Group Normalization详解与应用,及相关BatchNorm、LayerNorm、InstanceNorm、SwitchableNorm介绍

本文主要从何凯明2018年发表的《Group Normalization》出发,对Group Norm进行理解,以及在三维医学影像上的应用,并对文中提及的其他几种归一化方法进行说明,并给出部分代码和论文链接。

文章目录

  • 1 综述
    • 1.1 Group Normalization
    • 1.2 Batch Normalization
    • 1.3 Layer Normalizaiton
    • 1.4 Instance Normalization
    • 1.5 Switchable Normalization

1 综述

训练深度网络的时候经常发生训练困难的问题,因为,每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难。通过归一化这种方式可以减小图像之间的绝对差异,突出相对差异,加快训练速度。
论文中列出如下几种目前常见的Normalization方法。
Group Normalization详解与应用,及相关BatchNorm、LayerNorm、InstanceNorm、SwitchableNorm介绍_第1张图片

归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2019年),论文连接见下文

当输入Tensor为3D医疗影像,则记为[N, D, H, W, C],这几个方法主要的区别就是在:

  • Group Norm是将channel分组,把channel进行了划分细化,对 C//G * D * H * W 做归一化,其中G在论文中给出的是32,可解决batch Norm对小batchsize效果不好的问题。三维医疗影像因存在slice,受限于显存大小,一般batch size都很小,GN具有较好的效果;

  • Batch Norm是在batch上,对 NDHW 做归一化,就是对每个单一通道输入进行归一化,这样做对小batchsize效果不好;

  • Layer Norm在通道方向上,对 CDHW 归一化,就是对每个深度上的输入进行归一化,主要对RNN作用明显;

  • Instance Norm在图像像素上,对 DHW 做归一化,对一个图像的长宽即对一个像素进行归一化,用在风格化迁移;

  • Switchable Norm是将BN、LN、IN结合,在training过程中训练各种权重,让网络自己去学习归一化层应该使用哪种归一化方法,对于不同神经网络都具有较好的效果。

对于对应2D图像归一化总结大家可查看博文;

1.1 Group Normalization

论文连接:https://arxiv.org/pdf/1803.08494.pdf

该方法主要是针对Batch Normalization对小batchsize效果差的问题,提出将channel方向分group,然后每个group内做归一化,算(C//G) * H * W 的均值,这样与batchsize无关,不受其约束。文中列出数据对比:
Group Normalization详解与应用,及相关BatchNorm、LayerNorm、InstanceNorm、SwitchableNorm介绍_第2张图片
发现当随着batch size的减少,在相同epochs下BN的错误率逐渐变高了,但Group Norm并未受其影响,具有较好的稳定性。

伪代码如下
Group Normalization详解与应用,及相关BatchNorm、LayerNorm、InstanceNorm、SwitchableNorm介绍_第3张图片

def groupNormalization_layer(x, is_train, G=32, esp=1e-5, scope=None):
    """
    :param x:input data with shap of[batch,depth,height,width,channel]
    :param is_train:flag of normalizationlayer,True is training,False is Testing
    :param G:in group normalization,channel is seperated with group number(G)
    :param esp:Prevent divisor from being zero
    :param scope:normalizationlayer scope
    :return:
    """
    with tf.name_scope(scope + norm_type):
            # tranpose:[bs,z,h,w,c]to[bs,c,z,h,w]
            x = tf.transpose(x, [0, 4, 1, 2, 3])
            N, C, Z, H, W = x.get_shape().as_list()
            G = min(G, C)
            x = tf.reshape(x, [-1, G, C // G, Z, H, W])
            mean, var = tf.nn.moments(x, [2, 3, 4, 5], keep_dims=True)
            x = (x - mean) / tf.sqrt(var + esp)
            gama = tf.get_variable(scope + norm_type + 'group_gama', [C], initializer=tf.constant_initializer(1.0))
            beta = tf.get_variable(scope + norm_type + 'group_beta', [C], initializer=tf.constant_initializer(0.0))
            gama = tf.reshape(gama, [1, C, 1, 1, 1])
            beta = tf.reshape(beta, [1, C, 1, 1, 1])
            output = tf.reshape(x, [-1, C, Z, H, W]) * gama + beta
            # tranpose:[bs,c,z,h,w]to[bs,z,h,w,c] 
            output = tf.transpose(output, [0, 2, 3, 4, 1])
    return output
	

1.2 Batch Normalization

论文连接:https://arxiv.org/pdf/1502.03167.pdf

对输出层进行Batch Norm后,可以放心的使用大学习率,较大的学习率极大的提高了学习速度,
Batch Norm本身上也是一种正则的方式,可以代替其他正则方式如dropout等。而且batch Norm降低了数据之间的绝对差异,有一个去相关的性质,更多的考虑相对差异性,因此在分类任务上具有更好的效果。
Group Normalization详解与应用,及相关BatchNorm、LayerNorm、InstanceNorm、SwitchableNorm介绍_第4张图片
算法中两个额外的两个超参,因如果直接做归一化不做其他处理,神经网络是学不到任何东西的。但是加入这两个参数gamma和beta之后,可保证当前Tensor能还原到归一化之前,也即缩放平移到了归一化前的分布,相当于batch norm没有起作用, β 和 γ 分别称之为 平移参数和缩放参数 。这样就保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练。

代码如下:

def batchNormalization_layer(x, is_train, esp=1e-5, scope=None):
    """
    :param x:input data with shap of[batch,height,width,channel]
    :param is_train:flag of normalizationlayer,True is training,False is Testing
    :param esp:Prevent divisor from being zero
    :param scope:normalizationlayer scope
    :return:
    """
    with tf.name_scope(scope + norm_type):
            # tranpose:[bs,z,h,w,c]to[bs,c,z,h,w]
            x = tf.transpose(x, [0, 4, 1, 2, 3])
            N, C, Z, H, W = x.get_shape().as_list()
            mean, var = tf.nn.moments(x, [0, 2, 3, 4], keep_dims=True)
            x = (x - mean) / tf.sqrt(var + esp)
            gama = tf.get_variable(scope + norm_type + 'group_gama', [C], initializer=tf.constant_initializer(1.0))
            beta = tf.get_variable(scope + norm_type + 'group_beta', [C], initializer=tf.constant_initializer(0.0))
            gama = tf.reshape(gama, [1, C, 1, 1, 1])
            beta = tf.reshape(beta, [1, C, 1, 1, 1])
            output = tf.reshape(x, [-1, C, Z, H, W]) * gama + beta
            # tranpose:[bs,c,z,h,w]to[bs,z,h,w,c] 
            output = tf.transpose(output, [0, 2, 3, 4, 1])
    return output
	

1.3 Layer Normalizaiton

论文连接:https://arxiv.org/pdf/1607.06450v1.pdf

batch normalization存在以下缺点:

  • 对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布;
  • BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长很多,这样training时,计算很麻烦。

与BN不同,LN是针对深度网络的某一层的所有神经元的输入按以下公式进行normalize操作
Group Normalization详解与应用,及相关BatchNorm、LayerNorm、InstanceNorm、SwitchableNorm介绍_第5张图片

BN与LN的区别在于:

  • LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差;
  • BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差。

所以,LN不依赖于batch的大小和输入sequence的深度,因此可以用于batchsize为1和RNN中对边长的输入sequence的normalize操作。

论文中数据如下,可发现LN用于RNN效果比较明显。
Group Normalization详解与应用,及相关BatchNorm、LayerNorm、InstanceNorm、SwitchableNorm介绍_第6张图片

1.4 Instance Normalization

论文连接:https://arxiv.org/pdf/1607.08022.pdf

BN注重对每个batch进行归一化,保证数据分布一致,因为判别模型中结果取决于数据整体分布。
但是图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。
论文中给出公式如下:
在这里插入图片描述

1.5 Switchable Normalization

论文连接:https://arxiv.org/pdf/1806.10779.pdf

  • 归一化虽然提高模型泛化能力,然而归一化层的操作是人工设计的。在实际应用中,解决不同的问题原则上需要设计不同的归一化操作,并没有一个通用的归一化方法能够解决所有应用问题;
  • 一个深度神经网络往往包含几十个归一化层,通常这些归一化层都使用同样的归一化操作,因为手工为每一个归一化层设计操作需要进行大量的实验。

因此作者提出自适配归一化方法——Switchable Normalization(SN)来解决上述问题。与强化学习不同,SN使用可微分学习,为一个深度网络中的每一个归一化层确定合适的归一化操作。适合各种不同的深度网络模型。

公式如下,将IN,BN,LN分别赋予不同的权重,并在训练时学习这些权重。
Group Normalization详解与应用,及相关BatchNorm、LayerNorm、InstanceNorm、SwitchableNorm介绍_第7张图片

论文中给出的图表结果如下,可发现Switchable Norm对于不同的网络都具有较好的适应性,且在图像分类中BN权重较高,图像分割迁移网络中IN权重较高,符合认知。
Group Normalization详解与应用,及相关BatchNorm、LayerNorm、InstanceNorm、SwitchableNorm介绍_第8张图片

你可能感兴趣的:(深度学习)