在前述内容中,从概念和原理的角度对Transformer的注意力机制进行了说明。然而,在模型的实际设计与实现过程中,情况更加复杂。本节将从实践角度对注意力机制及多头注意力机制的流程进行讲解。
注意力机制解决了以下两个问题。
❑ 能够动态聚焦于与当前任务最相关的信息,无论这些信息在序列中的位置如何。这不仅限于句子内部的关系,还包括跨句子,乃至整个文档的长距离依赖。
❑ 注意力机制通过为序列中每个词动态分配权重,更有效利用远距离上下文信息,从而提升对下一个词预测的准确性。
Transformer模型的数据处理流程包括以下4个步骤。
1)Transformer模型在输入端将文本序列转换为词嵌入向量,并在词嵌入向量中补充位置编码信息(根据奇偶位置分别补充正余弦编码)。
2)使用包含位置编码信息的词嵌入,通过模型中的 Q 、 K 、 V 权重矩阵生成相应的查询( Q )、键( K )和值( V )表示。利用这些表示计算注意力权重,以表征输入序列中各部分的相关性。通过将计算得到的注意力权重与值结合,生成最终的注意力输出,该输出捕捉了序列的上下文信息,并可用于模型的下一层。
3)在每个Transformer层的处理后,注意力机制计算的结果直接加入残差网络中。数据流经过前馈网络,再经过残差连接和层归一化处理,最后进行归一化,得出下一个词预测结果的概率分布。
4)预测的结果作为新的输入,与之前的输入一起重新更新位置编码,进行更新预测处理。在此过程中,涉及多头的掩码处理。为保证模型在训练过程中不会“看到”尚未预测的词,需要使用掩码遮蔽这些词,以模拟推理过程中生成的过程,确保每次预测仅基于之前的词。
前文已对位置编码的实现进行了说明,本节重点介绍如何利用带有位置编码信息的词嵌入向量进行训练与学习。首先,从词语相似度计算展开。注意力机制的核心在于识别句子中的重要信息,而这些重要信息的关联通过词语相似度计算得出。相似度计算的结果高度依赖于词嵌入模型。在自然语言处理中,相同词语在不同语境中可能具有截然不同的含义。为使模型能够根据上下文准确判断词语的相似性并确定其在特定语境中的意义,我们需要训练辅助模型参数,以根据上下文动态调整权重,构建更新的词嵌入向量,使模型能够捕捉语境中的细微差异,并在保留原始语义信息的同时,为相同词语赋予不同的解释。
下面通过一个简单案例来展示这一过程。
假设Transformer在训练时输入了一句话:“一台苹果手机”。Transformer模型的注意力机制会将句中的每个词与其他词进行相似度比较,并根据相似度的大小确定该词在句子中的重要性。以“苹果”和“手机”的相似度计算为例,说明训练 Q 、 K 权重矩阵的必要性。
在前文中,我们已经模拟出在二维词向量空间中,“苹果”既可能与“水果”相关,又可能与“手机”相关。原生词嵌入向量无法动态调整相似度结果,导致对于多义词,单一的嵌入模型难以适应不同语境下的相似度判断。
因此,给定嵌入模型,我们需要寻找一种方式动态调整其向量空间,使得在不同语境下,相同词语的相似度计算结果有所不同。图2-9很好地展示了词嵌入变换矩阵的实际效果:通过机器学习训练,寻找更合适的变换矩阵,以实现更佳的词嵌入效果。
图2-9 词嵌入变换矩阵作用演示
如何求得该变换矩阵?我们可以通过训练 Q 、 K 的权重矩阵来实现。其核心概念如图2-10所示。
图2-10 词嵌入线性变换矩阵定义来源
在图2-10中,对部分术语进行解释。
❑ Keys:表示输入序列的Key向量,每个Key向量代表一个词语的语义信息。
❑ Queries:表示输入序列的Query向量,每个Query向量代表当前要计算注意力权重的词语的语义信息。
❑ Similarity:表示Key向量和Query向量之间的相似度。
❑ 线性变换:表示对Key向量和Query向量进行线性变换。