獲取數(shù)據(jù):確保要有高質(zhì)量的輸入/輸出數(shù)據(jù)集澎现,這個數(shù)據(jù)集要足夠大仅胞、具有代表性以及擁有相對清楚的標簽。缺乏數(shù)據(jù)集是很難成功的剑辫。
預處理:將數(shù)據(jù)進行集中是非常重要的干旧,也就是要使數(shù)據(jù)均值為0,從而使每個維度的每次變動為1妹蔽。有時椎眯,當輸入的維度隨量級排序變化時,最好使用那個維度的log(1+x)胳岂”嗾基本上,重要的是要找到一個0值的可信編碼以及自然分界的維度乳丰。這樣做可使學習工作得更好掌测。情況就是這樣的,因為權(quán)值是通過公式來更新的:wij中的變化\propto
xidL/dyj(w表示從層x到層y的權(quán)值产园,L是損失函數(shù))汞斧。如果x的均值很大(例如100),那么權(quán)值的更新將會非常大什燕,并且是相互關(guān)聯(lián)的粘勒,這使得學習變得低劣而緩慢。保持0均值和較小的方差是成功的關(guān)鍵因素秋冰。
批處理:在如今的計算機上每次只執(zhí)行一個訓練樣本是很低效的仲义。反之如果進行的是128個例子的批處理,效率將大幅提高剑勾,因為其輸出量是非嘲D欤可觀的。事實上使用數(shù)量級為1的批處理效果不錯虽另,這不僅可獲得性能的提升同時可降低過度擬合暂刘;不過這有可能會被大型批處理超越。但不要使用過大的批處理捂刺,因為有可能導致低效和過多過度擬合谣拣。所以我的建議是:根據(jù)硬件配置選取適合的批處理規(guī)模募寨,量力而為會更加高效。
梯度歸一化:根據(jù)批處理的大小來拆分梯度森缠。這是一個好主意拔鹰,因為如果對批處理進行倍增(或倍減),無需改變學習率(無論如何贵涵,不要太多)列肢。
學習率計劃:從一個正常大小的學習率(LR)開始,朝著終點不斷縮小宾茂。
1LR的典型取值是0.1瓷马,令人驚訝的是,對于大量的神經(jīng)網(wǎng)絡(luò)問題來說跨晴,0.1是學習率的一個很好的值欧聘。通常學習率傾向于更小而非更大。使用一個驗證集——一個不進行訓練的訓練集子集端盆,來決定何時降低學習率以及何時停止訓練(例如當驗證集的錯誤開始增多的時候)怀骤。學習率計劃的實踐建議:若發(fā)現(xiàn)驗證集遭遇瓶頸,不妨將LR除以2(或5)焕妙,然后繼續(xù)晒喷。最終,LR將會變得非常小访敌,這也到了停止訓練的時候了。這樣做可以確保在驗證性能受到損害的時候衣盾,你不會擬合(或過度擬合)訓練數(shù)據(jù)寺旺。降低LR是很重要的,通過驗證集來控制LR是個正確的做法势决。
但最重要的是要關(guān)注學習率阻塑。一些研究人員(比如Alex
Krizhevsky)使用的方法是,監(jiān)視更新范數(shù)和權(quán)值范數(shù)之間的比率果复。比率取值大約為10ˉ3。如果取值過小,那么學習會變得非常慢淑际;如果取值過大辛燥,那么學習將會非常不穩(wěn)定甚至失敗。
權(quán)值初始化迈窟。關(guān)注權(quán)值在學習開始時的隨機初始化私植。
如果想偷懶,不妨試試0.02*randn(num_params)车酣。這個范圍的值在許多不同的問題上工作得很好曲稼。當然索绪,更小(或更大)的值也值得一試贫悄。如果它工作得不好(例如是一個非常規(guī)的和/或非常深的神經(jīng)網(wǎng)絡(luò)架構(gòu))瑞驱,那么需要使用init_scale/sqrt(layer_width)*randn來初始化每個權(quán)值矩陣。在這種情況下窄坦,init_scale應該設(shè)置為0.1或者1唤反,或者類似的值。對于深度且循環(huán)的網(wǎng)絡(luò)嫡丙,隨機初始化是極其重要的拴袭。如果沒有處理好,那么它看起來就像沒有學習到任何東西曙博。我們知道拥刻,一旦條件都設(shè)置好了,神經(jīng)網(wǎng)絡(luò)就會學習父泳。一個有趣的故事:多年來般哼,研究人員相信SGD不能訓練來自隨機初始化的深度神經(jīng)網(wǎng)絡(luò)。每次嘗試都以失敗告終惠窄。令人尷尬的是蒸眠,他們沒有成功是因為使用“小的隨機權(quán)值”來進行初始化,雖然小數(shù)值的做法在淺度網(wǎng)絡(luò)上工作得非常好杆融,但在深度網(wǎng)絡(luò)上的表現(xiàn)一點也不好楞卡。當網(wǎng)絡(luò)很深時,許多權(quán)值矩陣之間會進行乘積脾歇,所以不好的結(jié)果會被放大蒋腮。但如果是淺度網(wǎng)絡(luò),SGD可以幫助我們解決該問題藕各。
所以關(guān)注初始化是很有必要的池摧。嘗試多種不同的初始化,努力就會得到回報激况。如果網(wǎng)絡(luò)完全不工作(即沒法實施)作彤,繼續(xù)改進隨機初始化是正確的選擇。
如果正在訓練RNN或者LSTM乌逐,要對梯度(記得梯度已除以批量大薪呋洹)范數(shù)使用一個硬約束。像15或者5這樣的約束在我個人的實驗中工作得很好黔帕。請將梯度除以批處理大小代咸,再檢查一下它的范數(shù)是否超過15(或5)。如果超過了成黄,將它縮小到15(或5)呐芥。這個小竅門在RNN和LSTM的訓練中發(fā)揮著巨大作用逻杖,不這樣做的話,爆炸性的梯度將會導致學習失敗思瘟,最后不得不使用像1e-6這樣微小而無用的學習率荸百。
數(shù)值梯度檢查:如果沒有使用過Theano或者Torch,梯度實現(xiàn)只能親力親為了滨攻。在實現(xiàn)梯度的時候很容易出錯够话,所以使用數(shù)值梯度檢查是至關(guān)重要的。這樣做會讓你對自己的代碼充滿信心光绕。調(diào)整超級參數(shù)(比如學習率和初始化)是非常有價值的女嘲,因此好刀要用在刀刃上。
如果正在使用LSTM同時想在具有大范圍依賴的問題上訓練它們诞帐,那么應該將LSTM遺忘關(guān)口的偏差初始化為較大的值欣尼。默認狀態(tài)下,遺忘關(guān)口是S型的全部輸入停蕉,當權(quán)值很小時愕鼓,遺忘關(guān)口會被設(shè)置為0.5,這只能對部分問題有效慧起。這是對LSTM初始化的一個警示菇晃。
數(shù)據(jù)增加(Data
augmentation):使用算法來增加訓練實例數(shù)量是個有創(chuàng)意的做法。如果是圖像蚓挤,那么應該轉(zhuǎn)換和旋轉(zhuǎn)它們磺送;如果是音頻,應該將清晰的部分和所有類型的雜音進行混合處理灿意。數(shù)據(jù)添加是一門藝術(shù)(除非是在處理圖像)册着,這需要一定的常識。
dropout:dropout提供了一個簡單的方法來提升性能脾歧。記得要調(diào)整退出率,而在測試時不要忘記關(guān)閉dropout演熟,然后對權(quán)值求乘積(也就是1-dropout率)鞭执。當然,要確保將網(wǎng)絡(luò)訓練得更久一點芒粹。不同于普通訓練兄纺,在進入深入訓練之后,驗證錯誤通常會有所增加化漆。dropout網(wǎng)絡(luò)會隨著時間推移而工作得越來越好估脆,所以耐心是關(guān)鍵。
綜合(Ensembling)座云。訓練10個神經(jīng)網(wǎng)絡(luò)疙赠,然后對其預測數(shù)據(jù)進行平均付材。該做法雖然簡單,但能獲得更直接圃阳、更可觀的性能提升厌衔。有人可能會困惑,為什么平均會這么有效捍岳?不妨用一個例子來說明:假如兩個分類器的錯誤率為70%富寿,如果其中一個的正確率保持較高,那么平均后的預測會更接近正確結(jié)果锣夹。這對于可信網(wǎng)絡(luò)的效果會更加明顯页徐,當網(wǎng)絡(luò)可信時結(jié)果是對的,不可信時結(jié)果是錯的银萍。
(下面幾點是上面的簡化版)
1:準備數(shù)據(jù):務(wù)必保證有大量变勇、高質(zhì)量并且?guī)в懈蓛魳撕灥臄?shù)據(jù),沒有如此的數(shù)據(jù)砖顷,學習是不可能的
2:預處理:這個不多說贰锁,就是0均值和1方差化
3:minibatch:建議值128,1最好,但是效率不高滤蝠,但是千萬不要用過大的數(shù)值豌熄,否則很容易過擬合
4:梯度歸一化:其實就是計算出來梯度之后,要除以minibatch的數(shù)量物咳。這個不多解釋
5:下面主要集中說下學習率
5.1:總的來說是用一個一般的學習率開始锣险,然后逐漸的減小它
5.2:一個建議值是0.1,適用于很多NN的問題览闰,一般傾向于小一點芯肤。
5.3:一個對于調(diào)度學習率的建議:如果在驗證集上性能不再增加就讓學習率除以2或者5,然后繼續(xù)压鉴,學習率會一直變得很小崖咨,到最后就可以停止訓練了。
5.4:很多人用的一個設(shè)計學習率的原則就是監(jiān)測一個比率(每次更新梯度的norm除以當前weight的norm)油吭,如果這個比率在10-3附近击蹲,如果小于這個值,學習會很慢婉宰,如果大于這個值歌豺,那么學習很不穩(wěn)定,由此會帶來失敗心包。
6:使用驗證集类咧,可以知道什么時候開始降低學習率,和什么時候停止訓練。
7:關(guān)于對weight初始化的選擇的一些建議:
7.1:如果你很懶痕惋,直接用0.02*randn(num_params)來初始化区宇,當然別的值你也可以去嘗試
7.2:如果上面那個不太好使,那么久依次初始化每一個weight矩陣用init_scale
/ sqrt(layer_width) * randn,init_scale可以被設(shè)置為0.1或者1
7.3:初始化參數(shù)對結(jié)果的影響至關(guān)重要血巍,要引起重視萧锉。
7.4:在深度網(wǎng)絡(luò)中,隨機初始化權(quán)重述寡,使用SGD的話一般處理的都不好柿隙,這是因為初始化的權(quán)重太小了。這種情況下對于淺層網(wǎng)絡(luò)有效鲫凶,但是當足夠深的時候就不行了禀崖,因為weight更新的時候,是靠很多weight相乘的螟炫,越乘越小波附,有點類似梯度消失的意思(這句話是我加的)
8:如果訓練RNN或者LSTM,務(wù)必保證gradient的norm被約束在15或者5(前提還是要先歸一化gradient)昼钻,這一點在RNN和LSTM中很重要掸屡。
9:檢查下梯度,如果是你自己計算的梯度然评。
10:如果使用LSTM來解決長時依賴的問題仅财,記得初始化bias的時候要大一點
12:盡可能想辦法多的擴增訓練數(shù)據(jù),如果使用的是圖像數(shù)據(jù)碗淌,不妨對圖像做一點扭轉(zhuǎn)啊之類的盏求,來擴充數(shù)據(jù)訓練集合。
13:使用dropout
14:評價最終結(jié)果的時候亿眠,多做幾次碎罚,然后平均一下他們的結(jié)果。