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


10

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

本教程使用tf.train.Optimizer.minimize(特别是tf.train.GradientDescentOptimizer)。我看不到任何传递参数以定义渐变的参数。

Tensor流默认情况下是否使用数值微分?

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

Answers:


16

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

如果出于某种原因您想逐段覆盖,可以使用gradient_override_map


使用数字微分不​​是自动微分吗?
Aerin

@BYOR否;请查看上面的Wikipedia链接。不过,张量流实际上是在“真实的”反向模式autodiff和符号微分之间的某个位置。
Dougal

@Dougal im使用没有图形,没有tf.function装饰器的渴望模式,自动微分如何知道张量之间的关系?
datdinhquoc

1
@datdinhquoc这是相同的基本算法,只是实现起来有点复杂。
Dougal

9

它使用自动区分。它使用链式规则并在图中分配梯度的反向词。

假设我们有一个张量C,这个张量C是在一系列操作之后得到的。例如,通过加,乘,经历一些非线性等

因此,如果此C依赖于称为Xk的某些张量集,则需要获取梯度

Tensorflow始终跟踪操作路径。我的意思是节点的顺序行为以及它们之间的数据流向。这是通过图形完成的 在此处输入图片说明

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

然后从河流开始。然后使用链式规则分布梯度。(与反向传播相同)

如果您阅读源代码属于tf.gradients()的任何方式,您都可以发现tensorflow已经很好地完成了此梯度分布部分。

当回溯tf与图交互时,在TF中,回传遍历TF将遇到不同的节点在这些节点内,有我们称为(ops)matmal,softmax,relu,batch_normalization等操作,所以tf所做的是将这些ops自动加载到图形

这个新节点构成了操作的偏导数。get_gradient()

让我们来谈谈这些新添加的节点

在这些节点内,我们将2加1。导数,计算出ierier)2。

因此,根据链式规则,我们可以计算

这就像Backword API一样

所以张量流总是考虑图的顺序以进行自动微分

因此,正如我们所知道的,我们需要前向传递变量来计算梯度,然后我们需要将中间值也存储在张量中,这可以减少内存。对于许多操作而言,他们知道如何计算梯度并分配梯度。


1
我正在使用没有图形,没有tf.function装饰器的渴望模式,自动差分如何知道张量之间的关系?
datdinhquoc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.