归一化,对原始数据进行线性变换把数据映射到 0~1,
标准化,使得数据服从标准正态分布。

BN

ICS

什么是Internal Covariate Shift?

Batch Normalization的原论文作者给了Internal Covariate Shift一个较规范的定义:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。

Internal Covariate Shift会带来什么问题?

  • 上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低
  • 网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度

    如何减缓Internal Covariate Shift?

  • 数据规范化

    • 使得输入特征分布具有相同的均值与方差。其中 PCA 白化保证了所有特征分布均值为 0,方差为 1;而 ZCA 白化则保证了所有特征分布均值为0,方差相同;
    • 去除特征之间的相关性。
  • BN

    • 简化 ZCA 白化, 规范化处理后让数据尽可能保留原始的表达能力。

      原理

      BN 层

      标准化层 - 图1

      BN层中含有统计数据数值,即均值和方差

  • track_running_stats=True,eval 模式使用的是滑动平均的统计值

    参数

  • apply scalar scale and bias

  • 统计量跟 batch size 有关
  • 参数量 2c

    优势

  • BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度

  • BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定
  • BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
  • BN具有一定的正则化效果

    GN,LN和IN

    image.png

    1. # num_groups = 1, GN = LN
    2. # num_groups = c, GN = IN
    3. def GroupNorm(x, gamma, beta, G, eps=1e5):
    4. # x: input features with shape [N,C,H,W]
    5. # gamma, beta: scale and offset, with shape [1,C,1,1] # G: number of groups for GN
    6. N, C, H, W = x.shape
    7. x = tf.reshape(x, [N, G, C // G, H, W])
    8. mean, var = tf.nn.moments(x, [2, 3, 4], keep dims=True) x = (x mean) / tf.sqrt(var + eps)
    9. x = tf.reshape(x, [N, C, H, W])
    10. return x gamma + beta

    LN 参数

  • apply elementwise scale and bias

  • 参数量 和 normalized shape 有关

    IN 参数

  • 参数量 2c

    GN 参数

  • 参数量 2c

    SN

  • 结合 BN, IN, LN, 赋予不同的权重,让网络去学