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。
假设某一层的输入为,其中d表示输入的维度,则对每一维进行标准化,有:
其中,和都是在整个训练集上计算得到的期望和方差。但是这种简单的标准化会存在一个问题,即可能会使得激活函数的非线性能力失效,导致整个网络的表现能力降低,因此,为例克服这个问题,作者对每一个维度的标准化引入了一对参数,对标准化后的值进行变换和移动,即:
特别地,当,时,则模型的表现能力与不采用Batch Normalization相同。
由于在全部训练集上进行Batch Normalization是不实际的,因此,作者提出了在mini-batch上进行Batch Normalization。记为一个batch大小为m的数据集,为了便于表示,将k进行省略,即第k个维度一个batch数据的表示为:
记Batch Normalization转换为:
其中,表示对每一维进行Batch Normalization后的结果,则Batch Normalization的算法步骤如下:
其中,为一个常数,主要为了确保计算的稳定。
2.2 推理阶段
由于在训练时,Batch Normalization是基于每一个mini-batch计算的,所以在预测或推理阶段,怎么对单个数据进行标准化呢?因为这时没法计算数据的均值和方差。针对这个问题,作者提出了算法2,即将训练时每个batch数据对应的均值和方差记录下来,利用他们来推算整个训练集的均值和方差,公式如下:
其中,、分别对应每个mini-batch的均值和方差。这样就可以对预测数据进行Batch Normalization,具体的算法过程如下:
2.3 对于卷积神经网络的Batch Normalization
对于卷积神经网络,为了保持卷积的特性,标准化是对每个feature-map进行,即每个feature-map不同位置的标准化采取同样的操作,令是大小为m的mini-batch对应的某个feature-map的所有数据的集合,假设feature-map的大小为,则对该feature-map的Batch Normalization则相当于对大小为的特征的标准化。
2.4 为什么Batch Normalization可以使用更高的学习率
当使用Batch Normalization后,假设参数变化为,则容易得到:
即参数的更新对每一层的输出不影响,另外,在反向传播时,有:
即当设置不同大小的学习率时,在反向传播时,都会被抵消掉,使得参数的更新相对稳定,因此,可以使用较大的学习率。
3.Batch Normalization的优点
最后,对Batch Normalization的优点进行总结,大概有以下几个方面:
- 可以采用更高的学习率,提高模型训练的速度,并且可以有效避免梯度的消失和爆炸
- 起到正则化的作用,类似dropout的功能
- 不用太在意参数的初始化