BN的作用一共有三个:
1 加速网络的收敛速度
2 控制了梯度消失的问题
3 防止过拟合
BN可以认为是在每一层的输入和上一层的输出之间加入一个计算层,对数据的分布进行额外的约束,从而增强模型的泛化能力。但是BN同时也降低了模型的拟合能力,BN之后的输入分布被强制为均值为0标准差为1。以Sigmoid激活函数为例,BN之后的输入分布整体处于函数的非饱和区域,只包含线性变换,破坏了之前学习到的特征分布。为了恢复原始数据分布,所以引入了缩放和平移参数。仅用这两个参数就可以恢复最优的输入数据分布,与之前的网络层解耦,从而更加有利于优化的过程,提高模型的泛化能力。
介绍
- 低层的微弱变化会引起高层的输入分布的变化,高层的网络需要不断地调整去适应输入的变化。从而导致收敛速度慢,学习速度慢。所以在没有使用BN之前,我们都要选择一个小的学习率和合适的初始化参数。
- BN首先是得输入Normalization,使其变成均值为0,方差为1的分布,normalization缓解了ICS,使得每一层的输入变得稳定,但是缺乏了数据原有的表达能力,使得底层学习到的信息丢失,并且均值为0,方差为1,在经过sigmoid的时候,容易陷入到其线性区域。
- 所以引入γ和β,恢复数据的表达能力,对规范后的数据进行线性变换。
一、使用顺序:
Conv=>BN=>ReLU=>dropout=>Conv
BN本质上是解决传播过程中的梯度消失问题
二、训练
训练时前向传导过程公式:
理解:
- 这个可学习重构参数 γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。(因为如果没有 γ、β ,那相当于我这一层网络所学习到的特征分布被你搞坏了)
- 这个 scale 和 shift ,它们的主要作用就是找到一个线性和非线性的平衡点,既能享受非线性较强的表达能力,有可以避免非线性饱和导致网络收敛变慢问题。
细节:
-
假如某一层卷积层有6个特征图,每个特征图的大小是100 * 100,这样就相当于这一层网络有6 * 100 * 100个神经元,如果采用BN,就会有6 * 100 * 100个参数γ、β,这样岂不是太恐怖了。因此卷积层上的BN使用,其实也是使用了类似权值共享的策略,把一整张特征图当做一个神经元进行处理。
-
卷积神经网络经过卷积后得到的是一系列的特征图,如果min-batch sizes为m,那么网络某一层输入数据可以表示为四维矩阵 (m,c,w,h),m为min-batch sizes,c为特征图个数,w、h分别为特征图的宽高。在CNN中我们可以把每个特征图看成是一个特征处理(一个神经元),因此在使用Batch Normalization,mini-batch size 的大小就是:m ∗ w ∗ h ,于是对于每个特征图都只有一对可学习参数:γ、β。说白了吧,这就是相当于求取所有样本所对应的一个特征图的所有神经元的平均值、方差,然后对这个特征图神经元做归一化。
三、测试
对于BN,当一个模型训练完成之后,它的所有参数都确定了,包括均值和方差,γ和β。
测试的时候还是一样的:
对于所有的γ和β,在测试的时候都是固定的(使用的是整个训练集的均值和方差,移动平均计算而来的)
四、BN的作用
-
改善流经网络的梯度
-
允许更大的学习率,大幅提高训练速度:
你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性; -
减少对初始化的强烈依赖
-
改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求
你再也不用去理会过拟合中dropout、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性; -
再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;
-
可以把训练数据彻底打乱(防止每批训练的时候,某一个样本都经常被挑选到,文献说这个可以提高1%的精度)。
五、BN的不足
- 当batch size较小时(比如2、4这样),该batch数据的均值和方差的代表性较差,因此对最后的结果影响也较大。随着batch size越来越小,BN层所计算的统计信息的可靠性越来越差,这样就容易导致最后错误率的上升;而在batch size较大时则没有明显的差别。虽然在分类算法中一般的GPU显存都能cover住较大的batch设置,但是在目标检测、分割以及视频相关的算法中,由于输入图像较大、维度多样以及算法本身原因等,batch size一般都设置比较小,所以GN对于这种类型算法的改进应该比较明显。
如上图,可见 BN 随着 batchsize 减小,性能下降比较明显。
由于BN训练的时候是基于一个 mini-batch 来计算均值和方差的,这相当于在梯度计算时引入噪声,如果 batchsize 很小的话, BN 就有很多不足。不适用于在线学习(batchsize = 1)当数据是大图片,并且一个batch一般都只有1-2张图片,不建议使用 BN、
- batchsize 小的时候可以用 group normalization 代替
BatchNorm:batch 方向做归一化,算 N ∗ H ∗ W NHWN∗H∗W 的均值
LayerNorm:channel 方向做归一化,算 C ∗ H ∗ W CHWC∗H∗W 的均值
InstanceNorm:一个 channel 内做归一化,算 H ∗ W H*WH∗W 的均值
GroupNorm:将 channel 方向分 group ,然后每个 group 内做归一化,算 ( C / / G ) ∗ H ∗ W ( C / / G ) ∗ H ∗ W (C//G)∗H∗W的均值
针对每一个 γ 和 β,GN 是对每一个 channel 进行学习的
其中两维 C 和 N 分别表示 channel 和 batch size,第三维表示 H,W,可以理解为该维度大小是 H ∗ W ,也就是拉长成一维,这样总体就可以用三维图形来表示。可以看出 BN 的计算和 batch size 相关(蓝色区域为计算均值和方差的单元),而 LN、BN 和 GN 的计算和 batch size 无关。同时 LN 和 IN 都可以看作是 GN 的特殊情况(LN 是 group=1 时候的 GN,IN 是 group=C 时候的GN)。
六. 为什么BN层一般在线性层和卷积层后面,而不是放在非线性单元后面
因为非线性单元的输出分布形状会在训练过程中发生变化,归一化无法消除他的方差偏移,相反的,全连接层和卷积层的输出是一个对称的,非稀疏的分布,类似于高斯分布,对他们进行归一化会产生更加稳定的分布。如果像relu这样的激活函数,如果输入的数据是一个高斯分布,经过它变换之后的数据是什么形状?小于0的被抑制了,也就是分布小于0的部分直接变成0了。
参考文献:
- 网络中BN层的作用
- BN的作用
- BN训练和测试时的区别
- 卷积神经网络CNN—— BN(Batch Normalization) 原理与使用过程详解
- BN的实现
- BN(讲的不错)
- BN