Batch Normalization(BN)
目的
将数值范围较为分散的数据集中在一个固定的小范围内,使得数据在进入激活函数层之后,激活函数可以对数据变化敏感(也就是希望数据不会过多的集中在饱和的区域).
解决的问题–Internal Covariate Shift
We refer to the change in the distributions of internal nodes of a deep network, in the course of training, as Internal Covariate Shift.
由于激活函数的形式是固定的(饱和区间等也是固定的),所以我们希望输入数据的分布最好的接近于特定的分布的。
位置
一般在全连接层和激活函数之间。结合实际问题分析.
算法
注意,最后一个公式,是一个反向操作!!!将 normalize 后的数据再扩展和平移. 原来这是为了让神经网络自己去学着使用和修改这个扩展参数 γ \gamma γ, 和 平移参数 β \beta β.
如何理解 γ \gamma γ, μ \mu μ?
γ − σ \gamma - \sigma γ−σ, β − μ \beta - \mu β−μ
y i ← x i γ σ B 2 + ϵ − γ μ B σ B 2 + ϵ + β y_{i} \gets x_{i}\frac{\gamma}{\sqrt{\sigma_{B}^{2}+\epsilon }}-\frac{\gamma \mu_{B}}{\sqrt{\sigma_{B}^{2}+\epsilon }}+\beta yi←xiσB2+ϵγ−σB2+ϵγμB+β
当 γ ← σ B \gamma \gets \sigma_{B} γ←σB, β ← μ B \beta \gets \mu_{B} β←μB时, y i ← x i y_{i} \gets x_{i} yi←xi, 此时相当于没有batch normalization.
当 γ ← 1 \gamma \gets 1 γ←1, β ← 0 \beta \gets 0 β←0时, y i ← x i ^ y_{i} \gets \hat{x_{i}} yi←xi^, 此时相当于只用Standardization.
为什么要用scale and shift?
BN其实也是一个通过反向传播,找到最优参数的过程. 从上面的描述可以发现 γ , β \gamma,\beta γ,β取不同参数包含了两种特殊的情况. 因为符合标准正态分布的输入不一定对于网络来说是最优的,通过网络最终的loss function结合最终的取值可以找到最适合网络的参数.
参数的传播以及更新
前向传播:就是上的算法流程.
反向传播:凡是对网络的损失函数产生影响的变量都需要用损失函数对其求偏导.
μ B , σ B \mu_{B},\sigma_{B} μB,σB为什么也是参数?
由于每次输入网络的batch不同,所以每次求得的
μ
,
σ
\mu,\sigma
μ,σ也不同,在测试集中使用的
μ
,
σ
\mu,\sigma
μ,σ是根据前面几组取平均得到.
优点
使用Batch Normalization,可以获得如下好处,
- 可以使用更大的学习率,训练过程更加稳定,极大提高了训练速度。
- 可以将bias置为0,因为Batch Normalization的Standardization过程会移除直流分量,所以不再需要bias。
- 对权重初始化不再敏感,通常权重采样自0均值某方差的高斯分布,以往对高斯分布的方差设置十分重要,有了Batch Normalization后,对与同一个输出节点相连的权重进行放缩,其标准差σσ也会放缩同样的倍数,相除抵消。
- 对权重的尺度不再敏感,理由同上,尺度统一由γγ参数控制,在训练中决定。
- 深层网络可以使用sigmoid和tanh了,理由同上,BN抑制了梯度消失。
- Batch Normalization具有某种正则作用,不需要太依赖dropout,减少过拟合
参考
Batch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift