訓練過程中Loss函數出現Nan的可能原因

綜合我做過的一些實驗,記錄一下實驗過程中Loss出現Nan的一些可能原因:

  1. 最簡單的,學習率過大
    BTW, 學習率過大還可能導致收斂到一個定值之前實驗室的師姐拿雲圖做DNI分類的結果最後都收斂到同一個數值,結果我後來一看也是學習率過大導致的。

    其中的原因我猜測是使用了ReLU激活函數以後,某一步跨入了一個點,使得出現了dead neuron的現象,然後前面的參數全部不更新,導致最後的結果變成了定值。所以ReLU的學習率一般不會很大。

  2. 壞樣本的加入
    比如一個樣本的全是0,你減去均值除以方差以後就變成了nan,你自己不會發現,進入神經網絡以後會使得突然loss也變nan了(因爲反傳是需要用到的)

    參考

  3. 你自己定義的某個Tensor沒有初始化
    比如代碼中實現一些簡單的weight matrix的時候,你直接使用torch.FloatTensor作爲訓練參數,但是FloatTensor本身的初始化是不適用於深度神經網絡的,此時最好用nn.init.kaiming_normal()之類的函數初始化一下。

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