目录
声明
由于学习本篇博客的内容时翻阅了很多资源,如知乎、他人博客等,很多内容已经不记得是在哪学到的了,也没有办法一一列举了,能列举的我尽量列举,如有侵权,请联系我删除,谢谢。
BN是什么[1]
BN是谷歌在这篇文章中提出的。具体的操作是,在每次SGD时,对mini-batch进行规范化操作,使结果的均值为0,方差为1。再经过scale+shift操作,尽量去还原BN前的输出。
为什么提出BN[1, 2]
先看一下论文的题目《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,可以看出,BN的动机是降低Internal Covariate Shift(以下简称ICS)来加速网络训练,下面解释什么是ICS。
在训练过程中,由于不同层的参数是不断变化的,这会导致,对于不同层,输入的分布是不断变化的。随着网络层数的加深,高层输入的分布会与原始输入样本的分布存在较大差异。以上便是ICS问题。
由于ICS问题,模型的优化难度变大,收敛速度慢。
BN的作用及原理
加速训练,提高收敛速度[1]
一方面,BN通过固定层间数据分布的方法,解决了ICS问题,从而提高了模型的训练速度。另一方面,由于BN能够缓解梯度消失(梯度爆炸),可以提高模型的收敛速度。
缓解梯度消失(梯度爆炸)[3]
- 不使用BN
在不使用BN时,对于某一层的前向传播,应有:
H l = W l T H l − 1 H_l=W_l^TH_{l-1} Hl=WlTHl−1
那么该层的反向传播梯度为:
∂ H l ∂ H l − 1 = W l \frac{\partial H_l}{\partial H_{l-1}}=W_l ∂Hl−1∂Hl=Wl
多层累计后的梯度为:
∂ H l ∂ H k = ∏ i = k + 1 l W i \frac{\partial H_l}{\partial H_k}=\prod_{i=k+1}^lW_i ∂Hk∂Hl=i=k+1∏lWi
可以看出,如果 W i W_i Wi总是较小的,经过不断的连乘,梯度呈指数级下降,即梯度消失。反之,如果 W i W_i Wi总是较大的,会发生梯度爆炸。
- 使用BN
带有BN的前向传播为:
H l = B N ( W l T H l − 1 ) = 1 σ l ( W l T H l − 1 − μ l ) H_l=BN(W_l^TH_{l-1})=\frac{1}{\sigma_l}(W_l^TH_{l-1}-\mu_l) Hl=BN(WlTHl−1)=σl1(WlTHl−1−μl)
则反向传播的梯度为:
∂ H l ∂ H l − 1 = W l 1 σ l \frac{\partial H_l}{\partial H_{l-1}}=W_l\frac{1}{\sigma_l} ∂Hl−1∂Hl=Wlσl1
多层累计后的梯度为:
∂ H l ∂ H k = ∏ i = k + 1 l W i 1 σ i \frac{\partial H_l}{\partial H_k}=\prod_{i=k+1}^lW_i\frac{1}{\sigma_i} ∂Hk∂Hl=i=k+1∏lWiσi1
可以看出,使用BN后,在反向传播时,使用 1 σ i \frac{1}{\sigma_i} σi1对梯度进行了缩放。如果 W i W_i Wi较小,则 W i T H l − 1 W_i^TH_{l-1} WiTHl−1较小,则 σ i {\sigma_i} σi较小, 1 σ i \frac{1}{\sigma_i} σi1较大, W i 1 σ l W_i\frac{1}{\sigma_l} Wiσl1比 W i W_i Wi大,实现了放缩。如果 W i W_i Wi较大,也是同理。为什么 W i T H l − 1 W_i^TH_{l-1} WiTHl−1较小,则 σ i {\sigma_i} σi较小?举个例子,1,5,10,20,30这组数据的标准差是10.5338,而0.1,0.5,1,2,3这组数据的标准差是1.05338。
缓解过拟合[4]
BN能够缓解过拟合在于引入了noise。对于特定的一层,在某个batch的前向传播过程中,如果添加了BN操作,则会对该层的输出进行normalization,具体如下式:
o
u
t
p
u
t
A
f
t
e
r
_
B
N
=
o
u
t
p
u
t
−
b
a
t
c
h
_
m
e
a
n
(
o
u
t
p
u
t
)
b
a
t
c
h
_
v
a
r
i
a
n
c
e
(
o
u
t
p
u
t
)
output_{After\_BN}=\frac{output-batch\_mean(output)}{batch\_variance(output)}
outputAfter_BN=batch_variance(output)output−batch_mean(output)
这说明,在每一次训练过程中,即使对于相同的样本,如果在batch中的其他样本发生了变化,
b
a
t
c
h
_
m
e
a
n
(
o
u
t
p
u
t
)
batch\_mean(output)
batch_mean(output)和
b
a
t
c
h
_
v
a
r
i
a
n
c
e
(
o
u
t
p
u
t
)
batch\_variance(output)
batch_variance(output)就会发生变化。这会导致,相同样本在不同的batch中会产生不同的
o
u
t
p
u
t
A
f
t
e
r
_
B
N
output_{After\_BN}
outputAfter_BN,相当于对于每个样本都引入了noise。模型为了克服样本的noise,会更加generalize,即降低了过拟合。
其他相关问题
BN和激活函数的顺序问题[5]
现在大多数的模型中都是用BN+ReLU,但是从BN论文的原理上将,其实ReLU+BN似乎能更好的解决ICS问题,下面分析一下两种方式的优缺点。
- BN+ReLU
让ReLU更好的进行特征选择,使其单侧抑制起作用。 - ReLU+BN
更好地解决ICS问题,训练效率更高。
使用ReLU还需要用BN吗[6, 7]
由于ReLU有dead neuron问题,使用BN后可以保证有一定占比的神经元处于激活状态,解决了dying ReLU问题。
[1] https://www.zhihu.com/question/38102762
[2] https://zhuanlan.zhihu.com/p/136701745
[3] https://www.zhihu.com/collection/537883741
[4] https://www.zhihu.com/question/291571486/answer/861428056
[5] https://zhuanlan.zhihu.com/p/113442866
[6] https://www.zhihu.com/question/304603935/answer/544970232
[7] https://www.zhihu.com/question/338802747/answer/784239481