0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

構(gòu)建神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn)和教訓(xùn)總結(jié)

汽車玩家 ? 來源:AI公園 ? 作者:Matt H and Daniel R ? 2020-05-04 11:58 ? 次閱讀

導(dǎo)讀

從成千上萬小時的模型訓(xùn)練中累計(jì)的經(jīng)驗(yàn)和教訓(xùn)。

在我們的機(jī)器學(xué)習(xí)實(shí)驗(yàn)室,我們在許多高性能的機(jī)器已經(jīng)積累了成千上萬個小時的訓(xùn)練。然而,并不是只有計(jì)算機(jī)在這個過程中學(xué)到了很多東西:我們自己也犯了很多錯誤,修復(fù)了很多錯誤。

在這里,我們根據(jù)我們的經(jīng)驗(yàn)(主要基于 TensorFlow)提出了一些訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的實(shí)用技巧。有些建議對你來說可能是顯而易見的,但對我們中的某個人來說卻不是。其他的建議可能不適用,甚至對你的特定任務(wù)來說是不好的建議:謹(jǐn)慎使用!

我們承認(rèn)這些都是眾所周知的方法。我們也站在巨人的肩膀上!我們這篇文章的目的僅僅是對它們進(jìn)行高層次的總結(jié),以便在實(shí)踐中使用。

通用 Tips

使用 ADAM 優(yōu)化器。它真的很好用。比起傳統(tǒng)的優(yōu)化方法,如原始的梯度下降,我更喜歡它。注意:如果要保存和恢復(fù)權(quán)重,記得在設(shè)置好AdamOptimizer之后設(shè)置Saver ,因?yàn)?ADAM 也有需要恢復(fù)的狀態(tài)(即每個權(quán)重的學(xué)習(xí)率)。

ReLU 是最好的非線性(激活函數(shù))。這有點(diǎn)像說 Sublime 是最好的文本編輯器。但實(shí)際上,ReLUs 是快速的、簡單的,而且令人驚訝的是,它們能夠工作,并且沒有梯度衰減的問題。雖然 sigmoid 是一種常見的教科書式激活函數(shù),但它不能很好地通過 DNNs 傳播梯度。

不要在輸出層使用激活函數(shù)。這應(yīng)該是顯而易見的,但這是一個很容易犯的錯誤,如果你用一個共享函數(shù)構(gòu)建每個層:一定要在輸出處關(guān)閉激活函數(shù)。

一定要在每一層添加一個偏差。這是 ML 101:偏差本質(zhì)上是將飛機(jī)轉(zhuǎn)換成最佳位置。在y=mx+b中,b 是偏差,允許直線向上或向下移動到“最合適”的位置。

使用 variance-scaled 初始化。在 Tensorflow 中,就像tf.contrib.layers.variance_scaling_initializer()。在我們的經(jīng)驗(yàn)中,這比常規(guī)的高斯分布、截?cái)嗟恼植己?Xavier 更能泛化/縮放。粗略地說, variance scaling 初始化根據(jù)每一層的輸入或輸出的數(shù)量來調(diào)整初始隨機(jī)權(quán)重的方差(TensorFlow 中的默認(rèn)值是輸入的數(shù)量),從而幫助信號更深入地傳播到網(wǎng)絡(luò)中,而不需要額外的“技巧”,比如 clipping 或 batch normalization。Xavier 是很相似的方法,但是 Xavier 的所有層的方差幾乎相同,在那些層的形狀變化很大的網(wǎng)絡(luò)(通常是卷積網(wǎng)絡(luò))中,可能不能很好地處理每一層相同的變化。

白化(歸一化)你的輸入數(shù)據(jù)。訓(xùn)練時,減去數(shù)據(jù)集的均值,然后除以其標(biāo)準(zhǔn)差。你需要向各個方向拉伸和拉伸的幅度越少,你的網(wǎng)絡(luò)學(xué)習(xí)就會越快、越容易。保持輸入數(shù)據(jù)的均值以不變的方差為中心有助于解決這個問題。你還必須對每個測試輸入執(zhí)行相同的標(biāo)準(zhǔn)化,因此要確保你的訓(xùn)練集與真實(shí)數(shù)據(jù)相似。

以合理保留其動態(tài)范圍的方式縮放輸入數(shù)據(jù)。這與歸一化有關(guān),但應(yīng)該在歸一化之前進(jìn)行。例如,實(shí)際范圍為[0,140000000]的數(shù)據(jù)“x”通??梢杂胻anh(x)或tanh(x/C)來處理,其中 C是某個常數(shù),它拉伸曲線以適應(yīng) tanh 函數(shù)動態(tài)的、傾斜的部分中的更多輸入范圍。特別是在輸入數(shù)據(jù)的一端或兩端可能是無界的情況下,神經(jīng)網(wǎng)絡(luò)在(0,1)之間可以更好地學(xué)習(xí)。

不要費(fèi)心降低學(xué)習(xí)速度(通常)。學(xué)習(xí)率下降在 SGD 中更為常見,但 ADAM 自然地處理了這個問題。如果你絕對想要榨干每一盎司的表現(xiàn):在訓(xùn)練結(jié)束后短時間內(nèi)降低學(xué)習(xí)速度,你可能會看到一個突然的,非常小的誤差下降,然后它會再次變平。

如果你的卷積層有 64 或 128 個濾波器,那可能就足夠了。特別是對于深度網(wǎng)絡(luò)。實(shí)際上,128 已經(jīng)很多了。如果你已經(jīng)有了大量的濾波器,那么添加更多的濾波器可能不會改善性能。

池化用于轉(zhuǎn)換不變性。池化本質(zhì)上是讓網(wǎng)絡(luò)學(xué)習(xí)圖像“那部分”的“大意”。例如,最大池可以幫助卷積網(wǎng)絡(luò)對圖像中特征的平移、旋轉(zhuǎn)和縮放變得健壯。

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

如果你的網(wǎng)絡(luò)沒有學(xué)習(xí)(意思是:在訓(xùn)練過程中,損失沒有收斂,或者你沒有得到你期望的結(jié)果),試試下面的建議:

過擬合!如果你的網(wǎng)絡(luò)沒有在學(xué)習(xí),首先要做的就是在單個數(shù)據(jù)樣本上讓網(wǎng)絡(luò)過擬合。這樣的話,準(zhǔn)確度應(yīng)該是 100%或 99.99%,或者接近于 0 的誤差。如果你的神經(jīng)網(wǎng)絡(luò)不能對單個數(shù)據(jù)點(diǎn)進(jìn)行過擬合,那么可能是體系結(jié)構(gòu)出現(xiàn)嚴(yán)重問題,但問題可能很微妙。如果你可以過擬合一個數(shù)據(jù)點(diǎn),但是在更大的集合上的訓(xùn)練仍然不收斂,請嘗試以下建議。

降低學(xué)習(xí)率。你的網(wǎng)絡(luò)學(xué)習(xí)速度會變慢,但它可能會進(jìn)入一個以前無法進(jìn)入的最小值,因?yàn)橹八牟介L太大了。(直覺上,當(dāng)你真正想進(jìn)入溝底時,你的錯誤是最低的,想象一下跨過路邊的水溝。)

提高學(xué)習(xí)率。這將加快訓(xùn)練,幫助收緊反饋回路,這意味著你會更早知道你的網(wǎng)絡(luò)是否在工作。雖然網(wǎng)絡(luò)應(yīng)該更快地收斂,但它的結(jié)果可能不會很好,而且“收斂”的過程實(shí)際上可能會跳來跳去。(使用 ADAM 的時候,我們發(fā)現(xiàn)~0.001 是一個非常好的值,在許多實(shí)驗(yàn)中都是這樣。)

減小 minibatch 大小。將 minibatch 大小減少到 1 可以提供與權(quán)重更新相關(guān)的更細(xì)粒度的反饋,你可以使用 TensorBoard(或其他調(diào)試/可視化工具)報(bào)告這些更新。

去掉 batch normalization。隨著批大小減少到 1,這樣做可以梯度消失或梯度爆炸。幾個星期以來,我們的網(wǎng)絡(luò)都沒有收斂,當(dāng)我們刪除了 batch normalization 之后,我們意識到在第二次迭代時輸出都是 NaN。Batch norm 的作用是給需要止血帶的東西貼上創(chuàng)可貼。它有它用的位置,但只有在你網(wǎng)絡(luò)是沒有 bug 的情況下才可以用。

增加 minibatch 大小。更大的 minibatch — 如果可以的話,使用整個訓(xùn)練集 — 減少梯度更新中的方差,使每次迭代更精確。換句話說,讓權(quán)重更新的方向是正確的。但是!它的有用性有一個有效的上限,物理內(nèi)存的限制。通常,我們發(fā)現(xiàn)這不如前兩個建議那么有用,這兩個建議將 minibatch 大小減少到 1 并刪除 batch normalization。

檢查一下 reshaping。劇烈的 reshaping(比如改變圖像的 X、Y 維度)會破壞空間的局部性,使得網(wǎng)絡(luò)更難學(xué)習(xí),因?yàn)樗脖仨殞W(xué)習(xí) reshaping。(自然景觀變得支離破碎。自然特征在空間上是局部的,這就是為什么 conv 網(wǎng)如此有效的原因。如果使用多個圖像/通道進(jìn)行 reshape,要特別小心,使用numpy.stack()進(jìn)行適當(dāng)?shù)膶R。

仔細(xì)檢查你的損失函數(shù)。如果使用復(fù)合函數(shù),嘗試將其簡化為 L1 或 L2。我們發(fā)現(xiàn) L1 對異常值的敏感度較低,當(dāng)遇到有噪聲的批處理或訓(xùn)練點(diǎn)時,L1 的調(diào)整幅度較小。

仔細(xì)檢查你的可視化效果,如果適用的話。你的可視化庫(matplotlib, OpenCV 等)是調(diào)整數(shù)值的比例,還是剪切它們?還可以考慮使用一種感覺上一致的配色方案。

用一個例子來學(xué)習(xí)一下

為了使上面描述的過程更接近實(shí)際,這里有一些損失圖(通過 TensorBoard 畫出來的),用于我們構(gòu)建的卷積神經(jīng)網(wǎng)絡(luò)的一些實(shí)際回歸實(shí)驗(yàn)。

起初,這個網(wǎng)絡(luò)根本沒有學(xué)習(xí):

構(gòu)建神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn)和教訓(xùn)總結(jié)

我們嘗試對值進(jìn)行 clipping,以防止它們超出界限:

構(gòu)建神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn)和教訓(xùn)總結(jié)

嗯??纯催@些沒做平滑的值有多瘋狂。學(xué)習(xí)率太高?我們試著降低學(xué)習(xí)速度,只對一個輸入進(jìn)行訓(xùn)練:

構(gòu)建神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn)和教訓(xùn)總結(jié)

你可以看到學(xué)習(xí)率的最初幾個變化發(fā)生在什么地方(大約在第 300 步和第 3000 步)。顯然,我們衰減得太快了。所以,在衰減之前給它更多的時間,它可以做得更好:

構(gòu)建神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn)和教訓(xùn)總結(jié)

你可以看到我們在 2000 步和 5000 步時衰減。這個更好,但仍然不是很好,因?yàn)樗鼪]有趨近于 0。

然后,我們禁用了學(xué)習(xí)率衰減,并嘗試將值移動到一個更窄的范圍內(nèi),不過不是通過輸入 tanh。雖然這明顯使錯誤值低于 1,但我們?nèi)匀徊荒苓^擬合訓(xùn)練集:

構(gòu)建神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn)和教訓(xùn)總結(jié)

通過刪除 batch normalization,我們發(fā)現(xiàn),在經(jīng)過一兩次迭代之后,網(wǎng)絡(luò)可以快速輸出 NaN。我們禁用了 batch normalization,并將初始化更改為 variance scaling。這些改變了一切!我們能夠過擬合我們的測試集,只是一個或兩個輸入。雖然底部的圖表蓋住了 Y 軸,但初始誤差值遠(yuǎn)遠(yuǎn)高于 5,表明誤差減少了近 4 個數(shù)量級:

構(gòu)建神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn)和教訓(xùn)總結(jié)

上面的圖表非常平滑,但是你可以看到它與測試輸入過擬合的速度非???,隨著時間的推移,整個訓(xùn)練集的損失降到了 0.01 以下。這并沒有降低學(xué)習(xí)率。在學(xué)習(xí)率下降一個數(shù)量級后,我們繼續(xù)訓(xùn)練,得到了更好的結(jié)果:

構(gòu)建神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn)和教訓(xùn)總結(jié)

這些結(jié)果好多了!但是如果我們以幾何的方式衰減學(xué)習(xí)率而不是把訓(xùn)練分成兩部分呢?

將每一步的學(xué)習(xí)率乘以 0.9995,結(jié)果并不好:

構(gòu)建神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn)和教訓(xùn)總結(jié)

大概是因?yàn)樗p太快了,乘數(shù)為 0.999995 的情況要好一些,但結(jié)果幾乎等于完全不衰減。我們從這個特殊的實(shí)驗(yàn)序列中得出結(jié)論,batch normalization 隱藏了糟糕的初始化所導(dǎo)致的急劇變化的梯度,降低學(xué)習(xí)率對 ADAM 優(yōu)化器并沒有特別的幫助,除了在最后可能會故意降低。與 batch normalization 一起,clipping 只是掩蓋了真正的問題。我們還通過將高方差輸入值放入 tanh 來處理它們。

我們希望隨著你對構(gòu)建深度神經(jīng)網(wǎng)絡(luò)越來越熟悉,你會發(fā)現(xiàn)這些基本技巧非常有用。通常,只是一些簡單的事情就能改變一切。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4777

    瀏覽量

    100973
  • ADAM
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    9811
收藏 0人收藏

    評論

    相關(guān)推薦

    如何構(gòu)建多層神經(jīng)網(wǎng)絡(luò)

    構(gòu)建多層神經(jīng)網(wǎng)絡(luò)(MLP, Multi-Layer Perceptron)模型是一個在機(jī)器學(xué)習(xí)和深度學(xué)習(xí)領(lǐng)域廣泛使用的技術(shù),尤其在處理分類和回歸問題時。在本文中,我們將深入探討如何從頭開始構(gòu)建一個多層
    的頭像 發(fā)表于 07-19 17:19 ?953次閱讀

    如何構(gòu)建三層bp神經(jīng)網(wǎng)絡(luò)模型

    能力。本文將介紹如何構(gòu)建三層BP神經(jīng)網(wǎng)絡(luò)模型。 神經(jīng)網(wǎng)絡(luò)基礎(chǔ)知識 2.1 神經(jīng)元模型 神經(jīng)元是神經(jīng)網(wǎng)絡(luò)
    的頭像 發(fā)表于 07-11 10:55 ?543次閱讀

    BP神經(jīng)網(wǎng)絡(luò)和人工神經(jīng)網(wǎng)絡(luò)的區(qū)別

    BP神經(jīng)網(wǎng)絡(luò)和人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Networks,簡稱ANNs)之間的關(guān)系與區(qū)別,是神經(jīng)網(wǎng)絡(luò)領(lǐng)域中一個基礎(chǔ)且重要的話題。本文將從定義、結(jié)構(gòu)、算法、應(yīng)用及未來發(fā)展等多個方面,詳細(xì)闡述BP
    的頭像 發(fā)表于 07-10 15:20 ?1218次閱讀

    PyTorch神經(jīng)網(wǎng)絡(luò)模型構(gòu)建過程

    PyTorch,作為一個廣泛使用的開源深度學(xué)習(xí)庫,提供了豐富的工具和模塊,幫助開發(fā)者構(gòu)建、訓(xùn)練和部署神經(jīng)網(wǎng)絡(luò)模型。在神經(jīng)網(wǎng)絡(luò)模型中,輸出層是尤為關(guān)鍵的部分,它負(fù)責(zé)將模型的預(yù)測結(jié)果以合適的形式輸出。以下將詳細(xì)解析PyTorch中
    的頭像 發(fā)表于 07-10 14:57 ?532次閱讀

    神經(jīng)網(wǎng)絡(luò)預(yù)測模型的構(gòu)建方法

    神經(jīng)網(wǎng)絡(luò)模型作為一種強(qiáng)大的預(yù)測工具,廣泛應(yīng)用于各種領(lǐng)域,如金融、醫(yī)療、交通等。本文將詳細(xì)介紹神經(jīng)網(wǎng)絡(luò)預(yù)測模型的構(gòu)建方法,包括模型設(shè)計(jì)、數(shù)據(jù)集準(zhǔn)備、模型訓(xùn)練、驗(yàn)證與評估等步驟,并附以代碼示例。
    的頭像 發(fā)表于 07-05 17:41 ?741次閱讀

    rnn是遞歸神經(jīng)網(wǎng)絡(luò)還是循環(huán)神經(jīng)網(wǎng)絡(luò)

    RNN(Recurrent Neural Network)是循環(huán)神經(jīng)網(wǎng)絡(luò),而非遞歸神經(jīng)網(wǎng)絡(luò)。循環(huán)神經(jīng)網(wǎng)絡(luò)是一種具有時間序列特性的神經(jīng)網(wǎng)絡(luò),能夠處理序列數(shù)據(jù),具有記憶功能。以下是關(guān)于循環(huán)
    的頭像 發(fā)表于 07-05 09:52 ?612次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)是循環(huán)神經(jīng)網(wǎng)絡(luò)

    遞歸神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,簡稱RNN)和循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,簡稱RNN)實(shí)際上是同一個概念,只是不同的翻譯方式
    的頭像 發(fā)表于 07-04 14:54 ?832次閱讀

    循環(huán)神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)的區(qū)別

    循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)和卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)是深度學(xué)習(xí)領(lǐng)域中兩種非常重要的神經(jīng)網(wǎng)絡(luò)
    的頭像 發(fā)表于 07-04 14:24 ?1410次閱讀

    深度神經(jīng)網(wǎng)絡(luò)與基本神經(jīng)網(wǎng)絡(luò)的區(qū)別

    在探討深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks, DNNs)與基本神經(jīng)網(wǎng)絡(luò)(通常指傳統(tǒng)神經(jīng)網(wǎng)絡(luò)或前向神經(jīng)網(wǎng)絡(luò))的區(qū)別時,我們需要從多個維度進(jìn)行深入分析。這些維度包括
    的頭像 發(fā)表于 07-04 13:20 ?1003次閱讀

    反向傳播神經(jīng)網(wǎng)絡(luò)和bp神經(jīng)網(wǎng)絡(luò)的區(qū)別

    反向傳播神經(jīng)網(wǎng)絡(luò)(Backpropagation Neural Network,簡稱BP神經(jīng)網(wǎng)絡(luò))是一種多層前饋神經(jīng)網(wǎng)絡(luò),它通過反向傳播算法來調(diào)整網(wǎng)絡(luò)中的權(quán)重和偏置,以達(dá)到最小化誤差的
    的頭像 發(fā)表于 07-03 11:00 ?845次閱讀

    bp神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)區(qū)別是什么

    BP神經(jīng)網(wǎng)絡(luò)(Backpropagation Neural Network)和卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,簡稱CNN)是兩種不同類型的人工神經(jīng)網(wǎng)絡(luò),它們在
    的頭像 發(fā)表于 07-03 10:12 ?1290次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)和bp神經(jīng)網(wǎng)絡(luò)的區(qū)別

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,簡稱CNN)和BP神經(jīng)網(wǎng)絡(luò)(Backpropagation Neural Networks,簡稱BPNN)是兩種
    的頭像 發(fā)表于 07-02 14:24 ?4530次閱讀

    使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)

    PyTorch是一個流行的深度學(xué)習(xí)框架,它以其簡潔的API和強(qiáng)大的靈活性在學(xué)術(shù)界和工業(yè)界得到了廣泛應(yīng)用。在本文中,我們將深入探討如何使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò),包括從基礎(chǔ)概念到高級特性的全面解析。本文旨在為讀者提供一個完整的、技術(shù)性的指南,幫助理解并實(shí)踐PyTorch
    的頭像 發(fā)表于 07-02 11:31 ?743次閱讀

    基于神經(jīng)網(wǎng)絡(luò)算法的模型構(gòu)建方法

    神經(jīng)網(wǎng)絡(luò)是一種強(qiáng)大的機(jī)器學(xué)習(xí)算法,廣泛應(yīng)用于各種領(lǐng)域,如圖像識別、自然語言處理、語音識別等。本文詳細(xì)介紹了基于神經(jīng)網(wǎng)絡(luò)算法的模型構(gòu)建方法,包括數(shù)據(jù)預(yù)處理、網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)、訓(xùn)練過程優(yōu)化、模
    的頭像 發(fā)表于 07-02 11:21 ?608次閱讀

    構(gòu)建神經(jīng)網(wǎng)絡(luò)模型方法有幾種

    構(gòu)建神經(jīng)網(wǎng)絡(luò)模型是深度學(xué)習(xí)領(lǐng)域的核心任務(wù)之一。本文將詳細(xì)介紹構(gòu)建神經(jīng)網(wǎng)絡(luò)模型的幾種方法,包括前饗神經(jīng)網(wǎng)絡(luò)、卷積
    的頭像 發(fā)表于 07-02 10:15 ?398次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品