论文链接: https://arxiv.org/abs/1502.03167
在训练的时候,输入分布的变化要求较低的学习率和较为严谨的参数初始化,使得训练模型困难。此外,各层输入分布的变化带来了一个问题,因为各层需要不断地适应新的分布,把这个问题称为内部协变量偏移(internal covariate shift)。
对每一个training mini-batch使用了normalization。使得训练网络的时候可以使用更大的学习率和较少的关注参数初始化。同时,它也充当了正则化项, 在某些情况可以取消使用Dropout。
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=1∑Nl(xi,w)
mini-batch使用是:
1 m ∂ l ( x i , w ) ∂ w \frac{1}{m}\frac{\partial l(x_i, w)}{\partial w} m1∂w∂l(xi,w)
使用mini-batch的好处:
但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} w2←w2−mαi=1∑m∂w2∂F2(xi,w2)
因此,各层输入x的分布随时间保持固定是有利的。
比如,假设 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),小心的初始化。如果我们能确保非线性输入的分布随着网络的训练保持稳定,优化器就不太可能陷入饱和状态,加速训练。
作者一开始提出了:
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里面的均值和协方差,具体如下:
其中,又引入了一个常量参数 ϵ \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^i∂l=∂yi∂l⋅γ∂σB2∂l=i=1∑m∂x^i∂l⋅(xi−μB)⋅2−1(σB2+ϵ)−3/2∂μB∂l=(i=1∑m∂x^i∂l⋅σB2+ϵ−1)+∂σB2∂l⋅m∑i=1m−2(xi−μB)∂xi∂l=∂x^i∂l⋅σB2+ϵ1+∂σB2∂l⋅m2(xi−μB)+∂μB∂l⋅m1∂γ∂l=i=1∑m∂yi∂l⋅x^i∂β∂l=i=1∑m∂yi∂l
从上面可以知道,训练的时候,均值和协方差是通过mini-batch的样本计算的。但是在推理的时候,我们想要输出只与输入有关系。所以一旦模型训练好了,使用
x ^ = x − E [ x ] V a r [ x ] + ϵ \hat{x} = \frac{x-E[x]}{\sqrt{Var[x] + \epsilon}} x^=Var[x]+ϵx−E[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]=m−1mEB[σB2],这里的 m m m是训练时候batch size的值, σ B 2 \sigma^2_{\Beta} σB2是训练时候的样本协方差。
具体的算法如下:
在卷积的时候,把 B \Beta B设置为 m ′ = ∣ B ∣ = m ⋅ p q m'=|\Beta|=m\cdot pq m′=∣B∣=m⋅pq,其中, m m m为batch size, p和q为feature map的大小。学习每一个feature map的 γ ( k ) \gamma^{(k)} γ(k)和 β ( k ) \beta^{(k)} β(k)。
在传统的深度网络中,太高的学习率或者太低的学习率会导致梯度消失或者爆炸,也有可能进入局部最低。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} \\ ∂x∂BN(αW)x=∂x∂BN(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} ∂W∂BN(αW)x=α1⋅∂W∂BN(Wx)
可以看到,大的学习率会导致更小的梯度。
Batch Normalization起到正则化的作用,避免了overfitting。
简单的在神经网络中使用BN,并没有完全利用好这篇文章的方法,作者还提出:
那Batch-normalized 应该放在非线性激活层的前面还是后面?
在BN的原始论文中,BN是放在非线性激活层前面的。
We add the BN transform immediately before the nonlinearity