几个神经网训练过程中的常见问题及解决方法

几个神经网训练过程中的常见问题及解决方法

个人总结神经网络训练可能会遇到的常见的一些问题及解决方法,导致问题的原因可能不是单一的,遇到具体情况,可能会是各种神奇的错误导致的,其中也不能排除是现有神经网络框架的bug。当问题通过调整还无法解决时,就得做好一步步跟踪变量排错的觉悟。

1、训练出现nan:

训练时候可能计算的loss会变成nan,又或者在反向传播时某些参数的梯度变成nan。造成这种问题的原因有很多,总结大概率的几个:
(1)输入数据中含有nan
(2)输入数据为空,反向传播时可能会出现nan
(3)梯度爆炸
(4)自定义损失函数时,损失函数中出现除零错误
(5)自定义网络不合适
(6)激活函数不合适(有时换掉ReLU就好了)
另:如果是梯度变为nan,还要考虑可能是自定义损失函数或者网络结构计算时某函数的定义域和值域不相符。比如使用了sqrt函数,其定义域是大于零的,一旦出现变量为0,那么其导数将是不可求的。这种问题也不是没有解决方法,可以在这类函数中加入很小的项保证梯度存在,如:

sqrt(x+1e-8)

又比如Charbonnier loss,其中加的ϵ\epsilon就是起到了这样的作用。

2、训练结果为同一常数:

(1)输入数据未归一化
(2)learning rate过大

3、pytorch中的inplace问题

如果你使用pytorch框架,在求导时需要注意一点,部分的inplace操作是无法自动求导的,可能会出错,甚至没有错,但是无法正常训练,具体参照下面的博客:
https://zhuanlan.zhihu.com/p/38475183

后期遇到其他会持续更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章