从论文给出的伪代码可以看出,BN层的计算流程如下。
1 .计算样本均值。
2 .计算样本方差。
3 .样本数据标准化处理。
4 .进行平移和变焦处理。 引入了和两个参数。 训练和两个参数。 引入了该可学习重构参数、,使我们的网络能够学习恢复原网络应该学习的特征分布。
BN是对不同样本的相同特征进行归一化。
BN层的作用
BN层的作用主要有三个:
1 .加快网络训练和收敛速度
2 .控制坡度爆炸防止坡度消失
3 .防止过度拟合。
接下来,分析为什么BN层具有三个作用。
加快网络培训和收敛
在深度神经网络中,每层数据分布不同会使网络收敛和训练变得非常困难,但将每层数据转换为均值为零、方差为1的状态后,进行训练使每层数据分布相同会变得容易收敛。
控制坡度爆炸以防止坡度消失
梯度消失:在深度神经网络中,网络的**输出越大,相应的梯度越小,网络学习速度越慢。 假设网络中每一层的学习梯度最大值小于0.25,且网络中有n层。 由于链式求导,第一层的坡度小于0.25的n次幂,因此学习速度相对较慢,而网络的最后一层只是需要的。坡度较大,学习速度会加快。 结果,在深网络中,浅层几乎不学习,权重的变化变小。 另一方面,后面几层的网络一直在学习,后面的网络基本上可以代表整个网络。 那样的话,就会失去深度的意义。 (在BN层归一化时,网络输出不变大,梯度不变小)
梯度爆炸:第一层偏移量梯度=层斜率1x权值1x层梯度2x… 层斜率(n-1)x权值(n-1)x层梯度n,假设**层梯度最大值为0.25,则所有层权重为100 (使用bn层后的权重更新也不是很大
防止过拟合
在网络培训中,BN将关联一个minibatch中的所有示例。 因此,网络不会从一个训练样本中生成确定的结果。 这意味着,相同样本的输出不再仅取决于样本本身,还取决于与该样本属于同一batch的其他样本。 因为每个网络都是随机batch的,所以整个网络在这个方向上学习不强烈。 在一定程度上避免了过度拟合。
为什么BN层用在线性层和卷积层之后,而不是非线性单元之后
原文是这样说明的。 非线性单元的输出分布形式在训练过程中会发生变化,规范化无法消除他的方差偏差。 相反,全连通和卷积层的输出一般是对称的,不稀疏的一个分布,更像欢喜的立方分布。 将他们规范化后,会产生更稳定的分布。 实际想想也是这样。 像relu这样的**函数,如果你输入的数据是喜悦的方形盒子分布,那么他转换的数据会是什么样的? 小于0的被抑制了。 也就是说,分布小于0的部分直接变成了0。