模型训练过程中产生NAN的原因分析

模型训练过程中产生NAN的原因分析

在模型的训练过程中发现,有时在经过多轮训练后loss会突然变为nan。loss变为nan也就使权重更新后的网络里的参数变为了nan,这样就使整个训练无法再进行下去了。

1. nan的来源

从调试情况来看nan出现的顺序是:loss的梯度 --> 网络的参数 --> 预测的结果 --> loss本身。

注意,第一个出现问题的应该是loss的梯度

2. 可能1:torch.sqrt()

一般sqrt函数的定义域为:[0,无穷大)

torch.sqrt()的定义域为:(0,无穷大)

因此,当开方的数非常小的时候反向传播无法正常进行。可以通过给其加一个非常小的数来避免该问题

torch.sqrt(x) --> torch.sqrt(x + 1e-8)

很有可能是这个原因造成的。实际操作的将其修改后再也没有出现过nan,说明这个问题很明显。

3. 可能2:torch.log()

众所周知,log函数在x接近于0的时候输出会接近于无穷小。因此,当绝对差很小的时候,log loss无法正常反向传播。因此需要对log里的x进行截取clip。

4. 可能3:梯度爆炸

假如在搜索空间中有一堵“墙”,那么当梯度下降撞到墙上时可能会得到一个异常的的梯度,这就是梯度爆炸现象。

当遇到梯度爆炸时,只需要对梯度进行剪裁即可:

loss.backward()
torch.nn.utils.clip_grad_norm(net.parameters(), 5)    #设置剪裁阈值为5

5. 可能4: 除0操作

虽然说这是一个很低级的失误, 但是有时候可能就是因为没有发现这个低级失误要检查很久.(血流教训)

ps:我会在这里持续更新我遇到的产生nan的原因.

  • 23
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值