前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Batch Normalization详解

Batch Normalization详解

作者头像
李拜六不开鑫
修改2020-04-26 15:30:11
1.8K0
修改2020-04-26 15:30:11
举报
文章被收录于专栏:本立2道生本立2道生

目录

  • 动机
    • 单层视角
    • 多层视角
  • 什么是Batch Normalization
  • Batch Normalization的反向传播
  • Batch Normalization的预测阶段
  • Batch Normalization的作用
  • 几个问题
    • 卷积层如何使用BatchNorm?
    • 没有scale and shift过程可不可以?
    • BN层放在ReLU前面还是后面?
    • BN层为什么有效?
  • 参考

动机

在博文《为什么要做特征归一化/标准化?》中,我们介绍了对输入进行Standardization后,梯度下降算法更容易选择到合适的(较大的)学习率,下降过程会更加稳定。

在博文《网络权重初始化方法总结(下):Lecun、Xavier与He Kaiming》中,我们介绍了如何通过权重初始化让网络在训练之初保持激活层的输出(输入)为zero mean unit variance分布,以减轻梯度消失和梯度爆炸。

但在训练过程中,权重在不断更新,导致激活层输出(输入)的分布会一直变化,可能无法一直保持zero mean unit variance分布,还是有梯度消失和梯度爆炸的可能,直觉上感到,这可能是个问题。下面具体分析。

单层视角

http://gradientscience.org/batchnorm/
http://gradientscience.org/batchnorm/
https://wiki2.org/en/Linear_classifier#/media/File:Svm_separating_hyperplanes.png
https://wiki2.org/en/Linear_classifier#/media/File:Svm_separating_hyperplanes.png

更新又要根据新的分布重新调整。直线调整了位置,输入分布又在发生变化,直线再调整位置,就像是直线和分布之间的“追逐游戏”。对于浅层模型,比如SVM,输入特征的分布是固定的,即使拆分成不同的batch,每个batch的统计特性也是相近的,因此只需调整直线位置来适应输入分布,显然要容易得多。而深层模型,每层输入的分布和权重在同时变化,训练相对困难。

多层视角

上面是从网络中单拿出一层分析,下面看一下多层的情况。在反向传播过程中,每层权重的更新是在假定其他权重不变的情况下,向损失函数降低的方向调整自己。问题在于,在一次反向传播过程中,所有的权重会同时更新,导致层间配合“缺乏默契”,每层都在进行上节所说的“追逐游戏”,而且层数越多,相互配合越困难,文中把这个现象称之为 Internal Covariate Shift,示意图如下。为了避免过于震荡,学习率不得不设置得足够小,足够小就意味着学习缓慢。

https://gab41.lab41.org/batch-normalization-what-the-hey-d480039a9e3b
https://gab41.lab41.org/batch-normalization-what-the-hey-d480039a9e3b

为此,希望对每层输入的分布有所控制,于是就有了Batch Normalization,其出发点是对每层的输入做Normalization,只有一个数据是谈不上Normalization的,所以是对一个batch的数据进行Normalization。

什么是Batch Normalization

Batch Normalization,简称BatchNorm或BN,翻译为“批归一化”,是神经网络中一种特殊的层,如今已是各种流行网络的标配。在原paper中,BN被建议插入在(每个)ReLU激活层前面,如下所示,

http://gradientscience.org/batchnorm/
http://gradientscience.org/batchnorm/

如果batch size为m,则在前向传播过程中,网络中每个节点都有m个输出,所谓的Batch Normalization,就是对该层每个节点的这m个输出进行归一化再输出,具体计算方式如下,

Batch Normalization Transform
Batch Normalization Transform
Batch Normalization
Batch Normalization
Batch Normalization的反向传播

对于目前的神经网络计算框架,一个层要想加入到网络中,要保证其是可微的,即可以求梯度。BatchNorm的梯度该如何求取?

反向传播求梯度只需抓住一个关键点,如果一个变量对另一个变量有影响,那么他们之间就存在偏导数,找到直接相关的变量,再配合链式法则,公式就很容易写出了。

在实际实现时,通常以矩阵或向量运算方式进行,比如逐元素相乘、沿某个axis求和、矩阵乘法等操作,具体可以参见Understanding the backward pass through Batch Normalization LayerBatchNorm in Caffe

Batch Normalization的预测阶段

Training a Batch-Normalized Network
Training a Batch-Normalized Network

因为Standardization和scale and shift均为线性变换,在预测阶段所有参数均固定的情况下,参数可以合并成y=kx+b的形式,如上图中行号11所示。

Batch Normalization的作用

使用Batch Normalization,可以获得如下好处,

  • 可以使用更大的学习率,训练过程更加稳定,极大提高了训练速度。
  • 可以将bias置为0,因为Batch Normalization的Standardization过程会移除直流分量,所以不再需要bias。
  • 深层网络可以使用sigmoid和tanh了,理由同上,BN抑制了梯度消失。
  • Batch Normalization具有某种正则作用,不需要太依赖dropout,减少过拟合

几个问题

卷积层如何使用BatchNorm?

For convolutional layers, we additionally want the normalization to obey the convolutional property – so that different elements of the same feature map, at different locations, are normalized in the same way. To achieve this, we jointly normalize all the activations in a mini-batch, over all locations. ... so for a mini-batch of size m and feature maps of size p × q, we use the effective mini-batch of size m′ = |B| = m · pq. We learn a pair of parameters γ(k) and β(k) per feature map, rather than per activation. —— Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

没有scale and shift过程可不可以?

BatchNorm有两个过程,Standardization和scale and shift,前者是机器学习常用的数据预处理技术,在浅层模型中,只需对数据进行Standardization即可,Batch Normalization可不可以只有Standardization呢?

答案是可以,但网络的表达能力会下降。

BN层放在ReLU前面还是后面?

paper建议将BN层放置在ReLU前,因为ReLU激活函数的输出非负,不能近似为高斯分布。

The goal of Batch Normalization is to achieve a stable distribution of activation values throughout training, and in our experiments we apply it before the nonlinearity since that is where matching the first and second moments is more likely to result in a stable distribution. —— Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

但是,在caffenet-benchmark-batchnorm中,作者基于caffenet在ImageNet2012上做了如下对比实验,

https://github.com/ducha-aiki/caffenet-benchmark/blob/master/batchnorm.md
https://github.com/ducha-aiki/caffenet-benchmark/blob/master/batchnorm.md

实验表明,放在前后的差异似乎不大,甚至放在ReLU后还好一些。

放在ReLU后相当于直接对每层的输入进行归一化,如下图所示,这与浅层模型的Standardization是一致的。

https://www.microsoft.com/en-us/research/video/how-does-batch-normalization-help-optimization/
https://www.microsoft.com/en-us/research/video/how-does-batch-normalization-help-optimization/

caffenet-benchmark-batchnorm中,还有BN层与不同激活函数、不同初始化方法、dropout等排列组合的对比实验,可以看看。

所以,BN究竟应该放在激活的前面还是后面?以及,BN与其他变量,如激活函数、初始化方法、dropout等,如何组合才是最优?可能只有直觉和经验性的指导意见,具体问题的具体答案可能还是得实验说了算(微笑)。

BN层为什么有效?

BN层的有效性已有目共睹,但为什么有效可能还需要进一步研究,这里有一些解释,

  • BN层让损失函数更平滑。论文How Does Batch Normalization Help Optimization中,通过分析训练过程中每步梯度方向上步长变化引起的损失变化范围、梯度幅值的变化范围、光滑度的变化,认为添加BN层后,损失函数的landscape(loss surface)变得更平滑,相比高低不平上下起伏的loss surface,平滑loss surface的梯度预测性更好,可以选取较大的步长。如下图所示,
https://arxiv.org/abs/1805.11604
https://arxiv.org/abs/1805.11604
  • BN更有利于梯度下降。论文An empirical analysis of the optimization of deep network loss surfaces中,绘制了VGG和NIN网络在有无BN层的情况下,loss surface的差异,包含初始点位置以及不同优化算法最终收敛到的local minima位置,如下图所示。没有BN层的,其loss surface存在较大的高原,有BN层的则没有高原,而是山峰,因此更容易下降。
https://arxiv.org/abs/1612.04010
https://arxiv.org/abs/1612.04010

这里多说一句,论文How Does Batch Normalization Help Optimization中对比了标准VGG以及加了BN层的VGG每层分布随训练过程的变化,发现两者并无明显差异,认为BatchNorm并没有改善 Internal Covariate Shift但这里有个问题是,两者的训练都可以收敛,对于不能收敛或者训练过程十分震荡的模型呢,其分布变化是怎样的?我也不知道,没做过实验(微笑)。

以上。

参考

博客:blog.shinelee.me | 博客园 | CSDN

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 动机
    • 单层视角
      • 多层视角
      • 什么是Batch Normalization
      • Batch Normalization的预测阶段
      • Batch Normalization的作用
      • 几个问题
        • 卷积层如何使用BatchNorm?
          • 没有scale and shift过程可不可以?
            • BN层放在ReLU前面还是后面?
              • BN层为什么有效?
              • 参考
              相关产品与服务
              批量计算
              批量计算(BatchCompute,Batch)是为有大数据计算业务的企业、科研单位等提供高性价比且易用的计算服务。批量计算 Batch 可以根据用户提供的批处理规模,智能地管理作业和调动其所需的最佳资源。有了 Batch 的帮助,您可以将精力集中在如何分析和处理数据结果上。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档