Inception v2

GoogLeNet(Inception v1)讲解
Inception v3~v4讲解

论文地址:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift,本文首先提出了batch normalization,并且被广泛使用,但是文中所述的batch normalization之所以work的原因却有人提出了异议,在这里,当然,本文还是会讲述原作的故事,权当启发也罢。

灵感来源

  1. 由于训练数据大,分mini-batch来训练成为了不错的训练,但是不同batch的数据分布不一样,也就是数据存在covariance shift,因此提出了batch normalization(BN)。从下文所述的BN的优势,就可以看出不加covariance shift造成的问题了。

不可行的做法

我们都知道卷积网络在处理图片时会对一个图片做白化变换,这样可以使得网络收敛更快,如果想要达到同样的效果,可以在每层网络输出之后,对特征做一次白化,然后再输入到下一层,这是一个很自然的想法,但是如果对输入做了白化,那么在梯度下降时就要计算每个输入特征之间的协方差,这个运算量将会非常的大,不可行。也正因为如此,作者提出的BN在做归一化时是在仅在每个特征维度上单独做,而不计算所有特征共同的特征。

batch normalization的优势

  1. 减小了数据的inner covariance shift
  2. 使得梯度不会随着数据的变化而发生太大的变化,因此选择学习率时可以稍微大一点而不用担心模型发散
  3. 像sigmoid这样的激活函数只有在数据接近0的地方梯度明显,当数据的绝对值非常大时,梯度是会很小的甚至接近0的,这会使得网络非常的难以训练,但是batch normalization后数据范围基本被限制在了0附近,因此激活函数也可以有更多选择了。

计算过程

训练阶段,假设每个batch有m条数据,BN层都是按维度来的,

  1. 先算出他们的均值和方差(有偏估计)
  2. 把每个数都减去均值除以标准差
  3. 乘以γ再加上β。其中γ和β都是可训练参数(注意第三步是必须的)

inference阶段,

  1. 同样要做归一化,但是此时的均值和方差都要利用所有的训练数据数据来计算,其中方差要用其无偏估计,而非仅利用一个batch,因此,以此计算,均值和方差都成了常数,在所有inference数据上都一样。
  2. γ和β都已经train好了,自然也是要用的。

使用BN

  1. BN一般加在非线性层之前,在加了BN之后,原来全连接中的bias也可以不用了,相当于是被β代替了,因为无论bias是多少,归一化之后该特征的均值都变成0了。
  2. 在卷积网络中,卷积网络一个重要的特点是平移不变性,即同一个feature map都是用同一个过滤器卷积而来的,因此在加入BN时作者想保留卷积的这一性质,所以在做BN时,同一个feature map都被看做同一个维度,譬如,mini-batch有m个sample,某层有n个feature map,每个的size都是kk,那我们计算均值是mk*k个值的均值,同理,每个feature map也只有一个γ和β,n个feature map就有n个γ和β。

实验

  1. 作者先是在MNIST上做了实验,发现相同情况下加了BN层后模型收敛的更快了
  2. 作者在GoogLeNet v1的基础上在每个非线性层之间都加了BN,并且为了做对比试验,在ImageNet上做训练时,网络相较于GoogLeNet v1做了如下变化:
    1. 加大初始学习率
    2. 删掉了DropOut层
    3. 加大了learning rate decay,即学习率的下降速度
    4. 删除了GoogLeNet v1中开始所用的local response标准化
    5. 对数据做了更彻底的shuffle
    6. 减小了数据的图像变形(好像是GoogLeNet v1在训练时为了做数据增强,做了一些图片的变形)

你可能感兴趣的:(Inception v2)