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

ICML, 2015
S. Ioffe and C. Szegedyhtml

解决什么问题(What)网络

  1. 分布不一致致使训练慢:每一层的分布会受到前层的影响,当前层分布发生变化时,后层网络须要去适应这个分布,训练时参数的变化会致使各层分布的不断变化,这个问题被定义为“internal covariate shift”,因为每一层的分布不同,就会致使训练很慢
  2. 梯度消失和梯度爆炸:深度网络中微小的参数变更引发梯度上的剧变,致使训练陷入sigmoid的饱和区
  3. 须要使用较小的学习率:大的学习率可能会致使参数的scale变大,致使bp时梯度放大,引发梯度爆炸。另外因为分布不一致,大的学习率容易致使分布变化不稳定
  4. 须要当心翼翼地设置权重初始化:设置合理的初始化权重能够减少陷入sigmoid饱和区致使的梯度消失或梯度爆炸
  5. 须要正则:防止过拟合,提升泛化能力

为何能解决(Why)函数

  1. 加速收敛:在每一层的输入对数据进行规范化,使每层的分布不会出现很大的差别,能够加快训练。BN由于对数据分布作了规范,能减少前层对后层的影响,后层更容易适应前层的更新。
  2. 减少梯度消失和梯度爆炸:对于sigmoid来讲,数据规范化后大部分落在sigmoid的中间区域,能够避免优化的时候陷入“saturated regime”(sigmoid的两边),可以减少梯度消失的出现。通常化地说(不只考虑sigmoid),BN规范化后,对于较大的权重会有较小的梯度,对于较小的权重会有较大的梯度(以下面公式所示),不容易出现梯度消失或梯度爆炸)。
    \[ BN(Wu) =BN((aW)u) \]
    \[ \frac{\partial BN((aW)u))}{\partial u}=\frac{\partial BN((W)u))}{\partial u} \]
    \[ \frac{\partial BN((aW)u))}{\partial (aW)} = \frac{1}{a} \frac{\partial BN(Wu))}{\partial W} \]
  3. 容许使用较大的学习率:BN使训练更适应参数的scale,大权重有小梯度,这就不怕大的学习率致使bp的梯度放大引发梯度爆炸。另外分布较为一致,较大的学习率也不会致使不稳定的学习
  4. 能够不须要当心翼翼地设置权重初始化:初始化对学习的影响减少了,能够不那么当心地设置初始权重。举例来讲,对于一个单元的输入值,无论权重w,仍是放缩后的权重kw,BN事后的值都是同样的,这个k被消掉了,对于学习来讲,激活值是同样的。
  5. 减少对正则的须要: 对于一个给定的训练样本,网络不产生一个肯定的值,它会依赖于mini-batch中的其它样本。论文的实验发现这种效应有利于网络的泛化,能够减少或者不用dropout。

BN是怎么作的(How)学习

  1. 对于一个神经元的一个mini-batch上的一批数据,作一次BN,假设batch size为m
  2. 先求mini-batch的均值: \[\mu\leftarrow \frac{1}{m}\sum_{m}^{i=1}x_{i}\]
  3. 而后求mini-batch的方差:\[\sigma ^{2}\leftarrow \frac{1}{m}\sum_{m}^{i=1}(x_{i}-\mu)^{2}\]
  4. 而后把每一个数据归一化:\[\hat{x_i}\leftarrow \frac{x_i - \mu}{\sqrt {\sigma ^{2} + \varepsilon }}\]
  5. 这样就获得了均值为0,方差为1的一批数据。咱们可能不但愿全部的数据老是均值为0,方差为1。这可能会改变原来的网络层能表示的东西,好比把sgmoid限制在了0附近的线性区域。全部咱们使用另外两个参数来转换一下,使得网络能学到更多的分布。它既能够保持原输入,也能够改变,提高了模型的容纳能力。\[y_i\leftarrow \gamma \hat{x_i}+\beta \equiv BN_{\gamma, \beta}(x_i)\]
  6. 对每一个神经元的每一个mini-batch数据作这样的BN转换,而后训练,每一个BN的参数\(\gamma, \beta\)不一样
  7. 在测试阶段,因为咱们不适用mini-batch,那么如何使用均值和方差来归一化呢,论文中给出的方法是使用全部mini-batch 的均值和方差来估计出两个统计量(用移动平均的计算方法来平均,指数加权平均是经常使用的一种移动平均的方法)来做为每一个测试样本BN时的均值和方差。指数加权平均在ng的深度学习课程中有学习过,我有记录相应的课程笔记
    \[E[x]\leftarrow E_B[\mu_B]\]
    \[Var[x]\leftarrow \frac{m}{m-1}E_B[\sigma ^{2}_B]\]
    \[y = \frac{x-E(x)}{\sqrt{Var[x]+\varepsilon }}\gamma+\beta\]

激活前仍是激活后作BN(Where)测试

  • 对于一个神经元的运算$ x = Wu+b $ 和 $ z = g(x) $,g为激活函数
  • 能够对u作BN,也能够对x作BN
  • 可是u多是另外一个非线性函数的输出,它的分布容易受到训练的影响而改变
  • \(Wu+b\)更可能有一致的,非稀疏的分布,对它归一化更可能产生稳定的分布

实验小结优化

  • mnist:用了BN后,收敛更快,准确率更高,随着训练的进行,分布更加平稳
    ui

  • ImageNet单网络分类:
    • Inception:学习率为0.0015,对Inceptionv1作了一些结构修改(好比2个3x3卷积替代5x5卷积)。
    • BN:在上面的基础上加入了BN,提高了Inception的收敛速度和准确率
    • BNx5:作了一些加速BN的策略变更,其中学习率扩大为原BN的5倍,即0.0075,相比于BN,收敛更快,准确率更高
    • BNx30:在BNx5的基础上,学习率扩大为原BN的30倍,即0.045,相比于BNX5,准确率更高
    • BNx5-sigmoid:虽然不如以上结果好,可是相比于不用BN,准确率更高
  • ImageNet集成网络分类:使用带BN的集成的Inception,在ImageNet的validation上达到了最好的表现spa

其它:CNN中的BN3d

  • 在CNN中对一个mini-batch中的一个feature map的全部单元作BN
  • 假设原来一个mini-batch中的大小为m,作BN时,一批数据的大小为m
  • 如今在CNN中,假设一个feature map中大小为p*q,则作BN时一批数据的大小为m*p*q

其它:Internal Covariate shift(ICS)
统计学习基于这样一个假设,但愿源空间和目标空间的分布是一致的,covariate shift是分布不一致假设之下的一个分支问题,指的是条件几率一致,可是边缘几率不一样,以下公式所示
\[P_{source}(Y|X=x)=P_{target}(Y|X=x)\]
\[P_{source}(X)\neq P_{target}(X)\]
神经网络各层的分布是不一样的,可是同同样本的label是一致,这就是符合了covariate shift的定义,由于不止对于输入,而对于中间层的输入都有这个问题,全部在前面加个“internal covariate shift”,定义这个各层之间分布不一致的问题。BN能够减少ICS带来的影响,可是不是解决ICS的办法,由于这并无保证各层的分布一致,只是规范化了均值和方差。htm

一点点小感觉

  • 一般来讲BN和dropout都是颇有用的trick,值得多多尝试
  • 可是以前作实验的时候,发现加了BN效果反而降低了,还有dropout也是,加了后没提高
  • 一些trick在你的数据和任务上并不必定老是work的,仍是实践至上,要多跑实验,尝试各类配置
相关文章
相关标签/搜索