1. 程式人生 > >Batch normalization:accelerating deep network training by reducing internal covariate shift的筆記

Batch normalization:accelerating deep network training by reducing internal covariate shift的筆記

work second mean 其它 什麽 區域 引用 right delta

說實話,這篇paper看了很久,,到現在對裏面的一些東西還不是很好的理解。

下面是我的理解,當同行看到的話,留言交流交流啊!!!!!

這篇文章的中心點:圍繞著如何降低 internal covariate shift 進行的, 它的方法就是進行batch normalization。

internal covariate shift 和 batch normalization

1. 什麽是 internal covariate shift呢?

簡單地理解為一個網絡或system的輸入的dirstribution不斷地發生變化,導致網絡的訓練很難。

2. 文中的 batch normalization 怎麽回事呢?

1)文中對輸入data的每一維的基於batch 塊的size 個數據 進行 normalization。 用公式表示: 技術分享, 這個其實就是 z-score。

2)為了不改變網絡的 representation(進行normalizaiton, 肯定改變了輸入的 scale了吧), 對normalization 之後的值進行scale 與 shift: (我感覺這個很重要的,真的)

技術分享

分析:

首先:對於如何盡可能地使每一層的 inputs 的 distribution 不發生變化這一件事情上,文章的做法就是:對輸入進行 normalizaiton, 結果呢, 每一維上的數據的分布有了相同的 均值 0 與 方差(variance). 也僅僅只能在這兩點上進行對網絡的輸入的分布進行控制, 來達到減少 internal covariate shift的目的;

第二點:這個網絡的輸入是指的:上一層的輸入 X 加權 W 以後的值,即 WX(也可以加上偏置,不過應該省略掉,加了也沒有屁用,經過 normalization就沒有作用了,另個後面對它進行調整的beta值可以代替它的使用了)。 如果想對網絡的輸出即 X 進行 batch normalizaiton 也是可以的,不過呢,由於呢,X 需要進行加權 W,所以呢,僅僅通過 mean 與 variance (即一階矩與二階矩)並不能很好地控制 輸入的 distribution. 文章3.2 section的原話為: We could have also normalized the layer inputs u, but since u is likely the output of another nonlinearity, the shape of its distribution is likely t o change during training, and constraining its first and second moments would not eliminate the covariate shift。

第三點:為什麽是在輸入的每一維進行 normalizaiton,而不是對於輸入的維度之間即每一層N個激活函數的輸入之間進行呢? (在有些的神經網絡中,有時最開始的輸入進行標準化)

後來思考了一個這個問題: 認為就是應該在基於 batch的每一維度之間進行 normalizaiton. 在訓練過程中,對於不同的 examples, 就應該讓輸入的每一個維度的分布盡可能一樣,別瞎變來變去的。 而輸入的各個維度之間的分布盡可能地不同,只能這樣才可以更好地進行分類啊。 你想想,把很多類別集中在一個小的區域好呢,還是分散更好呢? 或者這麽理解是對的吧。。。

文章 section 2 的理解:

技術分享

問題1: 這是想了好久呢,感覺問題在於: 技術分享 這個公式,它們不相等啊。。。。 E(delta)b 不等於 (delta)b 的啊。

問題2:另外,如果考慮 EX 對 B 的影響,會發現 delta b 為0 啊。。,所以,因為經過normalization, 這個偏置對網絡的輸入沒有什麽影響啊,直接約沒有了;

問題3:對於文中解釋的,為什麽會出現文中的那個情況,我真的沒有看明白啊。。我感覺文中意思是應該把Ex中的相關參數考慮進去。 但是考慮進去的話,就出現問題2 的情況了,這個 b 直接不用更新了,反正它對輸入也沒有影響了。另外通過 beta 參數就可以代替偏置b 的作用了;

batch normalizaiton 的步驟與梯度公式:

在網絡進行正向傳導時, batch normalization的步驟為如下圖,即文中的 algorithm 1:

技術分享

這個不難,一看就明白;

下圖為梯度更新公式:

技術分享

對於上面的公式:主要明白第二個與第三個公式中的為什麽要求 m 的加和:在基於mini-batch 的反向傳播算法中, W 與 b 的更新都是要進行加和處理的,對吧,沒有問題。而技術分享與W 和 b 是類似的,在 batch中的examples 之間是共用的,所以呢,需要加和。 到最後更新使用的時候,要不要除以 m, 這個需要看 loss函數是怎麽定義的了;

鏈式法則時:永遠記住誰是誰的變量,就不會出錯了。例如:上面公式中為什麽要求對技術分享的梯度呢,就是因為 xi 影響了 技術分享,在求對 xi 的梯度時,需要計算在包含在 技術分享中的那一部分;

對於測試過程:

需要思考:訓練的時候,normalizaiton的參數由batch 的example決定,而測試時,這個參數怎麽辦???

這個參數只能中訓練樣本決定(千萬別想著由測試樣本決定,怎麽可能), 文章中采用無偏估計,理論為中全部的樣本的均值與方差,但是計算公式如下:

技術分享

公式表示把每一個batch的參數再求無偏估計的期望值, 而不是重新把樣本全部相加計算;因為, batch 參數在訓練過程的已經求出了啊,避免再次計算了,並且用無偏估計可以更好的估計出用全部樣本計算出來的方差與均值;

再想一個問題:

很多時候,我們基於樣本集1 訓練出來的網絡模型,可以通過 tuning,應用到 樣本集中。 而采用 batch normalizaiton 的方法訓練得到的網絡模型,很大程度上應該受到了這樣的限制。 因為參數中的均值與方差很依賴訓練樣本的;

訓練與測試的總過程:

技術分享

對於卷積的情況:

在全連接層的網絡中的每一個神經元相當於卷積層的中每一個 feature map. 在同一個feature map中的神經元之間共享權值與偏置。對於卷積神經網絡的 bath normalization, 這裏的batch 指的是同一個 feature map 以及 batch 上的二者 聯合起來的 batch . 例如: batch 大小為32, feature map 為 5*5 ,則應該在 32* 5*5 個輸入之間求均值與方差;

bath normalization 是怎麽enable higher learning rate的:

文章的解釋為:當大的 lr時, 會使權值變大,而權值變大不會影響 layer jacobian(它決定了反向傳播過程中的梯度在網絡中的傳播), 並且使 對權值的更新的梯度變小; 公式如下:

技術分享

這個公式簡單證明一下:

技術分享

對於其它:

文章其它就是說了實驗部分了,以及對 batch normalization 的其它一些功能的推測;

在實驗部分最讓我吃驚的地方就是: 使用batch normalization以後,學習速度明顯加快了很多,這一點很重要啊;我感覺特厲害;

另外,文章有很多用於協方差矩陣、奇異值等的地方,這個需要加強演習;

論文引用:

Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.

Batch normalization:accelerating deep network training by reducing internal covariate shift的筆記