[论文阅读] Batch Normalization: Accelerating Deep Network Training By Reducing Internal Covariate Shift

Background

  • 存在什么问题?
    • 训练深度神经网络是比较复杂的,因为每层输入的分布在训练过程中都在变化。如果每层输入的分布在不停的变化,那我们就需要不停的调整我们的参数去补偿这部分变化,这就使得训练过程更加缓慢。
    • 此外,由于分布的变化使得使用saturating nonlinearity function变得更加难以训练。
      • 首先我们区分什么是saturating,什么是non-saturating
        • non-saturating:如果一个函数 lim ⁡ x → − ∞ f ( x ) → − ∞ {\lim_{x \to -\infty}f(x)\to-\infty} limxf(x)或者是 lim ⁡ x → + ∞ f ( x ) → + ∞ {\lim_{x \to +\infty}f(x) \to +\infty} limx+f(x)+ f ( x ) f(x) f(x)是non-saturating的。比如,ReLU
        • saturating:如果函数 f ( x ) f(x) f(x)不是non-saturating,则他就是saturating。比如,sigmoid
      • 接下来,为什么saturating nonlinearity 难以训练?因为他会面临梯度消失问题。
        • 考虑以sigmoid为激活函数的一层。 z = g ( W u + b ) , g = 1 1 + e x p ( − x ) z = g(Wu+b), g=\frac{1}{1+exp(-x)} z=g(Wu+b),g=1+exp(x)1
        • 当我们 ∣ x ∣ |x| x增长的时候,我们 g ′ ( x ) g^{'}(x) g(x)趋近于0。这时候就可能会出现梯度消失问题。
        • 但是 x x x又被 W , b W, b W,b和之前layer的参数影响,所以有很大可能性梯度会比较小。
  • 现存的有什么解决方法?
    • 数据分布—白化操作,PCA Whitening
      • 我们可以在每一层输入之前都使用白化操作将数据映射到0为中心, 不同特征之间具有相同方差的空间。
      • 但是这样操作计算量很大,并且有时候是不可导的。因为在计算PCA Whitening的过程中,我们需要计算协方差矩阵 Σ = ∑ i = 1 i = m x i ∗ x i T \Sigma=\sum_{i=1}^{i=m}{x_i*x_i^T} Σ=i=1i=mxixiT,然后再进行特征值分解。这样提取得到了特征之间无关(decorrelated)的新特征向量空间。
      • 所以,目前我们一般只在预处理阶段使用白化操作。
    • non-saturating nonlinearity—ReLU
      • 上面提到,我们使用saturating nonlinearity会导致梯度消失的问题,所以我们可以使用non-saturating nonlinearity来代替saturating nonlinearity。但是这样并没有从本质上改变数据的分布。我们还是要调整parameter来补偿输入分布的变化,这就使得我们的训练更慢。

Method

  • 为了normalized 数据分布,并且简化计算,使得处处可导。相对于PCA计算向量不同纬度之间的correlation,Batch Normalization 单独normalized 特征向量的每个纬度。这是Batch Normalization和PCA 白化的一个重要不同。
  • LeCun et al.提出了 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)],但是只使用这个可能会降低模型的表达能力。比如说我们使用non-linear的sigmoid,在输入之前经过这个transform处理后,会使得我们的sigmoid有点趋近于linear的transform。
  • 为了解决该问题,作者定义了 i d e n t i t y    t r a n s f o r m identity\space \space transform identity  transform y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y^{(k)}=\gamma^{(k)}\hat{x}^{(k)}+\beta^{(k)} y(k)=γ(k)x^(k)+β(k)来强化模型的表达能力。
  • 总结一下,在训练过程中,我们使用如下的流程来计算normalization。
    在这里插入图片描述
  • 此外,作者也给出了反向传播的公式,如下所示。
    在这里插入图片描述
  • 上面描述了在训练阶段normalization的过程。但是在测试(inference)阶段我们应该怎么处理呢?关键在于怎么计算 x ^ \hat{x} x^,我们知道在训练阶段我们通过减去batch 内的均值除以方差可以得到 x ^ \hat{x} x^,但是在测试阶段我们没有batch,或者batch的分布和训练时候不一样。那么我们怎么处理呢?作者提出了同样的处理方式 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)],不过 V a r [ x ] = m m − 1 E β [ σ 2 ] Var[x]=\frac{m}{m-1}E_{\beta}[\sigma^2] Var[x]=m1mEβ[σ2]无偏估计量来表示。然后再 y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y^{(k)}=\gamma^{(k)}\hat{x}^{(k)}+\beta^{(k)} y(k)=γ(k)x^(k)+β(k)
  • 此外还有以下几点需要注意
    • 文中说为了避免saturating 激活函数的梯度消失问题,BN一般放在激活函数之前
    • γ \gamma γ β \beta β是针对每一个特征有一对。比如说我们通过全连接层的输出是512纬的,那么BN层就有512对 γ \gamma γ β \beta β。针对卷积层的情况, γ \gamma γ β \beta β也是针对每一个特征有一对。假设说我们Convolutional layer的输出是 m ∗ W ∗ H ∗ 512 m*W*H*512 mWH512,那么BN层就有512对 γ \gamma γ β \beta β。不过计算均值 μ B \mu_{B} μB m m m就变成了 m ∗ W ∗ H m*W*H mWH。用原文中的话就是We learn a pair of parameters γ \gamma γ and β \beta β for per feature map.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值