归一化方法整理
参考:
https://mp.weixin.qq.com/s/2VmgcEZGxSYVMBTGOPADJA
https://blog.csdn.net/Fate_fjh/article/details/53375881
目前最主流的归一化方法为BN.BN的作用shi为了解决梯度消失与梯度爆炸,如sigmoid激活函数,当参数过大或过小时,就会引起梯度消失,使得网络训练困难。

BN作用是将将参数拉回到激活函数比较敏感的区域。
计算过程中可以看到,
1.求数据均值
2.求数据方差
3.数据进行标准化(个人认为称作正态化也可以)
4.训练参数γ,β
5.输出y通过γ与β的线性变换得到新的值

以CNN某层特征为例,其维度为[N, H, W, C]即N张图片,分辨率为HW,C个通道。
BN首先在计算在(N ,H, W)维度上的均值μ和方差σ
,然后各个通道上(C维度)进行标准归一化。最后对归一化的特征进行放缩和平移(scale and shift),γ和β是可学习的参数(参数大小为C)。也就是每次对N个NW的参数求均值方差,总共求C个通道进行标准化。(实际中N是batch_size)。BN存在的问题是对batch_size敏感,当batch_size较小时,性能较差。
后续的改进方法都没有考虑batch_size层面。
BN是在(N, H, W)维度上,LN是在(H,W,C)维度上,IN是在(H,W)维度上,GN其通过对C分组,此时特征可以从[N, H, W, C]变成[N, H, W, G, C/G],GN的计算是在[H, W, G]维度上。LN,IN以及GN都没有在B维度上进行归一化,所以不会有BN的问题。

BN与GN性能对比

GN性能与batch_size无关,但是在大batch_size时性能不如GN。
谷歌推出的新方法FRN层包括归一化层FRN(Filter Response Normalization)和激活层TLU(Thresholded Linear Unit)。FRN层不仅消除了模型训练过程中对batch的依赖,而且当batch size较大时性能优于BN。

FRN的操作是(H, W)维度上的,即对每张图片的每个channel单独进行归一化,所以FRN没有BN层对batch依赖的问题。BN层采用归一化方法是减去均值然后除以标准差,而FRN却不同,这里没有减去均值操作,公式中的
v是x的二次范数的平均值。这种归一化方式类似BN可以用来消除中间操作(卷积和非线性激活)带来的尺度问题,有助于模型训练。
如果FRN之后是ReLU激活层,可能产生很多0值,这对于模型训练和性能是不利的。为了解决这个问题,FRN之后采用的阈值化的ReLU,即TLU:
相关归一化方法性能对比。FRN与batch_size无关,且性能高于大batch_size的BN.
