1. 程式人生 > >重新認識BN演算法

重新認識BN演算法

Google在2015年發表論文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》。隨後BN的作用被證實,大量的神經網路都會採用在啟用層前面加入BN層。起初我認為BN層只是一個簡單的資料預處理,隨著研究的深入,我發現其背後的原理值得深思。

論文地址:https://arxiv.org/pdf/1502.03167v3.pdf

對理解有幫助的部落格:https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html

該作者借鑑了CS231n的課程用計算圖表達梯度傳播的過程。讓我明白了為什麼需要計算除\beta \gamma之外其他的節點的梯度(需要向後傳播)

知乎上我不壞博主寫了一段關於BN的深入探討,我明白了BN為什麼會使收斂速度快,減輕梯度爆炸或消失問題。其中有句話:

正如文章中所說,使用gamma和beta是為了通過 "scale and shift"  操作來保證整個網路的capacity,畢竟,一直將feature限制在均值為0方差為1的分佈下,明顯是不那麼明智的。尤其是在使用ReLU啟用函時,將其輸入限制在均值為0,相當於強制讓其輸出中總有一半為0,想想都覺得荒謬。

所以原作者加入了gamma和beta,讓網路自己學習資料的分佈哪種是最好,如果是原資料分佈最好也是可以學習出來(恢復)的。

連結:https://www.zhihu.com/question/38102762

博主Peng寫了BN的程式碼,可以作為以後手寫BP的參考。

https://zhuanlan.zhihu.com/p/26138673