作者: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輸入的數據都具有不同的分布,顯然會給網絡的訓練帶來困難。另一方面,數據經過一層層網絡計算后,其數據分布也在發生着變化,此現象稱為InternalInternalInternal CovariateCovariateCovariate ShiftShiftShift,接下來會詳細解釋,會給下一層的網絡學習帶來困難。batchnormbatchnormbatchnorm直譯過來就是批規范化,就是為了解決這個分布變化問題。
1.1 Internal Covariate Shift
Internal Covariate Shift :此術語是google小組在論文BatchBatchBatch NormalizatoinNormalizatoinNormalizatoin 中提出來的,其主要描述的是:訓練深度網絡的時候經常發生訓練困難的問題,因為,每一次參數迭代更新后,上一層網絡的輸出數據經過這一層網絡計算后,數據的分布會發生變化,為下一層網絡的學習帶來困難(神經網絡本來就是要學習數據的分布,要是分布一直在變,學習就很難了),此現象稱之為InternalInternalInternal CovariateCovariateCovariate ShiftShiftShift。
Batch Normalizatoin 之前的解決方案就是使用較小的學習率,和小心的初始化參數,對數據做白化處理,但是顯然治標不治本。
1.2 covariate shift
Internal Covariate Shift 和CovariateShift具有相似性,但並不是一個東西,前者發生在神經網絡的內部,所以是Internal,后者發生在輸入數據上。Covariate Shift主要描述的是由於訓練數據和測試數據存在分布的差異性,給網絡的泛化性和訓練速度帶來了影響,我們經常使用的方法是做歸一化或者白化。想要直觀感受的話,看下圖:
Covariate Shift 就是描述的輸入數據分布不一致的現象,對數據做歸一化當然可以加快訓練速度,能對數據做去相關性,突出它們之間的分布相對差異就更好了。Batchnorm做到了,前文已說過,Batchnorm是歸一化的一種手段,極限來說,這種方式會減小圖像之間的絕對差異,突出相對差異,加快訓練速度。所以說,並不是在深度學習的所有領域都可以使用BatchNorm,下文會寫到其不適用的情況。
第二節:Batchnorm 原理解讀
本部分主要結合原論文部分,排除一些復雜的數學公式,對BatchNorm的原理做盡可能詳細的解釋。
之前就說過,為了減小Internal Covariate Shift,對神經網絡的每一層做歸一化不就可以了,假設將每一層輸出后的數據都歸一化到0均值,1方差,滿足正太分布,但是,此時有一個問題,每一層的數據分布都是標准正太分布,導致其完全學習不到輸入數據的特征,因為,費勁心思學習到的特征分布被歸一化了,因此,直接對每一層做歸一化顯然是不合理的。
但是如果稍作修改,加入可訓練的參數做歸一化,那就是BatchNorm實現的了,接下來結合下圖的偽代碼做詳細的分析:
之所以稱之為batchnorm是因為所norm的數據是一個batch的,
1.先求出此次批量數據xxx的均值
2.求出此次batch的方差
3.接下來就是對xxx做歸一化