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






























