0-Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
批量归一化:通过减少内部协变量偏移加速深度网络训练 arXiv:1502.03167 ICML 2015
背景
提到BN操作,一定会想到CNN,如果说之前各种Net是模型创新,那么本篇就是优化创新。BN是对CNN中间层feature map在激活函数前进行归一化操作,让他们的分布不至于那么散,这样的数据分布经过激活函数之后更加有效。
在整个网络的训练过程中,由于上一层网络参数的变化将导致输出层结果分布的改变,这就使得网络中每一层输入的分布均会发生改变,从而加大的网络的训练难度,这种变化会减缓训练速度,需要更小的学习率和更加复杂的参数初始化方法。
那么这个问题是如何产生的:
$$
\mathcal{L}=F_2(F_1(u,\Theta_1),\Theta_2)\tag{1}
$$
其中$F_1$,$F_2$为任意的两个变换,u为原始的网络输出,$\Theta_1,\Theta_2$分别为两个网络层的参数。
现在我们的目的就是通过最小化$\mathcal{L}$来求得参数$\Theta_1,\Theta_2$的取值。此时,我们也可以将$F_2$的输入看成是$x=F_1(u,\Theta_1)$,那么根据式子(1)我们就有:
$$
\mathcal{L}=F_2(x,\Theta_2)\tag{2}
$$
接着根据式子(3)就可以完成$\Theta_2$的迭代求解:
$$
\Theta_2\leftarrow\Theta_2-\frac{\alpha}{m}\sum_{i=1}^m\frac{\partial F_2(x_i,\Theta_2)}{\partial \Theta_2}\tag{3}
$$
但一个不争的事实就是,原始输入u的分布在经过网络层$F_1$之后会发生改变,而这也就意味着网络层$F_2$中的参数$\Theta_2$就需要再来学习输入值x的分布。也就是说,尽管你一开始对原始的输入u进行了标准化,但是再经历过一个网络层后它的分布就发生了改变,那么下一层又需要重新学习另外一种分布,这就意味着每一层其实都是在学习不同的分布。因此,作者将这种由于网络参数发生变化而引起分布发生改变的现象称为网络的Internal Covariate Shift(ICS)问题。
同时作者继续说到,尽管先前由于ISC导致的梯度消失问题能够通过ReLU激活函数、较小的学习率或者是反复的初始化来解决。但是,如果我们能够确保每一层网络输入的分布更稳定,那么这将会极大的提高网络的训练速度。
所以采用mini-batch的方式对每一层网络的输入进行标准化。
实验方法
1.对每个纬度进行标准化:
假设现在有一个d维的网络层,其输出$x=(x^{(1)},x^{(2)},…,x^{(d)})$,那么对于每一个维度,我们就可以通过如下公式来进行标准化:
$$
\hat{x}^{(k)}=\frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}}\tag{4}
$$
其中,期望$E[x^{(k)}]和方差Var[x^{(k)}]$都是在整个 数据集上计算得到的。
但是,作者又说到,如果仅仅只是简单通过公式(4)来对每个维度进行标准化,那么在某些情况下将会改变该维度原本的表示信息。
为了解决这一问题,作者在公式(4)的基础上,加入了一组可学习的参数$\gamma^{(k)}和\beta^{(k)}对\hat{x}^{(k)}$进行了一次线性变换:
$$
y^{(k)}=\gamma^{(k)}\hat{x}^{(k)}+\beta^{(k)}\tag{5}
$$
其中$y^{(k)}$就是我们最后得到的标准化后的结果,而$\gamma^{(k)}和\beta^{(k)}$也会随着网络中的权重参数一起训练,当且仅当$\gamma^{(k)}=\sqrt{Var[x^{(k)}]},\beta^{(k)}=E[x^{(k)}]$时,公式(5)就变成了恒等变换,也就相当于没有进行标准化(如果网络确实需要的话)。
2.以mini-batch的方式进行标准化
假设现在有一个大小为m的小批量数据$\mathcal{B}$,同时由于BN是独立地对每个神经元的输出值进行标准化,这意味着每个神经元都有自己独立的参数,因此我们这里以对第k个神经元$x^{(k)}$标准化为例进行介绍,并且进一步为了书写方便我们把k也暂时省略掉。此时,对于m个样本的输入,在第k个神经元就会有对应的m个输出:
$$
\mathcal{B}={x_{1,2,…,m}}\tag{6}
$$
接着,我们将标准化后的结果记为$\hat{x}{1,2,…,m}$,线性变换后的结果为$y{1,2,…,m}$,我么就可以将整个BN的过程表示为:
$$
BN_{\beta,\gamma}:x_{1,2,…,m}\rightarrow y_{1,2,…,m}\tag{7}
$$
具体的,对于整个BN的详细过程如图2所示:
其中$\mu_{\mathcal{B}}$为在小批量$\mathcal{B}上对x_i期望的估计,\sigma^2_{\mathcal{B}}$为对$x_i$方差的估计,而$\hat{x}i$则表示标准化后的结果,$y_i$表示线性变换后的结果,也就是我们最后真正需要的结果。同时,为了防止方差为0的情况,在进行标准化时分母额外的加了一个很小的常数$\epsilon$。这里需要说明的是,$\mu{\mathcal{B}}$和$\sigma^2_{\mathcal{B}}$并不是整个数据集真实的期望与方差,而仅仅只是根据采样mini-batch估计得到的。
就这样,每一层的每个神经元的输出值都将会经历过如图所示的处理,使得均值为0方差为1,然后再输出到下一层网络中。尽管在这一个过程中可能会导致不同神经元之间的联合分布发生变换,但是这却使得每一层网络的输入具有了同样的均值与方差,进而加速了网络的训练过程。
3.BN的训练与预测
BN中一共有五个参数:$\mu_{\mathcal{B}},\sigma^2_{\mathcal{B}},\epsilon,\gamma,\beta$,但是只有后两个参数才是随着网络一起训练,前两个参数是训练过程中用mini-batch中的样本估计得到的,用于对训练时的mini-bath进行标准化,而第三个参数则是自己预先设定的。前两个参数的预测时均值和方差应该只取决于整个输入的训练集。
实验结果
BN处处可导
根据链式法则我们便能求得损失$\mathcal{L}$关于各个参数的梯度,其对应公式如下:
$$
\begin{aligned} \frac{\partial \mathcal{L}}{\partial \hat{x}i}&=\frac{\partial \mathcal{L}}{\partial y_i}\cdot\gamma;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(10)\[2ex] \frac{\partial \mathcal{L}}{\partial\sigma^2{\mathcal{B}}}&=-\sum_{i=1}^m\frac{\partial \mathcal{L}}{\partial \hat{x}i}\cdot(x_i-\mu{\mathcal{B}})\cdot\frac{1}{2}(\sigma^2_{\mathcal{B}}+\epsilon)^{-3/2};;;(11)\[2ex] \frac{\partial \mathcal{L}}{\partial \mu_{\mathcal{B}}}&=\sum_{i=1}^m\frac{\partial \mathcal{L}}{\partial \hat{x}i}\cdot\frac{\partial \hat{x}i}{\partial \mu{\mathcal{B}}} =\sum{i=1}^m\frac{\partial \mathcal{L}}{\partial \hat{x}i}\left[\frac{\partial\hat{x}i}{\partial\mu{\mathcal{B}}}+\frac{\partial\hat{x}i}{\partial\sigma^2{\mathcal{B}}}\frac{\partial\sigma^2{\mathcal{B}}}{\partial\mu_{\mathcal{B}}}\right];;;(12)\[2ex] &=-\left(\sum_{i=1}^m\frac{\partial\mathcal{L}}{\partial\hat{x}i}\cdot\frac{1}{\sqrt{\sigma^2{\mathcal{B}}+\epsilon}}\right)-\frac{\partial\mathcal{L}}{\partial\sigma^2_{\mathcal{B}}}\frac{2}{m}\sum_{i=1}^m(x_i-\mu_{\mathcal{B}})\[2ex] \frac{\partial \mathcal{L}}{\partial x_i}&=\frac{\partial \mathcal{L}}{\partial\mu_{B}}\cdot\frac{\partial\mu_{B}}{\partial x_i}+\frac{\partial \mathcal{L}}{\partial \hat{x}{i}}\cdot\frac{\partial\hat{x}{i}}{\partial x_i}+\frac{\partial \mathcal{L}}{\partial\sigma^2_{\mathcal{B}}}\cdot\frac{\partial\sigma^2_{\mathcal{B}}}{\partial x_i};;;;;;;;;;;;;(13)\[2ex] &=\frac{\partial \mathcal{L}}{\partial\mu_{B}}\cdot\frac{1}{m}+\frac{\partial \mathcal{L}}{\partial \hat{x}{i}}\cdot\frac{1}{\sqrt{\sigma^2{\mathcal{B}}+\epsilon}}+\frac{\partial \mathcal{L}}{\partial\sigma^2_{\mathcal{B}}}\cdot\frac{2(x_i-\mu_{\mathcal{B}})}{m}\[2ex] \frac{\partial \mathcal{L}}{\partial \gamma}&=\sum_{i=1}^m\frac{\partial \mathcal{L}}{\partial y_i}\cdot\hat{x}i ;,\frac{\partial \mathcal{L}}{\partial \beta}=\sum{i=1}^m\frac{\partial \mathcal{L}}{\partial y_i};;;;;;;;;;;(14) \end{aligned} \
$$
整个BN过程都是可导的,因此这也就保证了网络模型能够正常的按照设想进行学习,进而可以加快网络的训练速度。
BN可以被用于网络中任意神经元的标准化。
在普通的前馈网络中BN是以每一个神经元为单位进行BN标准化,而在卷积中BN则是以每一个特征图为单位进行标准化。
本篇文章的主要贡献是:
- 减少内部协变量偏移:通过在每层对输入进行归一化,显著减少了内部协变量偏移,使得每层的输入分布更加稳定。
- 加速训练:由于输入分布的稳定性,网络可以使用更高的学习率,收敛速度显著加快。
- 简化参数初始化:减轻了对复杂参数初始化方法的依赖,使得网络训练更加鲁棒。
- 正则化效果:由于在每个小批量上进行归一化,Batch Normalization在一定程度上起到了正则化的作用,有助于防止过拟合。
总结
通过引入Batch Normalization技术,有效减少了深度神经网络训练中的内部协变量偏移,显著加速了训练过程,并提高了模型的性能。Batch Normalization简单易用,效果显著,已成为深度学习模型训练中的标准技术。