神經網絡模型loss不收斂、不下降問題彙總

一、模型不收斂

主要有以下幾個原因:

1.learning rate設大了會帶來跑飛(loss突然一直很大)的問題
這個是新手最常見的情況——爲啥網絡跑着跑着看着要收斂了結果突然飛了呢?可能性最大的原因是你用了relu作爲激活函數的同時使用了softmax或者帶有exp的函數做分類層的loss函數。當某一次訓練傳到最後一層的時候,某一節點激活過度(比如100),那麼exp(100)=Inf,發生溢出,bp後所有的weight會變成NAN,然後從此之後weight就會一直保持NAN,於是loss就飛起來辣。我的depth estimation相關項目的loss曲線,如下:

可以看出跑飛了,(幸lr設的並不是非常大所以又拉了回來)。如果lr設的過大會出現跑飛再也回不來的情況。這時候你停一下隨便挑一個層的weights看一看,很有可能都是NAN了。對於這種情況建議用二分法嘗試。0.1~0.0001.不同模型不同任務最優的lr都不一樣。

 

2.數據庫太小一般不會帶來不收斂的問題
只要你一直在train總會收斂(rp問題跑飛了不算)。反而不收斂一般是由於樣本的信息量太大導致網絡不足以fit住整個樣本空間。樣本少只可能帶來過擬合的問題,你看下你的training set上的loss收斂了嗎?如果只是validate set上不收斂那就說明overfitting了,這時候就要考慮各種anti-overfit的trick了,比如dropout,SGD,增大minibatch的數量,減少fc層的節點數量,momentum,finetune等。

3.儘量用小模型
如果數據太少儘量縮小模型複雜度。考慮減少層數或者減少kernel number。

二、模型loss 不下降

train loss與test loss結果分析

train loss 不斷下降,test loss不斷下降,說明網絡仍在學習;
train loss 不斷下降,test loss趨於不變,說明網絡過擬合;
train loss 趨於不變,test loss不斷下降,說明數據集100%有問題;
train loss 趨於不變,test loss趨於不變,說明學習遇到瓶頸,需要減小學習率或批量數目;
train loss 不斷上升,test loss不斷上升,說明網絡結構設計不當,訓練超參數設置不當,數據集經過清洗等問題。

實例

這段在使用caffe的時候遇到了兩個問題都是在訓練的過程中loss基本保持常數值,特此記錄一下。

1.loss等於87.33不變

loss等於87.33這個問題是在對Inception-V3網絡不管是fine-tuning還是train的時候遇到的,無論網絡迭代多少次,網絡的loss一直保持恆定。
查閱相關資料以後發現是由於loss的最大值由FLT_MIN計算得到,FLT_MIN是1.17549435e−38F​1.17549435e−38F​其對應的自然對數正好是-87.3356,這也就對應上了loss保持87.3356了。
這說明softmax在計算的過程中得到了概率值出現了零,由於softmax是用指數函數計算的,指數函數的值都是大於0的,所以應該是計算過程中出現了float溢出的異常,也就是出現了inf,nan等異常值導致softmax輸出爲0.
當softmax之前的feature值過大時,由於softmax先求指數,會超出float的數據範圍,成爲inf。inf與其他任何數值的和都是inf,softmax在做除法時任何正常範圍的數值除以inf都會變成0.然後求loss就出現了87.3356的情況。
解決辦法
由於softmax輸入的feature由兩部分計算得到:一部分是輸入數據,另一部分是各層的權值等組成
減小初始化權重,以使得softmax的輸入feature處於一個比較小的範圍
降低學習率,這樣可以減小權重的波動範圍
如果有BN(batch normalization)層,finetune時最好不要凍結BN的參數,否則數據分佈不一致時很容易使輸出值變得很大(注意將batch_norm_param中的use_global_stats設置爲false )。
觀察數據中是否有異常樣本或異常label導致數據讀取異常
本文遇到的情況採用降低學習率的方法,learning rate設置爲0.01或者原來loss的1/5或者1/10。

2.loss保持0.69左右

採用VGG-16在做一個二分類問題,所以計算loss時等價與下面的公式:

loss=−log(Pk==label)loss=−log(Pk==label)


loss=−log(Pk==label)loss=−log(Pk==label)
當p=0.5時,loss正好爲0.693147,也就是訓練過程中,無論如何調節網絡都不收斂。

總結

loss一直不下降的原因有很多,可以從頭到尾濾一遍: 1)數據的輸入是否正常,data和label是否一致。 2)網絡架構的選擇,一般是越深越好,也分數據集。 並且用不用在大數據集上pre-train的參數也很重要的 3)loss 公式對不對。

相關博客推薦

神經網絡訓練loss不下降原因集合 :https://blog.csdn.net/liuweiyuxiang/article/details/80856991

Loss和神經網絡訓練介紹的比較完整,有1.梯度檢驗2.訓練前檢查,3.訓練中監控4.首層可視化5.模型融合和優化等等等
Facenet即triplet network模型訓練,loss不收斂的問題?

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