论文标题: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
论文链接: https://arxiv.org/pdf/1502.03167.pdf
Introduction
这篇论文的主要工作就是提出了如今深度学习常见的 Batch Normalization,来加速深层网络训练的收敛,以及在 Inception v1 的基础上做了一些训练方式和结构上的改进(Inception v2),其在 ImageNet 分类任务上是超越了当时最好的成绩:4.9% top-5 validation error。
Motivation
这篇论文拟解决的问题是深度学习中很关键的问题,深度神经网络模型的训练为什么困难、收敛慢? 这个问题的解决在之前的工作中,有从尝试新的激活函数角度,如 ReLU、Maxout、PReLU等;有从权值初始化方法角度,如Xavier初始化、Kaiming初始化等,但收益相对都不是很高。
作者也指出了因为这个问题的存在使得在设置 learning rate、初始化方法还有激活函数上得要很慎重,而这个问题的实质是因为在训练过程中,随着前一层参数的改变,哪怕很小的改变,也会因为网络加深而被放大,而这种改变使得每一层输入的分布发生改变,从而每一层需要持续地适应这种改变,这种现象在论文中被称为 Internal covariate shift (ICS)。
从另外一个角度看,把网络的中间层看作是 sub-network 以及采用 sigmoid 激活函数 z = g ( W u + b ) z = g(Wu + b) z=g(Wu+b),其中 u u u 是该层的输入,而 W W W 和 b b b 是学习的参数。随着 ∣ x ∣ |x| ∣x∣ 增大, g ′ ( x ) g'(x) g′(x) 趋向于0,这也就意味着会发生我们熟知的梯度消失(本质是落入饱和区),后来 ReLU 和 一些初始化方法是较好的缓解了这个问题。
换一个思路想,造成这个问题比较直观的原因是因为 ∣ x ∣ |x| ∣x∣ 的增大,即输入分布的变化,以及上面提到的 ICS 现象也是因为每一层的输入分布发生改变,那么很自然的想法就是,如果能确保输入的分布稳定,那么就不容易陷入饱和区域,从而梯度消失的问题也就得到很好的缓和,训练收敛的速度也随之提升了,问题就迎刃而解了。
看着好像蛮简单的,但还是有随之而来的问题:
- 确保输入的分布稳定,即 Normalization ,该怎么做?
- Normalization 能使得输入不落入饱和区域,反过来就是限制输入落入激活函数的线性区域,那这样网络不就失去了非线性的表达能力了吗,这该怎么弥补?
上面的两个也就是 Batch Normalization 这篇论文工作的核心。
Methods
白化(whitening) 作为一个很重要的数据预处理方法,它能使得模型训练收敛的更快,而白化一般包含两个目的:
- 去除特征之间的相关性(特征独立);
- 使得所有特征具有相同的均值和方差(同分布)
白化可以使得模型的输入标准化为均值为0,方差为1,那可以考虑将白化拓展到每一层的输入,就能使得每一层的分布趋于稳定。然而,标准的白化操作代价昂贵,特别是我们还希望白化操作是可微的,保证白化操作可以通过反向传播来更新梯度,即:
∂ N o r m ( x , X ) ∂ x a n d ∂ N o r m ( x , X ) ∂ X \frac{\partial \mathrm{Norm}(x, \mathcal{X})}{\partial x} \quad and \quad \frac{\partial \mathrm{Norm}(x, \mathcal{X})}{\partial \mathcal{X}} ∂x∂Norm(x,X)and∂X∂Norm(x,X)
Training and Inference with Batch-Normalizaed Networks
于是就有了本篇论文的工作,Batch Normalization(BN),即对白化做了简化,将其作用到每一层的输入,使得输入分布稳定。
第一个简化是只对每一个特征维度做 Normalization,并没有考虑特征之间去相关,论文中也提到了,“such normalization speeds up convergence, even when the features are not decorrelated.”,即:
x ^ ( k ) = x ( k ) − E [ x ( k ) ] V a r [ x ( k ) ] \widehat{x}^{(k)} = \frac{x^{(k)}-\mathrm{E}[x^{(k)}]}{\sqrt{\mathrm{Var}[x^{(k)}]}} x
(k)=Var[x(k)]x(k)−E[