Fan*_* WU 10 gradient nan deep-learning pytorch
2021-03-09
\n我在 pytroch 中训练了我的 Transformer 模型。在前几个批次中,损失计算和梯度更新都表现良好。然而,经过多次迭代后,模型的输出结果是 nan 值。我确信数据集中不存在有缺陷的数据。此外,这不是分类问题,标签是浮点数。
\n\n2021-03-10
\n追问: \n多么有趣的故事啊!当我使用更大的架构(如 6 个编码器层、8 个头等)运行这个 Transformer 模型时。NAN 值消失了。看来梯度爆炸只存在于微小的模型中。
\n解决方案: \n我搜索了Pytorch论坛和Stackoverflow,找到了这个NAN实例的准确原因。首先,因为 NAN 损失一开始并没有出现。我们可以得出结论,该模型可能定义良好。原因可能是数据或训练过程。我按照https://discuss.pytorch.org/t/gradient-value-is-nan/91663/2torch.autograd.set_detect_anomaly(True)
中的说明运行。它返回的是.RuntimeError: Function \xe2\x80\x98StdBackward1\xe2\x80\x99 returned nan values in its 0th output
根据https://discuss.pytorch.org/t/gradient-of-standard-deviation-is-nan/14713中的类似问题,我仔细检查了变压器内每一层的输出。奇怪的是,经过数十次迭代后,位置嵌入层输出了一个全是零的向量。因此,执行归一化工作的 LayerNorm 无法很好地向后推损失,因为它计算了标准差,而标准差在零处没有梯度(或者你可以说它是无限的)!x.std(unbiased=False)
如果您使用的是 pytorch,可能的解决方案是添加。
这就是我遇到的 NAN loss 和 mse。希望我的经历可以给你遇到这种情况时一些启示!
\n相关问题:深度学习Nan损失原因
\n 归档时间: |
|
查看次数: |
6929 次 |
最近记录: |