Batch Normalization原理与优点总结

1. 引言

    随着深度学习的发展,神经网络的模型的深度越来越大,虽然可以提取到数据中更加深层的特征信息,但是,也容易引起梯度消失或梯度爆炸等问题。当使用SGD优化函数时,我们经常会遇到以下两个问题:

  • 模型对参数初始化方式、学习率的设置特别敏感。
  • 随着网络深度的加深,参数的微小变动都会不断被放大。

    为了解决这两个问题,Sergey Ioffe等人在《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》 一文提出了Batch Normalization,本文将基于该文章,对Batch Normalization的原理进行解析,并对其优点进行总结和归纳。

2. Batch Normalization

2.1 mini-batch Normalization

    在介绍Batch Normalization的思想之前,先明确一个概念,即作者在文中提出的Internal Covariate Shift,其意思是:在训练过程中,深层网络内部节点分布的变化称为Internal Covariate Shift。

    假设某一层的输入为\mathrm { x } = \left( x ^ { ( 1 ) } \ldots x ^ { ( d ) } \right),其中d表示输入的维度,则对每一维进行标准化,有:

                                                                             \widehat { x } ^ { ( k ) } = \frac { x ^ { ( k ) } - \mathrm { E } \left[ x ^ { ( k ) } \right] } { \sqrt { \operatorname { Var } \left[ x ^ { ( k ) } \right] } }

其中,E \left[ x ^ { ( k ) } \right]\operatorname { Var } \left[ x ^ { ( k ) } \right]都是在整个训练集上计算得到的期望和方差。但是这种简单的标准化会存在一个问题,即可能会使得激活函数的非线性能力失效,导致整个网络的表现能力降低,因此,为例克服这个问题,作者对每一个维度的标准化引入了一对参数\gamma ^ { ( k ) } , \beta ^ { ( k ) },对标准化后的值进行变换和移动,即:

                                                                             y ^ { ( k ) } = \gamma ^ { ( k ) } \widehat { x } ^ { ( k ) } + \beta ^ { ( k ) }

特别地,当\gamma ^ { ( k ) } = \sqrt { \operatorname { Var } \left[ x ^ { ( k ) } \right] }\beta ^ { ( k ) } = \mathrm { E } \left[ x ^ { ( k ) } \right]时,则模型的表现能力与不采用Batch Normalization相同。

     由于在全部训练集上进行Batch Normalization是不实际的,因此,作者提出了在mini-batch上进行Batch Normalization。记\mathcal { B }为一个batch大小为m的数据集,为了便于表示,将k进行省略,即第k个维度一个batch数据的表示为:

                                                                                \mathcal { B } = \left\{ x _ { 1 \ldots m } \right\}

记Batch Normalization转换为:

                                                                           \mathrm { BN } _ { \gamma , \beta } : x _ { 1 \ldots m } \rightarrow y _ { 1 \dots m } 

其中,y _ { 1 \dots m }表示对每一维进行Batch Normalization后的结果,则Batch Normalization的算法步骤如下:

其中,\epsilon为一个常数,主要为了确保计算的稳定。 

2.2 推理阶段

   由于在训练时,Batch Normalization是基于每一个mini-batch计算的,所以在预测或推理阶段,怎么对单个数据进行标准化呢?因为这时没法计算数据的均值和方差。针对这个问题,作者提出了算法2,即将训练时每个batch数据对应的均值和方差记录下来,利用他们来推算整个训练集的均值和方差,公式如下:

                                                                                   \begin{array} { r l } { \mathrm { E } [ x ] } & { \leftarrow \mathrm { E } _ { \mathcal { B } } \left[ \mu _ { \mathcal { B } } \right] } \\ { \operatorname { Var } [ x ] } & { \leftarrow \frac { m } { m - 1 } \mathrm { E } _ { \mathcal { B } } \left[ \sigma _ { \mathcal { B } } ^ { 2 } \right] } \end{array}

其中,\mu_{\mathcal { B }}\sigma _ { \mathcal { B } } ^ { 2 }分别对应每个mini-batch的均值和方差。这样就可以对预测数据进行Batch Normalization,具体的算法过程如下:

2.3 对于卷积神经网络的Batch Normalization

    对于卷积神经网络,为了保持卷积的特性,标准化是对每个feature-map进行,即每个feature-map不同位置的标准化采取同样的操作,令\mathcal { B }是大小为m的mini-batch对应的某个feature-map的所有数据的集合,假设feature-map的大小为p \times q,则对该feature-map的Batch Normalization则相当于对大小为m ^ { \prime } = | \mathcal { B } | = m \cdot p q的特征的标准化。

2.4 为什么Batch Normalization可以使用更高的学习率

    当使用Batch Normalization后,假设参数W变化为a W,则容易得到: 

                                                                                \mathrm { BN } ( W \mathrm { u } ) = \mathrm { BN } ( ( a W ) \mathrm { u } )

即参数的更新对每一层的输出不影响,另外,在反向传播时,有:

                                                                           \begin{aligned} \frac { \partial \mathrm { BN } ( ( a W ) \mathrm { u } ) } { \partial \mathrm { u } } & = \frac { \partial \mathrm { BN } ( W \mathrm { u } ) } { \partial \mathrm { u } } \\ \frac { \partial \mathrm { BN } ( ( a W ) \mathrm { u } ) } { \partial ( a W ) } & = \frac { 1 } { a } \cdot \frac { \partial \mathrm { BN } ( W \mathrm { u } ) } { \partial W } \end{aligned}

即当设置不同大小的学习率时,在反向传播时,都会被抵消掉,使得参数的更新相对稳定,因此,可以使用较大的学习率。

3.Batch Normalization的优点

    最后,对Batch Normalization的优点进行总结,大概有以下几个方面:

  • 可以采用更高的学习率,提高模型训练的速度,并且可以有效避免梯度的消失和爆炸
  • 起到正则化的作用,类似dropout的功能
  • 不用太在意参数的初始化

猜你喜欢

转载自blog.csdn.net/linchuhai/article/details/84552806