在深度學(xué)習(xí)中,為了有效地訓(xùn)練深度神經(jīng)網(wǎng)絡(luò),有一些值得我們強烈推薦的做法。在本文中,我將介紹一些最常用的方法,從高質(zhì)量訓(xùn)練數(shù)據(jù)的重要性,到超參數(shù)的選擇,再到更快的做出 DNN 原型的通用技巧。這些方法的大多數(shù)由學(xué)術(shù)界和工業(yè)界的研究驗證過,并且在諸如 Yann LeCun 等人寫的《Efficient BackProp》和 Yoshua Bengio 的《Practical Recommendations for Deep Architectures》中也給出了數(shù)學(xué)和實驗證明。
你會注意到,我沒有在這篇文章中提到任何數(shù)學(xué)證明。在這里建議的所有要點,更多地應(yīng)該被看作是 DNN 的最佳訓(xùn)練方法中獲得的總結(jié)。為了更深入地了解,我強烈建議您最后看一遍上面提到的研究論文和后面提到的參考文獻(xiàn)。
訓(xùn)練數(shù)據(jù)
許多機器學(xué)習(xí)從業(yè)者習(xí)慣于在任何深度神經(jīng)網(wǎng)絡(luò)(DNN)中使用原始(raw)訓(xùn)練數(shù)據(jù)。為什么不這樣做呢,任何 DNN(大概)仍會給出好的結(jié)果,對吧?但是,說出「給出正確的數(shù)據(jù)類型,一個十分簡單的模型會比一個復(fù)雜的 DNN 更快地給出更好的結(jié)果」(雖然,這可能會有例外)并不是很守舊派的。因此,無論你是在做計算機視覺,還是在做自然語言處理或統(tǒng)計建模等,你都應(yīng)該嘗試預(yù)處理您的原始數(shù)據(jù)。你可以采取以下幾個方法來獲得更好的訓(xùn)練數(shù)據(jù):
盡可能大的數(shù)據(jù)集(DNN 對數(shù)據(jù)的需求是相當(dāng)大的:越多越好)
刪除所有具有損壞數(shù)據(jù)的訓(xùn)練樣本(短文本、高失真圖像、虛假輸出標(biāo)簽、具有大量空值的特征等)
數(shù)據(jù)增強——創(chuàng)建新樣本(如果是圖像,可以重新縮放、添加噪聲等)
選擇適當(dāng)?shù)募せ詈瘮?shù)
激活函數(shù)在任何神經(jīng)網(wǎng)絡(luò)中都是重要組成部分之一。激活將大家非常期望的非線性效果引入到了模型中。多年來,sigmoid 激活函數(shù)一直是最好的選擇。但是 sigmoid 函數(shù)本質(zhì)上有兩個缺陷:
1.sigmoid 尾部的飽和(會進(jìn)一步導(dǎo)致梯度消失問題)
2.sigmoid 不是以 0 為中心的。
一個更好的選擇是 tanh 函數(shù)——在數(shù)學(xué)上,tanh 只是一個重新縮放和移位的 sigmoid,tanh(x) = 2*sigmoid(x) - 1。雖然 tanh 仍然可能遭受梯度消失問題,但好消息是 tanh 是以零為中心的。因此,使用 tanh 為激活函數(shù)可以更快地收斂。我使用中也發(fā)現(xiàn)使用 tanh 作為激活函數(shù)通常比使用 sigmoid 函數(shù)好。
你可以根據(jù)具體任務(wù)進(jìn)一步探索其它選擇,如已經(jīng)表現(xiàn)出可以改善一些問題的 ReLU,SoftSign 等函數(shù)。
隱含單元和隱含層的數(shù)量
使用比最佳隱含單元數(shù)更多的數(shù)量通常是安全的。因為,任何正則化方法在一定程度上都可以處理多余的單元。而另一方面,使用比最佳隱含單元數(shù)更少的數(shù)量時,發(fā)生欠擬合的概率更高一些。
此外,當(dāng)采用無監(jiān)督學(xué)習(xí)預(yù)訓(xùn)練的表示(pre-trained representations,在后面部分中描述)時,隱含單元數(shù)的最佳數(shù)量通常要更大一些。因為,在各種表示中(對于特定的監(jiān)督任務(wù)),預(yù)訓(xùn)練表示可能會包含大量的無關(guān)信息。通過增加隱含單元的數(shù)量,模型將具有足夠支持從預(yù)訓(xùn)練表示中過濾出最合適的信息的靈活性。
選擇最佳隱含層數(shù)是相對簡單的。正如 Yoshua Bengio 在 Quora 上提到的:「你只需要繼續(xù)添加層,直到測試錯誤不再改善為止」。
權(quán)重初始化
始終使用小隨機數(shù)(random numbers)初始化權(quán)重,以打破不同單元之間的對稱性。但是權(quán)重應(yīng)該多小呢?推薦的上限是多少?使用什么概率分布來生成隨機數(shù)?此外,當(dāng)使用 sigmoid 激活函數(shù)時,如果權(quán)重被初始化為非常大的數(shù),則 sigmoid 函數(shù)將會飽和(尾部區(qū)域),導(dǎo)致死亡神經(jīng)元(dead neurons)。如果權(quán)重非常小,則梯度也會很小。因此,最好在中間范圍選擇權(quán)重,并且使它們圍繞平均值均勻分布。
幸運的是,目前已經(jīng)有很多關(guān)于初始權(quán)重的適當(dāng)值的研究,這對于有效的收斂是非常重要的。為了初始化得到均勻分布的權(quán)重,uniform distribution 可能是最好的選擇之一。此外,如論文(Glorot and Bengio, 2010)所示,具有更多傳入連接(fan_in)的單元應(yīng)具有相對較小的權(quán)重。
由于所有這些深入的實驗,現(xiàn)在我們有一個測量公式,可以直接用于權(quán)重初始化;例如從~ Uniform(-r, r) 范圍獲得權(quán)重,對于 tanh 作為激活函數(shù)的時候,r=sqrt(6/(fan_in+fan_out));而對于 sigmoid 作為激活函數(shù)的時候,r=4*(sqrt(6/fan_in+fan_out)),其中 fan_in 是上一層的大小,fan_out 是下一層的大小。