0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

訓練神經(jīng)網(wǎng)絡的實踐技巧總結

電子工程師 ? 來源:未知 ? 作者:胡薇 ? 2018-09-24 09:14 ? 次閱讀

在經(jīng)歷成千上萬個小時機器學習訓練時間后,計算機并不是唯一學到很多東西的角色,作為開發(fā)者和訓練者的我們也犯了很多錯誤,修復了許多錯誤,從而積累了很多經(jīng)驗。在本文中,作者基于自己的經(jīng)驗(主要基于 TensorFlow)提出了一些訓練神經(jīng)網(wǎng)絡的建議,還結合了案例,可以說是過來人的實踐技巧了。

通用技巧

有些技巧對你來說可能就是明擺著的事,但在某些時候可能卻并非如此,也可能存在不適用的情況,甚至對你的特定任務來說,可能不是一個好的技巧,所以使用時需要務必要謹慎!

▌使用 ADAM 優(yōu)化器

確實很有效。與更傳統(tǒng)的優(yōu)化器相比,如 Vanilla 梯度下降法,我們更喜歡用ADAM優(yōu)化器。用 TensorFlow 時要注意:如果保存和恢復模型權重,請記住在設置完AdamOptimizer 后設置 Saver,因為 ADAM 也有需要恢復的狀態(tài)(即每個權重的學習率)。

▌ReLU 是最好的非線性(激活函數(shù))

就好比 Sublime 是最好的文本編輯器一樣。ReLU 快速、簡單,而且,令人驚訝的是,它們工作時,不會發(fā)生梯度遞減的情況。雖然 sigmoid 是常見的激活函數(shù)之一,但它并不能很好地在 DNN 進行傳播梯度。

▌不要在輸出層使用激活函數(shù)

這應該是顯而易見的道理,但如果使用共享函數(shù)構建每個層,那就很容易犯這樣的錯誤:所以請確保在輸出層不要使用激活函數(shù)。

▌請在每一個層添加一個偏差

這是 ML 的入門知識了:偏差本質上就是將平面轉換到最佳擬合位置。在 y=mx+b 中,b 是偏差,允許曲線上下移動到“最佳擬合”位置。

▌使用方差縮放(variance-scaled)初始化

在 Tensorflow 中,這看起來像tf.reemaner.variance_scaling_initializer()。根據(jù)我們的經(jīng)驗,這比常規(guī)的高斯函數(shù)、截尾正態(tài)分布(truncated normal)和 Xavier 能更好地泛化/縮放。

粗略地說,方差縮放初始化器根據(jù)每層的輸入或輸出數(shù)量(TensorFlow中的默認值是輸入數(shù)量)調(diào)整初始隨機權重的方差,從而有助于信號更深入地傳播到網(wǎng)絡中,而無須額外的裁剪或批量歸一化(batch normalization)。Xavier 與此相似,只是各層的方差幾乎相同;但是不同層形狀變化很大的網(wǎng)絡(在卷積網(wǎng)絡中很常見)可能不能很好地處理每層中的相同方差。

▌歸一化輸入數(shù)據(jù)

對于訓練,減去數(shù)據(jù)集的均值,然后除以它的標準差。在每個方向的權重越少,你的網(wǎng)絡就越容易學習。保持輸入數(shù)據(jù)以均值為中心且方差恒定有助于實現(xiàn)這一點。你還必須對每個測試輸入執(zhí)行相同的規(guī)范化,因此請確保你的訓練集與真實數(shù)據(jù)相似。

以合理保留其動態(tài)范圍的方式縮放輸入數(shù)據(jù)。這與歸一化有關,但應該在歸一化之前就進行。例如,真實世界范圍為 [0,140000000] 的數(shù)據(jù) x 通??梢杂?tanh(x) 或 tanh(x/C) 來控制,其中 C 是一些常數(shù),它可以拉伸曲線,以適應 tanh 函數(shù)緩坡部分的動態(tài)范圍內(nèi)的更多輸入范圍。特別是在輸入數(shù)據(jù)在一端或兩端可能不受限制的情況下,神經(jīng)網(wǎng)絡將在(0,1)之間學習得更好。

▌一般不用學習率衰減

學習率衰減在 SGD 中更為常見,但 ADAM 很自然地處理了這個問題。如果你真的想把每一分表現(xiàn)都擠出去:在訓練結束時短時間內(nèi)降低學習率;你可能會看到突然的、非常小的誤差下降,然后它會再次變平。

如果你的卷積層有 64 或 128 個過濾器,那就足夠了。特別是一個對于深度網(wǎng)絡而言。比如,128 個真的就已經(jīng)很多了。如果你已經(jīng)有了大量的過濾器,那么再添加更多的過濾器未必會進一步提高性能。

▌池化用于平移不變性

池化本質上就是讓網(wǎng)絡學習圖像“那部分”的“總體思路”。例如,最大池化可以幫助卷積網(wǎng)絡對圖像中的特征的平移、旋轉和縮放變得更加健壯。

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

如果你的網(wǎng)絡沒能很好地進行學習(指在訓練過程中損失/準確率沒有收斂,或者沒有得到預期的結果),那么可以試試以下的技巧:

▌過擬合

如果你的網(wǎng)絡沒有學習,那么首先要做的第一件事就是對訓練點進行過擬合。準確率基本上應為 100% 或 99.99%,或誤差接近 0。如果你的神經(jīng)網(wǎng)絡不能對單個數(shù)據(jù)點進行過擬合,那么體系架構就可能有嚴重的問題,但這可能是微妙的。如果你可以對一個數(shù)據(jù)點進行過擬合,但是對較大的集合進行訓練仍然無法收斂,請嘗試以下建議:

▌降低學習率

你的網(wǎng)絡學習就會變得更慢一些,但是它可能會找到以前無法進入的最小化的方式,因為它的步長太大了。

▌提高學習率

這樣做將會加快訓練,有助于收緊反饋,這意味著無論你的網(wǎng)絡是否正常工作,你都會很快地知道你的網(wǎng)絡是否有效。雖然網(wǎng)絡應該更快地收斂,但其結果可能不會很好,而且“收斂”實際上可能會跳來跳去。(對于 ADAM 優(yōu)化器,我們發(fā)現(xiàn)在很多經(jīng)歷中,學習率大約為 0.001 時,表現(xiàn)很不錯。)

▌減少批量處理規(guī)模

將批處理大小減小到 1,可以為你提供與權重更新相關的更細粒度的反饋,你應該使用TensorBoard(或其他一些調(diào)試/可視化工具)展示出來。

▌刪除批歸一化層

隨著批處理大小減少到 1,這樣做會暴露出梯度消失或梯度爆炸的問題。我們曾有過一個網(wǎng)絡,在好幾周都沒有收斂,當我們刪除了批歸一化層之后,我們才意識到第二次迭代時輸出都是 NaN。就像是創(chuàng)可貼上的吸水墊,它也有它可以發(fā)揮效果的地方,但前提是你知道網(wǎng)絡沒有 Bug。

▌增加批量處理的規(guī)模

一個更大的批處理規(guī)模,如果可以的話,整個訓練集減少梯度更新中的方差,使每個迭代更準確。換句話說,權重更新將朝著正確的方向發(fā)展。但是!它的可用性和物理內(nèi)存限制都有一個有效的上限。通常,我們發(fā)現(xiàn)這個建議不如上述兩個建議有用,可以將批處理規(guī)模減少到1并刪除批歸一化層。

▌檢查你的重構

大幅度的矩陣重構(如改變圖像的X、Y 維度)會破壞空間局部性,使網(wǎng)絡更難學習,因為它也必須學會重塑。(自然特征變得支離破碎。事實上,自然特征在空間上呈局部性,也是為什么卷積神經(jīng)網(wǎng)絡能如此有效的原因!)如果使用多個圖像/通道進行重塑,請?zhí)貏e小心;使用 numpi.stack()進行適當?shù)膶R操作。

▌仔細檢查你的損失函數(shù)

如果使用一個復雜的函數(shù),請嘗試將其簡化為 L1 或 L2。我們發(fā)現(xiàn)L1對異常值不那么敏感,在發(fā)出噪聲的批或訓練點時,不會做出太大的調(diào)整。

如果可以的話,仔細檢查你的可視化。你的可視化庫(matplotlib、OpenCV等)是調(diào)整值的比例呢,還是它們進行裁剪?可考慮使用一種視覺上均勻的配色方案。

實戰(zhàn)分析

為了使上面所描述的過程更容易讓讀者理解,我們這兒有一些用于描述我們構建的卷積神經(jīng)網(wǎng)絡的真實回歸實驗的損失圖(通過TesnorBoard)。

起初,這個網(wǎng)絡根本沒有學習:

我們試圖裁剪這些值,以防止它們超出界限:

嗯??纯床黄交闹涤卸喁偪癜?!學習率是不是太高了?我們試著在一個輸入數(shù)據(jù)上降低學習率并進行訓練:

你可以看到學習率的前幾個變化發(fā)生的位置(大約在 300 步和 3000 步)。顯然,我們衰減得太快了。所以,給它更多的衰減時間,它表現(xiàn)得會更好:

你可以看到我們在 2000 步和 5000 步的時候衰減了。這樣更好一些了,但還不夠好,因為它沒有趨于 0。

然后我們禁用了 LR 衰減,并嘗試將值移動到更窄的范圍內(nèi),而不是通過 tanh 輸入。雖然這顯然使誤差值小于 1,但我們?nèi)匀徊荒軐τ柧毤M行過擬合:

這里我們發(fā)現(xiàn),通過刪除批歸一化層,網(wǎng)絡在一到兩次迭代之后迅速輸出 NaN。我們禁用了批歸一化,并將初始化更改為方差縮放。這些改變了一切!我們能夠對只有一兩個輸入的測試集進行過擬合了。當?shù)撞康膱D標裁剪Y軸時,初始誤差值遠高于 5,表明誤差減少了近 4 個數(shù)量級:

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

這些結果好得多了!但是,如果我們以幾何方式降低學習率,而不是將訓練分成兩部分,會發(fā)生什么樣的結果呢?

通過在每一步將學習率乘以 0.9995,結果就不那么好了:

大概是因為學習率衰減太快了吧。乘數(shù)為 0.999995 會表現(xiàn)的更好,但結果幾乎相當于完全沒有衰減。我們從這個特定的實驗序列中得出結論,批歸一化隱藏了由槽糕的初始化引起的爆炸梯度,并且 ADAM 優(yōu)化器對學習率的衰減并沒有什么特別的幫助,與批歸一化一樣,裁剪值只是掩蓋了真正的問題。我們還通過 tanh 來控制高方差輸入值。

我們希望,本文提到的這些基本技巧能夠在你構建深度神經(jīng)網(wǎng)絡時有所幫助。通常,正式因為簡單的事情才改變了這一切。

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

    關注

    42

    文章

    4774

    瀏覽量

    100894
  • ADAM
    +關注

    關注

    0

    文章

    13

    瀏覽量

    9810

原文標題:一位ML工程師構建深度神經(jīng)網(wǎng)絡的實用技巧

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    相關推薦

    人工神經(jīng)網(wǎng)絡原理及下載

    這個網(wǎng)絡輸入和相應的輸出來“訓練”這個網(wǎng)絡,網(wǎng)絡根據(jù)輸入和輸出不斷地調(diào)節(jié)自己的各節(jié)點之間的權值來滿足輸入和輸出。這樣,當訓練結束后,我們給定
    發(fā)表于 06-19 14:40

    訓練好的神經(jīng)網(wǎng)絡用于應用的時候,權值是不是不能變了?

    訓練好的神經(jīng)網(wǎng)絡用于應用的時候,權值是不是不能變了????就是已經(jīng)訓練好的神經(jīng)網(wǎng)絡是不是相當于得到一個公式了,權值不能變了
    發(fā)表于 10-24 21:55

    請問Labveiw如何調(diào)用matlab訓練好的神經(jīng)網(wǎng)絡模型呢?

    我在matlab中訓練好了一個神經(jīng)網(wǎng)絡模型,想在labview中調(diào)用,請問應該怎么做呢?或者labview有自己的神經(jīng)網(wǎng)絡工具包嗎?
    發(fā)表于 07-05 17:32

    【案例分享】ART神經(jīng)網(wǎng)絡與SOM神經(jīng)網(wǎng)絡

    元,它決定了該輸入向量在地位空間中的位置。SOM神經(jīng)網(wǎng)絡訓練的目的就是為每個輸出層神經(jīng)元找到合適的權向量,以達到保持拓撲結構的目的。SOM的訓練過程其實很簡單,就是接收到一個
    發(fā)表于 07-21 04:30

    解析深度學習:卷積神經(jīng)網(wǎng)絡原理與視覺實踐

    解析深度學習:卷積神經(jīng)網(wǎng)絡原理與視覺實踐
    發(fā)表于 06-14 22:21

    【AI學習】第3篇--人工神經(jīng)網(wǎng)絡

    `本篇主要介紹:人工神經(jīng)網(wǎng)絡的起源、簡單神經(jīng)網(wǎng)絡模型、更多神經(jīng)網(wǎng)絡模型、機器學習的步驟:訓練與預測、訓練的兩階段:正向推演與反向傳播、以Te
    發(fā)表于 11-05 17:48

    基于光學芯片的神經(jīng)網(wǎng)絡訓練解析,不看肯定后悔

    基于光學芯片的神經(jīng)網(wǎng)絡訓練解析,不看肯定后悔
    發(fā)表于 06-21 06:33

    matlab實現(xiàn)神經(jīng)網(wǎng)絡 精選資料分享

    神經(jīng)神經(jīng)網(wǎng)絡,對于神經(jīng)網(wǎng)絡的實現(xiàn)是如何一直沒有具體實現(xiàn)一下:現(xiàn)看到一個簡單的神經(jīng)網(wǎng)絡模型用于訓練的輸入數(shù)據(jù):對應的輸出數(shù)據(jù):我們這里設置:
    發(fā)表于 08-18 07:25

    優(yōu)化神經(jīng)網(wǎng)絡訓練方法有哪些?

    優(yōu)化神經(jīng)網(wǎng)絡訓練方法有哪些?
    發(fā)表于 09-06 09:52

    如何進行高效的時序圖神經(jīng)網(wǎng)絡訓練

    現(xiàn)有的圖數(shù)據(jù)規(guī)模極大,導致時序圖神經(jīng)網(wǎng)絡訓練需要格外長的時間,因此使用多GPU進行訓練變得成為尤為重要,如何有效地將多GPU用于時序圖神經(jīng)網(wǎng)絡訓練
    發(fā)表于 09-28 10:37

    Kaggle知識點:訓練神經(jīng)網(wǎng)絡的7個技巧

    科學神經(jīng)網(wǎng)絡模型使用隨機梯度下降進行訓練,模型權重使用反向傳播算法進行更新。通過訓練神經(jīng)網(wǎng)絡模型解決的優(yōu)化問題非常具有挑戰(zhàn)性,盡管這些算法在實踐
    的頭像 發(fā)表于 12-30 08:27 ?668次閱讀
    Kaggle知識點:<b class='flag-5'>訓練</b><b class='flag-5'>神經(jīng)網(wǎng)絡</b>的7個技巧

    如何訓練和優(yōu)化神經(jīng)網(wǎng)絡

    神經(jīng)網(wǎng)絡是人工智能領域的重要分支,廣泛應用于圖像識別、自然語言處理、語音識別等多個領域。然而,要使神經(jīng)網(wǎng)絡在實際應用中取得良好效果,必須進行有效的訓練和優(yōu)化。本文將從神經(jīng)網(wǎng)絡
    的頭像 發(fā)表于 07-01 14:14 ?489次閱讀

    卷積神經(jīng)網(wǎng)絡訓練的是什么

    訓練過程以及應用場景。 1. 卷積神經(jīng)網(wǎng)絡的基本概念 1.1 卷積神經(jīng)網(wǎng)絡的定義 卷積神經(jīng)網(wǎng)絡是一種前饋深度學習模型,其核心思想是利用卷積操作提取輸入數(shù)據(jù)的局部特征,并通過多層結構進
    的頭像 發(fā)表于 07-03 09:15 ?439次閱讀

    怎么對神經(jīng)網(wǎng)絡重新訓練

    重新訓練神經(jīng)網(wǎng)絡是一個復雜的過程,涉及到多個步驟和考慮因素。 引言 神經(jīng)網(wǎng)絡是一種強大的機器學習模型,廣泛應用于圖像識別、自然語言處理、語音識別等領域。然而,隨著時間的推移,數(shù)據(jù)分布可能會
    的頭像 發(fā)表于 07-11 10:25 ?474次閱讀

    脈沖神經(jīng)網(wǎng)絡怎么訓練

    脈沖神經(jīng)網(wǎng)絡(SNN, Spiking Neural Network)的訓練是一個復雜但充滿挑戰(zhàn)的過程,它模擬了生物神經(jīng)元通過脈沖(或稱為尖峰)進行信息傳遞的方式。以下是對脈沖神經(jīng)網(wǎng)絡
    的頭像 發(fā)表于 07-12 10:13 ?651次閱讀