Tensorflow梯度胶带的目的是什么?

时间:2018-12-28 02:39:48

标签: tensorflow eager-execution

我观看了Tensorflow开发人员在Tensorflow上急切执行的峰会视频,演示者介绍了“ Gradient Tape”。现在,我了解到Gradient Tape可以跟踪TF模型中发生的自动区分。

我试图了解为什么要使用渐变胶带?谁能解释渐变磁带如何用作诊断工具?为什么有人会使用Gradient Tape而不是Tensorboard可视化权重。

因此,我认为模型发生的自动微分是计算每个节点的梯度,这意味着在给定一些数据的情况下,每个节点的权重和偏差的调整。这就是学习过程。但是给我的印象是,我实际上可以使用tf.keras.callback.TensorBoard()调用来查看张量板的可视化效果,以便观察每个节点上的权重并确定是否存在死节点或饱和节点。

是否仅使用Gradient Tape来查看某些渐变是变为零还是变得很大等?还是梯度带还有其他用途?

3 个答案:

答案 0 :(得分:14)

启用急切执行后,Tensorflow会计算代码中出现的张量值。这意味着它不会预先计算通过占位符输入的静态图。这意味着要反向传播错误,您必须跟踪计算的梯度,然后将这些梯度应用于优化器。

这与不急于执行而运行的情况大不相同,在这种情况下,您将构建图表,然后仅使用sess.run来评估损失,然后将其直接传递给优化器。

从根本上讲,由于张量会立即求值,因此您没有图来计算梯度,因此需要梯度带。它不仅仅只是用于可视化,还更多的是,如果没有它,您将无法在渴望的模式下实现梯度下降。

很明显,Tensorflow可以跟踪每个tf.Variable上的每次计算的每个梯度。但是,这可能是巨大的性能瓶颈。它们暴露了渐变带,以便您可以控制代码的哪些区域需要渐变信息。请注意,在非急切模式下,这将根据损失的后代来静态确定,但在急切模式下,没有静态图,因此无法知道。

答案 1 :(得分:1)

已经解决了一段时间,在发布了第一个问题之后,我对梯度带在哪里有用有了更好的认识。例如,当您在keras模型中设计自定义图层时,或者等效地为模型设计自定义训练环时,似乎最有用的Gradient Tap应用程序就是Gradient Tap。

如果您有一个自定义层,则可以精确定义操作在该层中的发生方式,包括计算出来的梯度,还可以计算出累积的损耗量。

因此,“渐变色带”将仅使您直接访问图层中的各个渐变。

这里是Aurelien Geron关于Tensorflow的第二版书中的一个示例。

假设您要激活某个功能。

 def f(w1, w2):
     return 3 * w1 ** 2 + 2 * w1 * w2

现在,如果要对w1w2进行此函数的派生:

w1, w2 = tf.Variable(5.), tf.Variable(3.)
with tf.GradientTape() as tape:
    z = f(w1, w2)

gradients = tape.gradient(z, [w1, w2])

因此,优化器将计算渐变并允许您访问这些值。然后,您可以根据需要将它们加倍,平方,加倍等等。无论选择做什么,都可以将这些调整后的梯度添加到反向传播步骤等的损耗计算中。

答案 2 :(得分:0)

我认为,要回答这个问题,最重要的一点就是GradientTape 不是一种诊断工具。这就是这里的误解。

GradientTape是用于自动微分(autodiff)的数学工具,这是TensorFlow的核心功能。它不会自动跟踪 ,而是自动执行 的关键部分。

如其他答案所述,它用于记录(“录音”)对某些输入执行的一系列操作并产生一些输出,以便可以相对于输入区分输出(通过反向传播/反向- autodiff模式)(以便随后执行梯度下降优化)。