批量归一化——Batch Normalization

1.概述

在神经网络的训练中,我们有很多的参数如学习率、权重衰减系数等,我们使用随机梯度下降法等时,往往需要对这些参数不断调整,这将会花费我们大量的时间。这种情况下使用批量归一化能很好地解决这种问题。

批量归一化即通过归一化、缩放及平移使得数据变为满足或近似高斯形式的分布。我们知道在神经网络训练开始前,这是因为神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这就引导我们对数据做一个归一化的预处理使之满足相同的分布。总的来说,批量归一化就是解决训练过程中中间层数据分布发生改变的状况。

2.网络层的前向传导过程

批量归一化——Batch Normalization
批量归一化——Batch Normalization
这里批量归一化——Batch Normalization

在实战中,网络一旦训练完毕,参数都是固定的,这个时候即使每批训练样本进入网络,批量归一化层(BN)的均值与标准差也不会发生改变,这些数值可以用来作为测试样本中的均值和标准差。
测试阶段的均值和标准差为:
批量归一化——Batch Normalization
即对于均值来说直接计算所有batch u值的平均值;然后对于标准偏差采用每个batch σB的无偏估计。
最后测试阶段,BN的使用公式就是:
批量归一化——Batch Normalization
Δ:BN可以应用于一个神经网络的任何神经元上,BN通常可以置于全连接层、卷积层或**函数层的前面,非线性层的后面:批量归一化——Batch Normalization
在置于**函数层后面时,使得**函数层从z=g(Wu+b)变为z=g(BN(Wu+b)),而偏置参数b经过BN层后其实是没有用的,最后也会被均值归一化(当然BN层后面还有个β参数作为偏置项),所以**函数层变为了z=g(BN(Wu))

3.BN的作用

(1)改进了整个网络的梯度流
(2)提升网络的鲁棒性,能在更广范围的学习率和不同的初始值下工作(学习率衰减速度会很快,使得收敛很快(就算学习率很小,也比以前的收敛速度快))
(3)改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求(不用再去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性)
(4)再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层)

4.网络学习步骤

(1)数据预处理(零均值)
(2)选择网络结构
(3)进行前向传播检查Loss是否合理(不含正则项的10类的Loss约为2.3,加正则项Loss会提高)
(4)使用小数据开始训练(不加正则项看能否降Loss为0)
(5)使用全部数据,小的正则化训练,尝试不同的学习率
Ⅰ、Loss不下降或下降的很慢=>学习率设置的小了
Ⅱ、Loss为NaN=>网络发生爆炸,学习率设置得太大了
Δ:学习率的范围大概为0.001~0.00001
批量归一化——Batch Normalization

5.超参数的选择

使用交叉验证策略选择超参数:训练集上训练,验证集上验证
批量归一化——Batch Normalization
验证数据集与训练数据的准确率相差过大,表明可能过拟合了,可以尝试增大正则项;准确率没有差距,没有过拟合,可以增加模型容量。
随机采样较网格采样在寻找合适的超参数时更优,因为网格采样只会对一组超参数的固定值采样,随机采样更加真实
批量归一化——Batch Normalization
参考链接:https://blog.****.net/qq_41853758/article/details/82930944