批范数和层范数都是神经网络训练的常用归一化技术。
我想知道为什么变压器主要使用层规范。
批范数和层范数都是神经网络训练的常用归一化技术。
我想知道为什么变压器主要使用层规范。
在 CV 任务中使用 batchnorm 和在 NLP 任务中使用 layernorm 似乎已经成为标准。最初的Attention is All you Need论文只测试了 NLP 任务,因此使用了 layernorm。看起来即使变压器在 CV 应用程序中的兴起,layernorm 仍然是最标准使用的,所以我不能完全确定它们的优缺点。但我确实有一些个人直觉——我承认这不是基于理论的,但我仍然会在下面尝试详细说明。
回想一下,在 batchnorm 中,用于归一化的均值和方差统计量是针对批次中所有实例的所有元素独立计算的。对于 NLP 任务,“元素”和“实例”分别指“单词”和“句子”,对于 CV 任务,我指的是“像素”和“图像”。另一方面,对于 layernorm,统计数据是跨特征维度计算的,对于每个元素和实例都是独立的(来源)。在转换器中,它是针对每个实例独立地计算所有特征和所有元素的。最近这篇文章中的这张插图传达了 batchnorm 和 layernorm 之间的区别:
(在变压器的情况下,标准化统计数据是在每个实例的所有特征和所有元素上独立计算的,在图像中对应于蓝色立方体的左面。)
现在讨论为什么 batchnorm 不太适合 NLP 任务的原因。在 NLP 任务中,句子长度经常变化——因此,如果使用 batchnorm,将不确定要使用的适当归一化常数(归一化期间要除以的元素总数)是什么。不同的批次会有不同的归一化常数,这会导致训练过程中的不稳定。根据提供上面链接图像的论文,“整个批次维度的 NLP 数据统计在整个训练过程中表现出很大的波动。如果 BN 被天真地实施,这会导致不稳定。” (这篇论文关注的是对用于他们称为 PowerNorm 的转换器的 batchnorm 的改进,与 batchnorm 或 layernorm 相比,它提高了 NLP 任务的性能。)
另一个直觉是,在过去(在 Transformers 之前),RNN 架构是常态。在循环层中,如何计算归一化统计数据仍然不清楚。(您是否应该考虑通过循环层的先前单词?)因此,在同一个句子中独立于其他单词规范化每个单词要简单得多。当然这个原因不适用于转换器,因为转换器中的单词计算与之前的单词没有时间依赖性,因此您也可以跨句子维度进行归一化(在上图中,这将对应于整个左脸立方体被染成蓝色)。
也可能值得检查instance normalization和group normalization,我不是这方面的专家,但显然每个都有其优点。
Batch Norm 的一个鲜为人知的问题是并行化批标准化模型有多难。由于元素之间存在依赖关系,因此还需要跨设备进行同步。虽然这对于大多数视觉模型来说不是问题,它们往往用于一小部分设备,但变形金刚确实遇到了这个问题,因为它们依赖于大规模设置来应对其二次复杂性。在这方面,层规范提供了一定程度的标准化,同时不会产生批量依赖。
如果您想选择一个包含所有特征的数据样本框,但单个数据帧行的长度较小,并且单个数据帧组中的数量较小,作为批量发送到调度 -> 层规范
对于 Transformer,这种归一化是有效的,因为它将能够在所有实体上一次性创建相关矩阵。
第一个答案在两种模式[文本和图像]中都很好地解释了这一点