1. 程式人生 > >總結看到的深度學習調參技巧

總結看到的深度學習調參技巧

1.本的流程是否正確。對於小資料量,生成速度快,但是所有的指令碼都是和未來大規模訓練一致的。如果小資料量下,大網路奔著過擬合去都沒效果,那麼要開始反思模型的輸入輸出是不是有問題?要不要檢查自己的程式碼(永遠不要懷疑工具庫)? 模型解決的問題定義是不是有問題?對應用場景的理解是不是有錯?不要懷疑NN的能力,調參能遇到的問題,NN沒法擬合的。

2.Loss設計要合理。一般來說分類就是Softmax,迴歸就是L2的loss。但是要注意loss的錯誤範圍(主要是迴歸),如果預測一個label是10000的值,模型輸出0,這loss多大。這還是單變數的情況下,一般結果都是nan。所以不僅僅輸入要做normalization, 輸出也要這麼弄。多工情況下,各loss想法限制在一個量級上,或者最終限制在一個量級上,初期可以著重一個任務的loss。

3. 觀察loss勝於觀察準確率。準確率雖然是評測指標,但是訓練過程中還是要注意loss的。有些情況下,準確率是突變的,原來一直是0,可能保持上千迭代,然後突然變1。而loss是不會有這麼詭異的情況發生的,畢竟優化目標是loss。給NN一點時間,要根據任務留給NN的學習一定空間。有些情況下就是前面一段時間看不出起色,然後開始穩定學習。

4. 確認分類網路學習充分。分類網路就是學習類別之間的界限,網路就是慢慢的從類別模糊到類別清晰的。看Softmax輸出的概率的分佈,如果是二分類,剛開始的網路預測都是在0.5上下,很模糊,隨著學習過程,網路預測會慢慢的移動到0,1這種極值附近。所以,如果網路預測分佈靠中間,再學習學習。

5. Learning Rate設定合理。

    <1>太大造成loss爆炸,或者nan

    <2>太小造成半天loss沒反映(但是,LR需要降低的情況也是這樣,這裡視覺化網路中間結果,不是weights,有效果,倆者視覺化結果是不一樣的,太小的話中間結果有點水波紋或者噪點的樣子,因為filter學習太慢的原因,試過就會知道很明顯)

    <3>需要進一步降低了:loss在當前LR下一路降了下來,但是半天不再降了。

    <4>如果有個複雜點的任務, 剛開始, 是需要人肉盯著調LR的. 後面熟悉這個任務網路學習的特性後, 可以扔一邊跑去了。

    <5>如果上面的Loss設計那塊沒法合理,初始情況下容易爆,先上一個小LR保證不爆,等loss降下來了,再慢慢升LR,之後當然還會慢慢再降LR。
    <6>LR在可以工作的最大值下往小收一收,免得ReLU把神經元弄死了。

6.對比訓練集和驗證集的loss。判斷過擬合,訓練是否足夠,是否需要early stop的依據。

7.清楚receptive field的大小。CV的任務,context window是很重要的。所以對模型的receptive field的大小要心中有數,這個對效果的影響還是很顯著的,特別是用FCN,大目標需要很大的receptive field。不像有fully connection的網路,好歹有個fc兜底,全域性資訊都有。

8.預處理: -mean/std zero-center就夠了,PCA、白化什麼的都用不上。

9.一定要shuffle。

10.一定要Dropout(不僅僅可以防止過擬合,其實這相當於做人力成本最低的Ensemble,當然,訓練起來會比沒有Dropout的要慢一點)。

11.CV領域無腦用ReLU。

12.無腦用xavier。

13.LRN一類的,其實可以不用。不行可以再拿來試試看。

14.filter數量2^n。

15.多尺度的圖片輸入(或者網路內部利用多尺度下的結果)有很好的提升效果.

16.第一層的filter, 數量不要太少. 否則根本學不出來(底層特徵很重要).

17.sgd adam 這些選擇上看個人選擇,一般對網路不是決定性的。

18.batch normalization。

19.不要完全相信論文裡面的東西。結構什麼的覺得可能有效果,可以拿去試試。

20.有95%概率不會使用超過40層的模型。

21.shortcut的聯接是有作用的.

22.Google的inception論文,結構要好好看看。

23.網路初始化方法有:常量初始化(constant)、高斯分佈初始化(gaussian)、positive_unitball初始化、均勻分佈初始化(uniform)、xavier初始化、msra初始化、雙線性初始化(bilinear)。xavier、msra對ReLU網路效果較好。