算法解决的问题:
机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。
Internal Covariate Shift:
训练时每个batch数据的分布可能会有所差异,如果不对这种差异进行归一化处理,会导致训练有一些波动,单纯对输入数据进行白化处理可能不够,因为浅层信息的小差异随着网络层数的加深差异会逐渐变大,在每个卷积和全连接层的输出加上BN可将这种差异归一化。
原理:
如图所示,训练时
u
u
u,
o
o
o为当前batch的均值和方差,并通过一阶矩的形式计算整个训练集的均值和方差,
y
y
y,
B
B
B根据decay参数进行更新学习的参数;推断时
u
u
u,
o
o
o为训练时计算好的整个训练集的均值和方差,
y
y
y,
B
B
B为训练时计算好的参数。
y
y
y,
B
B
B的必要性:
BN为了保证非线性的获得,对变换后的满足均值为0方差为1的输出进行了scale加上shift操作(
y
=
y
∗
x
+
B
y=y*x+B
y=y∗x+B),每个神经元增加了两个参数
y
y
y,
B
B
B参数,这两个参数是通过训练学习到的,意思是通过
y
y
y,
B
B
B把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
算法优点:
- 加速训练过程:BN解决ICS问题,减少训练时的波动
- 可以使用较大的学习率 :BN减轻样本分布的波动,让每次梯度更合理
- 允许在深层网络中使用sigmoid这种易导致梯度消失的激活函数:BN可让激活函数的输入数据在0附近波动
- 具有轻微地正则化效果,以此可以降低dropout的使用:BN与dropout一般二选一
参考网站:
tensorflow接口