0、問題數組
機器學習領域有個很重要的假設:IID獨立同分布假設,就是假設訓練數據和測試數據是知足相同分佈的,這是經過訓練數據得到的模型可以在測試集得到好的效果的一個基本保障。那BatchNorm的做用是什麼呢?BatchNorm就是在深度神經網絡訓練過程當中使得每一層神經網絡的輸入保持相同分佈的。網絡
思考一個問題:爲何傳統的神經網絡在訓練開始以前,要對輸入的數據作Normalization?緣由在於神經網絡學習過程本質上是爲了學習數據的分佈,一旦訓練數據與測試數據的分佈不一樣,那麼網絡的泛化能力也大大下降;另外一方面,一旦在mini-batch梯度降低訓練的時候,每批訓練數據的分佈不相同,那麼網絡就要在每次迭代的時候去學習以適應不一樣的分佈,這樣將會大大下降網絡的訓練速度,這也正是爲何咱們須要對全部訓練數據作一個Normalization預處理的緣由。機器學習
爲何深度神經網絡隨着網絡深度加深,訓練起來越困難,收斂愈來愈慢?這是個在DL領域很接近本質的好問題。不少論文都是解決這個問題的,好比ReLU激活函數,再好比Residual Network,BN本質上也是解釋並從某個不一樣的角度來解決這個問題的。函數
一、「Internal Covariate Shift」問題學習
從論文名字能夠看出,BN是用來解決「Internal Covariate Shift」問題的,那麼首先得理解什麼是「Internal Covariate Shift」?測試
論文首先說明Mini-Batch SGD相對於One Example SGD的兩個優點:梯度更新方向更準確;並行計算速度快;(爲何要說這些?由於BatchNorm是基於Mini-Batch SGD的,因此先誇下Mini-Batch SGD,固然也是大實話);而後吐槽下SGD訓練的缺點:超參數調起來很麻煩。(做者隱含意思是用BN就能解決不少SGD的缺點)spa
接着引入covariate shift的概念:若是ML系統實例集合<X,Y>中的輸入值X的分佈總是變,這不符合IID假設,網絡模型很難穩定的學規律,這不得引入遷移學習才能搞定嗎,咱們的ML系統還得去學習怎麼迎合這種分佈變化啊。對於深度學習這種包含不少隱層的網絡結構,在訓練過程當中,由於各層參數不停在變化,因此每一個隱層都會面臨covariate shift的問題,也就是在訓練過程當中,隱層的輸入分佈總是變來變去,這就是所謂的「Internal Covariate Shift」,Internal指的是深層網絡的隱層,是發生在網絡內部的事情,而不是covariate shift問題只發生在輸入層。orm
而後提出了BatchNorm的基本思想:能不能讓每一個隱層節點的激活輸入分佈固定下來呢?這樣就避免了「Internal Covariate Shift」問題了,順帶解決反向傳播中梯度消失問題。BN 其實就是在作 feature scaling,並且它的目的也是爲了在訓練的時候避免這種 Internal Covariate Shift 的問題,只是恰好也解決了 sigmoid 函數梯度消失的問題。blog
BN不是憑空拍腦殼拍出來的好點子,它是有啓發來源的:以前的研究代表若是在圖像處理中對輸入圖像進行白化(Whiten)操做的話——所謂白化,就是對輸入數據分佈變換到0均值,單位方差的正態分佈——那麼神經網絡會較快收斂,那麼BN做者就開始推論了:圖像是深度神經網絡的輸入層,作白化能加快收斂,那麼其實對於深度網絡來講,其中某個隱層的神經元是下一層的輸入,意思是其實深度神經網絡的每個隱層都是輸入層,不過是相對下一層來講而已,那麼能不能對每一個隱層都作白化呢?這就是啓發BN產生的原初想法,而BN也確實就是這麼作的,能夠理解爲對深層神經網絡每一個隱層神經元的激活值作簡化版本的白化操做。深度學習
二、BatchNorm的本質思想
BN的基本思想其實至關直觀:由於深層神經網絡在作非線性變換前的激活輸入值(就是那個x=WU+B,U是輸入)隨着網絡深度加深或者在訓練過程當中,其分佈逐漸發生偏移或者變更,之因此訓練收斂慢,通常是總體分佈逐漸往非線性函數的取值區間的上下限兩端靠近(對於Sigmoid函數來講,意味着激活輸入值WU+B是大的負值或正值),因此這致使反向傳播時低層神經網絡的梯度消失,這是訓練深層神經網絡收斂愈來愈慢的本質緣由,而BN就是經過必定的規範化手段,把每層神經網絡任意神經元這個輸入值的分佈強行拉回到均值爲0方差爲1的標準正態分佈,其實就是把愈來愈偏的分佈強制拉回比較標準的分佈,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會致使損失函數較大的變化,意思是這樣讓梯度變大,避免梯度消失問題產生,並且梯度變大意味着學習收斂速度快,能大大加快訓練速度。
THAT’S IT。其實一句話就是:對於每一個隱層神經元,把逐漸向非線性函數映射後向取值區間極限飽和區靠攏的輸入分佈強制拉回到均值爲0方差爲1的比較標準的正態分佈,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,以此避免梯度消失問題。由於梯度一直都能保持比較大的狀態,因此很明顯對神經網絡的參數調整效率比較高,就是變更大,就是說向損失函數最優值邁動的步子大,也就是說收斂地快。BN說到底就是這麼個機制,方法很簡單,道理很深入。
從上面幾個圖應該看出來BN在幹什麼了吧?其實就是把隱層神經元激活輸入x=WU+B從變化不拘一格的正態分佈經過BN操做拉回到了均值爲0,方差爲1的正態分佈,即原始正態分佈中心左移或者右移到以0爲均值,拉伸或者縮減形態造成以1爲方差的圖形。什麼意思?就是說通過BN後,目前大部分Activation的值落入非線性函數的線性區內,其對應的導數遠離導數飽和區,這樣來加速訓練收斂過程。
可是很明顯,看到這裏,稍微瞭解神經網絡的讀者通常會提出一個疑問:若是都經過BN,那麼不就跟把非線性函數替換成線性函數效果相同了?這意味着什麼?咱們知道,若是是多層的線性函數變換其實這個深層是沒有意義的,由於多層線性網絡跟一層線性網絡是等價的。這意味着網絡的表達能力降低了,這也意味着深度的意義就沒有了。因此BN爲了保證非線性的得到,對變換後的知足均值爲0方差爲1的x又進行了scale加上shift操做(y=scale*x+shift),每一個神經元增長了兩個參數scale和shift參數,這兩個參數是經過訓練學習到的,意思是經過scale和shift把這個值從標準正態分佈左移或者右移一點並長胖一點或者變瘦一點,每一個實例挪動的程度不同,這樣等價於非線性函數的值從正中心周圍的線性區往非線性區動了動。
核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網絡收斂速度太慢。固然,這是個人理解,論文做者並未明確這樣說。可是很明顯這裏的scale和shift操做是會有爭議的,由於按照論文做者論文裏寫的理想狀態,就會又經過scale和shift操做把變換後的x調整回未變換的狀態,那不是饒了一圈又繞回去原始的「Internal Covariate Shift」問題裏去了嗎,感受論文做者並未可以清楚地解釋scale和shift操做的理論緣由。
對於Mini-Batch SGD來講,一次訓練過程裏面包含m個訓練實例,其具體BN操做就是對於隱層內每一個神經元的激活值來講,進行以下變換:
要注意,這裏t層某個神經元的x(k)不是指原始輸入,就是說不是t-1層每一個神經元的輸出,而是t層這個神經元的線性激活x=WU+B,這裏的U纔是t-1層神經元的輸出。變換的意思是:某個神經元對應的原始的激活x經過減去mini-Batch內m個實例得到的m個激活x求得的均值E(x)併除以求得的方差Var(x)來進行轉換。
上文說過通過這個變換後某個神經元的激活x造成了均值爲0,方差爲1的正態分佈,目的是把值日後續要進行的非線性變換的線性區拉動,增大導數值,加強反向傳播信息流動性,加快訓練收斂速度。可是這樣會致使網絡表達能力降低,爲了防止這一點,每一個神經元增長兩個調節參數(scale和shift),這兩個參數是經過訓練來學習到的,用來對變換後的激活反變換,使得網絡表達能力加強,即對變換後的激活進行以下的scale和shift操做,這實際上是變換的反操做:
BN其具體操做流程,如論文中描述的同樣:
走一遍Batch Normalization網絡層的前向傳播過程。
四、BatchNorm的推理(Inference)過程
BN在訓練的時候能夠根據Mini-Batch裏的若干訓練實例進行激活數值調整,可是在推理(inference)的過程當中,很明顯輸入就只有一個實例,看不到Mini-Batch其它實例,那麼這時候怎麼對輸入作BN呢?由於很明顯一個實例是無法算實例集合求出的均值和方差的。這可如何是好?既然沒有從Mini-Batch數據裏能夠獲得的統計量,那就想其它辦法來得到這個統計量,就是均值和方差。能夠用從全部訓練實例中得到的統計量來代替Mini-Batch裏面m個訓練實例得到的均值和方差統計量,由於原本就打算用全局的統計量,只是由於計算量等太大因此纔會用Mini-Batch這種簡化方式的,那麼在推理的時候直接用全局統計量便可。
決定了得到統計量的數據範圍,那麼接下來的問題是如何得到均值和方差的問題。很簡單,由於每次作Mini-Batch訓練時,都會有那個Mini-Batch裏m個訓練實例得到的均值和方差,如今要全局統計量,只要把每一個Mini-Batch的均值和方差統計量記住,而後對這些均值和方差求其對應的數學指望便可得出全局統計量
五、BatchNorm的好處
BatchNorm爲何NB呢,關鍵仍是效果好。
①不只僅極大提高了訓練速度,收斂過程大大加快;
②還能增長分類效果,一種解釋是這是相似於Dropout的一種防止過擬合的正則化表達方式,因此不用Dropout也能達到至關的效果;
③另外調參過程也簡單多了,對於初始化要求沒那麼高,並且可使用大的學習率等。
總而言之,通過這麼簡單的變換,帶來的好處多得很,這也是爲什麼如今BN這麼快流行起來的緣由。
六、tensorflow中的BN
爲了activation能更有效地使用輸入信息,因此通常BN放在激活函數以前。
一個batch裏的128個圖,通過一個64 kernels卷積層處理,獲得了128×64個圖,再針對每個kernel所對應的128個圖,求它們全部像素的mean和variance,由於總共有64個kernels,輸出的結果就是一個一維長度64的數組啦!最後輸出是(64,)的數組向量。
參考文獻:郭耀華博客:https://cloud.tencent.com/developer/article/1157136
https://zhuanlan.zhihu.com/p/36222443