机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。
那 BatchNorm 的作用是什么呢?BatchNorm 就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
提出背景
Internal Covariate Shift 的定义:在训练过程中,由于隐含层的参数在不断地变化,导致每层的输入也在变化,进而导致分布也在变化。这其实是符合 IDD 独立分布原则 的。
BatchNorm的基本思想:将每个隐藏节点的**输入的分布固定下来。
思想来源:BN 的操作参照了图像处理中的白化操作(即对输入数据进行标准化处理,将输入数据的分布转为0均值的,单方差的正态分布)一般图像在做了白化操作后,都能使神经网络快速的收敛。而每个隐藏层的输入本质就是一个个图像。综上,BN 可以理解为对深层神经网络每个隐层神经元的**值做简化版本的白化操作。
BatchNorm的本质思想
- 梯度消失:深层神经网络在做非线性变换前的**输入值随着网络深度加深,分布逐渐发生偏移或者变动,进而导致训练收敛变慢,进而导致整体分布逐渐往非线性函数的取值区间的上下限两端靠近,进而造成梯度消失(对于Sigmoid函数来说,意味着**输入值WX+B是大的负值或正值)。
- BN 的本质:对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布 强制拉回到 均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。
标准正态分布的意义
为什么将非线性函数的输入分布转为标准正态分布后,就可以缓解梯度消失问题呢?
如图所示,某个隐藏层神经元的**输入 x 取值符合正态分布。且此时属于均值-2,方差 0.5 对应着绿色的线,对该输入进行 BN 操作就是将该输入调整为均值为0,方差为 1的正态分布,意味着图形曲线更加平缓了(红色的线)。BN 操作一般是对圆曲线进行平移均值压缩或者扩大了尖锐程度。
那么这样的意义在哪里呢?
如上图,为正态分布的分布情况,可以看到有大约 95% 的 x 的值落在 [-2,2] 之间,我们再来看看 sigmoid 函数:
可以看到 sigmoid 函数变化最大的范围也就是在 [-2,2] 之间。
综上,可以看到,将非线性函数的输入转成标准正态分布的目的是为了输入的数据大多落在 [-2,2] 之间,而对于这一区间的数值,**函数存在很明显的梯度变化。
也就是说,经过 BN 后,目前大部分 Activation 的值落入非线性函数的线性区域内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。
BN 的拓展
具体的训练过程
前三步主要是计算数据集的均值和方差,将输入数据进行 规范化,得到标准正态分布的数据集合
x
^
i
\hat{x}_i
x^i ,然后作者在最后又加了一次线性组合:
y
=
s
c
a
l
e
×
x
+
s
h
i
f
t
y=scale\times x+shift
y=scale×x+shift
添加线性组合的原因:
上文说过: 经过这个变换后某个神经元的**x形成了标准正态分布,目的是把值往后续要进行的非线性变换的线性区拉动,增大导数值,增强反向传播信息流动性,加快训练收敛速度。
但是这样会导致网络表达能力下降,为了防止这一点,每个神经元增加两个调节参数(scale和shift),这两个参数是通过训练来学习到的,用来对变换后的**反变换,使得网络表达能力增强,即对变换后的**进行scale 和 shift 操作,这其实是变换的反操作。
BatchNorm的好处
- 极大提升了训练速度,收敛过程大大加快;
- 增加了分类的效果,一种解释是这是类似于 Dropout 的一种防止过拟合的正则化表达方式,所以不用 Dropout 也能达到相当的效果;
- 另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等
注意: 从上面的阐述可以看出 BN 操作在线性变化之后,非线性变化之前才是有意义的。