文章目录
博客: blog.shinelee.me | 博客园 | CSDN
动机
在博文《为什么要做特征归一化/标准化? 博客园 | csdn | blog》中,我们介绍了对输入进行Standardization后,梯度下降算法更容易选择到合适的(较大的)学习率,下降过程会更加稳定。
在博文《网络权重初始化方法总结(下):Lecun、Xavier与He Kaiming 博客园 | csdn | blog》中,我们介绍了如何通过权重初始化让网络在训练之初保持激活层的输出(输入)为zero mean unit variance分布,以减轻梯度消失和梯度爆炸。
但在训练过程中,权重在不断更新,导致激活层输出(输入)的分布会一直变化,可能无法一直保持zero mean unit variance分布,还是有梯度消失和梯度爆炸的可能,直觉上感到,这可能是个问题。下面具体分析。
单层视角
神经网络可以看成是上图形式,对于中间的某一层,其前面的层可以看成是对输入的处理,后面的层可以看成是损失函数。一次反向传播过程会同时更新所有层的权重 W 1 , W 2 , … , W L W_1, W_2, \dots, W_L W1,W2,…,WL,前面层权重的更新会改变当前层输入的分布,而跟据反向传播的计算方式,我们知道,对 W k W_k Wk的更新是在假定其输入不变的情况下进行的。如果假定第 k k k层的输入节点只有2个,对第 k k k层的某个输出节点而言,相当于一个线性模型 y = w 1 x 1 + w 2 x 2 + b y = w_1 x_1 + w_2 x_2 + b y=w1x1+w2x2+b,如下图所示,
假定当前输入 x 1 x_1 x1和 x 2 x_2 x2的分布如图中圆点所示,本次更新的方向是将直线 H 1 H_1 H1更新成 H 2 H_2 H2,本以为切分得不错,但是当前面层的权重更新完毕,当前层输入的分布换成了另外一番样子,直线相对输入分布的位置可能变成了 H 3 H_3 H3,下一次更新又要根据新的分布重新调整。直线调整了位置,输入分布又在发生变化,直线再调整位置,就像是直线和分布之间的“追逐游戏”。对于浅层模型,比如SVM,输入特征的分布是固定的,即使拆分成不同的batch,每个batch的统计特性也是相近的,因此只需调整直线位置来适应输入分布,显然要容易得多。而深层模型,每层输入的分布和权重在同时变化,训练相对困难。
多层视角
上面是从网络中单拿出一层分析,下面看一下多层的情况。在反向传播过程中,每层权重的更新是在假定其他权重不变的情况下,向损失函数降低的方向调整自己。问题在于,在一次反向传播过程中,所有的权重会同时更新,导致层间配合“缺乏默契”,每层都在进行上节所说的“追逐游戏”,而且层数越多,相互配合越困难,文中把这个现象称之为 Internal Covariate Shift,示意图如下。为了避免过于震荡,学习率不得不设置得足够小,足够小就意味着学习缓慢。
为此,希望对每层输入的分布有所控制,于是就有了Batch Normalization,其出发点是对每层的输入做Normalization,只有一个数据是谈不上Normalization的,所以是对一个batch的数据进行Normalization。
什么是Batch Normalization
Batch Normalization,简称BatchNorm或BN,翻译为“批归一化”,是神经网络中一种特殊的层,如今已是各种流行网络的标配。在原paper中,BN被建议插入在(每个)ReLU激活层前面,如下所示,
如果batch size为 m m m,则在前向传播过程中,网络中每个节点都有 m m m个输出,所谓的Batch Normalization,就是对该层每个节点的这 m m m个输出进行归一化再输出,具体计算方式如下,
其操作可以分成2步,
- Standardization:首先对 m m m个 x x x进行 Standardization,得到 zero mean unit variance的分布 x ^ \hat{x} x^。
- scale and shift:然后再对 x ^ \hat{x} x^进行scale and shift,缩放并平移到新的分布 y y y,具有新的均值 β \beta β方差 γ \gamma γ。
假设BN层有 d d d个输入节点,则 x x x可构成 d × m d \times m d×m大小的矩阵 X X X,BN层相当于通过行操作将其映射为另一个 d × m d\times m d×m大小的矩阵 Y Y Y,如下所示,
将2个过程写在一个公式里如下,
y i ( b ) = B N ( x i ) ( b ) = γ ⋅ ( x i ( b ) − μ ( x i ) σ ( x i ) 2 + ϵ ) + β y_i^{(b)} = BN\left(x_{i}\right)^{(b)}=\gamma \cdot\left(\frac{x_{i}^{(b)}-\mu\left(x_{i}\right)}{\sqrt{\sigma\left(x_{i}\right)^2 + \epsilon}}\right)+\beta yi(b)=BN(xi)(b)=γ⋅⎝⎛σ