【概述】
由于在训练神经网络期间前一层的参数发生了变化,这导致了每层输入的分布不同,难以通过较低的学习率和参数初始化来减慢训练速度,同时要训练的具有饱和非线性模型也十分困难,这种现象被称为内部协变量偏移(Internal Covariate Shift)
论文 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 中提出了批量归一化(Batch Normalization,BN)这种数据归一化方法来解决该问题
其通过引入标准化层(Normalizing Layer ),为每轮的 mini-batch 训练执行标准化,从而加快模型训练时的收敛速度,避免梯度爆炸或梯度消失,并且起到了一定的正则化作用,几乎替代了 Dropout
需要注意的是,批量归一化虽然能起到微弱的正则化效果,但是不要其并不是正则化的手段,只是一种加速学习的方式,其主要解决的还是反向传播过程中的梯度爆炸和梯度消失问题
【批量归一化】
对于给定的容量为 $N$ 的样本集 $D=\{(\mathbf{x}_1,\mathbf{y}_1),(\mathbf{x}_2,\mathbf{y}_2),…,(\mathbf{x}_N,\mathbf{y}_N)\}$,第 $i$ 组样本中的输入 $\mathbf{x}_i$ 具有 $n$ 个特征值,即:$\mathbf{x}_i=(x_i^{(1)},x_i^{(2)},…,x_i^{(n)})\in \mathbb{R}^n$,输出 $\mathbf{y}_i$ 具有 $m$ 个特征值,即:$\mathbf{y}_i=(y_i^{(1)},y_i^{(2)},…,y_i^{(m)})\in\mathcal{Y}=\mathbb{R}^{m}$
对于给定的神经网络,采取如下的符号假设:
- 用 $S_l$ 表示第 $l$ 层的神经元个数
- 用 $z_{i}^{[l]}$ 表示第 $l$ 层的第 $i$ 个神经元的权重累计
- 用 $a_i^{[l]}$ 表示第 $l$ 层的第 $i$ 个神经元的激活值(输出值)
批量归一化首先对第 $l$ 层的所有权重累计 $z_{i}^{[l]}$ 求均值以及方差,即:
然后根据均值与方差对每个神经元的权重累计 $z_{i}^{[l]}$ 进行归一化,即:
其中,一般取 $\varepsilon=10^{-8}$,以防止分母为 $0$
这样使得经过归一化后的权重累计 $\text{norm}(z^{[l]}_i)$ 均值靠近 $0$,方差靠近 $1$
最后,考虑到不同的隐藏层有不同的分布会更有意义,为此在归一化后的权重累计 $\text{norm}(z^{[l]}_i)$ 上加入学习参数 $\gamma^{[l]}$ 与 $\beta^{[l]}$,即:
其中,学习参数 $\gamma^{[l]}$ 与 $\beta^{[l]}$ 均是模型的学习参数,可以使用各种梯度下降算法来进行更新
之所以要使用这两个学习参数,是考虑到各隐藏层的权重累计均值 $\mu$ 如果在靠近 $0$ 的区域(激活函数的线性区域),不利于训练非线性神经网络,从而得到较差的模型
整个批量归一化流程图如下:
【内部协变量偏移】
在概述中,介绍了一个问题,叫内部协变量偏移,简单来说,就是网络中数据分布会随不同数据集而改变
如下图,在训练集中的数据分布如左图,那么网络学习到的分布也就是左图,对于给定测试集中的数据,分布不一样,这个网络可能就无法准确区分,这种情况下,一般要对模型进行重新训练
批量归一化的作用就是减小内部协变量漂移所带来的影响,让模型变得更加健壮,鲁棒性更强
即使输入的值改变了,由于批量归一化的作用,由每一层决定的 $\gamma^{[l]}$ 和 $\beta^{[l]}$ 能使得均值和方差保持稳定,限制了在前一层的参数更新对数值分布的影响程度,使得后层的学习变得更容易
同时,批量归一化减少了各层连接权重 $W^{[l]}$ 和 $\mathbf{b}^{[l]}$ 间的耦合性,让各层更加独立