批标准化-batch normalization

上一篇标准化-normalization中说到对线性回归模型,当输入特征在各个维度上取值范围相差较大时,可通过对输入标准化(normalization)来加快训练速度。

其中用到的回归模型$y = w_1x_1+w_2 x_2​$可以看做bias为0,激活函数为线性函数的单个神经元模型。

借鉴输入标准化可以加快训练速度的思想,批标准化(Batch-normalization, BN) 通过对深度网络每一层每个连接单元标准化来加快网络的训练速度。

Batch-normalization(BN)来自于文章Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift .

本文希望回答下面几个问题

(1) 批标准化(BN)如何做的?

(2) BN除加快训练速度外,还有什么优点?


模型

一个多层神经网络模型:

其中

  • $x$是输入
  • $W^1,W^2,\cdots$是权重
  • $z$ 为激活函数的输入
  • $a$ 为激活函数的输出

标准化(normalization) 就是对每层激活函数的输入做标准化。设整个数据集的均值和方差分别为$\mu_{}$和$\sigma_{}$,那么标准化公式为:

批标准化(batch-normalization)

但是多数深度学习模型数据量比较大,内存不足以计算整个数据集的均值和方法;或者为在线学习(online learning),数据动态获取,无法得到整个数据集。

对这种情况,就需要用batch-normalization: 使用批量数据(样本)的均值和方差替代整体(总体)的均值和方差。

既然是用样本估计总体,batch选的越大,估计值就越准。所以batch选的越大越好。

具体就是使用batch数据的得到的均值和标准差的移动平均值,近似整个数据的均值和标准差。

另外为了增加网络的表示能力表示能力,对标准化后的数据加了偏移项$\beta$及尺度参数$\gamma$ ($\beta,\gamma$的维数与$\tilde{z}$一样):

其中$\odot$是分量与分量的乘积(element-wise product)。

问题​(1)​的回答

将数据集$D​$分为训练集$D^{train}=(X^{train},y^{train})​$和测试集$D^{test}=(X^{test},y^{test})​$.

训练阶段:

从训练集$D^{train}=(X^{train},y^{train})​$中从抽样一个batch-size的数据$\{x^i,y^i\}_{i=1}^{bs}​$, 然后在每个激活函数前做标准化+平移+变化尺度:

image modified based on Machine Learning and having it deep and structured (2018,Spring): Special Training Technology

其中

  • $u_{bs},\sigma_{bs}$与每个batch的数据有关
  • $\beta,\gamma$作为模型的参数通过误差反向传播求解
  • 第一个batch数据用$u_{bs},\sigma_{bs}$,后面每个batch数据用下面描述的$\bar{\mu}^{t}$和$\bar{\sigma}^{t}$。

在迭代过程中记录其指数移动平均(exponential moving average)值$\bar{\mu}^{t}$和$\bar{\sigma}^{t}$,用来近似整个数据的均值$\mu$和方差$\sigma$。

设共迭代$T$步:

当$t=1$时,

当$t\ge2$时,

其中

  • $\mu^t_{bs}$-第$t$步迭代一个Batch的平均值;
  • $\bar{\mu}^t_{}$-第$t$步迭代模型中使用的均值;
  • $0 < \alpha_1< 1$-权重延迟系数。$\alpha_1$越大,过去均值对现在均值影响越小;
  • 公式(2)与公式(1)类似。

将最后一步迭代的参数值记为$\mu_{train}=\bar{\mu}^{T},\sigma_{train}=\bar{\sigma}^{T}$.

测试阶段:

计算测试集输入$X^{test}$的均值和标准差分别为$\mu_{test}$, $\sigma_{test}$,则测试过程的均值和方差$\mu,\sigma$取值如下:


Internal Covariate Shift

文章Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 将各层参数分布不一样而导致激活值(activations)分布不一样的现象定义为Internal Covariate Shift Internal Covariate Shift.

为观察Internal Covariate Shift 现象,对cifar10分类问题,使用keras搭建一个CNN模型:12层的网络, 其中有9个卷积层。代码见jupyter notebook

因为activations直接与参数有关,所以我们通过可视化参数的分布来说明activation的分布变化。

层数太少,比如5层,并没有观测到分布的变化现象。

训练结束后,权重的分布

  • 没有批标准化(左图), conv1 conv2 conv3 差别还是较大的,其它卷积层权重分布差不多

  • 有批标准化(右图), conv1 与其他卷积层差别较大,其它层权重分布相对比较一致


其它优点

Batch-normalization最大的优点是加快训练速度,除此之外,它还有一些其它的优点:

问题(2)的回答

(1) 避免梯度消失(gradient vanish)

网络中使用 sigmoid 或者 tanh 激活函数时,批标准化可调整输入到0附近,避免了数据落入导数为0的区域,从而可以一定程度上避免梯度消失问题。

(2) 正则化(regularization)

给定网络的损失函数: $\min_w L(w)=\sum (y_i-\hat{y}_i(w))^2+|w|_2$

使用批标准化后, $w’=kw(k \geq 1)$ 与 $w$的预测值是一样的(如下图)

但是 $L(w’) \geq L(w)$, 所以训练中会选择较小的参数值$w$,从而达到正则化的效果。




Internal Covariate Shift. We define Internal Covariate Shift as the change in the distribution of network activations due to the change in network parameters during training. 来自文章BN:… by Reducing Internal Covariate Shift
表示能力. 标准化将网络输入值变换到一定的范围内,限制了网络的表示能力。比如激活函数为Relu时,大部分输入将被限制在$-$3到$3$以内,其它值出现的概率较小。