綜合我做過的一些實驗,記錄一下實驗過程中Loss出現Nan的一些可能原因:
-
最簡單的,學習率過大。
BTW, 學習率過大還可能導致收斂到一個定值之前實驗室的師姐拿雲圖做DNI分類的結果最後都收斂到同一個數值,結果我後來一看也是學習率過大導致的。其中的原因我猜測是使用了ReLU激活函數以後,某一步跨入了一個點,使得出現了dead neuron的現象,然後前面的參數全部不更新,導致最後的結果變成了定值。所以ReLU的學習率一般不會很大。
-
壞樣本的加入
比如一個樣本的全是0,你減去均值除以方差以後就變成了nan,你自己不會發現,進入神經網絡以後會使得突然loss也變nan了(因爲反傳是需要用到的) -
你自己定義的某個Tensor沒有初始化
比如代碼中實現一些簡單的weight matrix的時候,你直接使用torch.FloatTensor作爲訓練參數,但是FloatTensor本身的初始化是不適用於深度神經網絡的,此時最好用nn.init.kaiming_normal()之類的函數初始化一下。