多头自注意力机制(Multi-Head Self-Attention)#

这是 Transformer 的核心。它允许模型在处理一个词时,同时关注到序列中的所有其他词,从而捕捉丰富的上下文信息。

在循环神经网络(RNN/LSTM)的时代,处理序列到序列(Sequence-to-Sequence, Seq2Seq)任务(如机器翻译)的标准范式是 编码器-解码器(Encoder-Decoder) 架构。

编码器(Encoder):一个 RNN(或 LSTM),负责读取并理解整个输入序列(例如,一个英文句子)。它将整个序列的信息压缩成一个固定长度的向量,称为上下文向量(Context Vector)。这个向量通常是编码器最后一个时间步的隐藏状态。

解码器(Decoder):另一个 RNN,它接收编码器生成的上下文向量,并逐词生成输出序列(例如,对应的法文句子)。

这种架构存在一个明显的信息瓶颈:无论输入序列有多长、多复杂,编码器都必须将其所有信息压缩到一个固定长度的向量中。对于长句子来说,这几乎是不可能完成的任务,模型会不可避免地丢失重要信息,尤其是句子开头的细节。

注意力机制#

为了解决这个瓶颈问题,注意力机制被引入。其灵感来源于人类的视觉注意力和认知过程:当人类处理信息时,并不会一次性处理所有信息,而是会将注意力集中在当前任务最相关的部分。

在 Seq2Seq 模型中,注意力机制允许解码器在生成每个词时,能够“回顾”并“关注”输入序列的所有部分,并根据当前要生成的词,动态地决定哪些输入词更重要。

核心思想:不再依赖于一个单一的、固定的上下文向量,而是在解码的每一步,都根据当前解码状态,重新计算一个针对当前步骤的、动态的上下文向量。这个动态的上下文向量是输入序列所有部分信息的加权平均,而“权重”就代表了模型对输入序列不同部分的“注意力”大小。

注意力机制是深度学习领域最重要的思想之一,它不仅革新了 NLP,也为更强大的 Transformer 模型的诞生铺平了道路。

  • 模型不再受限于固定长度的向量,可以处理更长的序列。

  • 通过关注相关部分,模型在机器翻译、文本摘要等任务上取得了显著的性能提升。

  • 通过可视化注意力权重,可以直观地看到模型在生成某个词时“正在看”输入序列的哪个部分,为理解和调试模型提供了窗口。

注意力机制的计算过程:Query, Key, Value#

注意力机制的计算过程可以被优雅地抽象为对 查询(Query)键(Key)值(Value) 的操作。

  • Query (Q):代表当前的需求。在 Seq2Seq 模型中,它通常是解码器在当前时间步的隐藏状态,表示“我正在寻找什么样的信息来生成下一个词?”

  • Key (K):与输入序列的每个元素相关联的“标签”。它用于和 Query 进行匹配,以衡量输入元素的重要性。在基础的注意力模型中,它就是输入序列每个位置的编码器隐藏状态。

  • Value (V):与 Key 关联的“内容”。它是输入序列每个元素的实际信息表示。在基础模型中,Value 通常也等于 Key(即编码器的隐藏状态)。

计算过程分为三步:

  1. 计算注意力分数(Attention Scores): 对于当前的 Query,用它和每一个 Key 进行相似度计算,得到一个分数。最常用的计算方法是点积(Dot-Product)。 $\( \text{score}(Q, K_i) = Q \cdot K_i \)\( 这个分数衡量了当前的查询 \)Q\( 与输入序列第 \)i\( 个位置的 Key \)K_i$ 的相关性有多高。

  2. 分数归一化(Softmax): 将上一步得到的所有分数通过一个 Softmax 函数进行归一化,得到注意力权重(Attention Weights) \(\alpha_i\)。Softmax 确保所有权重都是 0 到 1 之间的正数,并且它们的总和为 1,形成一个概率分布。 $\( \alpha_i = \text{softmax}(\text{scores})_i = \frac{\exp(\text{score}(Q, K_i))}{\sum_j \exp(\text{score}(Q, K_j))} \)$

  3. 计算上下文向量(Context Vector): 将注意力权重 \(\alpha_i\) 与对应的 Value \(V_i\) 相乘,然后求和,得到最终的上下文向量。 $\( \text{Context} = \sum_i \alpha_i V_i \)$ 这个上下文向量是一个加权和,其中注意力权重高的 Value 贡献更大。它汇集了当前解码步骤最需要的来自输入序列的信息。

最后,解码器将这个动态生成的上下文向量与它自身的隐藏状态结合起来,用于预测下一个词。

自注意力(Self-Attention)#

自注意力是注意力机制的一种特殊情况,其中查询(Query)、键(Key)和值(Value)均来自同一个地方——即上一层的输出。简单来说,序列中的每个词都会生成自己的 Q、K、V 向量,然后计算自己与其他所有词的注意力权重。

多头(Multi-Head)#

与其只进行一次注意力计算,不如将 Q、K、V 向量在维度上拆分成多个“头(head)”,并让每个头并行地进行计算。这允许模型在不同的表示子空间中学习到不同方面的信息(例如,一个头可能关注句法关系,另一个头可能关注语义关联)。最后,所有头的输出会被拼接起来,并通过一次线性变换得到最终结果。