幾個神經網訓練過程中的常見問題及解決方法

幾個神經網訓練過程中的常見問題及解決方法

個人總結神經網絡訓練可能會遇到的常見的一些問題及解決方法,導致問題的原因可能不是單一的,遇到具體情況,可能會是各種神奇的錯誤導致的,其中也不能排除是現有神經網絡框架的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

後期遇到其他會持續更新。

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