精品无人区无码乱码毛片国产_性做久久久久久免费观看_天堂中文在线资源_7777久久亚洲中文字幕

首頁 自媒自媒體大數(shù)據(jù)文摘正文

機(jī)器都會(huì)學(xué)習(xí)了,你的神經(jīng)網(wǎng)絡(luò)還跑不動(dòng)?來看看這些建議

在很多機(jī)器學(xué)習(xí)的實(shí)驗(yàn)室中,機(jī)器已經(jīng)進(jìn)行了上萬小時(shí)的訓(xùn)練。在這個(gè)過程中,研究者們往往會(huì)走很多彎路,也會(huì)修復(fù)很多bug,但可以肯定的是,在機(jī)器學(xué)習(xí)的研究過程中,學(xué)到經(jīng)驗(yàn)和知識(shí)的并不僅僅是機(jī)器,我們?nèi)祟愐卜e累的豐富的經(jīng)驗(yàn),本文就將給你幾條最實(shí)用的研究建議。

接下來本文將介紹一些訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí)的經(jīng)驗(yàn)(主要基于TensorFlow平臺(tái))。有些建議可能對(duì)你來說很顯而易見,但對(duì)其他人來說可能很重要。有些建議可能對(duì)某些特定任務(wù)并不適用,請(qǐng)謹(jǐn)慎使用!

一般性建議

使用 ADAM優(yōu)化器。和批量梯度下降等傳統(tǒng)優(yōu)化器相比,Adam優(yōu)化器效果更好。

TensorFlow使用建議:保存和恢復(fù)權(quán)重時(shí),記得在創(chuàng)建Adam優(yōu)化器后創(chuàng)建Saver,因?yàn)锳dam也有state(也叫學(xué)習(xí)速率的單位權(quán)重)需要恢復(fù)。

Relu是最好的非線性映射(激活函數(shù))。就像 Sublime是最好的文本編輯器, ReLU快速、簡(jiǎn)單,神奇的地方在于它在訓(xùn)練過程中不會(huì)逐漸減少梯度。雖然教科書中常用sigmoid作為激活函數(shù),但是它在DNN中不能很好地傳遞梯度。

不要在輸出層用激活函數(shù)。這一點(diǎn)應(yīng)該很明顯,但是如果你在構(gòu)建網(wǎng)絡(luò)的每一層都使用了一個(gè)共享的函數(shù),那這個(gè)錯(cuò)誤就很常見了。請(qǐng)確保你在輸出層沒有使用激活函數(shù)。

在每一層中增加一個(gè)偏差值。這是機(jī)器學(xué)習(xí)入門知識(shí):偏差本質(zhì)上的作用是把一個(gè)平面轉(zhuǎn)化到最佳擬合位置。在y=mx+b函數(shù)中, b就是一個(gè)偏差值,可以把直線移動(dòng)到最佳擬合的位置。

使用方差縮放初始化(variance-scaled initialization)。在Tensorflow中,使用類似于tf.contrib.layers.variance_scaling_initializer()這樣的方法初始化。

根據(jù)我們的經(jīng)驗(yàn),這個(gè)方法比常規(guī)的高斯分布初始化,截?cái)嗾龖B(tài)分布初始化和Xavier初始化方法效果更好。

總體上講,方差縮放初始化可以根據(jù)每一層輸入和輸出的數(shù)量(TensorFlow中默認(rèn)使用輸入的數(shù)量),來調(diào)整初始隨機(jī)權(quán)重的方差,從而幫助信號(hào)在不需要通過截?cái)嗷蛘吲恳?guī)范化等額外的方法來在網(wǎng)絡(luò)中傳遞得更深。

Xavier初始化方法和它類似,只是Xavier初始化在所有層中基本一樣,如果網(wǎng)絡(luò)的層與層之間的取值范圍差異很大(常見于卷積網(wǎng)絡(luò)),每一層使用同一個(gè)方差可能就不適用了。

輸入數(shù)據(jù)歸一化。在訓(xùn)練時(shí),減去數(shù)據(jù)集的均值,然后除以標(biāo)準(zhǔn)差。這樣可以減少權(quán)重在每個(gè)方向上的拉伸,幫助神經(jīng)網(wǎng)絡(luò)更快更好地學(xué)習(xí)。保持輸入的數(shù)據(jù)以方差為均值中心可以很好的實(shí)現(xiàn)這點(diǎn)。你也要保證每次測(cè)試輸入采取一致的歸一化方法,從而保證你的訓(xùn)練集能夠模擬真實(shí)數(shù)據(jù)環(huán)境。

合理地縮放數(shù)據(jù)。這與歸一化處理相關(guān),但應(yīng)該在歸一化之前進(jìn)行。比如,數(shù)據(jù)x在現(xiàn)實(shí)生活中的范圍是[0, 140000000],可能服從tanh(x)或者 tanh(x/C)分布,其中 C為常量,用于調(diào)整曲線幫助輸入數(shù)據(jù)更好的符合tanh函數(shù)的坡度部分。尤其當(dāng)你輸入數(shù)據(jù)地在一端或者兩端無界的情況下,神經(jīng)網(wǎng)絡(luò)在 (0,1)范圍里可以學(xué)習(xí)的更好。

通常情況下,不要費(fèi)力去降低學(xué)習(xí)速率。SGD中學(xué)習(xí)速率衰減更常見,但是 ADAM可以更自然地處理它。如果你一定要計(jì)較細(xì)微的性能差別:在訓(xùn)練結(jié)束時(shí)短暫地降低學(xué)習(xí)速率,你可能會(huì)看到一個(gè)誤差突然降低一點(diǎn),然后再次趨于平穩(wěn)。

如果你的卷積層有64或128個(gè)濾波器,這可能就有些多余了,尤其對(duì)于深度網(wǎng)絡(luò)來說,128個(gè)濾波器真的有些多了。如果你已經(jīng)有了大量的濾波器,再添加可能毫無意義。

池化(pooling)是為了最大程度保持變換的不變性。pooling本質(zhì)上是使神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)圖像中一部分的整體特征。比如,max pooling可以使圖像在卷積網(wǎng)絡(luò)中經(jīng)過位移、旋轉(zhuǎn)和縮放等變換之后,仍然保持特征的不變性。

調(diào)試神經(jīng)網(wǎng)絡(luò)

如果你的神經(jīng)網(wǎng)絡(luò)不能夠?qū)W習(xí),也就是說訓(xùn)練時(shí)損失或者精確度不收斂,或者不能得到預(yù)期的結(jié)果。嘗試以下的建議:

過擬合!如果你的網(wǎng)絡(luò)不收斂,第一件要做的事是去過擬合一個(gè)訓(xùn)練點(diǎn),精度應(yīng)該達(dá)到 100%或99.99%,或者誤差接近0。如果你的神經(jīng)網(wǎng)絡(luò)不能過擬合單個(gè)數(shù)據(jù)點(diǎn),那么你的架構(gòu)存在嚴(yán)重但可能很細(xì)微的問題。如果你可以過擬合一個(gè)數(shù)據(jù)點(diǎn)但訓(xùn)練更大的數(shù)據(jù)集時(shí)不能收斂,那么可以嘗試如下建議。

降低學(xué)習(xí)速率。你的網(wǎng)絡(luò)會(huì)學(xué)習(xí)的慢一些,但是它可以下降到最小值,之前無法達(dá)到是因?yàn)椴介L(zhǎng)設(shè)置的太大。(想象一下尋找最小值就相當(dāng)于你想抵達(dá)溝渠最低點(diǎn),而步長(zhǎng)太大導(dǎo)致你直接跨過了溝渠。)

提高學(xué)習(xí)率。較大的學(xué)習(xí)率有助于縮短訓(xùn)練時(shí)間,減少反饋環(huán)路,這就意味著可以較快地預(yù)判網(wǎng)絡(luò)模型是不是可行。不過雖然網(wǎng)絡(luò)模型能夠更快的收斂,但是結(jié)果可能不會(huì)特別理想,甚至?xí)休^大的振蕩。(我們發(fā)現(xiàn)對(duì)于ADAM優(yōu)化器,0.001的學(xué)習(xí)率在許多實(shí)驗(yàn)中收效不錯(cuò)。)

減小批處理的樣本數(shù)。使用樣本數(shù)為1的批處理能夠獲取更細(xì)粒度的權(quán)重以更新反饋,你可以使用TensorBoard查看(或者其他調(diào)試/可視化的工具。)

去掉批處理規(guī)范化。在批處理樣本數(shù)減少到1的同時(shí),去掉批處理規(guī)范化,可以暴露梯度消失或者梯度爆炸的問題。我們?cè)幸粋€(gè)神經(jīng)網(wǎng)絡(luò)模型在幾個(gè)星期后仍舊不能收斂。直到去掉了批處理規(guī)范化,我們才意識(shí)到在第二輪迭代后所有的輸出都是NaN。批處理規(guī)范化的作用如同止血時(shí)的創(chuàng)口貼,但是只有在你的網(wǎng)絡(luò)模型沒有錯(cuò)誤的情況下才管用。

增加批處理的樣本數(shù)。較大樣本的批處理,比如使用整個(gè)數(shù)據(jù)集,減少了梯度更新的方差,可以使得每輪迭代的結(jié)果更精確。換句話說,權(quán)重迭代將朝著正確的方向進(jìn)行。但是,這個(gè)方法受到物理內(nèi)存大小限制。通常,前面兩個(gè)使用樣本數(shù)為1 的批處理和除去批處理規(guī)范化的技巧比這個(gè)技巧要更有用。

檢查矩陣變形。較大的矩陣變形(例如改變圖像的橫縱軸)會(huì)破壞空間的局部性特征,給模型的學(xué)習(xí)增添了難度,因?yàn)榫仃囎冃我彩切枰獙W(xué)習(xí)的一部分。(自然的特征變得四分五裂。事實(shí)上自然特征的空間局部特征也是卷積神經(jīng)網(wǎng)絡(luò)之所以有效的原因。)要特別注意多圖形/通道的矩陣變形;用numpy.stack()進(jìn)行適當(dāng)?shù)恼{(diào)整。

檢查損失函數(shù)。如果使用的是復(fù)雜的損失函數(shù),就先試一下簡(jiǎn)單的例如L1或者L2損失函數(shù)。我們發(fā)現(xiàn)L1對(duì)于異常值沒那么敏感,因此受噪音數(shù)據(jù)影響較小。

檢查可視化。檢查你的可視化工具包(matplotlib,OpenCV,等)是否調(diào)整了數(shù)值的數(shù)量級(jí),或者有值域限制?也可以考慮使用統(tǒng)一的配色方案。

案例解析

為了使上述的步驟更容易理解,這里我們展示幾張(通過TensorBoard)卷積神經(jīng)網(wǎng)絡(luò)做的回歸實(shí)驗(yàn)的損失圖。

首先,這個(gè)神經(jīng)網(wǎng)絡(luò)根本沒有收斂:

機(jī)器都會(huì)學(xué)習(xí)了,你的神經(jīng)網(wǎng)絡(luò)還跑不動(dòng)?來看看這些建議

我們嘗試剪裁數(shù)值值域,以防止他們超出范圍:

機(jī)器都會(huì)學(xué)習(xí)了,你的神經(jīng)網(wǎng)絡(luò)還跑不動(dòng)?來看看這些建議

哎呀,看這個(gè)沒有光滑處理過的線是多么的雜亂。是學(xué)習(xí)率太大了嗎?我們?cè)囍p了學(xué)習(xí)率并只用一個(gè)樣本點(diǎn)進(jìn)行訓(xùn)練:

機(jī)器都會(huì)學(xué)習(xí)了,你的神經(jīng)網(wǎng)絡(luò)還跑不動(dòng)?來看看這些建議

你可以看到學(xué)習(xí)率發(fā)生了變化(大概在300到3000步間)。顯然,學(xué)習(xí)率降的太快了。所以,我們放緩了迭代速率,效果就好些了:

機(jī)器都會(huì)學(xué)習(xí)了,你的神經(jīng)網(wǎng)絡(luò)還跑不動(dòng)?來看看這些建議

你可以看我們?cè)?000到5000步間進(jìn)行了衰減。結(jié)果好些了,但是還不夠,因?yàn)閾p失還沒有降到0。

然后我們停止了學(xué)習(xí)率的衰減并且嘗試了將數(shù)值壓縮到更小的值域并取代了tanh函數(shù)。雖然這樣損失降到了1,我們?nèi)匀徊荒苓_(dá)到過擬合。

機(jī)器都會(huì)學(xué)習(xí)了,你的神經(jīng)網(wǎng)絡(luò)還跑不動(dòng)?來看看這些建議

我們就是在這一步發(fā)現(xiàn),去掉批處理規(guī)范化后,網(wǎng)絡(luò)輸出很快在一到兩次迭代后變成NaN。于是,我們停止了批處理規(guī)范化并且把初始化改為方差標(biāo)準(zhǔn)化。這樣一下就解決了問題,用一兩個(gè)輸入樣本訓(xùn)練就能達(dá)到過擬合。雖然圖下方的Y軸的值被剪切了,但是初始的誤差在5以上,表明誤差幾乎下降了4個(gè)數(shù)量級(jí)。

機(jī)器都會(huì)學(xué)習(xí)了,你的神經(jīng)網(wǎng)絡(luò)還跑不動(dòng)?來看看這些建議

上圖的上半部分是經(jīng)過光滑處理的,但是你仍可看到對(duì)測(cè)試數(shù)據(jù)很快達(dá)到了過擬合,整個(gè)訓(xùn)練集的損失也降到了0.01以下。而這時(shí)我們還沒有衰減學(xué)習(xí)率。我們將學(xué)習(xí)率降低了一個(gè)數(shù)量級(jí)后繼續(xù)訓(xùn)練神經(jīng)網(wǎng)絡(luò),得到了更加好的結(jié)果:

機(jī)器都會(huì)學(xué)習(xí)了,你的神經(jīng)網(wǎng)絡(luò)還跑不動(dòng)?來看看這些建議

這些結(jié)果好太多了!但是如果我們將學(xué)習(xí)率成幾何級(jí)衰減而不是將訓(xùn)練分成兩部分會(huì)怎么樣呢?

如果將學(xué)習(xí)率在每一步迭代都乘以0.9995,這個(gè)結(jié)果就不那么妙了:

機(jī)器都會(huì)學(xué)習(xí)了,你的神經(jīng)網(wǎng)絡(luò)還跑不動(dòng)?來看看這些建議

原因估計(jì)是因?yàn)閷W(xué)習(xí)率衰減的太快。用0.999995會(huì)稍微好一些,但是結(jié)果幾乎跟沒有衰減一樣。我們從這一系列的實(shí)驗(yàn)中總結(jié)出,批處理規(guī)范化掩蓋了由初始化不當(dāng)導(dǎo)致的梯度爆炸,而除了最后階段學(xué)習(xí)率的衰減,衰減的學(xué)習(xí)率對(duì)于ADAM優(yōu)化器也不是很有用。伴隨著批處理正規(guī)化,剪裁值域只是掩蓋了真實(shí)的問題。我們還通過使用tanh激活函數(shù)對(duì)我們高方差的輸入數(shù)據(jù)進(jìn)行了轉(zhuǎn)化。

我希望這些基本的技巧可以對(duì)你學(xué)習(xí)深度神經(jīng)網(wǎng)絡(luò)有所幫助。事情往往就是這樣,簡(jiǎn)單的細(xì)節(jié)可以產(chǎn)生重大的影響。(編譯:什錦甜、倪倪、胡笳、云舟)

相關(guān)報(bào)道:

http://www.21jieyan.cn

責(zé)任編輯:陳近梅

分享: