首先關於BN的文章是這一篇,大家可以下載下來看一下。
《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
貌似是兩位google的大佬寫的。
總結一下BN的好處:
- 加速訓練收斂速度;
- 可以使用較大的學習率;
- 允許在深層網絡中使用sigmoid這種易導致梯度消失的激活函數,當然用relu最好,文章中也提到了;
- 具有輕微地正則化效果,以此可以降低dropout的使用。
Convariate shift是BN論文作者提出來的概念,其意是指具有不同分佈的輸入值對深度網絡學習的影響。(原文: When the input distribution to a learning system changes, it is said to experience covariate shift)
文章中提到,加快收斂速度可以對輸入進行以下操作:
白化,線性變換0均值和單位標準差,去相關(PCA)
e是一個無窮小非0量,在tensorflow裏面,默認是10-6,防止除0
輸入值的分佈不同,也可以理解爲輸入特徵值的scale差異較大,與權重進行矩陣相乘後,會產生一些偏離較大地差異值;而深度學習網絡需要通過訓練不斷更新完善,那麼差異值產生的些許變化都會深深影響後層,偏離越大表現越爲明顯;因此,對於反向傳播來說,這些現象都會導致梯度發散,從而需要更多的訓練步驟來抵消scale不同帶來的影響,也需要更多地步驟才能最終收斂。
而BN的作用就是將這些輸入值進行標準化,降低scale的差異至同一個範圍內。這樣做的好處在於一方面提高梯度的收斂程度,加快訓練速度;另一方面使得每一層可以儘量面對同一特徵分佈的輸入值,減少了變化帶來的不確定性,也降低了對後層網路的影響,各層網路變得相對獨立。