調參其實就是trial-and-error,沒有其他捷徑可以走。快速嘗試, 快速糾錯這是調參的關鍵。
目錄
常用的調參經驗:
自動調參方法:
這是一個很好的連結, 說明了如何從零開始不斷的trial-and-error(其實這裡面沒遇到什麼error):
Using convolutional neural nets to detect facial keypoints tutorial
常用的調參經驗:
1.預處理
mean/std zero-center就夠了,PCA、白化什麼的都用不上。反正CNN能學習encoder,PCA用不用其實關系不大,大不了網絡裡面自己學習出來一個。
2.shuffle
3.了解網絡的原理。比如 CNN的conv這塊, 要明白sobel算子的邊界檢測。
4.Dropout
不僅可以防止過拟合,也相當于做人力成本最低的Ensemble。當然,訓練起來會比沒有Dropout的要慢一點,同時最好相應加一點網絡參數。
5.CNN更加适合訓練回答是否的問題,如果任務比較複雜,考慮先用分類任務訓練一個模型再finetune。
6.用ReLU(CV領域).
7.用3x3(卷積核)。
8.用xavier。
9.LRN一類的,其實可以不用。不行可以再拿來試試看。
10.filter數量2^n。
11.多尺度的圖檔輸入(或者網絡内部利用多尺度下的結果)有很好的提升效果。
12.第一層的filter,數量不要太少。否則根本學不出來(底層特征很重要)。
13.sgd adam 這些選擇上,看你個人選擇.。一般對網絡不是決定性的。反正我一般用sgd + momentum。
14.batch normalization我一直沒用,雖然我知道這個很好,我不用僅僅是因為我懶。是以要鼓勵使用batch normalization。
15.不要完全相信論文裡面的東西。結構什麼的覺得可能有效果,可以拿去試試。
16.你有95%機率不會使用超過40層的模型。
17.shortcut的聯接是有作用的。
18.Google的inception論文,結構要好好看看。
19.一些傳統的方法,要稍微了解了解。我自己的程式就用過1x14的手寫filter,寫過之後你看看inception裡面的1x7、7x1 就會會心一笑...
自動調參方法:
(1)Grid Search:網格搜尋,在所有候選的參數選擇中,通過循環周遊,嘗試每一種可能性,表現最好的參數就是最終的結果。其原理就像是在數組裡找最大值。缺點是太費時間了,特别像神經網絡,一般嘗試不了太多的參數組合。
(2)Random Search:經驗上,Random Search比Gird Search更有效。實際操作的時候,一般也是先用Gird Search的方法,得到所有候選參數,然後每次從中随機選擇進行訓練。另外Random Search往往會和由粗到細的調參政策結合使用,即在效果比較好的參數附近進行更加精細的搜尋。
(3)Bayesian Optimization:貝葉斯優化,考慮到了不同參數對應的 實驗結果值,是以更節省時間,貝葉斯調參比Grid Search疊代次數少, 速度快;而且其針對非凸問題依然穩健。
經驗參數
這裡給出一些參數的經驗值,避免大家調參的時候,毫無頭緒。
1.learning rate: 1、0.1、0.01、0.001。
一般從1開始嘗試。很少見learning rate大于10的。學習率一般要随着訓練進行衰減。衰減系數一般是0.5。衰減時機,可以是驗證集準确率不再上升時,或固定訓練多少個周期以後。
不過更建議使用自适應梯度的辦法,例如adam、adadelta、rmsprop等,這些一般使用相關論文提供的預設值即可,可以避免再費勁調節學習率。
對RNN來說,有個經驗,如果RNN要處理的序列比較長,或者RNN層數比較多,那麼learning rate一般小一些比較好,否則有可能出現結果不收斂,甚至Nan等問題。
2.網絡層數:先從1層開始。
3.每層結點數:16、32、128。超過1000的情況比較少見。超過1W的從來沒有見過。
4.batch size: 128上下開始。
batch size值增加,的确能提高訓練速度。但是有可能收斂結果變差。如果顯存大小允許,可以考慮從一個比較大的值開始嘗試。因為batch size太大,一般不會對結果有太大的影響,而batch size太小的話,結果有可能很差。
5.clip c(梯度裁剪):
限制最大梯度,其實是value = sqrt(w1^2+w2^2….),如果value超過了門檻值,就算一個衰減系系數,讓value的值等于門檻值:5、10、15。
6.dropout:0.5。
7.L2正則:1.0,超過10的很少見。
8.詞向量embedding大小:128、256。
9.正負樣本比例:這個是非常忽視,但是在很多分類問題上,又非常重要的參數。
很多人往往習慣使用訓練資料中預設的正負類别比例,當訓練資料非常不平衡的時候,模型很有可能會偏向數目較大的類别,進而影響最終訓練結果。除了嘗試訓練資料預設的正負類别比例之外,建議對數目較小的樣本做過采樣,例如進行複制。提高他們的比例,看看效果如何,這個對多分類問題同樣适用。
在使用mini-batch方法進行訓練的時候,盡量讓一個batch内,各類别的比例平衡,這個在圖像識别等多分類任務上非常重要。
參考資料:
https://www.zhihu.com/question/25097993
https://zhuanlan.zhihu.com/p/24720954