我观看了Tensorflow开发者峰会上关于Tensorflow中的Eager Execution的视频,演讲者介绍了“Gradient Tape”。现在我明白了Gradient Tape跟踪TF模型中发生的自动微分。
我想知道为什么我会使用梯度胶带?有人能解释一下梯度胶带是如何用作诊断工具的吗?为什么有人会使用梯度胶带而不仅仅是Tensorboard可视化权重。
所以我得到了一个模型的自动微分是计算每个节点的梯度--这意味着调整每个节点的权重和偏差,这就是学习过程。但我的印象是,我实际上可以使用tf.keras.callback.TensorBoard()
调用来查看训练的Tensorboard可视化--所以我可以观察每个节点的权重,并确定是否有死亡或过饱和的节点。
使用渐变带只是为了查看某些渐变是否为零或变得非常大,等等?或者渐变带还有其他用途?
3条答案
按热度按时间lx0bsm1f1#
启用即时执行后,Tensorflow将在代码中出现Tensor时计算Tensor的值。这意味着它不会预先计算通过占位符输入的静态图。这意味着要反向传播错误,您必须跟踪计算的梯度,然后将这些梯度应用于优化器。
这与没有急切执行的运行非常不同,在没有急切执行的情况下,你会构建一个图,然后简单地使用
sess.run
来评估你的损失,然后直接将其传递给优化器。从根本上说,因为Tensor是立即计算的,所以你没有一个图来计算梯度,所以你需要一个梯度带。它不仅仅是用于可视化,更重要的是没有它你就不能在渴望模式下实现梯度下降。
显然,Tensorflow可以跟踪每个
tf.Variable
上每次计算的每个梯度。然而,这可能是一个巨大的性能瓶颈。他们公开了一个梯度带,以便您可以控制代码的哪些区域需要梯度信息。请注意,在非急切模式下,这将基于作为损失的后代的计算分支来静态地确定,但是在渴望模式中,没有静态图,因此无法知道。qcuzuvrc2#
在这个问题上工作了一段时间后,在发布了最初的问题后,我对Gradient Tape在哪里有用有了更好的感觉。看起来Gradient Tape最有用的应用是当你在
keras
模型中设计一个自定义层时-或者等价地为你的模型设计一个自定义训练循环。如果你有一个自定义层,你可以精确地定义如何在该层中进行操作,包括计算的梯度以及计算累积的损失量。
因此,梯度磁带将只是给予您直接访问的个别梯度是在层。
下面是Aurelien Geron关于Tensorflow的第二版书中的一个例子。
假设你有一个你想要的功能作为你的激活。
字符串
现在,如果你想对这个函数分别对
w1
和w2
求导:型
因此,优化器将计算梯度,并给予您访问这些值的权限。然后,您可以将它们加倍,平方,三倍,等等。无论您选择做什么,然后您可以将这些调整后的梯度添加到反向传播步骤的损失计算中,等等。
z9smfwbn3#
我认为回答这个问题最重要的一点是
GradientTape
不是诊断工具。这是这里的误解。GradientTape
是一个自动微分(autodiff)的数学工具,这是TensorFlow的核心功能。它不会“跟踪”autodiff,而是执行autodiff的关键部分。正如其他答案所描述的那样,它用于记录(“磁带”)对某些输入执行的操作序列并产生某些输出,以便输出可以相对于输入进行区分(通过反向传播/反向模式autodiff)(以便然后执行梯度下降优化)。