写在前面:此文只记录了下本人感觉需要注意的地方,不全且不一定准确。详细内容可以参考文中帖的链接,比较好!!!
BN详解
GN详解
- 归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2018年);
- 下图是几种归一化方式的对比。图中的立方体是三维,其中两维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)。
Batch Normalization
- BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的**输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着**输入值WU+B是大的负值或正值,梯度几乎为0),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得**输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
- BN的基本公式
- 公式中$\gamma、\beta $的作用:
由于公式1~3,使得对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题,加速模型收敛。
但是很明显,不就只使用了非线性函数中的线性部分了么,这意味着深层的线性变化没有意义了(因为多层线性网络和一层线性网络是等价的)。为了保证非线性功能的使用,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
- 总结
优点
- 极大提升了训练速度,收敛过程加快
- 通过防止过拟合,提高了分类效果
- 调参变简单,初始化要求降低
缺点
- 比较依赖当前batch的数据,如果batch size 较小,效果提升不大
Group Normalization
- GN是针对BN的batch size较小时提出的改进方法,其基本思想并不复杂,针对每一个feature map,将其channels 分成 k 组(k为超参,一般取32),计算每组内部的均值和方差,其他与BN类似。引用原文的一句话:GN divides the channels into groups and computes within each group the mean and variance for normalization. GN’s computation is independent of batch sizes, and its accuracy is stable in a wide range of batch sizes.
- 伪代码:
- 总结
- 具有BN的优点的同时(也能防止过拟合?),解决了batch size问题。