Tensorflow 梯度带的用途是什么?

What is the purpose of the Tensorflow Gradient Tape?

看了 Tensorflow Developer's summit video on Eager Execution in Tensorflow,主持人介绍了 "Gradient Tape." 现在我明白了 Gradient Tape 跟踪 TF 模型中发生的自动微分。

我想明白为什么我会使用渐变胶带?谁能解释一下渐变胶带是如何用作诊断工具的?为什么有人会使用 Gradient Tape 而不是仅仅使用 Tensorboard 可视化权重。

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

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

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

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

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

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

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

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

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

这是 Aurelien Geron 关于 Tensorflow 的第 2 版书中的示例。

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

 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])

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

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

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

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