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