我正在尝试调试一个有点复杂和非规范的NN架构.计算前向传递很好,并且给我预期的结果,但是当我尝试使用Adam或任何标准优化器进行优化时,即使在一次学习率非常小的迭代之后,我也无处不在.我正试图将它们本地化,并且想知道是否有办法捕获第一次出现的纳米并检测它出现在哪个操作中?我试过tf.add_check_numerics_ops()但它似乎没有做任何事情,或者我可能错误地使用它.
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我在MNIST上运行深度神经网络,其中损失定义如下:
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, label))
该程序似乎运行正常,直到我在10000多个小批量中获得纳米损失.有时,程序正常运行直到完成.我想tf.nn.softmax_cross_entropy_with_logits是给了我这个错误.这很奇怪,因为代码只包含mul和add操作.
也许我可以用:
if cost == "nan":
optimizer = an empty optimizer
else:
...
optimizer = real optimizer
Run Code Online (Sandbox Code Playgroud)
但我找不到那种类型nan.我该如何检查变量nan?
我怎么能解决这个问题?
我正在使用 Tensorflow 在 CPU 上进行 CIFAR-10 培训。在前几轮比赛中,输球似乎还不错。但是在步骤 10210 之后,损失会发生变化并最终变为 NaN。
我的网络模型来自他们网站的 CIFAR-10 CNN 模型。这是我的设置,
image_size = 32
num_channels = 3
num_classes = 10
num_batches_to_run = 50000
batch_size = 128
eval_batch_size = 64
initial_learning_rate = 0.1
learning_rate_decay_factor = 0.1
num_epochs_per_decay = 350.0
moving_average_decay = 0.9999
Run Code Online (Sandbox Code Playgroud)
结果如下所示。
2017-05-12 21:53:05.125242: step 10210, loss = 4.99 (124.9 examples/sec; 1.025 sec/batch)
2017-05-12 21:53:13.960001: step 10220, loss = 7.55 (139.5 examples/sec; 0.918 sec/batch)
2017-05-12 21:53:23.491228: step 10230, loss = 6.63 (149.5 examples/sec; 0.856 sec/batch)
2017-05-12 21:53:33.355805: …Run Code Online (Sandbox Code Playgroud) 我使用 gensim 库保存了我的文本向量,该库由一些负数组成。会影响训练吗?如果不是,那么为什么我在某些训练步骤之后首先获得判别器的 nan 损失值,然后再获得判别器和生成器的 nan 损失值?