Pytorch 中 Transformer 模型输出 Nan 值

Fan*_* WU 10 gradient nan deep-learning pytorch

2021-03-09

\n

我在 pytroch 中训练了我的 Transformer 模型。在前几个批次中,损失计算和梯度更新都表现良好。然而,经过多次迭代后,模型的输出结果是 nan 值。我确信数据集中不存在有缺陷的数据。此外,这不是分类问题,标签是浮点数。

\n

损失变化过程

\n

2021-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

\n

根据https://discuss.pytorch.org/t/gradient-of-standard-deviation-is-nan/14713中的类似问题,我仔细检查了变压器内每一层的输出。奇怪的是,经过数十次迭代后,位置嵌入层输出了一个全是零的向量。因此,执行归一化工作的 LayerNorm 无法很好地向后推损失,因为它计算了标准差,而标准差在零处没有梯度(或者你可以说它是无限的)!x.std(unbiased=False)如果您使用的是 pytorch,可能的解决方案是添加。

\n

这就是我遇到的 NAN loss 和 mse。希望我的经历可以给你遇到这种情况时一些启示!

\n

相关问题:深度学习Nan损失原因

\n

ler*_*son 1

无论如何,我遇到了这个问题,结果发现我忘记初始化嵌入向量,所以这只是torch.empty()发生的事情(可能有很多零。)