深度學(xué)習(xí)已經(jīng)成為解決許多具有挑戰(zhàn)性的現(xiàn)實世界問題的方法。對目標(biāo)檢測,語音識別和語言翻譯來說,這是迄今為止表現(xiàn)最好的方法。許多人將深度神經(jīng)網(wǎng)絡(luò)(DNNs)視為神奇的黑盒子,我們放進(jìn)去一堆數(shù)據(jù),出來的就是我們的解決方案!事實上,事情沒那么簡單。
在設(shè)計和應(yīng)用DNN到一個特定的問題上可能會遇到很多挑戰(zhàn)。為了達(dá)到現(xiàn)實世界應(yīng)用所需的性能標(biāo)準(zhǔn),對數(shù)據(jù)準(zhǔn)備,網(wǎng)絡(luò)設(shè)計,訓(xùn)練和推斷等各個階段的正確設(shè)計和執(zhí)行至關(guān)重要。
今天給大家講講DNN(深度神經(jīng)網(wǎng)絡(luò))在訓(xùn)練過程中遇到的一些問題,然后我們應(yīng)該怎么去注意它,并學(xué)會怎么去訓(xùn)練它。
1、數(shù)據(jù)集的準(zhǔn)備:
必須要保證大量、高質(zhì)量且?guī)в袦?zhǔn)確標(biāo)簽的數(shù)據(jù),沒有該條件的數(shù)據(jù),訓(xùn)練學(xué)習(xí)很困難的(但是最近我看了以為作者寫的一篇文章,說明不一定需要大量數(shù)據(jù)集,也可以訓(xùn)練的很好,有空和大家來分享其思想---很厲害的想法);
2、數(shù)據(jù)預(yù)處理:
這個不多說,就是0均值和1方差化,其實還有很多方法;
3、Minibatch:
這個有時候還要根據(jù)你的硬件設(shè)備而定,一般建議用128,8這組,但是128,1也很好,只是效率會非常慢,注意的是:千萬不要用過大的數(shù)值,否則很容易過擬合;
4、梯度歸一化:
其實就是計算出來梯度之后,要除以Minibatch的數(shù)量,這個可以通過閱讀源碼得知(我之前有寫過SGD);
5、學(xué)習(xí)率:
① 一般都會有默認(rèn)的學(xué)習(xí)率,但是剛開始還是用一般的去學(xué)習(xí),然后逐漸的減小它;
② 一個建議值是0.1,適用于很多NN的問題,一般傾向于小一點;但是如果對于的大數(shù)據(jù),何凱明老師也說過,要把學(xué)習(xí)率調(diào)到很小,他說0.00001都不為過(如果記得不錯,應(yīng)該是這么說的);
③ 一個對于調(diào)度學(xué)習(xí)率的建議:如果在驗證集上性能不再增加就讓學(xué)習(xí)率除以2或者5,然后繼續(xù),學(xué)習(xí)率會一直變得很小,到最后就可以停止訓(xùn)練了;
④ 很多人用的一個設(shè)計學(xué)習(xí)率的原則就是監(jiān)測一個比率(每次更新梯度的norm除以當(dāng)前weight的norm),如果這個比率在10e-3附近,且小于這個值,學(xué)習(xí)會很慢,如果大于這個值,那么學(xué)習(xí)很不穩(wěn)定,由此會帶來學(xué)習(xí)失敗。
6、驗證集的使用:
使用驗證集,可以知道什么時候開始降低學(xué)習(xí)率和什么時候停止訓(xùn)練;
7、weight初始化:
① 如果你不想繁瑣的話,直接用0.02*randn(num_params)來初始化,當(dāng)然別的值也可以去嘗試;
② 如果上面那個建議不太好使,那么就依次初始化每一個weight矩陣用init_scale / sqrt(layer_width) * randn,init_scale可以被設(shè)置為0.1或者1;
③ 初始化參數(shù)對結(jié)果的影響至關(guān)重要,要引起重視;
④ 在深度網(wǎng)絡(luò)中,隨機(jī)初始化權(quán)重,使用SGD的話一般處理的都不好,這是因為初始化的權(quán)重太小了。這種情況下對于淺層網(wǎng)絡(luò)有效,但是當(dāng)足夠深的時候就不行,因為weight更新的時候,是靠很多weight相乘的,越乘越小,類似梯度消失的意思。
8、RNN&&LSTM(這方面沒有深入了解,借用別人的意思):
如果訓(xùn)練RNN或者LSTM,務(wù)必保證gradient的norm被約束在15或者5(前提還是要先歸一化gradient),這一點在RNN和LSTM中很重要;
9、梯度檢查:
檢查下梯度,如果是你自己計算的梯度;如果使用LSTM來解決長時依賴的問題,記得初始化bias的時候要大一點;
10、數(shù)據(jù)增廣:
盡可能想辦法多的擴(kuò)增訓(xùn)練數(shù)據(jù),如果使用的是圖像數(shù)據(jù),不妨對圖像做一點扭轉(zhuǎn),剪切,分割等操作來擴(kuò)充數(shù)據(jù)訓(xùn)練集合;
11、dropout:(先空著,下次我要單獨詳細(xì)講解Dropout)
12、評價結(jié)果:
評價最終結(jié)果的時候,多做幾次,然后平均一下他們的結(jié)果。
補(bǔ)充:
1、選擇優(yōu)化算法
傳統(tǒng)的隨機(jī)梯度下降算法雖然適用很廣,但并不高效,最近出現(xiàn)很多更靈活的優(yōu)化算法,例如Adagrad、RMSProp等,可在迭代優(yōu)化的過程中自適應(yīng)的調(diào)節(jié)學(xué)習(xí)速率等超參數(shù),效果更佳;
2、參數(shù)設(shè)置技巧
無論是多核CPU還是GPU加速,內(nèi)存管理仍然以字節(jié)為基本單元做硬件優(yōu)化,因此將參數(shù)設(shè)定為2的指數(shù)倍,如64,128,512,1024等,將有效提高矩陣分片、張量計算等操作的硬件處理效率;
3、正則優(yōu)化
除了在神經(jīng)網(wǎng)絡(luò)單元上添加傳統(tǒng)的L1/L2正則項外,Dropout更經(jīng)常在深度神經(jīng)網(wǎng)絡(luò)應(yīng)用來避免模型的過擬合。初始默認(rèn)的0.5的丟棄率是保守的選擇,如果模型不是很復(fù)雜,設(shè)置為0.2就可以;
4、其他方法
除了上述訓(xùn)練調(diào)優(yōu)的方法外,還有其他一些常用方法,包括:使用mini-batch learning方法、遷移訓(xùn)練學(xué)習(xí)、打亂訓(xùn)練集順序、對比訓(xùn)練誤差和測試誤差調(diào)節(jié)迭代次數(shù)、日志可視化觀察等等。
審核編輯 :李倩
-
語音識別
+關(guān)注
關(guān)注
39文章
1773瀏覽量
113846 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1222瀏覽量
25256 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5554瀏覽量
122428
原文標(biāo)題:基礎(chǔ)入門:“煉丹師”——深度學(xué)習(xí)訓(xùn)練技巧
文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
循環(huán)神經(jīng)網(wǎng)絡(luò)的優(yōu)化技巧
FPGA在深度神經(jīng)網(wǎng)絡(luò)中的應(yīng)用
深度神經(jīng)網(wǎng)絡(luò)在雷達(dá)系統(tǒng)中的應(yīng)用
脈沖神經(jīng)網(wǎng)絡(luò)怎么訓(xùn)練
BP神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)和訓(xùn)練過程

評論