目录
1. Batch Normalization的基本思想
BN解决的问题:深度神经网络随着网络深度加深,训练越困难,收敛越来越慢
问题出现的原因:深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新——BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布
BN的基本思想:
- 训练过程中整体分布逐渐往非线性函数的取值区间的上下限两端靠近,导致反向传播时低层神经网络的梯度消失,训练收敛慢
- BN把每层神经网络任意神经元输出的分布强行拉回到均值为0方差为1的标准正态分布,使得激活输入值落在非线性函数对输入比较敏感的区域,可以得到比较大的梯度,避免梯度消失,梯度变大意味着学习收敛速度快,能大大加快训练速度
2. BN层的作用
- 加快网络的训练和收敛的速度
- 深度神经网络中,每层的数据分布不一样会导致网络非常难收敛和训练,BN将每层数据分布转化为一致的标准正态分布,更容易收敛
- 控制梯度爆炸,防止梯度消失
- 梯度消失:深度神经网络中,如果网络的激活输出很大,其对应梯度会很小,甚至梯度消失,导致网络的学习速率慢,使用BN层归一化后,网络的输出不会很大,梯度就不会很小
- 梯度爆炸:第一层偏移量的梯度=激活层斜率1x权值1x激活层斜率2x…激活层斜率(n-1)x权值(n-1)x激活层斜率n,假如激活层斜率均为最大值0.25,所有层的权值为100,这样梯度就会指数增加,但使用BN层后权值的更新也不会很大
- 防止过拟合
- 在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习,一定程度上避免了过拟合
- Allows higher learning rates, faster convergence and networks become more robust to initialization -- Fei-Fei Li
注意⚠️:为什么BN层一般用在线性层和卷积层后面,而不是放在非线性单元后?
- 非线性单元的输出分布形状会在训练过程中变化,归一化无法消除它的方差偏移,相反的,全连接和卷积层的输出一般是一个对称、非稀疏的分布,更加类似高斯分布,对它们进行归一化会产生更加稳定的分布
- 例如Relu激活函数,输入的数据是一个高斯分布,变换后数据小于0的被抑制了(分布小于0的部分直接变成0)
3. 训练阶段和测试阶段的BN层
训练阶段:
- 例如batchsize为32,某层的某个神经元会输出32个响应值
- 对这32个响应求均值和标准差,再做归一化
- 归一化的响应值乘以γ,加上β
- 每个神经元都训练一组γ、β
测试阶段:
- 测试阶段均值、方差、γ、β都用训练阶段全局求出
- 在测试阶段Batch Normalization相当于做线性变换
注意⚠️:Dropout和BN都有防止过拟合的作用,单独使用,都带来一定的性能改进,为什么一起用反而性能下降?
原因:
- 当网络的状态从训练转移到测试时,Dropout转移了特定神经单元的方差。但是,在测试阶段,BN保持了它的统计方差,这是在整个学习过程中积累的。Dropout和BN中方差的不一致性(“方差偏移”),导致推断中不稳定的数值行为,最终导致错误的预测
- 如下图,Dropout在训练阶段以p的概率进行失活,而在测试阶段,对每个神经元进行尺度放缩(乘p)。另一种等价的表现形式,在训练阶段乘1/p,而测试阶段不需要做任何改动,所以,训练:X=a*(1/p)*X,测试:X=X,存在方差偏移
解决方案:总体思路是降低方差偏移
- 在所有BN层后使用Dropout
- 修改Dropout公式(如使用高斯Dropout)使得它对方差不是那么敏感
4. BN、LN、IN、GN与SN
BN、LN、IN和GN这四个归一化的计算流程几乎一样,输入的图像shape记为[N, C, H, W],区别在于:
BatchNorm:在batch上,对NHW做归一化,把每个通道的NHW单独拿出来归一化处理,针对每个channel都有一组γ,β,可学习的参数为2*C,当batch size越小,BN的表现效果也越不好,因为计算过程中所得到的均值和方差不能代表全局
LayerNorm:在通道方向上,对CHW归一化,把每个CHW单独拿出来归一化处理,不受batchsize 的影响,主要对RNN作用明显,常用在RNN网络,但如果输入的特征区别很大,那么就不建议使用它做归一化处理
InstanceNorm:在图像像素上,对HW做归一化,把每个HW单独拿出来归一化处理,不受通道和batchsize 的影响,常用在风格化迁移,但如果特征图可以用到通道之间的相关性,那么就不建议使用它做归一化处理
GroupNorm:将channel分组再做归一化,把先把通道C分成G组,然后把每个gHW单独拿出来归一化处理,最后把G组归一化之后的数据合并成CHW,GN介于LN和IN之间,LN(G=C)和IN(G=1)是GN的特例
SwitchableNorm:将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法,集万千宠爱于一身,但训练复杂