深度學習中 batchnorm 層是咋回事?


作者:Double_V_ 來源:CSDN 原文:https://blog.csdn.net/qq_25737169/article/details/79048516 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

作者:Double_V_ 來源:CSDN 原文:https://blog.csdn.net/qq_25737169/article/details/79048516 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

作者:Double_V_ 來源:CSDN 原文:https://blog.csdn.net/qq_25737169/article/details/79048516 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

作者:Double_V_ 來源:CSDN 原文:https://blog.csdn.net/qq_25737169/article/details/79048516 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

參考了這個博客, 博主寫的非常好     https://blog.csdn.net/qq_25737169/article/details/79048516

 

前言:Batchnorm是深度網絡中經常用到的加速神經網絡訓練,加速收斂速度及穩定性的算法,可以說是目前深度網絡必不可少的一部分。
本文旨在用通俗易懂的語言,對深度學習的常用算法–batchnorm的原理及其代碼實現做一個詳細的解讀。本文主要包括以下幾個部分。

 

第一節:Batchnorm主要解決的問題


首先,此部分也即是講為什么深度網絡會需要batchnormbatchnormbatchnorm,我們都知道,深度學習的話尤其是在CV上都需要對數據做歸一化,因為深度神經網絡主要就是為了學習訓練數據的分布,並在測試集上達到很好的泛化效果,但是,如果我們每一個batch輸入的數據都具有不同的分布,顯然會給網絡的訓練帶來困難。另一方面,數據經過一層層網絡計算后,其數據分布也在發生着變化,此現象稱為InternalInternalInternaCovariateCovariateCovariatShiftShiftShift,接下來會詳細解釋,會給下一層的網絡學習帶來困難。batchnormbatchnormbatchnorm直譯過來就是批規范化,就是為了解決這個分布變化問題。

1.1 Internal Covariate Shift

InternaCovariatShift :此術語是google小組在論文BatchBatchBatcNormalizatoinNormalizatoinNormalizatoin 中提出來的,其主要描述的是:訓練深度網絡的時候經常發生訓練困難的問題,因為,每一次參數迭代更新后,上一層網絡的輸出數據經過這一層網絡計算后,數據的分布會發生變化,為下一層網絡的學習帶來困難(神經網絡本來就是要學習數據的分布,要是分布一直在變,學習就很難了),此現象稱之為InternalInternalInternaCovariateCovariateCovariatShiftShiftShift。

BatcNormalizatoin 之前的解決方案就是使用較小的學習率,和小心的初始化參數,對數據做白化處理,但是顯然治標不治本。

1.2 covariate shift

InternaCovariatShift 和CovariateShift具有相似性,但並不是一個東西,前者發生在神經網絡的內部,所以是Internal,后者發生在輸入數據上。CovariatShift主要描述的是由於訓練數據和測試數據存在分布的差異性,給網絡的泛化性和訓練速度帶來了影響,我們經常使用的方法是做歸一化或者白化。想要直觀感受的話,看下圖:

 

Covariate Shift 就是描述的輸入數據分布不一致的現象,對數據做歸一化當然可以加快訓練速度,能對數據做去相關性,突出它們之間的分布相對差異就更好了。Batchnorm做到了,前文已說過,Batchnorm是歸一化的一種手段,極限來說,這種方式會減小圖像之間的絕對差異,突出相對差異,加快訓練速度。所以說,並不是在深度學習的所有領域都可以使用BatchNorm,下文會寫到其不適用的情況。

第二節:Batchnorm 原理解讀


本部分主要結合原論文部分,排除一些復雜的數學公式,對BatchNorm的原理做盡可能詳細的解釋。

之前就說過,為了減小InternaCovariatShift,對神經網絡的每一層做歸一化不就可以了,假設將每一層輸出后的數據都歸一化到0均值,1方差,滿足正太分布,但是,此時有一個問題,每一層的數據分布都是標准正太分布,導致其完全學習不到輸入數據的特征,因為,費勁心思學習到的特征分布被歸一化了,因此,直接對每一層做歸一化顯然是不合理的。
但是如果稍作修改,加入可訓練的參數做歸一化,那就是BatchNorm實現的了,接下來結合下圖的偽代碼做詳細的分析:
這里寫圖片描述

之所以稱之為batchnorm是因為所norm的數據是一個batch的,

1.先求出此次批量數據xxx的均值
2.求出此次batch的方差
3.接下來就是對xxx做歸一化
4.最重要的一步,引入縮放和平移變量 ,計算歸一化后的值

接下來詳細介紹一下這額外的兩個參數,之前也說過如果直接做歸一化不做其他處理,神經網絡是學不到任何東西的,但是加入這兩個參數后,事情就不一樣了,先考慮特殊情況下,如果γ和β分別等於此batch的標准差和均值,那么yi不就還原到歸一化前的x了嗎,也即是縮放平移到了歸一化前的分布,相當於batchnormbatchnormbatchnorm沒有起作用,$ β$ 和γγγ分別稱之為 平移參數和縮放參數 。這樣就保證了每一次數據經過歸一化后還保留的有學習來的特征,同時又能完成歸一化這個操作,加速訓練。

 

第四節:Batchnorm的優點

主要部分說完了,接下來對BatchNorm做一個總結:

  • 沒有它之前,需要小心的調整學習率和權重初始化,但是有了BN可以放心的使用大學習率,但是使用了BN,就不用小心的調參了,較大的學習率極大的提高了學習速度,
  • Batchnorm本身上也是一種正則的方式,可以代替其他正則方式如dropout等
  • 另外,個人認為,batchnorm降低了數據之間的絕對差異,有一個去相關的性質,更多的考慮相對差異性,因此在分類任務上具有更好的效果。

注:或許大家都知道了,韓國團隊在2017NTIRE圖像超分辨率中取得了top1的成績,主要原因竟是去掉了網絡中的batchnorm層,由此可見,BN並不是適用於所有任務的,在image-to-image這樣的任務中,尤其是超分辨率上,圖像的絕對差異顯得尤為重要,所以batchnorm的scale並不適合。

 

作者:Double_V_ 來源:CSDN 原文:https://blog.csdn.net/qq_25737169/article/details/79048516 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM