也是深度学习面试常考的东西,BN、LN、GN、IN等各种N,参考文章:https://zhuanlan.zhihu.com/p/115949091
定义其实一张图基本就能说明白,但是还有各种细节,先放图吧,然后后面讲到的时候再对着图讲:
1.BN
BN就是一个Batch算一个均值和方差,再做一个归一,为什么要这么做,学术一点是因为要解决Internal Covariate Shift问题,对隐层状态进行规范化使得神经元状态处理在匹配的量级上,加速和稳定模型的收敛;白话一点我觉得就是激活函数的激活区间在靠近y轴的区域,但是也不一定这样做就会是想要的,所以还会乘以缩放系数再加上偏置;
对于全连接层来说就是对一个Batch内的数做均值方差归一比较简单;那对于卷积层来说就是上面图最左的表示,一个batch(可以想象成B个C*H*W的小方块)出一个C*H*W的map,每一个方块都要和这个方块作用;
BN除了在FC和CNN上有区别,还在训练和预测时也有区别。训练时是按batch算均值和方差,预测肯定不能这样,就得有一个定值在那用于做BN,定值怎么得到呢:滑动平均(https://blog.csdn.net/s_sunnyy/article/details/79896273),blog中说没什么道理为什么前面的要衰减,这本身也就是个次优值;那还有一个问题为什么训练的时候不用全量训练数据的均值和方差常量呢,因为batch间差别可能比较大,这个差别能增强模型鲁棒性,使用全量数据可能会加剧过拟合。
2.LN
LN的提出主要是因为BN太依赖batch_size了,如果batch_size较小,均值和方差就很不稳定,容易学崩;上次我设了batch_size=1还error了,有可能是有的特征没有数据。
LN就是上面左数第二个,在C的维度去归一的,会得到B个W*H的map,每个方块都有对应的一个要拿去归一的map;
LN适用于小batch和RNN,大batch还是看BN
3.IN
IN是左数第三个,用于图像风格化任务,在H*W上归一,得到B个C*1的方块
4.GN
GN是左数第四个,LN的变种,先对C分组,再用这个组里的C来做LN,与batch_size无关,也不会用到全部的C(因为图像任务里用到全部的C确实很奇怪)
5.CBN
将前几次BN的参数保存起来,和这一次的一起去做一个推导得到这次用到的BN参数(可能是做一个滑动平均)
cp一下总结:BN是最传统的,如果batchsize允许够大的话,用在CNN中的效果依然是最好的;LN适合RNN;IN适合图像风格化任务;GN更适合小batchsize的CNN训练