原文鏈接:http://blog.csdn.net/chivalrousli/article/details/77650391
之前曾經(jīng)寫過一篇文章,講了一些深度學(xué)習(xí)訓(xùn)練的技巧,其中包含了部分調(diào)參心得:深度學(xué)習(xí)訓(xùn)練心得沈矿。不過由于一般深度學(xué)習(xí)實(shí)驗(yàn)移斩,相比普通機(jī)器學(xué)習(xí)任務(wù)肚医,時(shí)間較長(zhǎng)绢馍,因此調(diào)參技巧就顯得尤為重要。同時(shí)個(gè)人實(shí)踐中肠套,又有一些新的調(diào)參心得舰涌,因此這里單獨(dú)寫一篇文章,談一下自己對(duì)深度學(xué)習(xí)調(diào)參的理解你稚,大家如果有其他技巧瓷耙,也歡迎多多交流。
由于深度學(xué)習(xí)實(shí)驗(yàn)超參眾多刁赖,代碼風(fēng)格良好的實(shí)驗(yàn)環(huán)境搁痛,可以讓你的人工或者自動(dòng)調(diào)參更加省力,有以下幾點(diǎn)可能需要注意:
將各個(gè)參數(shù)的設(shè)置部分集中在一起宇弛。如果參數(shù)的設(shè)置分布在代碼的各個(gè)地方鸡典,那么修改的過程想必會(huì)非常痛苦。
可以輸出模型的損失函數(shù)值以及訓(xùn)練集和驗(yàn)證集上的準(zhǔn)確率枪芒。
可以考慮設(shè)計(jì)一個(gè)子程序彻况,可以根據(jù)給定的參數(shù),啟動(dòng)訓(xùn)練并監(jiān)控和周期性保存評(píng)估結(jié)果舅踪。再由一個(gè)主程序纽甘,分配參數(shù)以及并行啟動(dòng)一系列子程序。
畫圖是一個(gè)很好的習(xí)慣抽碌,一般是訓(xùn)練數(shù)據(jù)遍歷一輪以后悍赢,就輸出一下訓(xùn)練集和驗(yàn)證集準(zhǔn)確率。同時(shí)畫到一張圖上咬展。這樣訓(xùn)練一段時(shí)間以后泽裳,如果模型一直沒有收斂,那么就可以停止訓(xùn)練破婆,嘗試其他參數(shù)了涮总,以節(jié)省時(shí)間。
如果訓(xùn)練到最后祷舀,訓(xùn)練集瀑梗,測(cè)試集準(zhǔn)確率都很低,那么說明模型有可能欠擬合裳扯。那么后續(xù)調(diào)節(jié)參數(shù)方向抛丽,就是增強(qiáng)模型的擬合能力。例如增加網(wǎng)絡(luò)層數(shù)饰豺,增加節(jié)點(diǎn)數(shù)亿鲜,減少dropout值,減少L2正則值等等。
如果訓(xùn)練集準(zhǔn)確率較高蒿柳,測(cè)試集準(zhǔn)確率比較低饶套,那么模型有可能過擬合,這個(gè)時(shí)候就需要向提高模型泛化能力的方向垒探,調(diào)節(jié)參數(shù)妓蛮。
實(shí)踐中,一般先進(jìn)行初步范圍搜索圾叼,然后根據(jù)好結(jié)果出現(xiàn)的地方蛤克,再縮小范圍進(jìn)行更精細(xì)的搜索。
建議先參考相關(guān)論文夷蚊,以論文中給出的參數(shù)作為初始參數(shù)构挤。至少論文中的參數(shù),是個(gè)不差的結(jié)果惕鼓。
如果找不到參考儿倒,那么只能自己嘗試了∥匦Γ可以先從比較重要,對(duì)實(shí)驗(yàn)結(jié)果影響比較大的參數(shù)開始彻犁,同時(shí)固定其他參數(shù)叫胁,得到一個(gè)差不多的結(jié)果以后,在這個(gè)結(jié)果的基礎(chǔ)上汞幢,再調(diào)其他參數(shù)驼鹅。例如學(xué)習(xí)率一般就比正則值,dropout值重要的話森篷,學(xué)習(xí)率設(shè)置的不合適输钩,不僅結(jié)果可能變差,模型甚至?xí)o法收斂仲智。
如果實(shí)在找不到一組參數(shù)买乃,可以讓模型收斂。那么就需要檢查钓辆,是不是其他地方出了問題剪验,例如模型實(shí)現(xiàn),數(shù)據(jù)等等前联」ζ荩可以參考我寫的深度學(xué)習(xí)網(wǎng)絡(luò)調(diào)試技巧
調(diào)參只是為了尋找合適的參數(shù),而不是產(chǎn)出最終模型似嗤。一般在小數(shù)據(jù)集上合適的參數(shù)啸臀,在大數(shù)據(jù)集上效果也不會(huì)太差。因此可以嘗試對(duì)數(shù)據(jù)進(jìn)行精簡(jiǎn)烁落,以提高速度乘粒,在有限的時(shí)間內(nèi)可以嘗試更多參數(shù)豌注。
對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行采樣。例如原來100W條數(shù)據(jù)谓厘,先采樣成1W幌羞,進(jìn)行實(shí)驗(yàn)看看。
減少訓(xùn)練類別竟稳。例如手寫數(shù)字識(shí)別任務(wù)属桦,原來是10個(gè)類別,那么我們可以先在2個(gè)類別上訓(xùn)練他爸,看看結(jié)果如何聂宾。
建議優(yōu)先在對(duì)數(shù)尺度上進(jìn)行超參數(shù)搜索。比較典型的是學(xué)習(xí)率和正則化項(xiàng)诊笤,我們可以從諸如0.001 0.01 0.1 1 10系谐,以10為階數(shù)進(jìn)行嘗試。因?yàn)樗麄儗?duì)訓(xùn)練的影響是相乘的效果讨跟。不過有些參數(shù)纪他,還是建議在原始尺度上進(jìn)行搜索,例如dropout值: 0.3 0.5 0.7)晾匠。
這里給出一些參數(shù)的經(jīng)驗(yàn)值茶袒,避免大家調(diào)參的時(shí)候,毫無頭緒凉馆。
learning rate: 1 0.1 0.01 0.001, 一般從1開始嘗試薪寓。很少見learning rate大于10的。學(xué)習(xí)率一般要隨著訓(xùn)練進(jìn)行衰減澜共。衰減系數(shù)一般是0.5向叉。 衰減時(shí)機(jī),可以是驗(yàn)證集準(zhǔn)確率不再上升時(shí)嗦董,或固定訓(xùn)練多少個(gè)周期以后母谎。
不過更建議使用自適應(yīng)梯度的辦法,例如adam,adadelta,rmsprop等展懈,這些一般使用相關(guān)論文提供的默認(rèn)值即可销睁,可以避免再費(fèi)勁調(diào)節(jié)學(xué)習(xí)率。對(duì)RNN來說存崖,有個(gè)經(jīng)驗(yàn)冻记,如果RNN要處理的序列比較長(zhǎng),或者RNN層數(shù)比較多来惧,那么learning rate一般小一些比較好冗栗,否則有可能出現(xiàn)結(jié)果不收斂,甚至Nan等問題。
網(wǎng)絡(luò)層數(shù): 先從1層開始隅居。
每層結(jié)點(diǎn)數(shù): 16 32 128钠至,超過1000的情況比較少見。超過1W的從來沒有見過胎源。
batch size: 128上下開始棉钧。batch size值增加,的確能提高訓(xùn)練速度涕蚤。但是有可能收斂結(jié)果變差宪卿。如果顯存大小允許,可以考慮從一個(gè)比較大的值開始嘗試万栅。因?yàn)閎atch size太大佑钾,一般不會(huì)對(duì)結(jié)果有太大的影響,而batch size太小的話烦粒,結(jié)果有可能很差休溶。
clip c(梯度裁剪): 限制最大梯度,其實(shí)是value = sqrt(w1^2+w2^2….),如果value超過了閾值,就算一個(gè)衰減系系數(shù),讓value的值等于閾值: 5,10,15
dropout: 0.5
L2正則:1.0扰她,超過10的很少見兽掰。
詞向量embedding大小:128徒役,256
正負(fù)樣本比例: 這個(gè)是非常忽視禾进,但是在很多分類問題上,又非常重要的參數(shù)廉涕。很多人往往習(xí)慣使用訓(xùn)練數(shù)據(jù)中默認(rèn)的正負(fù)類別比例,當(dāng)訓(xùn)練數(shù)據(jù)非常不平衡的時(shí)候艇拍,模型很有可能會(huì)偏向數(shù)目較大的類別狐蜕,從而影響最終訓(xùn)練結(jié)果。除了嘗試訓(xùn)練數(shù)據(jù)默認(rèn)的正負(fù)類別比例之外卸夕,建議對(duì)數(shù)目較小的樣本做過采樣层释,例如進(jìn)行復(fù)制。提高他們的比例快集,看看效果如何贡羔,這個(gè)對(duì)多分類問題同樣適用。
在使用mini-batch方法進(jìn)行訓(xùn)練的時(shí)候个初,盡量讓一個(gè)batch內(nèi)乖寒,各類別的比例平衡,這個(gè)在圖像識(shí)別等多分類任務(wù)上非常重要院溺。
人工一直盯著實(shí)驗(yàn)楣嘁,畢竟太累。自動(dòng)調(diào)參當(dāng)前也有不少研究。下面介紹幾種比較實(shí)用的辦法:
Gird Search. 這個(gè)是最常見的逐虚。具體說聋溜,就是每種參數(shù)確定好幾個(gè)要嘗試的值,然后像一個(gè)網(wǎng)格一樣叭爱,把所有參數(shù)值的組合遍歷一下撮躁。優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單暴力,如果能全部遍歷的話买雾,結(jié)果比較可靠把曼。缺點(diǎn)是太費(fèi)時(shí)間了,特別像神經(jīng)網(wǎng)絡(luò)凝果,一般嘗試不了太多的參數(shù)組合祝迂。
Random Search。Bengio在Random Search for Hyper-Parameter Optimization中指出器净,Random Search比Gird Search更有效型雳。實(shí)際操作的時(shí)候,一般也是先用Gird Search的方法山害,得到所有候選參數(shù)纠俭,然后每次從中隨機(jī)選擇進(jìn)行訓(xùn)練。
Bayesian Optimization. 貝葉斯優(yōu)化浪慌,考慮到了不同參數(shù)對(duì)應(yīng)的實(shí)驗(yàn)結(jié)果值冤荆,因此更節(jié)省時(shí)間。和網(wǎng)絡(luò)搜索相比簡(jiǎn)直就是老牛和跑車的區(qū)別权纤。具體原理可以參考這個(gè)論文:Practical Bayesian Optimization of Machine Learning Algorithms钓简,這里同時(shí)推薦兩個(gè)實(shí)現(xiàn)了貝葉斯調(diào)參的Python庫(kù),可以上手即用:
jaberg/hyperopt, 比較簡(jiǎn)單汹想。
fmfn/BayesianOptimization外邓, 比較復(fù)雜,支持并行調(diào)參古掏。
合理性檢查损话,確定模型,數(shù)據(jù)和其他地方?jīng)]有問題槽唾。
訓(xùn)練時(shí)跟蹤損失函數(shù)值丧枪,訓(xùn)練集和驗(yàn)證集準(zhǔn)確率。
使用Random Search來搜索最優(yōu)超參數(shù)庞萍,分階段從粗(較大超參數(shù)范圍訓(xùn)練較少周期)到細(xì)(較小超參數(shù)范圍訓(xùn)練較長(zhǎng)周期)進(jìn)行搜索拧烦。
這里列了一些參數(shù)資料,大家有時(shí)間钝计,可以進(jìn)一步閱讀屎篱。
Practical recommendations for gradient-based training of deep architectures by Yoshua Bengio (2012)
Efficient BackProp, by Yann LeCun, Léon Bottou, Genevieve Orr and Klaus-Robert Müller