1. 程式人生 > >cnn訓練技巧1

cnn訓練技巧1

cnn調參技巧記錄,好的引數不光可以加速模型收斂,而且可以有效的避免很多錯誤。當然在很多簡單任務中可能完全隨機的模型初始引數,簡單的一些建議學習率以及動量都可以得到一個比較滿意的結果,比如單一,簡單的降質模型下的影象生成,類別簡單少量的一些分類任務等,不好的初始化引數是可以應對簡單任務的。但是對於複雜任務就很難了,因為初始化引數選擇的不好,導致結果十分不可控。因為不好的初始化引數導致結果很不可靠,不管是loss還是估計值都不是預期的結果,所以很麻煩。比如差得模型引數,使得估計結果跟label差的很遠,那麼導致你不好去控制動量以及學習率等引數,這些引數不可控之後,中間訓練結果就完全不好分析,比如loss的震盪,精度的長時間不提升。

所以,首先藥確定比較靠譜的模型初始化引數,改模型引數需要得到的結果儘量跟label分佈接近或者說靠近。

當有了好的模型初始化引數之後,那麼就需要根據loss的反饋來確認好的學習率和動量一些單引數,因為這些引數不好同樣會導致結果很不可控,好的學習率和動量必須要將模型在訓練過程中的結果控制在label的分佈下,或者跟label的分佈類似。而且還要有魯棒性,使得模型引數不能因為少量異常或者極端資料干擾模型引數,也就是說在異常資料下,學習率和動量不能使得模型引數變化過大,這樣同樣會導致估計結果震盪,或者長時間精度不提升甚至下降。

當然有了好的引數,那麼loss也需要考慮,因為loss不能變化太震盪,導致訓練結果震盪,遲遲找不到正確的下降梯度方向,最合理的就是根據總體反饋將loss進行歸一化,當然這個跟樣本分佈有關係。

訓練過程有了那就是優化方法的選擇問題,有很多文獻說的是推薦sgd,目前個人經驗也是sgd相對更好調參,結果更可控,所以能很好的選擇引數。adam這樣的結果不太好理解,因為對adam不熟悉,以後希望對各種優化方法做一個系統的學習在分享!