[译]Batch Normalization3个层次的理解 | 技术点评

476 阅读36分钟

本文翻译自:towardsdatascience.com/batch-norma…

网上有很多关于Batch Normalization的内容。然而,他们中的许多人却在为过时的理解辩护。我花了很多时间把这些零散的信息放在一起,以建立一个关于这个基本方法的良好理解,我认为一步一步的演练可能对一些读者有用。

特别是,这篇文章旨在带来

  • 通过3个层次的理解更新Batch Normalization的解释:30秒,3分钟,和一个全面的指南

  • 涵盖要充分利用BN的关键要素

  • 在Google Colab中使用Pytorch简单实现BN层,再现了官方论文中基于MNIST的实验

  • 关键洞察,以了解为什么BN仍然很少被理解(即使在阅读了高质量作者的解释之后!)

让我们开始吧!

A) 30s内了解

Batch-Normalization(BN)是一种使深度神经网络(DNN)训练更快、更稳定的算法。

它包括使用当前批次的第一和第二统计矩(均值和方差)对隐藏层的激活向量进行归一化。在非线性函数之前(或之后)应用此归一化步骤。

没有使用BN的多层感知机(MLP) | Credit : author - Design : Lou HD

使用了BN的多层感知机 | Credit : author - Design : Lou HD

目前的深度学习框架都已经实现了应用Batch Normalization的方法。它通常用作模块,可以作为DNN中的标准层插入。

注:对于那些喜欢读代码而不是文本的人,我在这个repo中编写了一个简单的Batch Normalization实现。

B)3分钟内了解

B.1 本质

Batch Normalization在训练和测试时计算方式不同

B.1.1 训练

在每个隐藏层,Batch Normalization将数据进行如下变换

(1) μ=1niZ(i)\mu=\frac{1}{n} \sum_{i} Z^{(i)}

(2) σ=1ni(Z(i)μ)\sigma=\frac{1}{n} \sum_{i}\left(Z^{(i)}-\mu\right)

(3) Znorm (i)=Z(i)μσ2ϵZ_{\text {norm }}^{(i)}=\frac{Z^{(i)}-\mu}{\sqrt{\sigma^{2}-\epsilon}}

(4) Z^=γZnorm (i)+β\hat{Z}=\gamma * Z_{\text {norm }}^{(i)}+\beta

Batch Normalization首先通过式子(1)和(2)计算batch中的均值和方差。

接着使用式子(3)将Z(i)Z^{(i)}进行归一化。通过这种方式,batch中每个神经元的输出满足标准正态分布(ϵ\epsilon是一个用于数值稳定性的常数)

Batch Normalization的第一步,例子为含有3个神经元的隐藏层,batch size为b。使用Batch Normalization后,每个神经元输出满足标准正态分布 | Credit : author - Design : Lou HD

最后通过运用γ\gammaβ\beta的线性变换计算网络层输出z^i\hat{z}^{i},如式子(4)所示。这一步允许模型通过调整两个参数来选择每个隐藏层的最优分布:

  • γ\gamma用于调节标准偏差(standard deviation)

  • β\beta用于调整偏置(bias),将曲线向左或向右移动。

γ\gammaβ\beta参数的好处。修改分布(顶部)允许我们使用不同的非线性函数区域(底部)。 | Credit : author - Design : Lou HD

注:解释BN有效性的理由有误解和错误(即使在原文中)。最近的一篇论文[2]推翻了一些错误的假设,更新了社区对这种方法的理解。我们将在第C.3节讨论这个问题:“为什么BN能工作?”.

在每次迭代中,网络计算与当前批次对应的平均值μ\mu和标准偏差σ\sigma。然后通过梯度下降训练μ\muσ\sigma,使用指数移动平均法(EMA)对最新的迭代给予更多的重视。

B.1.2 测试

与训练阶段不同,在测试阶段,我们可能没有一个完整的batch输入到模型中,为了解决这个问题,我们计算μpop\mu_{pop}σpop\sigma_{pop}

  • μpop\mu_{pop}:估计总体的均值

  • σpop\sigma_{pop}:估计总体的标准偏差

这些值是在训练期间所有的μbatch\mu_{batch}σbatch\sigma_{batch}计算的,并且在测试期间直接输入式子(3)(而不是先调用式子(1)和(2))。

注:我们将在第C.2.3节“评估期间的归一化”中深入讨论该问题。

B.2 实践

在实际应用中,我们将Batch Normalization视为一个标准层,如感知器层(perceptron)、卷积层(convolutional layer)、激活函数层(activation function)或dropout层。

每个流行的框架都已经实现了Batch Normalization。例如:

所有的BN实现都允许你独立地设置每个参数。然而,输入向量的大小是最重要的。应设置为:

  • 当前隐藏层中有多少神经元(适用于MLP)

  • 当前隐藏层中有多少个filter(针对卷积网络)

看看你最喜欢的框架的在线文档,并阅读BN层页面,它们的实现是否有任何特定内容?

B.3 结果概述

即使我们还不了解BN的所有底层机制(参见C.3),但有一点是每个人都同意的:它是有效的

让我们先来看看官方文章[1]的结果:

BN如何影响训练。ImageNet(2012)验证集的精确度,横轴是迭代训练次数,纵轴是验证集精度。比较了五种网络:“Inception”是普通的Inception网络[3];“BN-X”是具有BN层的Inception网络(对于3种不同的学习率:x1,x5,x30);最优的Inception网络,“BN-X-Sigmoid”是具有BN层的Inception网络,所有的ReLU都被Sigmoid取代。|来源:[1]

结果表明:BN层使训练速度更快,并且允许更大范围的学习速率,而不影响训练的收敛性。

注:现在,你应该对BN层有足够的了解,以便使用它们。然而,如果你想要最大限度地利用BN,则需要进行更深入的研究!

BN和这张图之间的联系是什么?| 来源:Danilo Alvesd on Unsplash

C)全面了解

C.1 实现

我用Pytorch重新实现了BN层,以再现原始的论文结果。代码可在此github中获得。

我建议你看看一些BN层的在线实现。看看它是如何在你最喜欢的框架中编码的,这很有启发意义!

C.2 实践中的BN

在深入研究该理论之前,让我们先从关于BN的确定性开始。在本节中,我们将看到:

  • BN如何影响训练表现?为什么这种方法在当今的深度学习中如此重要?

  • 我们必须注意BN的副作用是什么?

  • 什么时候,怎样使用BN?

C.2.1 原文的结果

如前所述,BN被广泛使用,因为它几乎总是能使深度学习模型表现得更好。

官方文章[1]进行了3个实验来证明他们的方法的有效性。

首先,他们在MNIST数据集上训练分类器。该模型由3个全连接层组成,每层100个神经元,全部由sigmoid激活函数进行变换。他们使用随机梯度下降法(SGD)和相同的学习率(0.01),对这个模型进行了两次(有和没有BN层)50000次迭代训练。注意,BN层被放在激活函数的正前方。

你可以在没有GPU的情况下轻松地复现这些结果,这是一个熟悉这个概念的好方法!

图2:BN在训练中产生的影响,以MLP为例 | 左边为准确率和迭代次数的关系 | 右边为训练loss和迭代次数的关系 | Credit: author

看起来不错!BN提高了我们的网络性能,包括训练loss和准确率。

第二个实验是观察隐藏层中的激活值。下面是与最后一个隐藏层对应的图(就在非线性之前):

图3:BN对最后一个隐藏层的激活值的影响 | Credit: author

在没有批规范化的情况下,激活值在第一次迭代期间波动显著。相反,使用BN时,激活曲线更加平滑。

图4:有BN的模型比没有BN的模型的激活曲线更平滑 | Credit: author

同时,当添加BN层时,信号噪声更小。这似乎使模型的收敛更容易。

这个例子并没有展示BN的所有好处。

官方文章进行了第三次实验。他们希望在一个更大的数据集ImageNet(2012)上添加BN层的同时,比较模型的性能。为了做到这一点,他们训练了一个当时强大的神经网络称为Inception[3]。最初,这个网络没有任何BN层。他们添加了一些,并通过修改学习率(x1,x5,x30)来训练模型。他们还试图用另一个网络中的sigmoid替换每个ReLU激活函数。然后,他们将这些新网络的性能与原来的网络进行了比较。结果如下

图5:BN在ImageNet上对训练的影响。“Inception”:原始网络[3];“BX-Baseline”:Inception加上BN,学习率与原始网络相同;“BX-x5”:与BX-Baseline相同,学习率x5;“BX-x30”:与BX-Baseline相同,学习率x30;“BN-x5-Sigmoid”:与BX-Baseline相同,学习率x5,使用Sigmoid而不是ReLU | 来源:[1]

从曲线中可以得到结论:

  • 增加BN层会导致更快更好的收敛(更好意味着更高的精度)

在如此大的数据集上,这种改进比在小型MNIST数据集上所观察到的改进要重要得多。

  • 增加BN层可以在不影响收敛的情况下使用更高的学习率(LR)

作者已经成功地用比原始网络高30倍的学习率训练了Inception-with-BN网络。 注意,5倍大的学习率已经使原始网络发散了!

这样,就更容易找到一个可接受的学习率:位于欠拟合和梯度爆炸之间的LR间隔要大得多。

同时,较高的学习率有助于优化算法避免局部极小收敛。鼓励探索,优化器将更容易收敛到更好的结果。

  • 基于sigmoid的模型与基于ReLU的模型达到了相似的结果

我们需要退后一步,放眼大局。我们可以清楚地看到,与基于Sigmoid的模型相比,基于ReLU的模型可以获得更好的性能,但这并不重要。

为了说明为什么这个结果是有意义的,让我重述一下Ian Goodfellow(GANs[6]的发明者,著名的深度学习手册的作者)所说的话:

Before BN, we thought that it was almost impossible to efficiently train deep models using sigmoid in the hidden layers. We considered several approaches to tackle training instability, such as looking for better initialization methods. Those pieces of solution were heavily heuristic, and way too fragile to be satisfactory. Batch Normalization makes those unstable networks trainable ; that’s what this example shows. — Ian Goodfellow (rephrased from : source)

现在我们明白了为什么BN对深度学习领域有如此重要的影响。

这些结果概述了BN对网络性能的好处。然而,要想从BN中获得最大的收益,你应该考虑到一些副作用。

C.2.2 正则化,BN的副作用

BN依赖于第一和第二统计矩(均值和方差)来规范隐藏层的激活。然后,输出值与当前批处理统计信息紧密关联。根据当前批处理中使用的输入示例,这种转换会添加一些噪声。

添加一些噪声以避免过拟合…听起来像是一个正则化过程,不是吗?;)

在实践中,由于正交性问题,我们不应该依赖BN来避免过度拟合。简单地说,我们应该始终确保一个模块解决一个问题。依靠几个模块来处理不同的问题使得开发过程比需要的困难得多。

不过,了解正则化效果还是很有趣的,因为它可以解释网络中的一些意外行为,尤其是在健全性检查(sanity checks)期间。

注:batch size越大,正则化越小(因为它减少了噪声影响)。

如果我们想在这样一个很棒的嵌入式系统上部署一个BN模型,该怎么办?| Credit : Marília Castelli on Unsplash

C.2.3 评估期间的归一化

有两种情况可以在评估模式(evaluation mode)下调用模型:

  • 进行交叉验证或测试时,在模型训练和开发期间

  • 在部署模型时

在第一种情况下,为了方便起见,我们可以使用当前的批处理统计信息应用批处理规范化。在第二种情况下,使用相同的方法是没有意义的,因为我们不一定要预测整个批次。

让我们看一个带有嵌入式摄像头的机器人的例子。我们可以有一个模型,使用当前的框架来预测任何即将到来的障碍的位置。因此,我们希望在每次迭代的单个帧(即一个rgb图像)上计算推断。如果训练batch size为N,那么对于模型期望进行的正向传播,我们应该为(N-1)个其他输入选择什么呢?

请记住,对于每个BN层,(β\betaγ\gamma)都使用标准化signal进行训练。所以我们需要确定(μ\muσ\sigma),以便得到有意义的结果。

一个解决方案是选择任意值来完成批处理。通过向模型中添加第1个batch,我们将为我们感兴趣的图像获得一定的结果。如果我们使用其他随机值构建第2个batch,则对于同一图像将有不同的预测。对于单个输入,两个不同的输出不是理想的模型行为。

这个技巧是定义(μpop,σpop)(\mu_{pop}, \sigma_{pop}),分别是目标数据的估计均值和方差。这些参数在训练期间计算得到,为(μbatch,σbatch)(\mu_{batch}, \sigma_{batch})的均值。

我们就是这么做的!

注:这个技巧可能会在评估阶段导致不稳定,让我们在下一节讨论它。

C.2.4 稳定性问题

即使BN工作做的很好,但有时会导致稳定性问题。在某些情况下,BN层使激活值在评估阶段(evaluation phase)爆炸(使模型返回loss=NaN)。

我们刚才提到了(μpop,σpop)(\mu_{pop}, \sigma_{pop})是如何确定的,以便在评估过程中使用:我们计算训练过程中计算的所有(μbatch,σbatch)(\mu_{batch}, \sigma_{batch})的平均值。

让我们考虑一个仅在包含运动鞋的数据集上进行训练的模型。如果测试集中有德比鞋(derby-like shoes),该怎么办?

如果从训练到评估的输入分布变化过大,模型可能会对某些数值产生过度反应,导致激活值发散 | Credit : Grailify (left), and Jia Ye (right) on Unsplash

我们假设在训练和评估过程中,隐藏层的激活值会有显著不同的分布——可能太多了。在这种情况下,估计的(μpop,σpop)(\mu_{pop}, \sigma_{pop})不能正确估计实际的总体均值和标准差。应用(μpop,σpop)(\mu_{pop}, \sigma_{pop})可能会使激活值远离(μ=0,σ=1)(\mu = 0, \sigma = 1),从而导致活化值的高估。

注:分布在训练集和测试集之间的转移称为covariate shift。我们将在第(C.3.)节中再次讨论这种效应。

BN的一个众所周知的特性增强了这种效应:在训练期间,激活值使用它们自己的值进行归一化。在推理过程中,使用训练过程中计算的(μpop,σpop)(\mu_{pop}, \sigma_{pop})对数据进行归一化。因此,用于归一化的系数不考虑实际激活值本身。

一般来说,训练集必须与测试集足够相似,否则,就不可能正确地训练针对目标任务的模型。因此,在大多数情况下,(μpop,σpop)(\mu_{pop}, \sigma_{pop})应该很适合测试集。如果没有,我们可能会得出这样的结论:训练集不够大,或者训练质量不足以完成目标任务。

但是有时候,它就是发生了。对于此问题,并非总是有一个简洁的解决方案。

我曾经在Pulmonary Fibrosis Progression的Kaggle比赛中遇到过。训练数据集由元数据和与每个患者相关的肺部3D扫描组成。这些扫描的内容复杂多样的,但我们只有约100名患者被分成训练和验证集。结果,当模型从训练模式切换到评估模式时,我想要用于特征提取的卷积网络返回了NaN。愉快的调试。

当你无法轻松获取其他数据来增强训练集时,你必须找到一种解决方法。在上述情况下,我也手动对验证集进行了强制BN层的计算(μbatch,σbatch)(\mu_{batch}, \sigma_{batch})。(我同意,这是修复它的丑陋方法,但是我比赛时间用完了;) )

假设不会给网络带来负面影响,在网络中添加BN层也并不总是最好的策略!

C.2.5 循环网络和层归一化

在实践中,人们普遍认为:

  • 对于卷积网络(CNN),BN效果比较好
  • 对于递归网络(RNN),Layer Normalization(LN)更好

虽然BN使用当前批处理对每个单个值进行归一化,但LN使用当前的所有层进行此操作。换句话说,使用单个示例中的其他特征而不是在所有当前批处理中使用相同的特征来执行规范化。对于循环网络,此解决方案似乎更有效。请注意,很难为这类神经元定义一致的策略,因为它们依赖于同一权重矩阵的多次乘法。我们是否应该独立地规范化每个步骤?还是应该计算所有步骤的均值,然后递归地应用归一化?(直觉论证的来源:此处

我不会在此问题上进一步介绍,因为这不是本文的目的。

C.2.6 非线性之前还是之后

历史上,BN层正好位于非线性函数之前,这与作者当时的目标和假设是一致的:

他们在文章中说:

“We would like to ensure that, for any parameter values, the network always produces activations with the desired distribution.” — Sergey Ioffe & Christian Szegedy (source : [1])

一些实验表明,在非线性函数之后使用BN层可以获得更好的结果。下面是一个例子

Keras的创始人、目前在谷歌工作的工程师François Chollet表示:

“I haven’t gone back to check what they are suggesting in their original paper, but I can guarantee that recent code written by Christian [Szegedy] applies relu before BN. It is still occasionally a topic of debate, though.” — François Chollet (source)

尽管如此,许多常用的迁移学习架构在非线性之前应用BN(ResNet、mobilenet-v2等)。

请注意,文章[2]挑战了原文章[1]为解释BN有效性而提出的假设(见C.3.3))——将BN层放在激活函数之前,但没有给出确切的理由。

据我所知,这个问题还在讨论中。

进一步阅读:这里有一个有趣的reddit讨论,即使有些论据是不令人信服的,主要支持BN激活后。

为什么我乱七八糟的代码还能工作? | Credit : Rohit Farmer on Unsplash

C.3 BN为什么起作用

在大多数情况下,BN可以提高深度学习模型的性能。太好了。但我们想知道黑匣子里到底发生了什么。

这是事情变得有些毛茸茸的地方。

问题是:我们还不清楚是什么让BN工作得这么好。深度学习社区中经常讨论一些假设:我们将一步一步地探讨它们。

在深入讨论之前,我们将看到以下内容:

  • 最初的论文[1]假设BN的有效性是由于减少了他们所称的内部协变量转移(ICS)。最近的一篇论文[2]驳斥了这一假设。(见C.3.1)

  • 另一个假设更为谨慎地取代了第一个假设:BN减轻了训练过程中各层之间的相互依赖性。(见C.3.2)

  • MIT最近的一篇论文[2]强调了BN对优化landscape smoothness的影响,使训练更容易。(见C.3.3)

我敢打赌,探索这些假设将有助于你建立关于BN的强烈直觉。

C.3.1 第一个假设:关于内部协变量转移(ICS)的困惑

尽管BN对DNN的性能有根本的影响,但它仍然容易被误解。

关于BN的混淆主要是由于原文[1]支持的错误假设。

Sergey Ioffe和Christian Szegedy介绍BN如下:

“We refer to the change in the distributions of internal nodes of a deep network, in the course of training, as Internal Covariate Shift. […] We propose a new mechanism, which we call Batch Normalization, that takes a step towards reducing internal covariate shift, and in doing so dramatically accelerates the training of deep neural nets.” — Sergey Ioffe & Christian Szegedy (source : [1])

换句话说,BN是有效的,因为它部分地解决了内部的协变量转移问题。

这一说法受到了后来工作[2]的严重挑战。

注:从现在开始,ICS为内部协变量转移。

为了理解造成这种混乱的原因,我们首先讨论协变量转移是什么,以及它如何受到规范化的影响。

什么是协变量转移(分布稳定性观点)?

[1] 作者明确地定义了它:协变量转移,在分布稳定性的角度下,描述了模型输入分布的转移。通过扩展,内部协变量转移描述了这种现象在深层神经网络的隐藏层中发生的情况。

让我们通过一个例子来了解为什么这可能是一个问题。

假设我们想训练一个分类器来回答以下问题:这个图像包含一辆汽车吗?如果我们想从一个非常大的未标记数据集中提取所有的汽车图像,这样的模型将节省我们大量的时间。

我们将有一个RGB图像作为输入,一些卷积层,然后是完全连接的层。输出应该是一个单一的值,将其输入一个logistic function,使最终值介于0和1之间,描述输入图像包含一辆汽车的概率。

图5:一个简单的CNN分类器。 | Credit : author - Design : Lou HD

为了训练这样一个模型,我们需要大量的标记图像。

现在,假设我们只有用于训练的普通汽车。如果我们要求模型对一级方程式赛车进行分类,它会作何反应?

如前所述,协变量的变化可以使网络激活发散(第C.2.4节)。即使没有,也会影响整体表现! | Credit : Dhiva Krishna (left) and Ferhat Deniz Fors (right) on Unsplash

在这个例子中,在训练和测试分布之间有一个偏移。更广泛地说,不同的汽车方向,闪电,或天气条件可能影响我们的模型性能。在这种情况下,模型的泛化性能较差。

如果我们在特征空间中绘制提取的特征,我们会得到如下结果:

图6.a:为什么我们需要规范化模型输入值?不规范的情况。在训练过程中,输入值是分散的:在点密度较高的地方,近似函数将非常精确。相反,在点密度较低的情况下,它将是不准确的,并且会呈现随机性(例如,近似曲线可以是绘制的3条线之一)。 | Credit : author - Design : Lou HD

假设十字形描述不包含任何汽车的图像相关的特征,而圆环描述了包含汽车的图像的特征。在这里,单个函数可以将两类分开。但是该函数在图的右上部分可能不太准确:没有足够的样本来确定一个好的函数。这可能会导致分类器在评估期间犯下许多错误。

为了有效地训练我们的模型,我们需要在我们可以想象的任何可能的情况下提供许多汽车图像。即使现在仍然是我们训练CNN的方式,我们也要使用尽可能少的样本来确保模型能够很好地泛化。

问题可以概括为:

From the model point-of-view, training images are - statistically - too different from testing images. There is a covariate shift.

我们可以用更简单的模型来解决这个问题。众所周知,当输入值被归一化时(即使其分布接近(μ=0,σ=1)(\mu=0, \sigma=1)),线性回归模型更容易优化:这就是为什么我们通常对模型的输入值进行归一化。

图6.b:为什么我们需要规范化模型输入值?正常化的情况。在训练过程中,对输入数据进行规范化可以使特征空间中的点彼此更接近:现在更容易找到一个良好的泛化函数。 | Credit : author — Design : Lou HD

在BN论文发表之前,这种解决方案已经众所周知。 [1]的作者希望借助BN将这种方法扩展到隐藏层,以帮助进行训练。

最初的论文假设:内部协变量转移训练导致训练恶化

Diagram 7 : 分布稳定性视角下的内协变量转移原理。 | Credit : author - Design : Lou HD

在我们的汽车分类器中,我们可以将隐藏层视为一个单元,当它们识别出一些与汽车相关的概念特征时,这些单元就会被激活:它可以是一个轮子、一个轮胎或一扇门。我们可以假设前面描述的效果可能发生在隐藏的单元内部。一定方向角的轮子会激活特定分布的神经元。理想情况下,我们希望让一些神经元对任何方向的车轮做出类似的反应,这样模型就可以有效地得出输入图像包含汽车的概率。

如果在输入信号中有一个巨大的协变量转移,优化器将很难很好地推广。相反,如果输入信号始终遵循标准正态分布,则优化器将更容易推广。考虑到这一点,[1]的作者采用了在隐藏层中规范化信号的策略。他们认为,强迫(μ=0,σ=1)(\mu=0, \sigma=1)中间产物的信号分布将有助于网络在概念层面上的泛化。

不过,我们并不总是希望标准正态分布的隐藏单位。这会降低模型的代表性(representativity ):

图8:为什么我们不总是希望隐藏单元中有标准正态分布。这里,sigmoid函数只在它的线性区域工作。。 | Credit : author - Design : Lou HD

原文以sigmoid函数为例来说明为什么规范化本身就是一个问题。如果输入信号值介于0和1之间,非线性函数将只在其线性范围内工作。听起来有问题。

为了解决这个问题,他们增加了两个可训练的参数β\betaγ\gamma,允许优化器定义特定任务的最佳平均值(使用β\beta)和标准差(使用γ\gamma)。

⚠警告:以下假设现已过时。许多关于BN的重要内容仍然认为它是该方法在实践中发挥作用的原因。然而,最近的工作对它提出了严峻的挑战。

在[1]发布后的几年里,深度学习社区对BN有效性的解释如下:

假设 1

BN➜隐单元内输入信号的归一化➜增加两个可训练参数以调整分布并最大限度地利用非线性➜更易于训练

这里,归一化到(μ=0,σ=1)(\mu=0, \sigma=1)是解释BN有效性的主要原因。这一假设受到质疑(见第C.3.3节),取而代之的是另一个假设:

假设 2

BN➜隐藏单元内输入信号的规范化➜减少隐藏层之间的相互依赖性(从分布稳定性的角度来看)➜更易于训练

有一个细微但非常重要的区别。在这里,规范化的目的是减少层之间的相互依赖性(从分布稳定性的角度来看),因此优化器可以通过只调整两个参数来选择最佳分布!让我们进一步探讨一下这个假设。

BN和这张图之间的联系是什么?| 来源:Danilo Alvesd on Unsplash

C.3.2 第二个假设:缓解分布之间的相互依赖性

关于这一部分:我找不到任何关于这一部分所讨论的假设的确凿证据。因此,我决定主要依靠Ian Goodfellow对此事的解释(特别是在这段精彩的视频中)。

考虑下面例子:

图9:一个简单的DNN,由线性变换组成。| Inspired by Ian Goodfellow

其中(a)、(b)、(c)、(d)和(e)是网络的相邻的层。这是一个非常简单的例子,所有层都通过线性变换连接起来。假设我们想用SGD训练这样的模型。

要更新层(a)的权重,我们需要根据网络输出计算梯度:

grad(a)=grad(b)grad(c)grad(d)grad(e)grad(a) = grad(b) * grad(c) * grad(d) * grad(e)

我们首先考虑一个没有BN层的网络。从上面的方程,我们得出结论,如果所有梯度都很大,梯度(a)将非常大。相反,如果所有梯度都很小,梯度(a)几乎可以忽略不计。

通过观察隐藏单元的输入分布,很容易看出层与层之间的依赖性:修改(a)权重将修改(b)权重的输入分布,最终修改(d)和(e)的输入信号。这种相互依赖性可能会对训练稳定性产生问题:如果我们想调整特定隐藏单元的输入分布,我们需要考虑整个层序列。

然而,SGD考虑层之间的一阶关系。所以他们没有考虑到上面提到的更高层次的关系!

图10:假设2原理。BN层通过规范每个隐藏单元内的信号,并允许使用β\betaγ\gamma进行分布调整,使信号调节更容易。BN的作用就像一个阀门,在某些点上使流量控制变得更加容易,而不会降低网络的复杂度! | Credit : author - Design : Lou HD

在训练过程中,添加BN层显著降低了各层之间的相互依赖性(从分布稳定性的角度来看)。BN就像一个阻止流量的阀门,并允许使用β\betaγ\gamma对其进行调节。这样就不再需要考虑所有参数来获得隐藏单元内部分布的线索。

注:优化器可以进行更大的权重修改,而不会影响其他隐藏层中的调整参数。它使超参数调整方式更容易!

这个例子抛开了一个假设,即BN的有效性是由于中间信号分布的标准化(μ=0,σ=1)(\mu=0, \sigma=1)。在这里,BN的目的是使优化器的工作更容易,使其一次仅使用两个参数即可调整隐藏层的分布。

⚠ 不过,请记住,这主要是猜测。这些讨论应该被用作建立对BN的直觉的洞见。我们仍然不知道为什么BN在实践中是有效的!

2019年,麻省理工学院的一个研究小组进行了一些有关BN的有趣实验[2]。他们的研究结果严重挑战了假设1(仍然有许多严肃的博客文章和mooc分享)。

如果我们想避免关于BN对训练的影响的局部最小值假设,我们应该看一下这篇论文… ;)

Alright … you better initialize well. | Credit : Tracy Zhang on Unsplash

C.3.3 第三个假设:使优化landscape更平滑

关于这一部分:我综合了[2]的结果,这有助于我们建立一个关于BN的更好的直觉。我不可能详尽无遗,这篇论文很密集,如果你对这些概念感兴趣的话,我建议你仔细阅读。

让我们直接跳到[2]的第二个实验。他们的目标是检验ICS和BN对训练结果提升之间的相关性(假设1)。

注:我们现在用ICSdistribICS_{distrib}来引用这个协变量移位。

为此,研究人员在CIFAR-10上训练了三个VGG网络:

  • 第一个没有BN层

  • 第二个有BN层

  • 第三种方法与第二种方法相似,只是在激活之前,他们在隐藏单元内部显式地添加了一些ICSdistribICS_{distrib}分布(通过添加随机偏差和方差)。

他们测量了每个模型所达到的精度,以及分布值随迭代次数的变化。以下是他们得到的:

Diagram 6 : ICSdistribICS_{distrib}上具有BN的网络比标准网络训练得更快;在受监管网络上明确添加ICSdistribICS_{distrib}不会降低BN的效益。 | Source : [2]

我们可以看到,正如预期的那样,第三个网络具有非常高的ICS。然而,噪声网络的训练速度仍比标准网络快。其性能与标准BN网络的性能相当。这一结果表明,BN的有效性与ICS的分布无关。哎呀!

我们不应该太快抛弃ICS理论:如果BN有效性不是来自ICS分布,它可能与ICS的另一个定义有关。毕竟,假设1背后的直觉是有道理的,不是吗?

ICSdistribICS_{distrib}的主要问题在于其定义与隐藏单元的输入分布有关。因此,优化问题本身并没有直接的联系。

[2]中作者提出了ICS的另一个定义:

让我们考虑一个固定的输入X。

从优化的角度来看,我们将内部协变量偏移定义为反向传播误差L(X)itL(X)_{it}后在隐藏层k上计算的梯度与从损失L(X)it+1L(X)_{it+1}在同一层k上计算的梯度之间的差,迭代后计算出的it的权重更新。

这一定义的目的是将重点放在梯度上,而不是放在隐藏层的输入分布上,假设它可以为我们提供有关ICS如何对基础优化问题产生影响的更好线索。

注:ICSoptiICS_{opti}现在指的是从优化角度定义的ICS。

在接下来的实验中,作者评估了ICSoptiICS_{opti}对训练结果的影响。为此,他们测量了有无BN层的DNN在训练过程中ICS的变化。为了量化ICSoptiICS_{opti}定义中提到的梯度变化,他们计算:

  • L2差异(L2 difference):权重更新前后梯度是否有一个接近的范数?理想情况下:0

  • 余弦角(Cosine angle):权重更新前后,梯度是否具有紧密的方向? 理想情况下:1

图7:BN对ICSoptiICS_{opti}的影响| L2的差异和余弦角表明BN不会阻止ICSoptiICS_{opti}(似乎以某种方式稍微增加了它)。 | Source [2]

结果有点令人惊讶:依赖BN的网络似乎比标准网络有更高的ICSoptiICS_{opti}。记住,具有BN(蓝色曲线)的网络比标准网络(红色曲线)训练得更快!

ICS似乎与训练表现毫无关联...至少对于ICS的定义来说是这样。在某种程度上,BN对网络有另一个影响,这使得收敛更容易。现在,让我们研究BN如何影响优化landscape。我们可以在那里找到线索。

下面是这个文章中的最后一个实验:

图11:在梯度方向上进行优化landscape探索,论文中进行的实验[2]| | Inspired by Andrew Ilyas - Design : Lou HD

从一个单一的梯度,我们用不同的优化步骤(就像一个学习率)更新权重。直观地,我们从特征空间中的某一点(即网络结构ω\omega)定义一个方向,然后沿着这个方向进一步探索优化landscape。

在每一步,我们测量梯度和损失。因此,我们可以用一个起点来比较优化landscape的不同点。如果我们测量大的变化,landscape是非常不稳定的,梯度是不确定的:大的步骤可能会恶化优化。相反,如果测量的变化很小,landscape是稳定的,梯度是可信的:我们可以应用更大的步骤而不影响优化。换言之,我们可以使用更大的学习速率,并使收敛更快(BN的一个众所周知的特性)。

我们来看看结果:

图8:BN对优化landscape平滑的影响|使用BN可显著减少梯度变化。|Source : [2]

我们可以清楚地看到,BN层的优化效果要平滑得多。

我们最终得到了可以用来解释BN有效性的结果:BN层在某种程度上使优化landscape更加平滑。这使得优化器的工作更容易:我们可以使用一个更大的学习率,而不会导致梯度消失或梯度爆炸。

我们可以得出第三个假设,由[2]提出:

假设 3

BN➜对隐藏单元内的输入信号进行归一化➜使优化后的landscape更加平滑➜更快更稳定的训练

它提出了另一个问题:BN如何使优化landscape更加平滑?

[2]作者还从理论的角度探讨了这些问题。他们的工作很有启发性,有助于更好地掌握BN的平滑效果。特别是,他们表明,BN使优化landscape更加平滑,同时保留了所有正常landscape的极小值。换句话说,BN重新设定了潜在的优化问题,使训练变得更快,更轻松!

⚠ 在另外的研究中,[2]的作者观察到这种效应并不是BN独有的。他们获得了与其他归一化方法(例如L1或L2归一化)相似的训练性能。这些观察结果表明,BN的有效性主要是由于偶然性,利用了我们尚未完全确定的潜在机制。

现在是时候设定一个非常高的学习率了。| Credit : Finding Dan | Dan Grinwis on Unsplash

为了结束这一部分,本文严重挑战了广泛接受的观点,即BN的有效性主要是由于ICS的减少(从训练稳定性分布的角度来看,以及从优化的角度来看)。但强调了BN平滑效应对优化landscape的影响。

文章提出了一个关于BN对训练速度影响的假设,但并没有回答BN为什么有助于泛化。

他们简要地指出,通过优化landscape更平滑可以帮助模型收敛于平坦的极小值,后者具有更好的泛化特性。 不过,关于此事没有更多细节。

他们的主要贡献是挑战公认的BN效应对ICS的影响,这已经很重要了!

C.4 总结:我们现在了解了什么

  • 假设1:BN层减轻了内部协变量转移(ICS)

❌ 错误:[2]表明在实践中,ICS与训练结果之间没有相关性。

  • 假设2:BN层使优化器的工作更容易,因为它只允许用2个参数调整隐藏单元的输入分布。

❓ 也许:这个假设突出了参数之间的相互依赖性,使得优化任务更加困难。不过,没有确凿的证据。

  • 假设3:BN层重新设定了潜在的优化问题,使其更平滑,更稳定。

❓ 也许:他们的结果是最近的。据我所知,他们到目前为止还没有受到挑战。它们提供了经验证明和理论证明,但一些基本问题仍然没有答案(如“BN如何帮助泛化?”).

讨论:在我看来,最后两个假设是相容的。直观地说,我们可以把假设2看作是从具有多个参数的问题到具有多个参数的许多问题的投影; 一种降维,这将有助于泛化。有什么想法吗?

许多问题仍然悬而未决,BN仍然是当前的研究课题。讨论这些假设仍然有助于更好地理解这种常用的方法,摒弃我们几年来一直在想的一些错误陈述。

不过,这些问题并不妨碍我们在实践中利用BN的好处!

总结

BN是近年来深度学习领域的一个重要进展。该方法依靠两个连续的线性变换,使深度神经网络(DNN)训练更快、更稳定。

关于BN在实践中的有效性,最广为接受的假设是训练过程中隐藏层之间相互依赖的减少。然而,归一化变换对landscape平滑度优化的影响似乎是BN有效性的重要机制。

现在许多常用的DNN依赖于BN(例如ResNet[4],EfficientNet[5],…)。

如果你对深度学习感兴趣,你一定要熟悉这种方法!

开放的问题

即使BN多年来在实践中似乎是有效的,但有关其内在机制的许多问题仍然没有答案。

以下是关于BN的开放式问题的非详尽列表:

  • BN如何帮助泛化?

  • BN是使优化更容易的最佳归一化方法吗?

  • β\betaγ\gamma如何影响优化landscape平滑度?

  • 文献[2]所做的探索优化landscape的实验侧重于BN对梯度的短期影响:他们测量了几个步长值下,单个迭代的梯度和损失的变化。BN对梯度的长期影响如何?权重的相互依赖性对优化landscape有其他有趣的影响吗?

致谢

非常感谢Lou Hacquet Delepine绘制的所有图表,以及她在校对方面的全面帮助!

参考文献

[1] Ioffe, S., & Szegedy, C. (2015). Batch normalization: Accelerating deep network training by reducing internal covariate shift, arXiv preprint arXiv:1502.03167.

[2] Santurkar, S., Tsipras, D., Ilyas, A., & Madry, A. (2018). How does batch normalization help optimization?, Advances in Neural Information Processing Systems

[3] Szegedy, C., Liu, W., Jia, Y., Sermanet, P., Reed, S., Anguelov, D., … & Rabinovich, A. (2015). Going deeper with convolutions, Proceedings of the IEEE conference on computer vision and pattern recognition

[4] He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep residual learning for image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition

[5] Tan, M., & Le, Q. V. (2019). Efficientnet: Rethinking model scaling for convolutional neural networks, arXiv preprint arXiv:1905.11946.

[6] Goodfellow, I., Pouget-Abadie, J., Mirza, M., Xu, B., Warde-Farley, D., Ozair, S., Courville, A. Bengio, Y. (2014), Generative adversarial nets, Advances in neural information processing systems

进一步探索

  • lan Goodfellow的精彩演讲。他在课程开始时谈到BN:链接

  • 论文作者之一对论文的口头陈述[2]。观众们提出了尖锐的问题,展开了关于BN的精彩辩论:链接

  • 我们应该把BN放在激活之前还是之后,在stackoverflow:链接

  • 我们应该把BN放在激活之前还是之后,在reddit:链接

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情