训练过程中Loss突然变为NaN的可能原因与解决

本文探讨深度学习训练中Loss突然变为NaN的原因与解决方案,包括梯度爆炸、损失函数中的数学问题及坏样本的影响。

训练过程中Loss突然变为NaN的可能原因与解决

深度学习训练过程中,我们依赖模型当前参数训练得到的loss,根据所选择的优化策略,如Adam、SGD等得到参数步进调整值,对参数进行不断的调整,直到模型达到我们的预期。

但在实际训练过程中,有时候会发现loss变为NaN或Inf的情况,导致训练无法正常进行。出现这种情况的原因主要有以下几点:
1. 梯度爆炸
2. 出现除零、对数函数自变量为负值等数学问题
3. 出现坏样本

1. 梯度爆炸

训练过程中由于学习率等超参数设置的不合理,导致优化过程中没有减小loss,反而因为震荡导致loss逐渐增大,最终超过了float表示范围,出现NaN。这一过程通常伴随渐变与自激的特性,也即在训练到某一轮迭代时对参数调整的步进过大导致模型变差,输出的loss随之增大,此时反向传播的梯度也跟着增大,最终模型的参数越调越差,直至崩溃。
如果我们输出每一轮的loss,就能够发现这一逐渐增大的过程,从而能够基本锁定问题出现在梯度爆炸这一层面上。

解决的方式一般是减小学习率。如果涉及到多个损失函数,可以找出哪一项导致了梯度爆炸,通过减小其权重解决。

2. 不合适的损失函数带来的数学问题

采用一些涉及到除法、对数函数等的损失函数时,要注意除零、对数输入负数等情况,这样同样会导致loss变为NaN。这种情况的出现,一般是在开始训练就出现,不存在loss逐渐增大到爆炸的过程。

一般通过对网络输出值域以及损失函数定义的数学分析可以进行判断,并进行相应地调整。

3. 出现坏样本

坏样本的出现也可能导致loss突然变为NaN。坏样本一般是指不符合任务要求需要被清洗掉的样本,如CV任务中全黑图片等等。坏样本不符合模型训练的要求,因此输入到模型中根本无法得到正常的结果,因此loss会变得巨大以至于成为NaN。
一般情况下,我们需要找出并清理掉坏样本。

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值