Normalization in DL

归一化

注意:归一化标准化 不是同一个概念。

  • 为什么要进行归一化?

    • 去除不同特征之间由于单位不同导致的差别(比如身高用m,体重用kg)。
  • 归一化的作用

    • 加快梯度下降算法的收敛。(归一化之后损失函数的等高线由椭圆变成了圆,梯度直接朝向最小点移动)

      如果不进行归一化,由于特征向量中不同特征的取值相差较大,会导致目标函数变“扁”。这样在进行梯度下降的时候,梯度的方向就会偏离最小值的方向,增大训练时间。

      归一化之前

      如果进行归一化以后,目标函数会呈现比较“圆”,这样训练速度大大加快。

      归一化之后
    • 归一化有可能提高精度 (如 KNN)。

  • 归一化的方法

    • min-max

    • z score

  • 应用场景说明

    • 概率模型不需要归一化,因为这种模型不关心变量的取值,而是关心变量的分布和变量之间的条件概率。

    • SVM、线性回归之类的最优化问题需要归一化,是否归一化主要在于是否关心变量取值。

    • 神经网络需要标准化处理,一般变量的取值在 $ -1 $ 到 $ 1 $ 之间,这样做是为了弱化某些变量的值较大而对模型产生影响。一般神经网络中的隐藏层采用tanh激活函数比sigmod激活函数要好些,因为tanh双曲正切函数的取值 $ [-1,1] $ 之间,均值为 $ 0 $ 。

    • 在 K 近邻算法中,如果不对解释变量进行标准化,那么具有小数量级的解释变量的影响就会微乎其微。

  • 参考

Batch Normalization

  • 传统的归一化方法:白化。但是有不足:

    • 计算量非常大(第一步进行 PCA)。

    • 不是处处可微的,所以不能在神经网络中使用。

    • 这种单纯的归一化可能会破坏掉某一层网络学到的特征。

      这些原因导致无法用到 DNN 中。

  • Batch Normalization:即在每次 SGD 时,通过 mini-batch 来对相应的 activation 做规范化操作,使得输出信号各个维度的均值为 $ 0 $ ,方差为 $ 1 $ 。而最后的 scale and shift 操作则是为了让因训练所需而“刻意”加入的 BN 能够有可能还原最初的输入(即当),从而保证整个 network 的 capacity。(有关 capacity 的解释:实际上 BN 可以看作是在原模型上加入的“新操作”,这个新操作很大可能会改变某层原来的输入。当然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既可以改变同时也可以保持原输入,那么模型的容纳能力(capacity)就提升了。)

  • BN 相当于弄了一个可以 学习 的归一化层,这种“学习”体现在:如果网络认为不需要对这一层的输出做归一化,可以通过 $ \beta $,$ \gamma $ 来控制归一化后的结果和原始的输出相近似。

  • $ \beta $,$ \gamma $ 起到了 de-normalization 的作用。如果不用 $ \beta $,$ \gamma $ 的话,就只是单纯的做了归一化,此时网络无法把归一化的特征转化回去(这层学到的、一化之前的特征),此时就已经不是 BN 了。

  • BN 本质上解决的是反向传播过程中的梯度问题。

    把得到的特征进行 “零均值, $ 1 $ 方差”,相当于把数据压缩到了原点为中心,此时对于 sigmoid/tanh ,梯度是比较大的时候。

  • BN 有一种理解是每个 batch 的均值和方差由于 shuffle 都会改变,所以可以理解做了一种数据增强。参考1参考2

  • BN 放在激活函数的前面还是后面,没有一个确定的答案。(原论文中提到放到激活函数的前面,ResNet 的改进版本也是放到了激活函数的前面。)

  • BN 存在的问题:

    • BN 的优势在 batch size > 32/64 的时候才会凸显出来。

    • BN 在 image to image translation 中,必须不能区分 train 和 test 阶段,否则效果很差。

      • BN 在 classification 当中的效果较好,主要原因是因为 classification 对于 scale 不敏感。但是 superresolution 这样图片到图片的变换,per image 的 scale 还是一个有效信息。
    • BN无法用到 RNN

      • 因为本质上 BN 是对每个 神经元/卷积核 单独做 normalization,应用到 RNN 的环境中,就是在每个 time step 都需要进行 BN,这就会浪费很大的计算资源和存储资源。使得网络更为复杂,更难训练。所以导致无法用到 RNN 中。(并不是不能用到 RNN 中,而是用了之后效果可能不好。参考:CNN和RNN中如何引入BatchNorm - CSDN博客)

      • 在每次迭代中引进了随机性,使梯度增加了 noise,这一点使得 BN 对于 generative model(例如 lstm 网络)或者 reinforcement learning(例如 DQN )都是不适用的。

    • Batch Normalization 基于一个mini batch的数据计算均值和方差,而不是基于整个Training set来做,相当于进行梯度计算式引入噪声。因此,Batch Normalization不适用于对噪声敏感的强化学习、生成模型(Generative model:GAN,VAE)使用。相反,Weight Normalization对通过标量g和向量v对权重W进行重写,重写向量v是固定的,因此,基于Weight Normalization的Normalization可以看做比Batch Normalization引入更少的噪声。<深度学习优化策略-3> 深度学习网络加速器Weight Normalization_WN

参考

Layer Normalization

  • 同一层的所有神经元(卷积核)得到的 feature map 进行归一化。

  • BN 是对同一个神经元(卷积核)在不同的样本得到的 feature map 进行归一化。

  • 这里一层网络共享一个均值和方差,不同训练样本对应不同的均值和方差,这是和 BN 的最大区别。参考1

  • LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于小 mini-batch 场景、动态网络场景和 RNN ,特别是自然语言处理领域。此外,LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。

  • 但是,BN 的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而 LN 对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么 LN 的处理可能会降低模型的表达能力。参考1

Instance Normalization

  • image-to-image translation(Super resolution,Style transfer)、GAN 等任务中,BN 的效果并不好(比如:CycleGANDualGAN中使用的 BN 没有区分训练和测试阶段)。使用 BN 的时候,如果测试阶段设置 is_training=False,生成的图片是噪点,设置成is_training=True,可以得到和 IN 相近的效果。

  • IN 可以理解成为每个图片自己做 BN,这样比 BN 能保留更多scale信息。更新的研究表明如果训练收敛不是问题的话,进一步去掉 IN 的效果也会更好。参考

参考

对比:BN vs LN vs IN

BN vs LN vs IN.jpg

  • 上图的 C 可以看成是某一层中神经元的数目(对于 FC )或卷积核的数目(对于 CNN)。

  • 一开始z轴方向的 H,W 看不懂什么意思,其实这里可以理解为 H*W。这种设计很合理:对于 FC,垂直于 C 的一个纵列可以看做是某个神经元的输出向量;对于 CNN,垂直于 C 的一个纵列可以看成把某一个 feature map 拉伸后得到的一个向量。

  • Batch Normalization 是对某一个隐藏层中的 每一个 神经元/卷积核的输出(即垂直于 C 的每一列)单独(即不同神经元/卷积核的输出之间不会有关联,这里是相对于 LN 所说的)做 cross sample 的normalization。

  • Layer Normalization 是对某一个隐藏层中的 所有 神经元/卷积核的输出(即垂直于 C 的每一列)一起 做。

  • Instance Normalization 是对某一个隐藏层中的 每一个 神经元/卷积核的输出(即垂直于 C 的每一列)单独(即不同神经元/卷积核的输出之间不会有关联,这里是相对于 LN 所说的)做 normalization。(这里和 Batch Normalization 最像,相当于去掉了 cross sampleBN

Conditional Batch Normalization

  • 相对于 BN,这里的 meanvariance 不再是通过计算训练数据集得到,而是采用类似于 word embedding 的方式训练一个 lookup table,然后查表得到meanvariance

  • 实验效果比传统的 Conditional GAN 的效果好(传统的方法:把 condition 信息和 Generator/Discriminatorfeature map 进行concat)。

  • Conditional GAN 更好的方法:cGANs with Projection Discriminator (Generator用的是Conditional Batch Normalization来引入 condition 信息,没有使用 concat)。

Batch Re-normalization

Weight Normalization