來源:52AI人工智能
常言道,師傅領(lǐng)進(jìn)門,修行靠個(gè)人,相信很多人或多或少是在別人的建議或帶領(lǐng)下步入深度學(xué)習(xí)這個(gè)大坑,然后師傅說深度學(xué)習(xí)是個(gè)玄學(xué),后面就靠個(gè)人修行,瞬間就懵了對(duì)不對(duì)?可能后面經(jīng)過自己的磨盤滾打,不斷實(shí)驗(yàn)積累相關(guān)經(jīng)驗(yàn),會(huì)有一些自己的學(xué)習(xí)心得。本文可謂是深度學(xué)習(xí)中的一份秘籍,幫助你少走一些彎路。在本文中,列舉了一些常用的機(jī)器學(xué)習(xí)的訓(xùn)練技巧,目的是對(duì)這些技巧進(jìn)行簡(jiǎn)單的介紹并說明它們的工作原理。另外一些建議是斯坦福的CS231n課程及之前總結(jié)的網(wǎng)絡(luò)結(jié)構(gòu)。
本文的目錄如下:
數(shù)據(jù)預(yù)處理
初始化
訓(xùn)練
正則化
網(wǎng)絡(luò)結(jié)構(gòu)
自然語(yǔ)言處理
增強(qiáng)學(xué)習(xí)
網(wǎng)絡(luò)壓縮
數(shù)據(jù)預(yù)處理
(本部分原作者沒有寫,以個(gè)人的理解及相關(guān)補(bǔ)充這部分內(nèi)容)
What:輸入神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)的好壞直接關(guān)系著網(wǎng)絡(luò)訓(xùn)練結(jié)果,一般需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,常用的數(shù)據(jù)預(yù)處理方式有:
去均值:每個(gè)原始數(shù)據(jù)減去全部數(shù)據(jù)的均值,即把輸入數(shù)據(jù)各個(gè)維度的數(shù)據(jù)都中心化到0;
歸一化:一種方式是使用去均值后的數(shù)據(jù)除以標(biāo)準(zhǔn)差,另外一種方式是全部數(shù)據(jù)都除以數(shù)據(jù)絕對(duì)值的最大值;
PCA/白化:這是另外一種形式的數(shù)據(jù)預(yù)處理方式,一種方式是降維處理,另外一種是進(jìn)行方差處理;
Why:通過對(duì)數(shù)據(jù)進(jìn)行預(yù)處理能夠使得它們對(duì)模型的影響具有同樣的尺度或其他的一些目的。
Ref:CS231n Convolutional Neural Networks for Visual Recognition.
初始化
What:權(quán)重若初始化合理能夠提升性能并加快訓(xùn)練速度,偏置一般設(shè)置為0,對(duì)于權(quán)重而言,建議統(tǒng)一到一定區(qū)間內(nèi):
對(duì)于線性層[1]:區(qū)間為[-v,v],v = 1/sqrt(輸入尺寸),sqrt表示開根號(hào);
對(duì)于卷積層[2]:區(qū)間為[-v,v],v = 1/sqrt(卷積核的寬度x卷積核的高度x輸入深度);
批量標(biāo)準(zhǔn)化[3]在某些方面的應(yīng)用降低了調(diào)整權(quán)值初始化的需要,一些研究結(jié)果頁(yè)提出了相應(yīng)的替代公式。
Why:使用默認(rèn)的初始化,每個(gè)神經(jīng)元會(huì)隨著輸入數(shù)量的增多而存在一個(gè)方差,通過求根號(hào)縮放每個(gè)權(quán)重能確保神經(jīng)元有近似的輸出分布。
Ref:
1.Stochastic Gradient Descent Tricks, Leon Bottou;
2.在Torch中默認(rèn)這么操作;
3.Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, S. Ioffe and C. Szegedy;
What:對(duì)于長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM),遺忘偏置一般設(shè)置為1,可以加快訓(xùn)練過程。
Why:直覺是訓(xùn)練開始時(shí),想要信息在細(xì)胞之間傳播,故不希望細(xì)胞忘記它的狀態(tài)。
Ref:An Empirical Exploration of Recurrent Network Architectures, Rafal Jozefowicz et al.
What:對(duì)于t-分布領(lǐng)域嵌入算法(t-SNE),原作者建議對(duì)于大小為5000~10000之間的數(shù)據(jù)集,將困惑度設(shè)置為5和50之間[1],對(duì)于更大的數(shù)據(jù)集,相應(yīng)的困惑度也會(huì)增。
Why:困惑度決定了每個(gè)點(diǎn)的高斯分布的方差大小,更小的困惑度將獲得更多的集群,大的困惑度與之相反,太大的困惑度沒有任何意義;另外需要考慮的是畫出的聚類不能保留原有的規(guī)模,聚類之間的距離不一定代表原始的空間幾何,不同的困惑度能在數(shù)據(jù)結(jié)構(gòu)上提供互補(bǔ)的信息,每次運(yùn)行都會(huì)產(chǎn)生不同的結(jié)果[2]。
Ref:
1.Visualizing High-Dimensional Data Using t-SNE, L.J.P. van der Maaten.
2.How to Use t-SNE Effectively, Wattenberg, et al., Distill, 2016.
訓(xùn)練
What:除了使用真值硬化目標(biāo)外,同樣可以使用軟化目標(biāo)(softmax輸出)訓(xùn)練網(wǎng)絡(luò)。
Ref:Distilling the Knowledge in a Neural Network / Dark knowledge, G. Hinton et al.
What:學(xué)習(xí)率可能是需要調(diào)參中最重要的一個(gè)參數(shù),一種策略是選擇一些參數(shù)均有隨機(jī)化學(xué)習(xí)率,并觀察幾次迭代后的測(cè)試誤差。
參數(shù)
什么情況下增加性能
原因
注意事項(xiàng)
隱藏節(jié)點(diǎn)的數(shù)量
增加
增加隱藏節(jié)點(diǎn)的數(shù)量提升了模型的表示能力
隱藏節(jié)點(diǎn)的增加會(huì)增加模型每次操作的時(shí)間和內(nèi)存代價(jià)
學(xué)習(xí)率
調(diào)整優(yōu)化
一個(gè)不合適的學(xué)習(xí)率會(huì)導(dǎo)致模型效率很低
卷積核的寬度
增加
增大核寬度提升模型的參數(shù)個(gè)數(shù)
更寬的核導(dǎo)致一個(gè)更窄的輸出維度
隱性的零填充
增加
在卷積前補(bǔ)零保持大尺寸的表示
增加了大多數(shù)操作的時(shí)間和內(nèi)存代價(jià)
權(quán)值衰減系數(shù)
降低
降低權(quán)值衰減系數(shù)釋放模型的參數(shù)
Dropout的概率
降低
丟失更少的節(jié)點(diǎn)使得單元有更多的機(jī)會(huì)去擬合訓(xùn)練集
Ref:Some advice for tuning the hyperparameters. Ref: Goodfellow et al 2016 Book
正則化
What:在RNN中使用Dropout,它僅僅應(yīng)用于非循環(huán)連接[1],但是一些最近的文章提出了一些技巧使得Dropout能應(yīng)用于循環(huán)連接[2]。
Ref:
1.Recurrent Neural Network Regularization, Wojciech Zaremba et al.
2.Recurrent Dropout without Memory Loss, Stanislau Semeniuta et al.
What:批量標(biāo)準(zhǔn)化(Batch Normalization, BN),增添了一個(gè)新的層,作者給出一些額外的技巧加速BN層的工作:
增大學(xué)習(xí)率;
移除/減少dropout:在不增加過擬合發(fā)生的條件下加快訓(xùn)練;
移除/減少L2范數(shù)權(quán)值歸一化;
加快學(xué)習(xí)率衰減速度:使得網(wǎng)絡(luò)訓(xùn)練更快;
移除局部響應(yīng)歸一化;
將訓(xùn)練樣本打亂地更徹底:防止相同的樣本總出現(xiàn)在小批量中(驗(yàn)證集上提高了1%);
減少光度失真;
Why:一些好的解釋在此。
Ref:Accelerating Deep Network Training by Reducing Internal Covariate Shift, S. Ioffe and C. Szegedy.
網(wǎng)絡(luò)結(jié)構(gòu)
What:使用跳躍式連接,直接將中間層連接到輸入/輸出層。
Why:作者的觀點(diǎn)是通過減少神經(jīng)網(wǎng)絡(luò)的底端與頂端之間的處理步驟使得訓(xùn)練深層網(wǎng)絡(luò)更加簡(jiǎn)單,并減輕梯度消失問題。
When:在一些CNN結(jié)構(gòu)中或RNN中一些重要的層。
Ref:Generating Sequences With Recurrent Neural Networks, Alex Grave et al.
RNN的跳躍式連接例子
What:為L(zhǎng)STM增加窺視孔連接(連接之前輸出到門的輸入),根據(jù)作者的觀點(diǎn),這個(gè)操作對(duì)長(zhǎng)時(shí)間依賴關(guān)系有用。
Ref:Learning Precise Timing with LSTM Recurrent Networks, Felix A. Gers et al.
What:大多數(shù)的深度學(xué)習(xí)框架提供了一個(gè)結(jié)合SoftMax和Log的函數(shù)或者是在損失函數(shù)中計(jì)算SoftMax(在Tensorflow中是softmax_cross_entropy_with_logits,在Torch中是nn.LogSoftMax),這些應(yīng)該被更好地使用。
Why:Log(SoftMax)在數(shù)值上不穩(wěn)定是小概率,從而導(dǎo)致溢出等不良結(jié)果。另外一種流行的方法是在Log中加入一些小數(shù)避免不穩(wěn)定。
自然語(yǔ)言處理(NLP)
What:對(duì)于RNN和seq2seq模型的一些技巧:
嵌入尺寸:1024或620。更小的維度比如256也能導(dǎo)致很好的表現(xiàn),但是更高的維度不一定導(dǎo)致更好的表現(xiàn);
對(duì)于譯碼器而言:LSTM>GRU>Vanilla-RNN;
2-4層似乎普遍足夠,但帶有殘差的更深網(wǎng)絡(luò)看起來很難收斂,更多去挖掘更多的技巧;
Resd(密集的殘差連接)>Res(近連接先前層)>無殘差連接;
對(duì)于編碼器而言:雙向>單向(反向輸入)>單向;
注意力(加法)>注意力(乘法)>無注意力;
使用光束會(huì)導(dǎo)致更好的結(jié)果;
Ref:Massive Exploration of Neural Machine Translation Architectures, Denny Britz, Anna Goldie et al.
What:對(duì)于seq2seq而言,翻轉(zhuǎn)輸入序列的順序,保持目標(biāo)序列的完整。
Why:根據(jù)作者的觀點(diǎn),這種簡(jiǎn)單的數(shù)據(jù)變換極大提升了LSTM的性能。
Ref:Sequence to Sequence Learning with Neural Networks, Ilya Sutskever et al.
What:對(duì)于seq2seq而言,為編碼器和譯碼器網(wǎng)絡(luò)使用不同的權(quán)值。
Ref:Sequence to Sequence Learning with Neural Networks, Ilya Sutskever et al.
What:當(dāng)訓(xùn)練時(shí),強(qiáng)制更正譯碼器的輸入;在測(cè)試時(shí),使用先前的步驟,這使得訓(xùn)練在開始時(shí)非常高效,Samy等人提出了一種基于模型轉(zhuǎn)變的改進(jìn)方法[1]。
Ref:1.Scheduled Sampling for Sequence Prediction with Recurrent Neural Networks, Samy Bengio et al.
What:以無監(jiān)督的方式訓(xùn)練一個(gè)網(wǎng)絡(luò)去預(yù)測(cè)文本的下一個(gè)字符(char-RNN),該網(wǎng)絡(luò)將學(xué)習(xí)一種能用來監(jiān)督任務(wù)的表示(比如情感分析)。
Ref:Learning to Generate Reviews and Discovering Sentiment, Ilya Sutskever et al.
增強(qiáng)學(xué)習(xí)
What:異步:以不同的勘探政策同時(shí)訓(xùn)練多個(gè)代理,提升了魯棒性。
Ref:Asynchronous Methods for Deep Reinforcement Learning, V. Mnih.
What:跳幀:每隔4幀計(jì)算一次動(dòng)作,而不是每幀都計(jì)算,對(duì)于其它幀,重復(fù)這個(gè)動(dòng)作。
Why:在Atari游戲中工作得很好,并且使用這個(gè)技巧以大約4倍的速度加快了訓(xùn)練過程。
Ref:Playing Atari with Deep Reinforcement Learning, V. Mnih.
What:歷史:不是僅僅將當(dāng)前幀作為輸入,而是將最后的幀與輸入疊加,結(jié)合間隔為4的跳幀,這意味著我們有一個(gè)含t、t-4、t-8及t-12的幀棧。
Why:這允許網(wǎng)絡(luò)有一些動(dòng)量信息。
Ref:Deep Reinforcement Learning with Double Q-learning, V. Mnih.
What:經(jīng)驗(yàn)回放:為了避免幀間的相關(guān)性,作為一個(gè)代理不是更新每一幀,最好是在過渡時(shí)期的歷史中采樣一些樣本,該思想類似于有監(jiān)督學(xué)習(xí)中訓(xùn)練前打亂數(shù)據(jù)集。
Ref:Prioritized Experience Replay, Tom Schaul et al.
What:Parallel Advantage Actor Critic(PAAC):通過代理的經(jīng)驗(yàn)以及使用一個(gè)單一的同步更新模型使得簡(jiǎn)化A3C算法成為可能。
Ref:Efficient Parallel Methods for Deep Reinforcement Learning, Alfredo V. Clemente et al.
網(wǎng)絡(luò)壓縮
What:在推理中,為了減少層數(shù),通過批量歸一化(BN)層能夠吸收其它的權(quán)值。這是因?yàn)樵跍y(cè)試時(shí)批量歸一化進(jìn)行地是一個(gè)簡(jiǎn)單的線性縮放。
作者信息
Conchylicultor,谷歌大腦參與者,專注于機(jī)器學(xué)習(xí)和軟件開發(fā)。
Linkedin:https://www.linkedin.com/in/potetienne/
Mail:etiennefg.pot@gmail.com
文章原標(biāo)題《Deep Learning Tricks》,作者:Conchylicultor,譯者:海棠,審閱: