【论文阅读总结】Batch Normalization总结

时间:2022-12-21 09:51:38

1. 摘要

  • 内部协变移位现象
    • 训练深度神经网络很复杂,训练中随着前一层参数变化,后一层输入分布就会变化。就要求是用较低学习速率着重仔细的设置参数初始化值,导致训练速度较慢,并且使训练具有饱和非线性的模型变得非常困难。
  • 通过规范输入层来解决问题的方法。【Batch Normalization】
    • 将批量数据集输入之前进行标准化,进行训练。
    • 将 Batch Normalization(标准化)作为模型体系结构的一部分,并为每个训练小批量执行标准化,从而发挥了其优势。
    • 允许使用更高的学习率(也不能太高),并且对初始化参数不那么着重仔细。
    • 充当正则化器,在某些情况下去除了dropout的必要性。
  • 应用于图像分类模型,Batch Normalization实现了相同的精度且训练次数减少了14倍,并以显著的优势击败了原始模型。
  • 使用批量归一化网络,ImageNet分类结果精度得到提升:达到4.9%的top-5验证错误(和4.8%的测试错误),超过了人类识别的准确度。

2. 序言

  • 深度学习极大地提高了视觉、言语和许多其他领域的艺术水平。
  • 随机梯度下降(SGD)证明是训练深度网络的一种有效方法。
    • SGD优化了网络参数,以使损失最小化
  • SGD变换方法(例如:momentum【动量随机梯度下降】和Adagrad【自适应随机梯度下降】)已被用于实现最先进的性能。
  • 由于网络容易陷入饱和模式,sigmoid激活函数会导致梯度消失问题,所以使用ReLu作为激活函数【一般情况下,都会使用ReLu激活函数,或者转变的ReLu激活函数,不会用sigmoid激活函数】
  • 解决消失梯度方法
    • 使用ReLU激活函数
    • 调整超参数初始化值【Batch Normalization】
    • 使用较小的学习率

2.1 min-batches的优缺点

  • 优点
    • 小批量训练的损失梯度是训练集上的梯度估计,其质量随着批量大小的增加而提高(批量大小的增加使梯度更接近真实的全局梯度)。
    • 由于现代计算平台的并行性,并行批量计算的效率比m次迭代计算要高得多。
  • 缺点
    • 超参数初始化值难设置
      • 由于每个输入层都受到所有先前层参数的影响,因此训练变得复杂,因此网络参数的微小变化会随着网络的深入而放大,即需要仔细调整模型超参数,特别是学习率,以及模型参数初始值。
    • 会发生内部协变量转移
      • 内部协变量转移:深度网络内部节点分布变化。
      • 训练过程中,以输入网络的每一个mini-batch进行训练(部分训练集),导致每个batch具有不同的分布,随着网络的加深,分布差异会越来越大,使模型训练收敛速度很慢,出现梯度消失的问题。
      • 输入层分布的变化带来了问题,因为输入层需要不断适应新分布。当学习系统的输入层分布发生变化时,据说会经历协变变化。这通常通过领域适应来处理。然而,协变移位的概念可以扩展到整个学习系统之外,应用到其部分,例如子网络或层。

2.2 批量归一化解决内部协变量转移的优点

  • 通过批量归一化,每个输入层使用相同的的均值和方差,保持相同分布,减少内部协变移位,可以显著加快模型训练。
  • 减少梯度对参数或其初始值的依赖性,批量归一化对通过网络的梯度传播也有益。【批量归一化可以降低梯度消失问题,更好的反向传播】
  • 允许使用更高的学习率(也不能太高),并且对初始化参数不那么着重仔细,而不存在差异的风险。
  • 充当正则化器,在某些情况下去除了dropout的必要性。
  • 使用批量归一化可以防止网络陷入饱和模式,使得使用饱和非线性激活函数(例如:sigmoid激活函数)成为可能,但是大多数还是用ReLu激活函数。

3.减少内部协变量转移实现思想

  • 内部协变量转移定义:由于训练期间网络参数变化而导致的网络激活分布的变化。【前一输出层结果是后一输入层的参数】
  • whitened(白化,也叫标准化):对网络训练每个输入层使用具有零均值和单位方差(均值为0,方差为1)的相同分布,并且去相关性,网络训练收敛更快。这将消除内部协变移位的不良影响。

3.1 白化的问题

  • 标准化方法:在每个训练步骤或某个时间间隔内标准化,直接修改网络参数或根据网络激活值改变优化算法参数。如果同时修改网络参数与优化算法参数,则梯度下降需要根据归一化后的网络参数来更新参数(增加了归一化步骤,增加了计算量),这会降低梯度下降的效率。
    • 标准化公式
      x ^ = x − E [ x ] \begin{aligned} \hat{x}&=x-E[x] \end{aligned} x^=xE[x]
    • 例如:输入层u,输出层x
      • b为此次卷积导致分布变化的偏移量
        x = u + b \begin{aligned} x=u+b \end{aligned} x=u+b
      • 梯度下降过程中,就是对b的更新,参数优化就会对b产生依赖,而不是参数本身
        b = b + Δ b ∆ b ∝ − ∂ ℓ l o s s ∂ x ˉ \begin{aligned} b=b+\Delta{b}\\ ∆b\propto-\frac{∂ℓ_{loss}}{∂ \bar{x}} \end{aligned} b=b+Δbbxˉloss
      • 标准化后的x为
        x ^ = u + b + Δ b − E [ u + b + Δ b ] = u + b − E [ u + b ] \begin{aligned} \hat{x}&=u+b+\Delta{b}-E[u+b+\Delta{b}]\\ &= u+b-E[u+b] \end{aligned} x^=u+b+ΔbE[u+b+Δb]=u+bE[u+b]
    • 问题:对b的更新和随后的归一化变化不会导致分布变化,也不会导致增加损失。训练加深,b将无限增长,而损失保持不变。如果标准化不仅集中而且扩展了激活【自己理解的这句话:如果标准化后的参数值比较密集,而且导致激活函数激活造成梯度消失】,问题可能更糟。实验发现,在梯度下降步骤之外计算归一化参数时,模型会崩溃。

3.2 解决白化问题

  • 上述方法问题发生,在于梯度下降优化没有考虑到参数归一化后已经改变。

  • 解决问题:对于任何参数值,确保网络总是产生具有所需分布的激活。确保归一化会对模型参数Θ具有依赖性。(根据参数Θ求梯度,而不是根据参数偏移量的值b求梯度)

    • 例如:输入层x,视为向量,则 χ \chi χ是训练数据集上这些输入的集合。
      • 对x进行标准化
        x = N o r m ( x , χ ) \begin{aligned} x&=Norm(x,\chi) \end{aligned} x=Norm(x,χ)
      • 反向传播,计算雅可比矩阵
        ∂ N o r m ( x , χ ) ∂ x ∂ N o r m ( x , χ ) ∂ χ \begin{aligned} \frac{∂Norm(x,\chi)}{∂x}\\ \frac{∂Norm(x,\chi)}{∂\chi} \end{aligned} xNorm(x,χ)χNorm(x,χ)
    • 协方差矩阵公式
      C o v [ x ] = E x ∈ χ [ x x T ] − E [ x ] E [ x ] T \begin{aligned} Cov[x]=E_{x∈\chi}[xx^T]− E[x]E[x]^T \end{aligned} Cov[x]=Exχ[xxT]E[x]E[x]T
  • 白化层输入是昂贵的,因为它需要计算协方差矩阵及其平方根的倒数,以产生白化激活 C o v [ x ] − 1 2 ( x − E [ x ] ) Cov[x]^{−\frac{1}{2}}(x− E[x]) Cov[x]21xE[x]以及用于反向传播的这些变换的导数。这促使我们寻求一种替代方案.

4.小批量统计进行标准化

  • 由于每一层输入的完全白化代价高昂,且并非处处可微(可导),因此我们进行了两个必要的简化。

4.1.白化简化的两种方式

4.1.1 对通道维度进行标准化

  • 我们将通过使每个标量特征的均值为零,方差为1,而不是联合白化层输入和输出中的特征(根据通道进行标准化,不根据所有通道进行标准化)。
    • 对于具有d维(d个通道)输入 x = ( x ( 1 ) … x ( d ) ) x=(x(1)…x(d)) x=x1xd))的层,我们将对每个通道进行标准化
      x ^ k = x k − E [ x k ] V a r [ x k ] \begin{aligned} \hat{x}^{k}=\frac{x^{k}-E[x^{k}]}{\sqrt{Var[x^{k}]}} \end{aligned} x^k=Var[xk] xkE[xk]

    • 其中在训练数据集上计算期望值和方差。即使特征不去相关,这种归一化也会加快收敛速度

    • 进行标准化后每个输入层的内容(输入的值)会发生改变。因此,我们为每个激活 x ( k ) x(k) xk引入一对参数 γ ( k ) γ(k) γ(k) β ( k ) β(k) β(k),它们缩放并移动归一化值(根据此操作,是数值更接近归一化之前的值),这些参数与原始模型参数一起学习,并恢复网络的表示能力。
      y k = γ ( k ) x ^ k + β ( k ) \begin{aligned} y^{k}=γ^{(k)}\hat{x}^{k}+β^{(k)} \end{aligned} yk=γ(k)x^k+β(k)

    • 通过设置 γ ( k ) γ^{(k)} γ(k) β ( k ) β^{(k)} β(k)参数函数,我们可以恢复原始激活
      γ ( k ) = V a r [ x k ] β ( k ) = E [ x k ] \begin{aligned} γ^{(k)}=\sqrt{Var[x^{k}]}\\ β^{(k)}=E[x^{k}] \end{aligned} γ(k)=Var[xk] β(k)=E[xk]

4.1.2 对小批量数据集进行标准化

  • 在批量归一化中,每个训练步骤都基于整个训练集,使用整个数据集来规范激活。然而,当使用随机优化时,这是不合适的。
  • 由于我们在随机梯度训练中使用了小批量,所以每个小批量产生了每个激活的均值和方差的估计。用于小批量归一化的统计数据可以完全参与梯度反向传播。
  • 注意,使用小批次是通过计算每维方差而不是联合协方差实现的;在联合情况下,需要正则化,因为小批量的大小可能小于被白化的激活次数,从而导致奇异协方差矩阵
  • 例如:
    • 一个大小为m的小批量 β \beta β。有m个激活值, β = { x 1 … m } \beta=\{x_{1…m}\} β={x1m}
    • 设归一化值为 x ^ 1 … m \hat{x}_{1…m} x^1m,其线性变换为 y 1 … m {y}_{1…m} y1m。称为批量归一化变换。
      B N γ , β : x 1 … m → y 1 … m \begin{aligned} BNγ,β:{x}_{1…m}→ {y}_{1…m} \end{aligned} BNγβx1my1m
    • 在算法中, ε \varepsilon ε是一个常数,添加到小批量方差中以获得数值稳定性(防止分母为0)
      【论文阅读总结】Batch Normalization总结
  • 在公式 y = B N γ , β ( x ) y = BN_{γ,β}(x) y=BNγ,β(x)中,要学习参数γ和β。
    • 注意,BN变换并不独立处理每个训练样本中的激活。相反, B N γ , β ( x ) BN_{γ,β}(x) BNγ,β(x)取决于训练样本和小批量中的其他样本。
  • 被缩放和移动的值y传递到其他网络层。标准化激活 x ^ \hat{x} x^是转化至关重要的内在因素。
  • 只要每个小批次样本是从相同的分布中采样的,并且在忽略了 ε \varepsilon ε,任何 x ^ \hat{x} x^的值的分布都是期望值0和方差1。
  • 每个归一化激活 x ^ k \hat{x}^k x^k可以被视为由线性变换 y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y^{(k)}=γ^{(k)}\hat{x}^{(k)}+β^{(k)} y(k)=γ(k)x^(k)+β(k)组成的子网络的输入,然后由原始网络进行其他处理。
  • 尽管这些归一化 x ^ k \hat{x}^k x^k的联合分布在训练过程中会发生变化,但我们预计归一化输入的引入会加速子网络训练,从而加速整个网络训练。
  • BN变换是将归一化激活引入网络的可微变换。这确保了在模型训练时,层可以继续学习表现出较少内部协变移位的输入分布,从而加速训练。此外,BN变换后保持着网络容量。
  • 在训练期间,需要通过变换反向传播损失的梯度,以及计算关于BN变换参数的梯度。我们需要使用链式法则
    【论文阅读总结】Batch Normalization总结
  • 实际上,变换不是线性的,归一化的值也不能保证是高斯的或独立的,但我们仍然期望批量归一化能够帮助更好地进行梯度传播。批量归一化对梯度传播的精确影响仍是一个有待进一步研究的领域。

4.2.批量归一化训练与步骤

【论文阅读总结】Batch Normalization总结

4.3.批量归一化卷积网络

4.3.1 变换函数推理

  • BN添加在卷积之后非线性之前
  • 批处理归一化可以应用于网络中的任何一组激活。
  • 由仿射变换和元素非线性组成的变换函数:
    • W和b是模型的学习参数,g(x)是非线性激活函数,如sigmoid或ReLU
      z = g ( W u + b ) \begin{aligned} z=g(W u + b) \end{aligned} z=g(Wu+b)
  • 可以将输入层u归一化,但由于u可能是另一个非线性的输出,其分布的形状在训练过程中可能会改变,可能不会消除协变量移位【不合适】。
  • 通过归一化 x = W u + b x = W u + b x=Wu+b,可能具有对称的非稀疏分布(根偏向于高斯分布);将其归一化很可能产生具有稳定分布的激活。
  • 归一化 x = W u + b x = W u + b x=Wu+b,偏差b可以被忽略,因为它的影响将被随后的平均减法抵消。因此变换函数代替为
    • BN变换独立于 x = W u x = W u x=Wu的每个维度,每个维度有单独学习参数γ(k),β(k)。
      z = g ( W u ) \begin{aligned} z=g(W u) \end{aligned} z=g(Wu

4.3.2 归一化遵循卷积性质实现

  • 希望归一化遵循卷积性质——这样同一特征映射的不同元素,在不同位置,以相同的方式归一化。
  • 实现方法:我们将所有位置的所有激活共同标准化。
    • β \beta β是一个小批量元素和空间位置的特征图中所有值的集合,大小为m小批量数据集和 p ∗ q p *q pq大小的特征图,使用大小为 m ′ m^{'} m的有效小批量。
      m ′ = ∣ β ∣ = m ∗ p ∗ q \begin{aligned} m^{'}=|\beta|=m*p*q \end{aligned} m=β=mpq
    • 每个特征图学习一对参数γ(k)和β(k),而不是每个激活。以便在推理过程中BN变换对给定特征映射中的每个激活应用相同的线性变换。

4.3.3.使用更高的学习率

4.3.3.1使用更高的学习率缺点

  • 传统深度网络使用更高的学习率缺点
    • 可能会导致梯度爆炸或消失。
    • 陷入糟糕的局部极小值。

4.3.3.2批处理规范化优点

  • 通过批处理规范化解决更高的学习率带来的问题:通过将整个网络的激活归一化。
  • 它可以防止参数的微小变化放大为梯度中激活的较大和次优变化。
  • 它可以防止训练陷入非线性的饱和状态
  • 参数更新速度快。
    • 通常,较大的学习率可能会增加层参数的尺度(值大小),然后在反向传播过程中放大梯度,导致模型爆炸。然而,使用批处理归一化,通过层的反向传播不受其参数规模的影响。这个尺度不影响雅可比矩阵,也不影响梯度传播。此外,较大的权重导致较小的梯度,批量归一化将稳定参数的增长。
  • 保留了反向传播过程中的梯度大小。
    • 批处理归一化可能会导致层雅可比矩阵具有接近1的奇异值,这对训练是有益的,这保留了反向传播过程中的梯度大小。
  • 批处理归一化规范了模型【Dropout可以被删除或降低强度】
    • 当使用批处理归一化进行训练时,一个训练样本与小批中的其他样本一起被看到,并且训练网络不再为给定的训练样本产生确定性值。在实验中,我们发现这种效应有利于网络的泛化。虽然Dropout通常用于减少过拟合,但在批处理标准化网络中,我们发现它可以被删除或降低强度。
  • 可以使网络训练速度更快,准确率更高。
  • 使分布更加稳定,减少了内部协变量的移位。

5.阅读总结

5.1 模型实现步骤

  • 深度学习模型网络较深,容易导致梯度消失问题,引入批量训练
  • 批量训练,导致每个批次的数据分布不同,引入白化(数据标准化)
  • 使用白化,使参数服从高斯分布,增加标准化,计算量高昂,引入通道标准化
  • 由于使用批量训练,使用全局标准化期望与方差不合实际,引入小批量期望与方差标准化
  • 由于标准化导致数据变化,该变了原始模型参数表达含义,引入 B N γ , β BN_{γ,β} BNγ,β转换,使模型恢复原始表达含义
  • 最终得到Batch Normalization

5.2 感悟

  • 不喜欢读论文,翻译不准确,理解不了专业术语,这个论文视频讲解没有找的详细的,只能自己看
  • 找了好几个视频结合论文看,一篇论文读了好像有5天(原先以为一天应该就读完了,发现有些读不懂,费脑子,但是第二天再读,发现又读懂了。。。),脑子清醒的时候效率比较高
  • 写总结的时候也很乱,因为作者是根据思路一步一步实现的,就自己向前看了一下论文步骤,总结了模型实现步骤,发现,11页论文也没有多少东西。。。
  • 第一次总结的文章,还有很多不太理解的,有时间再读,再修改。。。