本文主要是对Batch Normalization的简析和自己的理解
Batch Normalization解决了什么问题
为了解决训练过程中输入数据分布漂移——Internal Covariate Shift
ICS和ICS的问题
什么是ICS?
1、IID:
机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。
2、神经网络隐层多,会产生ICS,不符合IID假设:
在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去。
ICS的问题
训练深层神经网络收敛越来越慢:
- 随着网络深度加深或者在训练过程中,输入分布逐渐发生偏移或者变动。
- 之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失
BN层是什么
1、总览
BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
2、详细步骤
1、把每层神经网络神经元对应的输入值进行标准化,将输入值的分布强行拉回到均值为0方差为1的标准正态分布中
2、拉回到正态分布中后,进行scale和shift变换,增强网络的表达能力:
y ( k ) = γ ( k ) x ( k ) + β ( k ) y^{(k)} = \gamma^{(k)}x^{(k)} + \beta^{(k)} y(k)=γ(k)x(k)+β(k)
为什么会有第二步操作
如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了?这意味着什么?我们知道,如果是多层的线性函数变换其实这个深层是没有意义的,因为多层线性网络跟一层线性网络是等价的。这意味着网络的表达能力下降了,这也意味着深度的意义就没有了
-
所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的
-
scale: 正态分布图形长胖或者变瘦
-
shift: 正态分布图形左移或者右移
BN层的优点
- 训练速度角度:
- 将在激活函数中的输入值变换到 远离最大最小值的区间,防止了梯度消失问题,极大提升了训练速度
- 将在激活函数中的输入值变换到 远离最大最小值的区间,防止了梯度消失问题,极大提升了训练速度
- learning rate:
- 因为ICS问题,原始NN为了不断适应新的输入数据分布,同时每层更新都会影响到其他层,因此每层参数的更新策略需要尽可能谨慎,所以在设置learning rate时会设置较小的learning rate
- 而加了BN层后,可以设置较大的learning rate,加速收敛
参考资料
https://www.cnblogs.com/guoyaohua/p/8724433.html
https://zhuanlan.zhihu.com/p/33173246