GPT-2 中的层规范化细节

数据挖掘 深度学习 正常化 变压器
2022-02-15 18:18:29

我读过 GPT-2 和其他转换器在自注意和前馈块之前使用层规范化,但我仍然不确定规范化是如何工作的。

来自 http://jalammar.github.io/illustrated-transformer/ 的变压器图

假设我们的上下文大小为 1024 个标记,嵌入大小为 768(因此每个标记及其后续隐藏状态由大小为 768 的向量表示),并且我们使用 12 个多注意头。所以在上图中,有 1024 个 r,每个 r 有 768 维。

对于变压器中的给定层,计算了多少归一化统计信息(样本均值和标准差)?我们是否对每个令牌进行一次标准化,进行 12x1024 标准化,以便每个令牌的特征值具有均值 0 和标准 1?或者我们是否对 12x768 标准化跨标记的每个特征的值进行标准化?或者我们是否将所有标记的所有特征值归一化,进行 12 次归一化?我们是否为小批量中的每个上下文计算单独的规范化?

我也很想直观地理解为什么这种标准化是可取的。假设该方案是将特征值归一每个标记:假设我们的一个标记是一个像“ok”这样的乏味词,而另一个标记是“仇恨”这个词。我希望“仇恨”的表示会更加尖锐,不同特征值之间的差异更大。为什么丢弃这些信息并强制“ok”的表示同样尖锐是有用的?另一方面,如果归一化方案是跨特征值进行归一化,那么如果您从我们上下文中的所有标记中获取特征 1,它们的均值和标准偏差为 1,这不会在所有标记中丢弃信息吗?在我们的上下文中的词是非常负面的,例如在上下文中“战争暴力仇恨恐惧”?

另外,通过层归一化,通过学习的偏差和增益参数重新缩放归一化值似乎是可选的。GPT-2 是这样做的,还是将值标准化为 0 和 std 1?

2个回答

最标准的实现使用 PyTorch 的LayerNorm ,它在小批量输入上应用层规范化。均值和标准差在最后一个特定的维数上分别计算,这些维数必须是normalized_shape参数指定的形状。最常见的 normalized_shape 是令牌嵌入大小

论文“ On Layer Normalization in the Transformer Architecture ”详细介绍了该主题。该论文提出“层归一化在控制梯度尺度方面起着至关重要的作用。” 表现更好的梯度有助于训练。

根据参考,每个块(或层)应用层规范化 2 次。一次用于注意层输出的隐藏状态,一次用于前馈层输出的隐藏状态。然而,它是

(对于拥抱脸的实现,你可以在class Block 这里查看

对于您的示例,规范化不一定真的不会改变各种令牌的尖峰顺序,而是改变尖峰的大小。这表明增加了模型训练时间,并提高了性能。