Tensorflow `tf.train.Optimizer` 如何计算梯度?

机器算法验证 Python 优化 张量流
2022-03-27 06:09:24

我正在关注 Tensorflow mnist 教程(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py)。

本教程使用tf.train.Optimizer.minimize(特别是tf.train.GradientDescentOptimizer)。我没有看到在任何地方传递任何参数来定义渐变。

张量流默认使用数值微分吗?

有没有办法像你一样传递渐变scipy.optimize.minimize

2个回答

这不是数值微分,而是自动微分这是 tensorflow 存在的主要原因之一:通过在 tensorflow 图中指定操作(对Tensors 等进行操作),它可以自动遵循整个图的链式规则,并且由于它知道每个单独操作的导数指定,它可以自动组合它们。

如果由于某种原因您想分段覆盖它,可以使用gradient_override_map.

它使用自动微分。它使用链式法则并在图中分配梯度。

假设我们有一个张量 C 这个张量 C 经过一系列操作后得到让我们说通过加法、乘法、经历一些非线性等

所以如果这个 C 依赖于一组称为 Xk 的张量,我们需要得到梯度

Tensorflow 总是跟踪操作的路径。我的意思是节点的顺序行为以及它们之间的数据流动方式。这是由图表完成的 在此处输入图像描述

如果我们需要从 X 输入中获取成本的导数,首先要做的是通过扩展图来加载从 x 输入到成本的路径。

然后它以河流顺序开始。然后用链式法则分配梯度。(与反向传播相同)

无论如何,如果您阅读属于 tf.gradients() 的源代码,您会发现 tensorflow 以一种很好的方式完成了这个梯度分布部分。

在回溯 tf 与 graph 交互时,在 backword pass 中,TF 会遇到不同的节点在这些节点内部有我们称之为(ops)matmal、softmax、relu、batch_normalization 等的操作所以我们 tf 所做的就是自动将这些操作加载到图形

这个新节点构成了操作的偏导数。获取梯度()

先说一下这些新增的节点

在这些节点中,我们 tf 添加了 2 件事 1. 我们计算的导数更早) 2. 前向传递中对应 opp 的输入也是

所以通过链式法则我​​们可以计算

所以这就像一个 backword API

所以tensorflow总是考虑图的顺序以便做自动微分

所以我们知道我们需要前向传递变量来计算梯度然后我们需要在张量中存储中间值这可以减少内存对于许多操作 tf 知道如何计算梯度并分配它们。