【Bert101】变压器模型背后的复杂数学【03/4】-LMLPHP

一、说明 

        在上一篇文章中,我们详细介绍了变压器模型的编码器块的工作原理。如果您还没有读过那篇文章,我建议您在开始这篇文章之前先阅读它,因为本文中介绍了其中涵盖的概念。您可以前往:

        如果你已经读过它,太棒了!让我们开始深入了解解码器块以及与之相关的复杂数学。

二、变压器解码器

        与转换器模型的编码器块一样,解码器块由 N 个堆叠解码器组成,这些解码器按顺序运行并接受来自前一个解码器的输入。但是,这不是解码器接受的唯一输入。编码器块生成的句子表示形式将馈送到解码器块中的每个解码器。因此,我们可以得出结论,每个解码器接受两个不同的输入:

  • 来自编码器块的句子表示
  • 上一个解码器的输出

【Bert101】变压器模型背后的复杂数学【03/4】-LMLPHP

图1.编码器和解码器模块一起工作(图片来自作者)

        在我们深入研究构成解码器的不同组件之前,必须对解码器通常如何生成输出句子或目标句子有一个直觉。

三、目标句子是如何生成的?

        在时间步长 t=1 时,只有 <sos> 标记或句子的开头作为输入传递到解码器块。基于<sos>,目标句子的第一个单词由解码器块生成。

        在下一个时间戳中,即t=2,解码器块的输入包括<sos>令牌以及解码器块生成的第一个单词。下一个单词基于此输入生成。

        同样,随着时间戳的增量,解码器块的输入长度随着在上一个时间戳中生成的单词添加到当前输入句子中而增加。

        当解码器块完成整个目标句子的生成时,将生成<eos>或句子末尾标记。您可以将其视为递归过程!

【Bert101】变压器模型背后的复杂数学【03/4】-LMLPHP

图2 使用解码器递归生成输出令牌(图片来自作者)

        现在,当输入被提供给变压器模型并且我们期待输出时,这就是应该发生的情况。但是在训练/微调转换器模型时,我们已经在训练数据集中有了目标句子。那么它是如何工作的呢?

        它给我们带来了解码器的一个极其重要的概念:蒙面多头注意力。听起来很耳熟?当然,确实如此。在上一部分,我们了解了编码器块中使用的多头注意力的概念。现在让我们了解这两者的不同之处。

四、Mask多头注意力

        解码器块逐字生成目标句子,因此,必须对模型进行类似的训练,以便即使使用有限的标记集也可以做出准确的预测。

        因此,顾名思义,我们在计算自我注意矩阵之前屏蔽了句子右侧尚未预测的所有标记。这将确保自我注意机制仅考虑在预测的每个递归步骤中可供模型使用的令牌。

        让我们举一个简单的例子来理解它:

【Bert101】变压器模型背后的复杂数学【03/4】-LMLPHP

图3.遮罩多头注意力矩阵表示(图片来自作者)

        计算自我注意力矩阵的步骤和公式将与我们在编码器块中所做的相同。我们将在本文中简要介绍这些步骤。为了更深入地了解,请随时前往本系列文章的前一部分。

  • 为目标句子生成嵌入并获取目标矩阵 Y
  • 通过将随机权重矩阵 Wq、Wk 和 Wv 与目标矩阵 Y 相乘,将目标句子转换为 Q、K 和 V
  • 计算 Q 和 K 转置的点积
  • 通过将点积除以嵌入维度的平方根 dk) 来缩放点积)
  • 通过将所有单元格替换为 <mask> 来对缩放矩阵应用掩码 — inf
  • 现在在矩阵上应用 softmax 函数并将其与 Vi 矩阵相乘以生成注意力矩阵 Zi
  • 将多个注意力矩阵 Zi 连接成单个注意力矩阵 M

此注意力矩阵将与编码器块生成的输入句子表示形式一起馈送到解码器块的下一个组件。现在让我们了解解码器块如何使用这两个矩阵。

五、多头注意力

解码器块的这个子层也称为“编码器-解码器注意层”,因为它接受屏蔽的注意力矩阵(M)和编码器(R)的句子表示

【Bert101】变压器模型背后的复杂数学【03/4】-LMLPHP

图4.多头注意力机制(图片来自作者)

自我注意矩阵的计算与上一步中的计算方式非常相似,只是略有改动。由于我们有两个输入矩阵,因此它们被转换为Q,K和V,如下所示:

  • Q 使用 Wq 和 M 生成
  • K&V矩阵使用Wk&Wv和R生成

到现在为止,您必须已经了解,变压器模型背后的每个步骤和计算都有一个非常具体的原因。同样,这些矩阵中的每一个都是使用不同的输入矩阵生成的也是有原因的。你能猜到吗?

快速提示:答案在于如何计算自我注意力矩阵......

是的,你做对了!

如果你还记得,当我们使用输入句子理解自我注意的概念时,我们谈到了它如何在将源句子映射到自身时计算注意力分数。将源句子中的每个单词与同一句子中的每个其他单词进行比较,以量化关系并理解上下文。

在这里,我们也在做同样的事情,唯一的区别是,我们将输入句子的每个单词(K-转置)与目标句子单词(Q)进行比较。它将帮助我们量化这两个句子之间的相似程度,并理解单词之间的关系。

【Bert101】变压器模型背后的复杂数学【03/4】-LMLPHP

图5.带有输入句子和目标句子的注意力矩阵表示(图片来自作者)

最后,生成的注意力矩阵 Zi 将是维度 N X 1,其中 N = 目标句子的字数。

由于这也是一个多头注意力层,为了生成最终的注意力矩阵,将多个注意力矩阵串联起来。

有了这个,我们已经涵盖了解码器块的所有独特组件。但是,其他一些组件的功能与编码器块中的功能相同。让我们也简要地看一下它们:

  • 位置编码 — 就像编码器块一样,为了保留目标句子的词序,我们在将目标嵌入添加到目标嵌入之前,将其馈送到屏蔽多注意力层。
  • 前馈网络 — 解码器块中的这个子层是具有两个密集层和 ReLU 激活的经典神经网络。它接受来自多头注意力层的输入,对同一层执行一些非线性变换,最后生成上下文化向量。
  • 添加和规范组件 — 这是一个残差层,然后是层规范化。它有助于加快模型训练,同时确保不会丢失来自子层的信息。

我们在第 1 部分中详细介绍了这些概念。

有了这个,我们也完成了解码器块的内部工作。正如您可能已经猜到的那样,编码器和解码器块都用于处理和生成输入句子的上下文化向量。那么谁来执行实际的下一个单词预测任务呢?让我们来了解一下。

六、线性和softmax层

        它位于解码器网络的顶部,接受堆栈中最后一个解码器生成的输出矩阵作为输入。此输出矩阵将转换为与词汇表大小相同大小的 logit 向量。然后,我们在此 logit 向量上应用 softmax 函数以生成对应于每个单词的概率。概率最高的单词被预测为下一个单词。该模型使用 Adam 优化器针对交叉熵损失进行了优化。

        为了避免过度拟合,在编码器/解码器网络的每个子层之后都添加了dropout层

        这就是整个变压器模型的全部内容。至此,我们用最简单的语言完成了变压器模型架构的深入演练。

七、结论

        既然您已经了解了变压器模型的所有知识,那么在此基础上构建知识并深入研究更复杂的LLM模型架构(如BERT,GPT等)应该不难。

        您可以参考以下资源:

  1. BERT 101 - State Of The Art NLP Model Explained
  2. The Illustrated GPT-2 (Visualizing Transformer Language Models) – Jay Alammar – Visualizing machine learning one concept at a time.

        我希望这篇由两部分组成的文章能让变压器模型不那么令人生畏。

08-13 10:39