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

来源:互联网 发布:2016年新疆网络管制 编辑:程序博客网 时间:2024/06/05 12:48

[ 论文阅读地址 ]

1. 问题描述

起因

  神经网络在训练时候,每一层的输入的分布都在发生变化(训练时候,网络的参数会更新),这就要求网络的初始化权重不能随意设置,而且学习率也比较低。因此,我们很难使用饱和非线性部分去做网络训练,作者称这种现象为internal covariate shift
  对网络中每一层的输入值来说,这层之前的所有层的参数都对其有影响,因此,网络参数发生变化时候,随着网络层次的加深它的影响会越来越大。

解决

  作者提出,解决internal covariate shift 的办法就是在训练网络时,对于一个mini-batch的输入,将网络中一层神经元的输入做归一化(normalizing)。

优点

  当使用上述方法(Batch Normalization),可以使用更大的学习率,而且也不用对初始化权重有过多的关注。
  Batch Normalization 也有正则化的作用,在一些情况下可以取代Dropout。

2. 模型

介绍

  训练时,网络中每层的输入的分布在不断的变化,使得当前层的参数需要不断的去拟合新的分布。考虑如下的计算:
  

=F2(F1(u,Θ1),Θ2)

  其中,F1F2 都是任意的变换, Θ1Θ2 都是需要学习以最小化 的参数。当学习参数Θ2 时,可以认为输入x=F1(u,Θ1) 提供给了子网络:
  
=F2(x,Θ2)

  等价于只有F2 网络和其输入x ,即认为F2F1 独立。因此,利用网络F1 ,可以使得能加速训练的输入的分布性质,直接提供给F2 网络,因而参数Θ2 就不用去拟合输入x 的分布的变化。将固定分布的输入提供给子网络F2 不止对当前层有好处,对子网络外的更深的层也有好处。

归一化做法

  在对输入进行whitening时,协方差矩阵和其-1/2次幂的计算量会很大。文中进行了两个简化:第一个就是whitening输入时,对每个维度单独计算;第二种方法是使用mini-batch来估计估计均值和方差。
  采用第一种方法处理输入时,作者说这样做会改变网络的表达能力。例如,将sigmoid激活函数的输入进行归一化后,会将值限制在非线性激活函数的线性区域。为了解决这个问题,作者提出,对网络的转化应该包括恒等转化(即,转化后的网络,可以表达转化前网络的分布)。作者提出对于激活值的每一维度x(k) ,都有一对参数γ(k)β(k) 来缩放和平移归一化后的值:

y(k)=γ(k)x^(k)+β(k)

  此时就可以看到,如果γ(k)=Var[x(k)]β(k)=E[x(k)] ,那么x^(k)=x(k) ,即网络的表达能力增加了。
  总体的归一化过程如下(对于网络中的某一层):对于一个含有m个样本的mini-batch B={x1m}xi 为激活函数的输出值,归一化后的值为x^1m ,线性变化后的值为y1m ,记x1my1m 的变换为BNγ,β (Batch Normalizing Transform)。文章中如下:
  


  这里写图片描述
  

  需要注意的一点,BNγ,β(xi)} 并不只是依赖与当前的单个训练样本,还依赖于mini-batch中的所有其他样本。文中的求导过程:
  

  这里写图片描述
  

网络的训练和预测

  训练阶段,随机选取网络中的一部分节点,对其结果使用Batch Normalization。训练结束后,使用模型预测时,讲所有的依赖于mini-batch的Batch Normalization都改成依赖于整个样本,即:

x^=xE[x]Var(x)+ϵ

  其中,方差采用无偏估计:Var[x]=mm1EB[σ2B] 。文章中概括的训练过程:
  


  这里写图片描述
  

1 0
原创粉丝点击