为什么批量标准化有效?

人工智能 神经网络 机器学习 文件 隐藏层 批量标准化
2021-11-01 20:21:32

添加BatchNorm层可以缩短训练时间并使整个深度模型更加稳定。这是在机器学习实践中广泛使用的实验事实。

我的问题是 - 为什么它有效?

最初的(2015 年)论文通过指出这些层有助于修复“内部协变量偏移”来推动层的引入。粗略的想法是,内层输入分布的大变化使训练不太稳定,导致学习率下降和训练减慢。批标准化通过标准化内层的输入来缓解这个问题。

这一解释遭到下一篇(2018 年)论文的严厉批评——引用摘要:

... 层输入的分布稳定性与 BatchNorm 的成功关系不大

他们证明了 BatchNorm 对内层输入分布的影响很小。不仅如此——他们试图在分布中注入一些非零均值/方差噪声。他们仍然获得几乎相同的性能。

他们的结论是,BatchNorm 起作用的真正原因是……

相反,BatchNorm 使优化环境变得更加平滑。

根据我的口味,说它提高稳定性有点重复。

我发现了另外两篇试图解决这个问题的论文:在这篇论文中,“关键好处”据称是批量标准化使残差块偏向于恒等函数的事实。本文中,它“避免了排名崩溃”。

那么,有底线吗?为什么 BatchNorm 有效?

4个回答

这让我开始思考我对批量标准化的理解。我以为我明白了,直到我读到这个。然后,我参考了 Andrew Ng 的 Coursera 深度学习专业。
Andrew Ng 教授是这样解释的。


批处理规范起作用的一个原因是它不仅对输入特征而且对隐藏单元中的进一步值进行归一化,以采用可以加速学习的相似范围的值。

批处理规范起作用的第二个原因是,它使权重比您拥有的网络(例如第 10 层的权重)更晚或更深,对神经网络早期层(例如,第一层)中权重的变化更加稳健。然而,这些隐藏的单位值一直在变化,因此它受到协变量移位的问题的困扰。那么批量规范的作用是减少这些隐藏单元值的分布移动量。批范数保证的是,无论神经网络的参数如何更新,它们的均值和方差至少会保持相同的均值和方差,从而使输入值变得更加稳定,从而使神经网络的后层具有更坚实的立足之地。

即使输入分布发生了一点变化,它的变化也较小,而且即使前面的层不断学习,这迫使后面的层在层变化时尽快适应的量减少了,或者,如果你会,它削弱了早期层参数必须做的事情和后面层参数必须做的事情之间的耦合。所以它允许网络的每一层自己学习,稍微独立于其他层,这有加速整个网络学习的效果。要点是,批量规范意味着,特别是从神经网络的较晚层之一的角度来看,较早的层不会发生太多变化,因为它们被限制为具有相同的均值和方差。因此,这使得在后面的层中学习的工作变得更容易。事实证明,批量规范有第二个效果,它有轻微的正则化效果。因此,批处理规范的一个不直观的事情是,每个小批量,仅在该小批量上计算的均值和方差,而不是在整个数据集上计算,均值和方差在其中有一点噪音,因为它只是在您的小批量(例如 64 个或 128 个,或者可能是 256 个或更大的训练示例)上计算的。批量规范适用于小批量

当我们训练深度神经网络时,梯度告诉如何更新每个参数,假设其他层不变。在实践中,我们同时更新所有层。当我们更新时,可能会出现意想不到的结果,因为许多组合在一起的函数会同时使用在其他函数保持不变的假设下计算的更新进行更改。这使得选择合适的学习率变得非常困难,因为更新对一层的参数在所有其他层上都很强。

批量归一化如何帮助: 批量归一化添加到神经网络中的任何输入或隐藏层的层。假设 H 是要归一化的层的最小激活量。

归一化 H 的公式是:

H=HMeanStandardDeviation

平均值:包含每个单元的平均值的向量标准偏差:包含每个单元的平均值的向量

在训练时计算均值和 sd,当我们通过这些操作对应用均值、sd 和归一化 H 进行反向传播时。这意味着梯度永远不会提出简单地增加 hi 的标准差和均值的操作,归一化操作删除这种动作的效果并将其在梯度中的分量归零。因此,批量归一化确保了在批量归一化之后输入到层中没有或轻微的协方差偏移,从而改善了学习时间,如问题中提到的原始论文所示。

更多详情:https ://www.deeplearningbook.org/contents/optimization.html

在某种程度上,它摆脱了低强度的数值噪声。优化问题的条件属性始终是一个问题,我怀疑 BatchNorm 缓解了这种不稳定性。

这是一个没有简单答案的问题。

一方面,有些人不喜欢 BatchNormalization,他们认为它不会改变神经网络的准确性或使它们产生偏差。另一方面,它被另一方强烈推荐,因为它可以带来更好的训练模型,具有更大的预测范围和更少的溢出机会。

我所知道的是,BN 在图像分类方面确实非常有效。事实上,就像去年图像分类和分类的飙升以及 BN 是该领域的一个很好的实践一样,它已经扩展到几乎所有的 DNN。

BN 不仅不总是用于正确的目的,而且经常在不考虑以下几个元素的情况下使用它:

  • 应用BN的层
  • 初始化算法
  • 激活算法
  • 等等

更多“反对”BN的计算机科学文献,我让大家看看H. Zhang等人的论文,他在没有BN的情况下训练了一个DNN并获得了不错的结果。

有些人使用梯度裁剪技术(R. Pascanu)而不是 BN,特别是用于 RNN

我希望它会给你一些答案!