Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 论文笔记

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

论文链接: https://arxiv.org/abs/1502.03167

一、 Problem Statement

在训练的时候,输入分布的变化要求较低的学习率和较为严谨的参数初始化,使得训练模型困难。此外,各层输入分布的变化带来了一个问题,因为各层需要不断地适应新的分布,把这个问题称为内部协变量偏移(internal covariate shift)。

二、 Direction

对每一个training mini-batch使用了normalization。使得训练网络的时候可以使用更大的学习率较少的关注参数初始化。同时,它也充当了正则化项, 在某些情况可以取消使用Dropout

三、 Method

SGD最优化权重参数 w w w:
w = arg min ⁡ w 1 N ∑ i = 1 N l ( x i , w ) w = \argmin_{w} \frac{1}{N}\sum_{i=1}^Nl(x_i,w) w=wargminN1i=1Nl(xi,w)
mini-batch使用是:
1 m ∂ l ( x i , w ) ∂ w \frac{1}{m}\frac{\partial l(x_i, w)}{\partial w} m1wl(xi,w)
使用mini-batch的好处:

  1. 小批量损失梯度是对训练集上梯度的估计,随着batch的增大,其质量也随之提高
  2. 用batch取计算比计算m次单个样本更加有效。

但SGD需要对超参数比较敏感,随着网络加深,小的变化也会被放大。此外还有内部协变量偏移的问题。
比如下面有一个网络计算:
l = F 2 ( F 1 ( x , w 1 ) , w 2 ) l=F_2(F_1(x,w_1),w_2) l=F2(F1(x,w1),w2)
学习 F 2 F_2 F2的时候,会把 F 1 ( x , w 1 ) F_1(x,w_1) F1(x,w1)当作输入,这样的梯度就是:
w 2 ← w 2 − α m ∑ i = 1 m ∂ F 2 ( x i , w 2 ) ∂ w 2 w_2 \leftarrow w_2 - \frac{\alpha}{m}\sum_{i=1}^m\frac{\partial F_2(x_i,w_2)}{\partial w_2} w2w2mαi=1mw2F2(xi,w2)

因此,各层输入x的分布随时间保持固定是有利的。

  1. w 2 w_2 w2不需要重新调整来补偿输入 x x x分布的变化
  2. 对于激活函数等也有积极的影响。

比如,假设 F F F是sigmoid activate function z = f ( W x + b ) , f = 1 1 + e x p ( − x ) z=f(Wx+b), \quad f=\frac{1}{1+exp(-x)} z=f(Wx+b),f=1+exp(x)1。随着 ∣ x ∣ |x| x增大, f ′ ( x ) f'(x) f(x)趋向于0,这意味着,梯度会消失,导致训练困难。
同时,由于 x x x受到 w , b w,b w,b和下面所有层的参数的影响,这些参数在训练过程中的变化可能会使 x x x的许多维数进入非线性的饱和状态从而减慢收敛速度,随着网络加深,影响扩大。这个问题通常可以由ReLU解决
R e L U ( x ) = m a x ( x , 0 ) ReLU(x)=max(x,0) ReLU(x)=max(x,0),小心的初始化。如果我们能确保非线性输入的分布随着网络的训练保持稳定,优化器就不太可能陷入饱和状态,加速训练。

1. Towards Reducing Internal Covariate Shift

作者一开始提出了:
x ^ ( k ) = x ( k ) − E [ x ( k ) ] V a r [ x ( k ) ] \hat{x}^{(k)} = \frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}} x^(k)=Var[x(k)] x(k)E[x(k)]
这里的期望和协方差是基于整个训练集的。这样的normalization可能会改变每一层所表示的东西。为了解决这个问题,作者引入了两个变量 γ ( k ) \gamma^{(k)} γ(k) β ( k ) \beta^{(k)} β(k)确保嵌入到网络中的变换可以表示同样的变换。
y ( k ) = γ ( k ) x ^ ( k ) β ( k ) y^{(k)} = \gamma^{(k)} \hat{x}^{(k)} \beta^{(k)} y(k)=γ(k)x^(k)β(k)

这两个超参数,随着网络的学习得到。事实上,如果它们是最优的话,
γ ( k ) = V a r [ x ( k ) ] , β ( k ) = E [ x ( k ) ] \gamma^{(k)} = \sqrt{Var[x^{(k)}]}, \quad \beta^{(k)} = E[x^{(k)}] γ(k)=Var[x(k)] ,β(k)=E[x(k)]

但基于整个训练集计算均值和协方差是不实际的。 因此作者做了第二个简化: 只计算每一个mini-batch里面的均值和协方差,具体如下:
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 论文笔记_第1张图片

其中,又引入了一个常量参数 ϵ \epsilon ϵ,用来作数值稳定。这样的话,任何 x ^ \hat{x} x^的值的分布都有0期望,协方差为1的性质。
下面是Batch Normalization的导数形式:
∂ l ∂ x ^ i = ∂ l ∂ y i ⋅ γ ∂ l ∂ σ B 2 = ∑ i = 1 m ∂ l ∂ x ^ i ⋅ ( x i − μ B ) ⋅ − 1 2 ( σ B 2 + ϵ ) − 3 / 2 ∂ l ∂ μ B = ( ∑ i = 1 m ∂ l ∂ x ^ i ⋅ − 1 σ B 2 + ϵ ) + ∂ l ∂ σ B 2 ⋅ ∑ i = 1 m − 2 ( x i − μ B ) m ∂ l ∂ x i = ∂ l ∂ x ^ i ⋅ 1 σ B 2 + ϵ + ∂ l ∂ σ B 2 ⋅ 2 ( x i − μ B ) m + ∂ l ∂ μ B ⋅ 1 m ∂ l ∂ γ = ∑ i = 1 m ∂ l ∂ y i ⋅ x ^ i ∂ l ∂ β = ∑ i = 1 m ∂ l ∂ y i \begin{aligned} &\frac{\partial l}{\partial \hat{x}_i} = \frac{\partial l}{\partial y _i} \cdot \gamma \\ &\frac{\partial l}{\partial \sigma^2_{\Beta}} = \sum_{i=1}^m \frac{\partial l}{\partial \hat{x}_i} \cdot (x_i - \mu_{\Beta}) \cdot \frac{-1}{2}(\sigma_{\Beta}^2+\epsilon)^{-3/2} \\ &\frac{\partial l}{\partial \mu_{\Beta}} = (\sum_{i=1}^m \frac{\partial l}{\partial \hat{x}_i}\cdot \frac{-1}{\sqrt{\sigma_{\Beta}^2+\epsilon}})+\frac{\partial l}{\partial \sigma_{\Beta}^2}\cdot \frac{\sum_{i=1}^m-2(x_i-\mu_{\Beta})}{m}\\ &\frac{\partial l}{\partial x_i} = \frac{\partial l}{\partial \hat{x}_i}\cdot \frac{1}{\sqrt{\sigma^2_{\Beta}+\epsilon}}+\frac{\partial l}{\partial \sigma^2_{\Beta}} \cdot \frac{2(x_i - \mu_{\Beta})}{m}+\frac{\partial l}{\partial \mu_{\Beta}}\cdot \frac{1}{m} \\ &\frac{\partial l}{\partial \gamma} = \sum_{i=1}^m \frac{\partial l}{\partial y_i}\cdot \hat{x}_i \\ &\frac{\partial l}{\partial \beta} = \sum_{i=1}^m \frac{\partial l}{\partial y_i} \end{aligned} x^il=yilγσB2l=i=1mx^il(xiμB)21(σB2+ϵ)3/2μBl=(i=1mx^ilσB2+ϵ 1)+σB2lmi=1m2(xiμB)xil=x^ilσB2+ϵ 1+σB2lm2(xiμB)+μBlm1γl=i=1myilx^iβl=i=1myil

2. Training and Inference with Batch Normalized Networks。

从上面可以知道,训练的时候,均值和协方差是通过mini-batch的样本计算的。但是在推理的时候,我们想要输出只与输入有关系。所以一旦模型训练好了,使用
x ^ = x − E [ x ] V a r [ x ] + ϵ \hat{x} = \frac{x-E[x]}{\sqrt{Var[x] + \epsilon}} x^=Var[x]+ϵ xE[x]

这里的 V a r [ x ] = m m − 1 E B [ σ B 2 ] Var[x]=\frac{m}{m-1}E_{\Beta}[\sigma_{\Beta}^2] Var[x]=m1mEB[σB2],这里的 m m m是训练时候batch size的值, σ B 2 \sigma^2_{\Beta} σB2是训练时候的样本协方差。
具体的算法如下:
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 论文笔记_第2张图片

3. Batch Normalized Convolutional Networks

在卷积的时候,把 B \Beta B设置为 m ′ = ∣ B ∣ = m ⋅ p q m'=|\Beta|=m\cdot pq m=B=mpq,其中, m m m为batch size, p和q为feature map的大小。学习每一个feature map γ ( k ) \gamma^{(k)} γ(k) β ( k ) \beta^{(k)} β(k)

4. Batch Normalization enables higher learning rates

在传统的深度网络中,太高的学习率或者太低的学习率会导致梯度消失或者爆炸,也有可能进入局部最低。Batch Normlization有助于解决这个问题。批处理规范化还使训练对参数规模更具弹性。通常情况下,较大的学习速率会增加层参数的规模,从而在反向传播过程中放大梯度,导致模型爆炸。
然而,使用了Batch Normalization, 通过一个网络层的时候,反向梯度不会受到learning rate的影响:
B N ( W x ) = B N ( ( α W ) x ) BN(Wx) = BN((\alpha W)x) BN(Wx)=BN((αW)x)
相对应的梯度为:
∂ BN ( α W ) x ∂ x = ∂ BN ( W x ) ∂ x \frac{\partial \text{BN}(\alpha W)x}{\partial x} = \frac{\partial \text{BN}(Wx)}{\partial x} \\ xBN(αW)x=xBN(Wx)
∂ BN ( α W ) x ∂ W = 1 α ⋅ ∂ BN ( W x ) ∂ W \frac{\partial \text{BN}(\alpha W)x}{\partial W} = \frac{1}{\alpha} \cdot \frac{\partial \text{BN}(Wx)}{\partial W} WBN(αW)x=α1WBN(Wx)
可以看到,大的学习率会导致更小的梯度。

5. Batch Normalization regularizes the model

Batch Normalization起到正则化的作用,避免了overfitting。

四、 Conclusion

  • 所提出的Batch Normalization 可以固定网络层输入的均值和协方差
  • 且通过减少梯度对参数的大小和初始值的依赖,有助于网络中梯度的传递。
  • Batch Normalization也有正则化的作用,减少了Dropout的使用
  • Batch Normalization通过防止网络陷入饱和模式,使得使用饱和非线性成为可能。

简单的在神经网络中使用BN,并没有完全利用好这篇文章的方法,作者还提出:

  1. 增大学习率,加速网络训练
  2. 删除Dropout,加速训练,也能避免过拟合。
  3. 减少 L 2 L_2 L2 权重正则化。在Inception网络中,使用了 L 2 L_2 L2 loss来控制过拟合,通过控制这个Loss的权重提升精度。
  4. 加速学习率的衰减。
  5. 移除local response normalization。
  6. 彻底打乱数据样本。
  7. 减少photometric distortions。因为标网络训练更快,观察每个训练示例的次数更少,所以我们让培训师通过较少的扭曲来关注更“真实”的图像。

Batch-normalized 应该放在非线性激活层的前面还是后面?
在BN的原始论文中,BN是放在非线性激活层前面的。

We add the BN transform immediately before the nonlinearity

五、 Reference

  1. https://www.zhihu.com/question/283715823/answer/438882036

你可能感兴趣的:(网络Tricks,深度学习,算法,神经网络)