normaliztion是一个线性的操作,其目标是将非标准正态分布的数据数据,转换成为标准的正态分布(这个操作又称为白化),并且添加scale加上shift操作(y=scale*x+shift), 这样将(0 , 1)标准正态分布的输入数据转换成为稍微偏离(0, 1)标准正态分布的数据输入,可以保证输入数据基本维持正态状态,且输入非线性。normaliztion常见的有五种,batch normaliation, layer normaliztion, instance normalztion, group normaliztion,Weight Normalization, 对于每一种normaliztion,必须要知道其内部结构,和不同的normaliztion在什么应用场景下使用是最优的。
所有norm共同点就是:
从上面几个图应该看出来BN在干什么了吧?其实就是把隐层神经元激活输入x=WU+B从变化不拘一格的正态分布通过BN操作拉回到了均值为0,方差为1的正态分布,即原始正态分布中心左移或者右移到以0为均值,拉伸或者缩减形态形成以1为方差的图形。什么意思?就是说经过BN后,目前大部分Activation的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。
batch norm的推理(验证)阶段理解: 在验证阶段,很显然每次输入的图像为1张图片,那么单张图片无法求解均值与方差,为了解决one-example的推理的bn,bn在验证的过程中单独设计了验证bn操作。
在验证过程中,使用整个训练集的方差以及均值,在训练的过程中,每一层的卷积层分别记录每个batch的均值与方差,在验证的过程中,直接通过n个batch的均值和方差计算其数学期望,即可获得全局的均值与方差,并且隐含层的也有训练好的scale和shift值,通过计算即可获得单个样例的推理效果(深入需要再去看原文链接理解。)
Batch Norm 的优点:关键还是效果好。①不仅仅极大提升了训练速度,收敛过程大大加快;②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等*。
layer norm是norm的一种,是为了解决小batch的情况下bn的效果不好的一种方法,同时适用于rnn,在n个神经元输入处求平均。
layer norm出现背景:
BN虽然带来了很多好处,不过BN的缺点还是有一些的:
(1) BN特别依赖Batch Size;当Batch size很小的适合,BN的方差和均值不能代表整个数据集的分布。在很多情况下,Batch size大不了,因为你GPU的显存不够。所以,通常会有其他比较麻烦的手段去解决这个问题,比如MegDet的CGBN等。
(2) BN对处理序列化数据的网络比如RNN是不太适用的,因为rnn 的sequence的长度是不一致的,导致每次输入神经元的深度是不一致的,所以,若出现一个很长的sequence,那么bn的效果会很不好。
(3) BN只在训练的时候用,验证的时候不会用到,因为验证的输入不是批量输入。这也不一定是BN的缺点,但这是BN的特点。
layer norm的计算公式:
Instance norm提出原因: 根据之前的两个介绍,我们知道了常规的bn是为了在mini-batch上模拟allset的均值和方差设计的归一化方法,layer nrom是为了在输入的batch为1-2,或者在深度不一致的rnn中能用上归一化的方法所以提出的两个方法,那么问题来了,instance norm主要是为了风格迁移设计的,那么风格迁移主要有什么特点呢?
风格迁移的每张图的风格比较重要,如果使用bn,那么多张图都会被归一化到同一个数据分布,由此可见,每张图经过bn都会受到其他图片的影响,并且若经过shuffle操作,那么每次经过bn后的单张图片的数据分布都是不一样的,那么问题来了,风格迁移对于图片像素点的稳定性需求很大,如果两次图片的数据分布不同,同一张图片的同一个位置的像素点不同,那么就会生成两张风格不一致的图片,(因为它不是像语义分割一样对像素点分类,是对像素点提取和转换嘛)。所以要在风格迁移上能用上norm,还不能破坏原有的像素规律,那么只能用instance norm了。
看到这里的基本都不太想看了,我们带一张图来研究研究四种norm的异同吧。记住,常规BN设为32
众所周知,深度网络中的数据维度一般是[N, C, H, W]或者[N, H, W,C]格式,N是batch size,H/W是feature的高/宽,
C是feature的channel,压缩H/W至一个维度,其三维的表示如上图,假设单个方格的长度是1,那么其表示的是[6, 6,*, * ]
上图形象的表示了四种norm的工作方式:
BN在batch的维度上norm,归一化维度为[N,H,W],对batch中对应的channel归一化;
LN避开了batch维度,归一化的维度为[C,H,W];
IN 归一化的维度为[H,W];
而GN介于LN和IN之间,其首先将channel分为许多组(group),对每一组做归一化,
及先将feature的维度由[N, C, H, W]reshape为[N, G,C//G , H, W],归一化的维度为[C//G , H, W]
个人理解: 如图4, 四种norm的结构,C代表神经元的个数,N代表batch size, HW代表一个小格子。那么就可以看出,batch norm是不考虑神经元,直接对一个batch的数据做平均,数据平均完之后直接喂给神经元。LN,IN,GN都与batch无关,与神经元有关。对layer norm来说,输入的数据在神经元输入前规范化,因此每个神经元吃到的都是高斯分布的数据, instance norm只对同一张图片的feature map像素点做归一化,当group = 1,只有一组,就是layer norm ,当group norm = C,有C组,则I为Instance norm。在小batch的网络运行中,或者到训练后期,batch size缩小,图片放大的情况下,合适的Group norm较为优秀。(有待商榷,不太理解)
在wgan的使用过程中,数据也被归一化到[-1, 1]之间,在big gan的使用过程中,会用到其独有的norm,简单介绍一下吧。
wgan发现以下几个方法可以让训练非常稳定,不需要再看生成器和判别器是否能力相等,是否程序训练稳定。
wgan-GP这篇论文在wgan中发现,如果你将参数w强制截取到指定的范围,那么它训练中w大多数时间只出现在区间边界上, 如图左:
那么就会出现一个问题,w长期在这两个值固定了,那么梯度的反向传播过程会出现梯度消失(w长时间不变,根据链式反向传播规则,每次dw约为0),或者梯度爆炸(初始在(-1, 1)那么强制截断到(-90,90)那么w就会往90方向飞奔,dw >> 1, 通过链式反向传播,梯度就dw的n次方就炸了),所以不仅要限制原始的w的区间,并且要限制dw的区间!!
梯度惩罚就是既然Lipschitz限制是要求判别器的梯度不超过K,那么可以通过建立一个损失函数来满足这个要求,即先求出判别器的梯度d(D(x)),然后建立与K之间的二范数就可以实现一个简单的损失函数设计。但是注意到D的梯度的数值空间是整个样本空间,对于图片(既包含了真实数据集也包含了生成出的图片集)这样的数据集来说,维度及其高,显然是及其不适合的计算的。作者提出没必要对整个数据集(真的和生成的)做采样,只要从每一批次的样本中采样就可以了,比如可以产生一个随机数,在生成数据和真实数据上做一个插值。如图:
但是论文提出,由于是对每个batch中的每一个样本都做了梯度惩罚(随机数的维度是(batchsize,1)),因此判别器中不能使用batch norm,但是可以使用其他的normalization方法,比如Layer Normalization、Weight Normalization和Instance Normalization,论文中使用了Layer Normalization,weight normalization效果也是可以的。
明天再写吧。
batch nromalization原文地址
layer nromalization原文地址
Group nromalization原文地址