如何使用 Tensorboard 检测消失和爆炸梯度?

数据挖掘 机器学习 张量流 深度学习 卷积神经网络
2021-10-10 06:40:44

我有两个“子问题”

1) 鉴于当前 write_grads=True 在 Tensorboard 回调中已被弃用,根据“un-deprecate write_grads for fit #31173” ,我如何使用 Tensorboard 检测梯度消失或爆炸?

2) 我想我可能可以根据 Tensorboard 的 Distributions and Histograms 选项卡中的权重分布和直方图判断我的模型是否存在梯度消失的问题。我的问题是我没有可比较的参考框架。目前,我的偏见似乎在“移动”,但我无法判断我的内核权重(Conv2D 层)是否“移动”/“改变”“足够”。有人可以通过给出经验法则来帮助我在 Tensorboard 中直观地评估这一点吗?即,如果只有底部 25% 的内核权重在移动,那是否足够好/不够好?或者也许有人可以从 tensorBoard 中发布两个消失梯度与非消失梯度的参考图像。

这是我的直方图和分布,是否可以判断我的模型是否存在梯度消失的问题?(为简洁起见省略了一些图层)提前致谢。

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

1个回答

当您在寻找爆炸/消失的梯度时,最好检查梯度直方图,而不是直接检查权重。

我在 Quora 上找到了一个代码,粘贴它以防万一链接消失

with tf.name_scope('train'): 
optimizer = tf.train.AdamOptimizer() 
# Get the gradient pairs (Tensor, Variable) 
grads = optimizer.compute_gradients(cross_entropy) 
# Update the weights wrt to the gradient 
train_step = optimizer.apply_gradients(grads) 
# Save the grads with tf.summary.histogram 
for index, grad in enumerate(grads): 
    tf.summary.histogram("{}-grad".format(grads[index][1].name), grads[index]) 

万一您想从值中了解消失/爆炸梯度,您可以简单地遵循以下逻辑:

  • 如果你面对爆炸梯度,它会显着增加一些权重,最终会达到 NaN 并使损失成为 NaN。因此,这将是爆炸梯度的典型输出。
  • 如果您面对消失的梯度,您会观察到所有或部分层的权重在几次迭代/时期内完全相同。请注意,您不能真正将规则设置为“检测消失梯度的 %X%”,因为损失是基于动量和学习率的。学习率和/或动量可能低到足以导致梯度消失一段时间,然后如果它们中的任何一个变得足够高,它可能会打破梯度消失的问题。您在适当训练中的目标是在迭代中平滑变化的直方图,而不是随着时间的推移恒定的权重和偏差分布。