返回介绍

数学基础

统计学习

深度学习

工具

Scala

十、Normalization

发布于 2023-07-17 23:38:25 字数 23708 浏览 0 评论 0 收藏 0

10.1 batch normalization

  1. batch normalization是优化神经网络的一大创新。

    • 它并不是一个优化算法,而是一个自适应的、调整参数模型的方法。
    • 它试图解决训练非常深的神经网络的困难。
  2. 深度神经网络训练困难的一个重要原因是:深度神经网络涉及很多层的叠加,而每一层的参数更新会导致上一层的输入数据分布发生变化。这会带来两个问题:

    • 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。

    • 通过层层叠加,高层的输入分布变化会非常剧烈。这就使得高层需要不断去适应底层的参数更新变化。

      这就要求我们需要非常谨慎的设定学习率、初始化权重、参数更新策略。

10.1.1 白化

  1. 在机器学习中,如果数据是独立同分布的,则可以简化模型的训练,提升模型的预测能力。所以通常需要对输入数据进行白化whitening。 白化主要实现两个目的:

    • 去除特征之间的相关性。即:特征之间尽可能的独立。
    • 使得所有特征都具有相同的均值和方差。即:特征之间尽可能的同分布。
  2. 白化操作:

    • 首先将输入执行 PCA 降维,这称作PCA 处理。
    • 然后在新的空间中,对输入数据的每一维进行标准差归一化处理。
  3. 理论上可以对神经网络的每一层的输入执行白化来解决输入数据分布的问题。但是有两个困难:

    • 白化操作代价高昂,算法复杂度太大。因为PCA 处理涉及到协方差矩阵 $ \mathbf X^T\mathbf X $ 的特征值求解,而计算协方差矩阵的算法复杂度为 $ O(N^2\times n^2) $ (不考虑Strassen 算法优化),其中 $ N $ 为数据集样本数量, $ n $ 为特征数量。

      对于神经网络的训练集,通常 $ N $ 都数以万计甚至百万计,如果在每一层、每一次参数更新都执行白化操作,则不可接受。

    • 白化操作不可微,这样反向传播算法无法进行。

    因此batch normalization 就退而求其次,执行简化版的白化:将神经网络的每一层的输入的分布限定其均值和方差。

10.1.2 深层网络的参数更新

  1. 对于一个深层的神经网络,如果同时更新所有层的参数,则可能会发生一些意想不到的后果。

    假设有一个深层神经网络,一共有 $ l $ 层,每层只有一个单元,且每个隐层不使用激励函数。则输出为:

    $ \hat y=xw_1w_2\cdots w_l $

    其中 $ w_i $ 为第 $ i $ 层的权重。第 $ i $ 层的输出为: $ h^{}=h^{ }w_i $ 。

    令 $ \mathbf{\vec g}=(g_1,g_2,\cdots,g_l)^T=\nabla_{\mathbf{\vec w}}\hat y $ ,其中:

    $ g_i=\frac{\partial \hat y}{w_i} = x\prod_{j=1,j\ne i}^{l}w_j $

    利用梯度下降法更新参数,则有: $ \mathbf{\vec w}\leftarrow \mathbf{\vec w}-\epsilon \mathbf{\vec g} $

  2. 如果使用 $ \hat y $ 的一阶泰勒近似,则有: $ f(\mathbf{\vec w}-\epsilon \mathbf{\vec g})-f(\mathbf{\vec w})\approx-\epsilon \mathbf{\vec g}^{T}\mathbf{\vec g} $ 。即: $ \hat y $ 的值下降了 $ \epsilon \mathbf{\vec g}^{T}\mathbf{\vec g} $ 。因此梯度下降法一定能够降低 $ \hat y $ 的值。

    如果直接按多项式乘法展开,则会考虑 $ \epsilon $ 的二阶、三阶甚至更高阶的项,有:

    $ f(\mathbf{\vec w}-\epsilon \mathbf{\vec g})-f(\mathbf{\vec w})=x(w_1-\epsilon g_1)(w_2-\epsilon g_2)\cdots (w_l-\epsilon g_l)-xw_1w_2\cdots w_l\\ = -\epsilon x \sum_{i=1}^{l}\left(g_i\prod_{j=1,j\ne i}^{l}w_j\right)+\epsilon^{2} x \sum_{i=1}^{l}\sum_{j=i}^{l}\left(g_ig_j\prod_{k=1,k\ne i,k\ne j}^{l}w_k\right)+\cdots $

    考虑到 $ g_i=x\prod_{j=1,j\ne i}^{l}w_j $ ,则有:

    $ f(\mathbf{\vec w}-\epsilon \mathbf{\vec g})-f(\mathbf{\vec w})=-\epsilon \mathbf{\vec g}^{T}\mathbf{\vec g}+\epsilon^{2} x \sum_{i=1}^{l}\sum_{j=i}^{l}\left(g_ig_j\prod_{k=1,k\ne i,k\ne j}^{l}w_k\right)+\cdots\\ $
    • 如果 $ w_i $ 都比较小,则 $ \prod_{k=1,k\ne i,k\ne j}^{l}w_k $ 很小,则二阶项可以忽略不计。

      如果 $ w_i $ 都比较大,则该二阶项可能会指数级大。此时很难选择一个合适的学习率,使得 $ f(\mathbf{\vec w}-\epsilon \mathbf{\vec g})-f(\mathbf{\vec w})\lt 0 $ 。

      因此某一层中参数更新的效果会取决于其他所有层(即:其它层的权重是不是较大)。

    • 虽然二阶优化算法会利用二阶项的相互作用来解决这个问题,但是还有三阶项甚至更高阶项的影响。

10.1.3 BN 算法

  1. batch normalization解决了多层之间协调更新的问题,它可以应用于网络的任何输入层或者隐层。

  2. 设 $ \mathbb H_{mini-batch} = \{\mathbf{\vec h}_1,\mathbf{\vec h}_2,\cdots,\mathbf{\vec h}_m\} $ 为神经网络某层的一个mini-batch 的输入, $ n $ 为输入的维度。

    • 首先计算这个mini-batch 输入的均值和每维特征的标准差:

      $ \vec \mu= \frac 1m \sum_{i=1}^m \mathbf{\vec h}_i\\ \vec\sigma ^2 = (\sigma_{1}^2,\sigma_{2}^2,\cdots,\sigma_{n}^2)^T,\quad \sigma_{j}^2 = \frac 1m \sum_{i=1}^m (h_{i,j}-\mu_{j})^2 $
    • 然后对输入进行归一化:

      $ \mathbf{\vec h}_i^{<1>} = \frac{\mathbf{\vec h}_i-\vec\mu}{\sqrt{\vec\sigma^2+\epsilon}} $

      其中 $ \frac{1}{\sqrt{\vec\sigma^2+\epsilon}} $ 表示逐元素的除法: $ h_{i,j}^{<1>}=\frac{h_{i,j}-\mu_j}{\sqrt{\sigma_j^2+\epsilon}},j=1,2,\cdots,n $ 。

    • 最后执行缩放: $ \mathbf{\vec h}_i^{<2>} =\vec\gamma \odot \mathbf{\vec h}_i^{<1>}+\vec\beta $ 。其中 $ \vec \gamma,\vec\beta $ 是网络从数据中自动学习到的参数,用于调整 $ \mathbf{\vec h}_i^{<2>} $ 的均值和方差, $ \odot $ 为逐元素积。

      虽然 $ \mathbf{\vec h}_i^{<2>} $ 的每个维度不是零均值、单位方差的,但是可以保证它的每个维度的均值、方差不再依赖于低层的网络。

  3. 归一化一个神经元的均值和标准差会降低包含该神经元的神经网络的表达能力。

    若每个神经元的输出都是均值为0、标准差为 1 ,则会产生两个问题:

    • 无论底层的神经元如何学习 ,其输出在提交给上层神经元处理之前,都被粗暴的归一化。导致底层神经元的学习毫无意义。

    • sigmoid 等激活函数通过区分饱和区、非饱和区(线性区),使得神经网络具有非线性计算的能力。

      输入归一化使得数据几乎都被映射到激活函数的线性区,从而降低了模型的表达能力。

    因此执行缩放的原因是:保证模型的容量不会被降低。

    当网络学到的参数且好是 $ \vec\gamma = \sqrt{\vec\sigma^2+\epsilon},\vec\beta=\vec\mu $ 时, $ \mathbf{\vec h}_i^{<2>} = \mathbf{\vec h}_i $ ,因此BN 可以还原原来的输入。这样,模型既可以改变、也可以保持原输入,这就提升了网络的表达能力。

  4. batch normalization 算法

    • 输入:

      • 网络中某层的一个mini-batch 的输入 $ \mathbb H_{mini-batch} = \{\mathbf{\vec h}_1,\mathbf{\vec h}_2,\cdots,\mathbf{\vec h}_m\} $
      • 参数 $ \vec\gamma,\vec\beta $ (它们是由神经网络自动学习到的)
    • 输出:经过batch normalization 得到的新的输入 $ \mathbb H_{mini-batch}^{<2>} = \{\mathbf{\vec h}_1^{<2>},\mathbf{\vec h}_2^{<2>},\cdots,\mathbf{\vec h}_m^{<2>}\} $

    • 算法步骤:

      • 计算输入的每个维度的均值和方差:

        $ \vec \mu= \frac 1m \sum_{i=1}^m \mathbf{\vec h}_i\\ \vec\sigma ^2 = (\sigma_{1}^2,\sigma_{2}^2,\cdots,\sigma_{n}^2)^T,\quad \sigma_{j}^2 = \frac 1m \sum_{i=1}^m (h_{i,j}-\mu_{j})^2 $
      • 对输入的每个维度执行归一化:

        $ \mathbf{\vec h}_i^{<1>} = \frac{\mathbf{\vec h}_i-\vec\mu}{\sqrt{\vec\sigma^2+\epsilon}} $
      • 执行缩放: $ \mathbf{\vec h}_i^{<2>} = \vec\gamma \odot \mathbf{\vec h}_i^{<1>}+\vec\beta $

  5. 根据梯度的链式法则,反向传播规则为(假设代价函数为 $ \mathcal L $ ):

    • $ \nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L = \vec\gamma \odot \nabla_{\mathbf{\vec h}_i^{<2>}} \mathcal L $

    • 考虑到 $ \vec \gamma,\vec\beta $ 出现在 $ \mathbf{\vec h}_1^{<2>} ,\cdots, \mathbf{\vec h}_m^{<2>} $ 中,因此有:

      $ \nabla_{\vec\beta} \mathcal L = \sum_{i=1}^m \nabla_{\mathbf{\vec h}_i^{<2>}} \mathcal L,\quad \nabla_{\vec \gamma} \mathcal L = \sum_{i=1}^m (\nabla_{\mathbf{\vec h}_i^{<2>}} \mathcal L)\odot \mathbf{\vec h}_i^{<1>} $
    • 由于 $ \vec\mu,\vec\sigma^2 $ 出现在 $ \mathbf{\vec h}_1^{<2>} ,\cdots, \mathbf{\vec h}_m^{<2>} $ 中,因此有:

      $ \nabla_{\vec\mu} \mathcal L= \sum_{i=1}^m\left (\frac{\partial \mathbf{\vec h}_i^{<1>} }{\partial \vec\mu}\right)^T \nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L= \sum_{i=1}^m - \frac{\nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L}{\sqrt{\vec\sigma^2+\epsilon}}\\ \nabla_{\vec\sigma^2} \mathcal L = \sum_{i=1}^m\left (\frac{\partial \mathbf{\vec h}_i^{<1>} }{\partial \vec\sigma^2}\right)^T \nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L= \sum_{i=1}^m -\frac 12 \frac{\mathbf{\vec h}_i-\vec\mu}{(\vec\sigma^2+\epsilon)^{3/2}}\odot (\nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L) $
    • 由于 $ \mathbf{\vec h}_i $ 出现在多条路径中,因此有:

      $ \nabla_{\mathbf{\vec h}_i} \mathcal L= \left(\frac{\partial \mathbf{\vec h}_i^{<1>}}{\partial \mathbf{\vec h}_i}\right)^T\nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L + \left(\frac{\partial \vec\mu}{\partial \mathbf{\vec h}_i}\right)^T\nabla_{\vec\mu} \mathcal L + \left(\frac{\partial \vec\sigma^2}{\partial \mathbf{\vec h}_i}\right)^T\nabla_{\vec\sigma^2} \mathcal L\\ = \frac{\nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L}{\sqrt{\vec\sigma^2+\epsilon}}+\frac{\nabla_{\vec\mu} \mathcal L}{m}+\frac 2m (\mathbf{\vec h}_i-\vec\mu)\odot \nabla_{\vec\sigma^2} \mathcal L $

  6. 大多数神经网络隐层采用 $ \phi(\mathbf X\mathbf W+\mathbf{\vec b}) $ 的形式,其中 $ \phi $ 是非线性激励函数(如relu)。

    batch normalization 中推荐使用 $ \phi(\mathbf X\mathbf W) $ ,因为参数 $ \mathbf{\vec b} $ 会被 batch normalization 中的参数 $ \vec\beta $ 吸收:无论 $ \mathbf{\vec b} $ 的值是多少,在归一化的过程中它将被减去。

10.1.4 BN 内部原理

  1. BN 表现良好的一个解释是:内部协方差偏移Internal Covariate Shift:ICS 会对训练产生负面影响,BN 能够减少ICS

  2. 内部协方差偏移:低层网络的更新对当前层输入分布造成了改变。

    统计学习中一个经典假设是源空间source domain 和目标空间target domain 的数据分布一致。协方差偏移covariate shift 就是分布不一致假设之下的一个分支问题。它指的是:源空间和目标空间的条件概率是一致的,但是其边缘概率不同。即:对所有的 $ x \in \mathcal X $ ,有 $ P_s(Y\mid X=x) = P_t(Y\mid X=x) $ ,但是 $ P_s(X) \ne P_t(X) $ 。

    在神经网络中经过各层的作用,各层输出与其输入分布会不同。这种差异随着网络深度的增大而增大,但是它们能够“指示”的样本标记仍然不变,这就符合covariate shift 的定义。

    由于是对层间信号的分析,这就是internal 的由来。

    ICS 带来的问题是:各个神经元的输入数据不再是独立同分布的。

    • 上层参数需要不断适应新的输入数据分布,降低了学习速度。
    • 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
    • 每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
  3. 论文《How Does Batch Normalization Help Optimization》 2018 Shibani Santurkar etc. 说明BN 对训练带来的增益与ICS 的减少没有任何联系,或者说这种联系非常脆弱。研究发现:BN 甚至不会减少ICS

    论文说明 BN 的成功的真正原因是:它使得优化问题的解空间更加平滑了。这确保梯度更具有预测性,从而允许使用更大范围的学习率,实现更快的网络收敛。

10.1.5 BN 性质

  1. BN 独立地归一化每个输入维度,它要求每个mini batch 的统计量是整体统计量的近似估计。

    因此BN 要求每个mini-batch 都比较大,而且每个mini-batch 的数据分布比较接近。所以在训练之前,需要对数据集进行充分混洗,否则效果可能很差。

  2. 当验证或者测试的batch size 较小时(如:只有一个测试样本),此时无法得到mini batch 的统计量,或者mini batch 统计量无法作为整体统计量的近似估计。

    此时的做法是:先通过训练集上得到的所有 mini batch 的统计量的移动平均值,然后将它们作为验证或者测试时的mini batch 的统计量。

    但是当训练数据、验证数据、测试数据的数据分布存在差别时(如:训练数据从网上爬取的高清图片,测试数据是手机拍照的图片),训练集上预先计算好的mini batch 的统计量的移动平均值并不能代表验证集、测试集的相应的统计量。这就导致了训练、验证、测试三个阶段存在不一致性。

  3. BN 存在两个明显不足:

    • 高度依赖于mini batch 的大小。它要求每个mini-batch 都比较大,因此不适合batch size 较小的场景,如:在线学习(batch size=1 )。

    • 不适合RNN 网络。

      因为不同样本的 sequence 的长度不同,因此RNN 的深度是不固定的。同一个batch 中的多个样本会产生不同深度的RNN,因此很难对同一层的样本进行归一化。

  4. 设 $ \mathbf{\vec h}_i= \mathbf W \mathbf{\vec x}_i $ ,则BN 具有权重伸缩不变性,以及数据伸缩不变性。

    • 权重伸缩不变性:假设 $ \tilde {\mathbf W}=\lambda\mathbf W $ ,则有:

      $ \tilde{\mathbf{\vec h}}_i = \lambda \mathbf{\vec h}_i,\quad \tilde{\vec \mu} = \lambda\vec\mu,\quad \tilde{\vec\sigma}_2 = \lambda^2 \vec\sigma_2 $

      其中因为 $ \epsilon $ 很小几乎可以忽略不计,因此有 $ \tilde{\mathbf{\vec h}}_i^{<1>} = \mathbf{\vec h}_i^{<1>} $ ,则有: $ \nabla_{\tilde{\mathbf{\vec h}}_i^{<1>} }\mathcal L = \nabla_{ \mathbf{\vec h}_i^{<1>}} \mathcal L $ 。

      $ \frac{\partial \tilde{\mathbf{\vec h}}_i^{<1>}}{\partial \mathbf{\vec x}_i} = \frac{\tilde {\mathbf W}}{\sqrt {\tilde {\vec\sigma}^2+\epsilon}} = \frac{\mathbf W}{\sqrt {\vec\sigma^2+\epsilon}} = \frac{\partial \mathbf{\vec h}_i^{<1>}}{\partial \mathbf{\vec x}_i} $

      因此权重缩放前后, $ \nabla_{\mathbf{\vec x}_i} \mathcal L $ 保持不变。 $ \mathbf{\vec x}_i $ 是BN 层的输入, $ \nabla_{\mathbf{\vec x}_i} \mathcal L $ 就是高层流向低层的梯度,因此权重缩放不影响梯度的流动。

      另外,由于 $ \frac{\partial \tilde{\mathbf{\vec h}}_i^{<1>}}{\partial \tilde{\mathbf W}} = \frac 1\lambda \frac{\partial \mathbf{\vec h}_i^{<1>}}{\partial \mathbf W} $ ,因此权重越大,则该权重的梯度越小,这样权重更新就越稳定。这相当与实现了参数正则化的效果,避免了参数的大幅震荡。

      通常并不会把batch normalization 当作一种正则化的手段,而是作为加速学习的方式。

    • 数据伸缩不变性:假设 $ \tilde{\mathbf{\vec x}}_i=\lambda \mathbf{\vec x}_i $ ,同理有:

      $ \frac{\partial \tilde{\mathbf{\vec h}}_i^{<1>}}{\partial \mathbf W} = \frac{\partial \mathbf{\vec h}_i^{<1>}}{\partial \mathbf W},\quad \frac{\partial \tilde{\mathbf{\vec h}}_i^{<1>}}{\partial \tilde{\mathbf {\vec x}}_i} = \frac 1\lambda \frac{\partial \mathbf{\vec h}_i^{<1>}}{\partial \mathbf {\vec x}_i} $

      因此数据的伸缩变化不会影响到对该层的权重更新,简化了对学习率的选择。

  5. 究竟是在激活函数之前、还是之后进行batch normalization, 这个问题在文献中有一些争论。

    实践中,通常都是在激活函数之前进行的。

  6. 在测试阶段,如果需要对单一样本评估,此时测试集只有单个样本,无法给出均值和标准差。

    解决的方式为:将 $ \vec\mu,\vec\sigma $ 设置为训练阶段收集的运行均值(或者是指数加权均值)。

10.2 其它 normalization

  1. 除了batch normalization 之外,还有layer normalization、 instance normalization、group normalization、 weight normalization

    下图给出了BN、LN、IN、GN 的示意图(出自论文《Group Normalization》 Kaiming He etc.)。其中蓝色部分表示:通过这些蓝色区域计算均值和方差,然后蓝色区域中的每个单元都使用这些均值、方差来归一化。

    注意:这里的BN 是网络某层中,对每个通道进行归一化;而前面的BN 是对每个神经元进行归一化。

    如果是对每个神经元进行归一化,则BN 示意图中,蓝色区域只有最底下的一行。

10.2.1 layer normalization

  1. BN 不同,LN 是对单个样本的同一层的神经元进行归一化,同层神经元使用相同的均值和方差。

    对于该层神经元,不同样本可以使用的均值和方差不同。

    与之相比,BN 是对每个神经元在mini batch 样本之间计算均值和方差。对每个神经元,mini batch 中的所有样本在该神经元上都使用相同的均值和方差。但是不同神经元使用不同的均值和方差。

    因此LN 不依赖于batch size,也不依赖于网络深度。因此它适合在线学习,也适合于RNN 网络。

  2. 设神经网络第 $ l $ 层的输入为 $ \mathbf{\vec h} $ , $ \mathbf{\vec h}=(h_1,\cdots,h_n)^T $ , $ n $ 为该层神经元的数量。则LN 的步骤为:

    • 首先计算该层所有神经元的均值和方差:

      $ \mu = \frac 1n \sum_{i=1}^n h_i,\quad \sigma^{2} = \frac 1 n\sum_{i=1}^n(h_i-\mu)^2 $
    • 然后对神经元进行归一化:

      $ \mathbf{\vec h}^{<1>} = \frac{\mathbf{\vec h}-\mu}{\sqrt{\sigma^{2}+\epsilon}} $

      其中 $ \mu ,\sigma^{2} $ 都是标量。

    • 最后执行缩放: $ \mathbf{\vec h}^{<2>}= \vec\gamma \odot \mathbf{\vec h}^{<1>} +\vec\beta $ 。

      BN 相同, $ \vec \gamma,\vec\beta $ 也是网络从数据中自动学习到的参数,用于调整 $ \mathbf{\vec h}^{<2>} $ 的均值和方差, $ \odot $ 为逐元素积。

      这一步的作用也是提升神经网络的表达能力。

  3. layer normalization 算法

    • 输入:

      • 网络中第 $ l $ 层的输入 $ \mathbf{\vec h} $
      • 参数 $ \vec\gamma,\vec\beta $ (它们是由神经网络自动学习到的)
    • 输出:经过layer normalization 得到的新的输入 $ \mathbf{\vec h}^{<2>} $

    • 算法步骤:

      • 计算该层所有神经元的均值和方差:

        $ \mu = \frac 1n \sum_{i=1}^n h_i,\quad \sigma^{2} = \frac 1 n\sum_{i=1}^n(h_i-\mu)^2 $
      • 对该层神经元进行归一化:

        $ \mathbf{\vec h}^{<1>} = \frac{\mathbf{\vec h}-\mu}{\sqrt{\sigma^{2}+\epsilon}} $
      • 执行缩放: $ \mathbf{\vec h}^{<2>}= \vec\gamma \odot \mathbf{\vec h}^{<1>} +\vec\beta $

  4. 根据梯度的链式法则,反向传播规则为(假设代价函数为 $ \mathcal L $ ):

    $ \nabla_{\mathbf{\vec h}^{<1>} } \mathcal L = \vec\gamma \odot \nabla_{\mathbf{\vec h}^{<2>} } \mathcal L\\ \nabla_{\vec\beta} \mathcal L = \nabla_{\mathbf{\vec h}^{<2>} } \mathcal L\\ \nabla_{\vec \gamma} \mathcal L = (\nabla_{\mathbf{\vec h}^{<2>}} \mathcal L)\odot \mathbf{\vec h}^{<1>} \\ \nabla_{\mu} \mathcal L = -\frac{1}{\sqrt{\sigma^{2}+\epsilon}}\sum_{i=1}^n \frac{\partial \mathcal L}{\partial h_i^{<1>}}\\ \nabla_{\sigma^{2}} \mathcal L = -\frac 12 \times\frac{1}{(\sigma^{2}+\epsilon)^{3/2}}\sum_{i=1}^n \frac{\partial \mathcal L}{\partial h_i^{<1>}}\times (h_i-\mu)\\= \frac{-1}{2(\sigma^{2}+\epsilon)^{3/2}}(\nabla_{\mathbf{\vec h}^{<1>} } \mathcal L )^T (\mathbf{\vec h}-\mu) $

    由于 $ \mathbf{\vec h} $ 出现在多条路径中,因此有:

    $ \nabla_{\mathbf{\vec h}} \mathcal L= \left(\frac{\partial \mathbf{\vec h}^{<1>}}{\partial \mathbf{\vec h}}\right)^T\nabla_{\mathbf{\vec h}^{<1>}} \mathcal L + \left(\frac{\partial \mu}{\partial \mathbf{\vec h}}\right) \nabla_{\mu} \mathcal L + \left(\frac{\partial \sigma^{2}}{\partial\mathbf{\vec h}}\right)\nabla_{\sigma^{2}} \mathcal L\\ = \frac{\nabla_{\mathbf{\vec h}^{<1>} } \mathcal L}{\sqrt{\sigma^{2}+\epsilon}}+\frac{ \nabla_{\mu} \mathcal L}{n}+\frac{2(\nabla_{\sigma^{2}} \mathcal L)\times (\mathbf{\vec h}-\mu)}{n} $

    其中出现标量与向量的加法,它等价于将标量扩充为向量,扩充向量在每个维度上的取值就是该标量。如: $ \frac 1n \rightarrow (\frac 1n,\frac 1n,\cdots,\frac 1n)^T $ 。

    其计算图如下所示,与BN 相同。

  5. LN 的特点是:针对单个样本进行,不依赖于mini batch 中的其它样本。

10.2.2 instance normalization

  1. INLN 相同,它们都是对单个样本进行操作。与LN 不同的是:IN 对同一层神经元中的同一个通道进行归一化。

    IN 主要用于图像处理任务中,此时每一层网络都有 N、H、W、C 四个维度。其中N 代表batch 维度,H、W 代表 feature map 的宽度和高度, C 代表通道数量。

    LN 使得同一层神经元中的同一个通道上的神经元使用相同的均值和方差。对于该通道中的神经元,不同的样本使用的均值和方差不同。

  2. 设单张图片在网络第 $ l $ 层的输入张量为 $ \mathbf X =(X_{i,j,k}) \in \mathbb R^{C\times H\times W} $ 。 为了防止名字冲突,这里用 $ \mathbf X $ 标记第 $ l $ 层的输入。其中 $ C $ 为通道数, $ H,W $ 为feature map 的高度和宽度。

    三个索引分别代表: $ i $ 代表通道维的索引, $ j,k $ 分别代表高度和宽度维度的索引。

    LN 的步骤为:

    • 首先计算样本在第 $ i $ 个通道的神经元的均值和方差:

      $ \mu_{i} = \frac {1}{H\times W} \sum_{j=1}^H\sum_{k=1}^W X_{i,j,k},\quad \sigma^{2}_{i} = \frac {1}{H\times W} \sum_{j=1}^H\sum_{k=1}^W(X_{i,j,k}-\mu_{i})^2 $
    • 然后对神经元进行归一化:

      $ X_{i,j,k}^{<1>} = \frac{X_{i,j,k}-\mu_{i}}{\sqrt{\sigma_{i}^2+\epsilon}}, \quad j=1,\cdots,H;k=1,\cdots,W $
    • 最后执行缩放:

      $ X_{i,j,k}^{<2>} =\gamma_{i,j,k} \times X_{i,j,k}^{<1>} +\beta_{i,j,k} $

      其中 $ \gamma_{i,j,k},\beta_{i,j,k} $ 表示第 $ i $ 个通道位于 $ (j,k $ ) 的神经元的缩放因子和平移因子。

  3. instance normalization 算法

    • 输入:

      • 网络第 $ l $ 层的输入张量为 $ \mathbf X =(X_{i,j,k}) \in \mathbb R^{ C\times H\times W} $
      • 参数张量 $ (\gamma_{i,j,k}),(\beta_{i,j,k})\in \mathbb R^{C\times H\times W} $
    • 输出:经过instance normalization 得到的新的输入 $ \mathbf X^{<2>} $

    • 算法步骤:

      • 计算样本在第 $ i $ 个通道的神经元的均值和方差:

        $ \mu_{i} = \frac {1}{H\times W} \sum_{j=1}^H\sum_{k=1}^W X_{i,j,k},\quad \sigma^{2}_{i} = \frac {1}{H\times W} \sum_{j=1}^H\sum_{k=1}^W(X_{i,j,k}-\mu_{i})^2 $
      • 对神经元进行归一化:

        $ X_{i,j,k}^{<1>} = \frac{X_{i,j,k}-\mu_{i}}{\sqrt{\sigma_{i}^2+\epsilon}}, \quad j=1,\cdots,H;k=1,\cdots,W $
      • 执行缩放: $ X_{i,j,k}^{<2>} =\gamma_{i,j,k} \times X_{i,j,k}^{<1>} +\beta_{i,j,k} $ 。

  4. instance normalization 的反向传播规则的推导类似layer normalization

  5. BNmini batch 中所有图片求均值和方差,计算得到的统计量会受到mini batch 中其它样本的影响。而IN 是对单个图片求均值和方差,与其它样本无关。

    • 对于GAN、风格迁移这类任务上,IN 效果要优于BN 。其普遍解释为:这类生成式方法,每张图片自己的风格比较独立,不应该与batch 中其它图片产生太大联系。
    • IN 也不依赖于batch size,也不依赖于网络深度。因此它适合在线学习,也适合于RNN 网络。

10.2.3 group normalization

  1. GN 首先将通道分组。假设有C 个通道,分成G 个组,则:通道1,...,C/G 为一个组,通道C/G+1,...,2C/G 为一个组.... 。

    然后GN 对每个通道组进行归一化。

    因此可以看到:GN 介于LNIN 之间。如果G=1,即只有一个分组,则GN 就是LN ;如果G=C,即每个通道构成一个组,则GN 就是IN

  2. group normalization 算法

    • 输入:

      • 网络第 $ l $ 层的输入张量为 $ \mathbf X =(X_{i,j,k}) \in \mathbb R^{ C\times H\times W} $
      • 分组的组数 $ G $
      • 参数张量 $ (\gamma_{i,j,k}),(\beta_{i,j,k})\in \mathbb R^{G\times H\times W} $
    • 输出:经过group normalization 得到的新的输入 $ \mathbf X^{<2>} $

    • 算法步骤:

      • 计算每个分组的通道数 $ n_G =\frac{C}{G} $

      • 计算样本在第 $ i $ 个分组的神经元的均值和方差:

        $ \mu_{i} = \frac {1}{n_G\times H\times W} \sum_{i^\prime=(i-1)*n_G+1}^{i*n_G}\sum_{j=1}^H\sum_{k=1}^W X_{i^\prime,j,k}\\ \sigma^{2}_{i} = \frac {1}{n_G\times H\times W} \sum_{i^\prime=(i-1)*n_G+1}^{i*n_G} \sum_{j=1}^H\sum_{k=1}^W(X_{i^\prime,j,k}-\mu_{i})^2 $
      • 对神经元进行归一化:

        $ X_{(i-1)*n_G+g,j,k}^{<1>} = \frac{X_{(i-1)*n_G+g,j,k}-\mu_{i}}{\sqrt{\sigma_{i}^2+\epsilon}}\\ j=1,\cdots,H;k=1,\cdots,W;i=1,\cdots,G;g=1,\cdots,n_G $
      • 执行缩放: $ X_{i,j,k}^{<2>} =\gamma_{i,j,k} \times X_{i,j,k}^{<1>} +\beta_{i,j,k} $ 。

  3. GN 有效的可能原因是:在网络的每一层中,多个卷积核学到的特征并不是完全独立的。某些特征具有类似的分布,因此可以被分到同一组。

10.2.4 比较

  1. 根据论文《Group Normalization》 Kaiming He etc. 得到的结论:

    • BN 很容易受到batch size 的影响,而GN 不容易受到batch size 的影响。

      如下图/表 所示为BNGN 的比较,模型为resnet-50、训练集为ImageNet、训练硬件为8个带GPUworker 、指标为它们在验证集上的验证误差。

      batch size3216842
      BN23.623.724.827.334.7
      GN24.124.224.024.224.1
      提升0.50.5-0.8-3.1-10.6

    • 在较大的batch size 上,BN 的表现效果最好。

      resnet-50 模型在ImageNet 训练中,当采用batch size=32 时,采取各种normalization 的模型的表现(验证误差)为:

      BNLNINGN
      验证误差23.625.328.424.1
      相比 BN 的提升--1.7-4.8-0.5

      下图为这些模型在各个epoch 事训练、验证的表现:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文