76

看了Tensorflow开发者的峰会视频Eager Execution in Tensorflow,主持人介绍了“渐变胶带”。现在我了解到梯度磁带跟踪 TF 模型中发生的自动微分。

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

所以我知道模型发生的自动微分是计算每个节点的梯度——这意味着在给定一批数据的情况下调整每个节点的权重和偏差。这就是学习过程。但我的印象是,我实际上可以使用tf.keras.callback.TensorBoard()调用来查看训练的 tensorboard 可视化——所以我可以观察每个节点上的权重,并确定是否有死节点或过饱和节点。

使用渐变胶带是否只是为了查看某些渐变是否变为零或变得非常大等?或者渐变胶带还有其他用途吗?

4

3 回答 3

73

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

这与在没有急切执行的情况下运行非常不同,在这种情况下,您将构建一个图表,然后简单地使用它sess.run来评估您的损失,然后将其直接传递给优化器。

从根本上说,因为张量是立即评估的,所以你没有计算梯度的图表,所以你需要一个梯度带。与其说它只是用于可视化,不如说是没有它你无法在渴望模式下实现梯度下降。

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

于 2019-01-01T12:09:11.487 回答
63

经过一段时间的研究,在发布了最初的问题后,我对渐变胶带的用处有了更好的了解。似乎 Gradient Tap 最有用的应用是当您在keras模型中设计自定义层时 - 或者等效地为您的模型设计自定义训练循环。

如果您有一个自定义层,您可以准确定义该层内的操作方式,包括计算的梯度以及计算累积的损失量。

所以渐变胶带只会让您直接访问图层中的各个渐变。

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

假设您有一个想要激活的功能。

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

现在,如果您想将此函数的导数与w1和相关w2

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

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

因此优化器将计算梯度并让您访问这些值。然后你可以将它们加倍、平方、三倍等,无论你喜欢什么。无论您选择做什么,您都可以将这些调整后的梯度添加到反向传播步骤的损失计算中,等等。

于 2019-06-03T00:46:12.320 回答
9

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

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

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

于 2020-11-15T02:54:48.147 回答