神經網絡算法Batch Normalization的分析與展望 | 大牛講堂

2020-11-22 雷鋒網

雷鋒網(公眾號:雷鋒網)按:作者羅恆,地平線機器人技術資深算法研究員。2011年博士畢業於上海交通大學,後隨Yoshua Bengio從事博士後研究,2014年加入百度深度學習實驗室,參與深度學習在搜索中應用、PaddlePaddle研發等工作。2016年加入地平線機器人公司,負責深度學習模型壓縮與加速。

 

訓練更深的神經網絡近年來一直是深度學習領域的重要趨勢之一,2015年初Google提出的Batch Normalization 算法使得深層神經網絡訓練更加穩定,加快了收斂的速度,甚至同時起到了正則化的作用。本期羅老師將為大家分析Batch Normalization背後的動機和原理,以及後續的發展。

1.引言

現在正是神經網絡的第三次研究的熱潮,與之前兩次不同,這次神經網絡(深度學習)在很多實際問題上取得了巨大的成功,吸引了越來越多的人投身其中。剛開始接觸神經網絡的同學們,往往發現無從下手,有很多理論的文章,但是似乎對實際用處不大。談論最多的往往是各種各樣的tricks。

Batch Normalization [1] 是近年來最火爆的tricks之一,幾乎成了前向神經網絡的標配。在我看來,BN主要做的比較好的是在恰當的地方做標準化(Normalization),在矩陣乘之後,在激活之前;BN的參數和使得輸出仍舊保持一定的靈活性;為什麼這兩方面比較重要下面我會做些分析。最後我會簡單討論一些把BN應用到RNN的工作。

2. 升降桌和中心極限定理

在開始之前先來個廣告,地平線機器人最近搬家了,我發現所有的桌子都換成了電動升降桌,如下圖

 

前面的數字是桌面的高度,精確到毫米,那兩個三角可以調節升還是降,但是經常調完了之後出現「78.3」、「77.9」之類的數字,而我更喜歡整數「78」,我最常用的策略就是當接近78的時候,交替地(為了對符號均勻採樣)快速地按(力爭每次按擊獨立)上升、下降,很快數字就會停到了78。這是因為按照中心極限定理,我壓了一堆均值接近0的隨機數(+0.1, -0.2, +0.3之類的),那麼這些隨機數的累加和(桌子的最終高度)會服從正態分布,我會很大概率見到0,也就是整數的高度。這裡也就引出了今天介紹Batch Normalization的一個角度,一些隨機數的累加和很可能服從正態分布(Normal distribution),中心極限定理。

3. 神經網絡訓練困難的一個例子

廣告結束,言歸正傳。神經網絡很多年了,一個很大的困難在於比較難訓練。比較難訓練的一個可能原因在於,神經網絡高度冗餘,同一個函數我們可以找到很多很多參數不同的網絡來確切的等價於這個函數,而這些不同參數的網絡有的優化起來很容易,有的則非常困難。比如這樣一個函數,(這是個線性函數,裡面沒有非線性變換,主要是為了簡單。不過當我們用ReLU作為激活函數,當都是正的,當輸入也是正的,下面的分析也都可以保持正確),我們發現,和表達的函數完全一樣,但是當我們做sgd的時候後者的優化會變得十分困難。假如些X=1,損失函數傳來的梯度是(損失函數希望網絡能輸出個小的y),對於第二組參數代表的網絡求得的梯度為,如果拿這個去更新第二組參數,那麼數值小的參數改變巨大,大的參數則幾乎不變,訓練過程將會變得非常不穩定。

4. BN的動機和成功的原因

訓練神經網絡,通常是用反向傳播算法(BP)+隨機梯度下降(SGD),具體到一個具體的第L層連接神經元i和神經元j的參數的更新就是,通常我們會希望這個更新比較穩定。因此,首先有很多的工作在於選擇自適應的學習率,對於上面的例子如果我們能夠找到非常適合的各個參數大小不同的學習率,訓練過程依舊可以變得很穩定;其次,也有些tricks可以看做穩定從網絡上層回傳的錯誤,比如隨機shuffle訓練數據,當樣本不均衡時做些採樣;第三類工作則是穩定(其中,是某個非線性函數)。之前有過工作直接對來標準化,效果有限。BN的結果之所以更好,可能作對了兩個地方,第一,正像我們之前講的,一堆隨機數的和()更接近一個正態分布,在這個和上來做標準化更加容易使得通過非線性之後依然保持穩定,對於使用sigmoid非線性的時候,對於一個mini batch而言大概接近68%的值在[0.27 0.73]之間,95%的值在[0.12 0.88]之間,這當然很好,基本都在sigmoid函數的線性部分,不會出現飽和的情況(這裡的梯度不會接近0),這樣的好處就是訓練在一開始可以變得很快,如下圖。但是問題在於假如真的始終是接正態分布,那麼這些神經元就很難達到它的飽和區域。

 

BN的作者引入的可能是為了解決這個問題,但是我覺得可能很難,從的梯度可以看出,這個梯度可能會在一個mini batch內相互抵消,從而變得很小(有興趣的同學可以做實驗看看是不是會比較小)。當然也可能通過在開始初始化的時候把直接設成比較適合的值,不過這就是另一個問題了。從上圖也可以看出,似乎模型的在MNIST上也是underfitting,是否是上面說的原因呢?

不過BN的設計的背景本身就是為了很深的網絡+ReLU這類激活函數。換句話說是如何使得深層ReLU網絡在較大學習率的情況下訓練保持穩定。那麼我們在ReLU的情況下繼續討論,假設來自正態分布,標準化之後(0均值1方差),那麼總會有一半左右的數據通過ReLU之後為0,也就是說當前這個神經元對於後續的計算不在起作用了(但是還是會有關於這些樣本的梯度傳回)。BN的作者引入的可能是為了解決這個問題,從的梯度可以看出,如果有更多的錯誤傳來,則會變小,從而允許更多的樣本向上傳遞非零的信號。在訓練過程中把神經元的平均的非零可視化出來可能也會比較有意思。從這裡的分析,也可以看出來,BN網絡相對而言更加需要全局的徹底的隨機shuffle,如果沒有徹底的shuffle,幾條樣本總是出現在同一個mini batch中,那麼很可能有些樣本對於在經過標準化之後,在很多神經元的輸出總是零,從而難以將信號傳遞到頂層。這可能就是為什麼[1]提到增加了shuffle之後,結果在驗證集上有所變好。同時這也可能為什麼當使用了BN+隨機shuffle之後dropout的作用在下降的一個原因,因為數據隨機的組合,利用mini batch統計量標準化之後,對於特定樣本的特定神經元可能隨機地為0,那麼和dropout的機制有類似的地方。但是如果使用很大的mini batch又會如何呢?

除了上面提到的在適合的地方做標準化、使用和保持靈活性之外,BN把均值和方差的計算也看作整個運算的一部分(參與梯度的計算),從而避免了反向過程中梯度試圖改變均值和方差,然而前向過程的BN層又會取消梯度的這些企圖。

BN取得了很大的成功,同時也暗示了後來的研究方向:首先,梯度消失和爆炸在RNN中更為常見,如何應用BN到RNN;其次,如何克服BN對mini batch的大小敏感;第三如何統一訓練和測試過程等等。

5. 應用BN到RNN的一些工作

BN之後,很快就開始有一些工作嘗試在RNN中加入BN。首先我們來看RNN,,其中的激活函數常用的tanh。在[2]中先嘗試了直接加入BN,,結果不好,即使是在訓練集也會略差(直接加入BN後模型的優化、擬合都出了問題)。[2]又改為,overfitting(訓練集好,驗證集差)。我的理解在於和可能是很不同的正態分布,他們求和之後再做標準化,可能會有害處。[3]中進一步做了如下調整,,這樣將兩個不同的正態分布分別標準化再相加就合理多了。同時[3]中還有兩個tricks,第一,不再初始化為1而是初始化為比較小的數,如0.1。我估計這個可能和LSTM中大量的sigmoid和tanh有關(有興趣的同學可以自己分析看看);第二,不同的時間步t各自統計自己的mean和std,這個可能對於之前overfitting的一個回應,就是說工作[2]中overfitting的原因在於訓練的時候用來做標準化的統計量(每層每個mini batch計算得到)和測試的過程中使用的統計量(使用訓練中各層共享的、不斷地做moving avearge的統計量)顯著不同。

另外一個在RNN中做Normalization比較重要的工作是[4]。Layer Normalization與BN的機制似乎不太相同,這裡不展開分析了。LN除了可以作用在RNN之外,也可以用於前向全連接的網絡,論文也也給出了比較試驗,如下圖,


從右邊的圖可以看出太小的mini batch對於BN無論是在訓練的過程和測試過程中使用訓練過程統計的統計量都造成了危害。從左邊的圖則可以看出,由於LN是對每條樣本做標準化從而失去了上面討論的BN帶來的正則化效果。

參考文獻

[1] Sergey Ioffe and Christian Szegedy. Batch normalization: Accelerating deep network training by reducing internal covariate shift. ICML, 2015.

[2] Ce ́sar Laurent, Gabriel Pereyra, Phile ́mon Brakel, Ying Zhang, and Yoshua Bengio. Batch normalized recurrent neural networks. arXiv preprint arXiv:1510.01378, 2015.

[3] Tim Cooijmans, Nicolas Ballas, Ce ́sar Laurent, and Aaron Courville. Recurrent batch normalization. arXiv preprint arXiv:1603.09025, 2016.

[4] Ba, J. L., Kiros, J. R., and Hinton, G. E. (2016). Layer normalization. arXiv preprint arXiv:1607.06450.

END

本周四(17日)晚19:00-19:45,羅恆博士即將參與大牛直播間線上活動,在「大牛部落」微信群中,為大家在線解答技術問題,並與大家一起展望Batch Normalization的未來。可申請加入「大牛部落」,參加線上直播。

註:本文由大牛講堂發布雷鋒網,如需轉載請聯繫原作者,並註明作者和出處,不得刪減內容。有興趣可以關注公號【地平線機器人技術】,了解最新消息。

雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 神經網絡算法BatchNormalization的分析與展望|大牛講堂
    訓練更深的神經網絡近年來一直是深度學習領域的重要趨勢之一,2015年初Google提出的Batch Normalization 算法使得深層神經網絡訓練更加穩定,加快了收斂的速度,甚至同時起到了正則化的作用。本期羅老師將為大家分析Batch Normalization背後的動機和原理,以及後續的發展。
  • 批歸一化Batch Normalization的原理及算法
    ,最新的文獻算法很多都會引用這個算法,進行網絡訓練,可見其強大之處。Batch Gradient Descent使用多個梯度的均值來更新權重,用相對少的訓練次數遍歷完整個訓練集,也正是因為平均了多個樣本的梯度,許多樣本對神經網絡的貢獻就被其他樣本平均掉了,相當於在每個epoch中,訓練集的樣本數被縮小了。batch中每個樣本的差異性越大,這種弊端就越嚴重。
  • 人工智慧算法:訓練神經網絡中的批量歸一化(附代碼)
    Keras提供了一種順序API,用於以連續的方式堆疊神經網絡的各個層。以下是將要構成我們的神經網絡的各層信息。展平:採用輸入形狀,並將輸入圖像數據展平為一維數組。for variable in model.layers[2].variables: print(variable.name)>> batch_normalization/gamma:0>> batch_normalization/beta:0>> batch_normalization/moving_mean:0>
  • 神經網絡算法原理_神經網絡算法的應用_神經網絡算法實例說明
    神經網絡算法原理   由於神經網絡算法的設計面太大,我們此處暫且只分析Microsoft神經網絡算法的原理,在Microsoft神經網絡算法中,我們可以簡化成下面這個圖片:      神經網絡算法的應用   在網絡模型與算法研究的基礎上,利用人工神經網絡組成實際的應用系統,例如,完成某種信號處理或模式識別的功能、構作專家系統、製成機器人、複雜系統控制等等。   縱觀當代新興科學技術的發展歷史,人類在徵服宇宙空間、基本粒子,生命起源等科學技術領域的進程中歷經了崎嶇不平的道路。
  • 透徹分析批歸一化Batch Normalization強大作用
    在深度神經網絡訓練中,Batch Normalization有諸多非常強大的作用和效果:無論使用哪種激活功能或優化器,BN都可加快訓練過程並提高性能;解決梯度消失的問題;規範權重;優化網絡梯度流...等等。
  • 大牛講堂
    地平線《大牛講堂》有幸請到了世界著名計算機視覺和多媒體技術專家,微軟研究院視覺技術組高級研究員張正友博士,來與大家分享「基於幾何與Gabor小波的多層感知表情識別」和「基於特徵的識別」兩項面部表情識別技術。
  • 一文詳解神經網絡 BP 算法原理及 Python 實現
    所謂的鏈式求導法則,就是求複合函數的導數: 鏈式求導法則 放個例題,會更加明白一點: 鏈式求導的例子 神經網絡的結構 神經網絡由三部分組成,分別是最左邊的輸入層,隱藏層(實際應用中遠遠不止一層)和最右邊的輸出層。
  • Batch、Mini-batch和隨機梯度下降的區別和Python示例
    在梯度下降的三種類型(Batch梯度下降、Mini-batch梯度下降和隨機梯度下降)中,我應該使用哪一種呢?在這篇文章中,我們將了解這些概念之間的區別,並從梯度下降的代碼實現來闡明這些方法。梯度下降梯度下降是幫助神經網絡獲得正確的權重值和偏差值的最常見算法之一。梯度下降法(GD)是在每一步中最小化成本函數J(W,b)的一種算法。
  • 神經網絡初學者指南:基於Scikit-Learn的Python模塊
    ,其最新版本現在已經內置支持神經網絡模型。| 神經網絡神經網絡是一個試圖模仿自然生物神經網絡的學習模式的機器學習框架。 生物神經網絡具有相互連接的神經元,神經元帶有接受輸入信號的樹突,然後基於這些輸入,它們通過軸突向另一個神經元產生輸出信號。 我們將嘗試通過使用人工神經網絡(ANN)來模擬這個過程,我們現在將其稱為神經網絡。 創建神經網絡的過程從最基本的形式單個感知器開始。
  • 前沿| 利用遺傳算法優化神經網絡:Uber提出深度學習訓練新方式
    許多人認為,SGD 算法有效計算梯度的能力對於這種訓練能力而言至關重要。但是,Uber 近日發布的五篇論文表明,神經進化(neuroevolution)這種利用遺傳算法的神經網絡優化策略,也是訓練深度神經網絡解決強化學習(RL)問題的有效方法。
  • 大牛講堂 | 語音專題第二講,語言模型技術
    近年來提出的神經網絡語言模型技術,一定程度上解決了參數空間大,長距離依賴的問題。而且對於相似的詞,概率估計上自帶一定程度的平滑,從另一個角度解決了數據稀疏的問題。但是神經網絡語言模型的缺點是訓練時間長,實際應用中查詢速度較慢,需要結合硬體做加速。Ngram語言模型如上所說,Ngram語言模型是應用最常見的語言模型。
  • 理解Batch Normalization
    作者&編輯:李中梁   引言   上文   提過不要在神經網絡中使用dropout層,用BN層可以獲得更好的模型。
  • 地震去噪新探索——無監督卷積神經網絡實戰
    01 使用全連接神經網絡來處理降噪上一篇文章介紹了一個用全連接神經網絡去噪的案例。實現了把這樣的含有噪聲的圖像,如下圖。但最重要的原因是還是全連接神經網絡本來的局限性——對於細節較多的特徵學習能力有限。現在神經網絡發展日新月異,現在對細節學習能力較強的一類的結構就是卷積神經網絡。
  • 基於神經網絡算法 羊毛_基於pso算法和bp算法訓練神經網絡 - CSDN
    圖神經網絡是用於圖結構數據的深度學習架構,將端到端學習與歸納推理相結合,業界普遍認為其有望解決深度學習無法處理的因果推理、可解釋性等一系列瓶頸問題,是未來 3 到 5 年的重點方向。2019 年圖神經網絡有哪些研究成果值得關注?2020 年它又將朝什麼方向發展?讓我們一起來一探究竟。
  • 建神經網絡模型,哪種優化算法更好?35000次測試告訴你
    現在,最全面的優化算法分析來了。此外,它還給出了幾種基準測試方法,並用它分析了1344種可能的配置方案。在運行了35000次測試後,它給出了非常全面的優化器算法分析介紹,並告訴你如何用這些基準測試,為自己的深度學習模型選擇最好的優化方案。優化方法具體都有哪幾種?從下圖這份密密麻麻的圖表來看,迄今為止,提出的優化算法已經有130種左右。
  • 伯克利RISE實驗室大牛也在關注的深度學習庫評測
    背景及相關知識隨著深度學習技術的快速發展,人們針對不同的應用場合開發出各類深度神經網絡,包括全連接神經網絡(FCN)、卷積神經網絡(CNN)、循環神經網絡(RNN)、局限型波茲曼機(RBM)。此論文著重分析三種神經網絡(FCN、CNN和RNN)的運行性能(或時間速度)及收斂速度。
  • 入門| Tensorflow實戰講解神經網絡搭建詳細過程
    【IT168 技術】之前我們講了神經網絡的起源、單層神經網絡、多層神經網絡的搭建過程、搭建時要注意到的具體問題、以及解決這些問題的具體方法。本文將通過一個經典的案例:MNIST手寫數字識別,以代碼的形式來為大家梳理一遍神經網絡的整個過程。
  • 深度學習故障診斷方法:殘差收縮網絡
    殘差收縮網絡的工作原理,可以解釋為: 通過注意力機制注意到不重要的特徵,通過軟閾值函數將它們置為零;或者說,通過注意力機制注意到重要的特徵,將它們保留下來,加強深度神經網絡從含噪信號中提取有用特徵的能力 。1.為什麼要提出殘差收縮網絡呢?首先,在對樣本進行分類的時候,樣本中不可避免地會有一些噪聲,就像高斯噪聲、粉色噪聲、拉普拉斯噪聲等。
  • 神經網絡中的分類器該如何改成生成器?
    作者 | 李秋鍵責編 | 劉靜引言: 相信我們都做過一些圖片分類或者是其他分類的項目,我們知道神經網絡是在w和b參數調節基礎上,使得x與y達到對應輸出的效果。首先,引進判斷建模(常見建模還包括反對矢量機和多層人工神經網絡)。其次,其改進步驟是在分解建模和判斷建模兩者之間尋找沃克平衡。GAN創建的自學構建實質上是分解建模和判斷建模兩者之間的仿真博弈論。