Batch Normalization
对每个batch中同一维特征做normalization。
可以调用slim.batch_norm实现。slim.batch_norm有两种实现方式,如果参数fused为None或者True,就用一种能更快的(?)融合实现方法;如果为False就用系统推荐的方法。
第一种方法实现函数是_fused_batch_norm()。训练时需要不断更新moving_mean和moving_variance,而更新的ops是保存在tf.GraphKeys.UPDATE_OPS中,这个更新过程在训练过程之前,因此训练操作train_op需要加上对参数更新操作update_ops的依赖:
第二种方法则是调用了tf.layers库中的类BatchNormlization。
但是这两种方法最后都是对nn.batch_normalization的包装,这么看两种方法似乎并没有什么不同,查了下网上的解释是在TensorFlow中fused_batch_norm只是将batch_norm中的多个ops合成一个,这样有助于加速。这里我不是很理解,我猜测这里所谓的“多个ops合成一个”是指_fused_batch_norm中构建了_force_updates()函数强制在train阶段更新moving_mean和moving_variance,而nn.batch_normalization中是没有写入这部分功能的,如果调用nn.batch_normalization就需要自己再写一个参数更新函数,也就是_forces_updates()。
PyTorch中可以调用torch.nn.BatchNorm2d等实现。
Layer Normalization
之前的BN是纵向规范化,而layer normalization则是横向规范化,针对单个训练样本的所有维度做normalization,不用保存mini_batch的均值和方差。BN中同一个batch的样本中的不同特征经过处理后分布在不同的区间,而LN则是将同一个样本中的特征处理到同一区间中。比如对于图片提取的三维特征图,经过BN后每层特征图的分布是不相同的,但是经过LN后每层特征图的分布是相同。TensorFlow中layer normalization的实现保证batch size为1。
TensorFlow中可以调用slim.layer_norm实现,PyTorch中可以调用torch.nn.LayerNorm实现。
BN和LN的对比:
batchnorm在[batch,height,weight]上计算mean和variance,维度是[channels],后面保留层表达能力的和维度是[channels];
layernorm在[height,weight,channels]上计算mean和variance,维度是[batch],后面保留层表达能力的和维度也是[channels]。
Instance Normalization
instance norm和batch norm的区别只有一点不同,那就是BN是作用于一个batch,而IN则是作用于单个样本。也就是说,BN是同一个batch中所有样本的同一层特征图抽出来一起求mean和variance,而IN只是对一个样本中的每一层特征图求mean和variance。这么说的话似乎instance norm只对3D数据有用,也就是只对图像特征有用。(如果是一维特征,那么用了instance norm结果还是自身,因为参与计算的值只有1个...)
TensorFlow中可以调用slim.instance_norm实现,PyTorch中可以调用torch.nn.InstanceNorm2d实现。
Weight Normalization
WN和其他normalization不一样,它不是利用数据特性对数据进行变换,而是利用网络参数W的特性对数据进行变换。
BN、LN和IN都是用输入数据的方差对输入数据进行scale,而WN则是用模型参数W的欧氏范式对输入数据进行scale。
TensorFlow和PyTorch中都没有weight norm的API,不过我在WGAN-GP的源码中找到了WN的实现代码:
norm_values=np.sqrt(np.sum(np.square(filter_values), axis=[0,1,2]))
其中,filter_values的维度是[filter_size,filter_size,input_dim,output_dim],axis=[0,1,2]表明在0、1、2维上求和,输出维度和输入的第3维度一样,为[output_dim]。也就是说,每一张特征图都对应一个norm_value。
WN相当于只对数据进行了scale,而没有shift。(只实现了参数的作用,并没有实现参数的作用)
Group Normalization
相当于对每张特征图进行区域划分,对每一部分求mean和variance。如果说BN,LN之流是一张特征图生成一组mean和variance,那么在group norm中就是一张特征图生成多组mean和variance。Group norm论文中的图就很直观地体现了这种不同: