【发布时间】:2021-10-08 13:56:54
【问题描述】:
我怀疑我的 Pytorch 模型的梯度消失了。我知道我可以跟踪每一层的渐变并用writer.add_scalar 或writer.add_histogram 记录它们。但是,对于具有相对大量层数的模型,在 TensorBoard 日志中包含所有这些直方图和图形变得有点麻烦。我并不是说它不起作用,只是为每一层设置不同的图形和直方图并滚动浏览它们有点不方便。
我正在寻找一个图表,其中y 轴(垂直)表示梯度值(特定层的梯度平均值),x 轴(水平)显示层号(例如,在x=1 是第 1 层的梯度值),z 轴(深度)是 epoch 数。
这看起来像一个直方图,但当然,它与直方图有本质的不同,因为x 轴不代表豆类。可以编写一个脏代码,它会创建一个直方图,而不是 bean,而是层数,类似于(这显然是一个伪代码):
fake_distribution = []
for i, layer in enumerate(model.layers):
fake_distribution += [i for j in range(int(layer.grad.mean()))]
writer.add_histogram('gradients', fake_distribution)
我想知道是否有更好的方法。
【问题讨论】:
-
您可以查看模型参数梯度的标准。
-
@Ivan 你能解释一下吗?
-
将模型的所有参数梯度放在一个张量中,您可以计算它的范数并绘制它,或者取最大范数。查看
clip_grad_norm_的实现,了解如何处理渐变。 -
@Ivan 我不需要分别查看每一层的渐变以查看它们是否正在消失吗?当我在一个张量中获取所有梯度时,最大范数只会给我最大的梯度,这是一个单一的数字。
-
您可以将参数梯度的范数视为一个张量。查看每个梯度是非常不合理的。例如,根据模型的大小,如果您使用数千个参数,您最终将需要监控相同数量的梯度。另一个想法是查看模型特定层上的渐变......
标签: deep-learning pytorch tensorboard