Transformer 架构中的 Self-Attention (自注意力) 是其核心创新和强大功能的关键所在。它彻底改变了处理序列数据(如文本)的方式,克服了 RNN 和 LSTM 在处理长距离依赖和并行化方面的主要限制。

以下是 Self-Attention 机制的详细解析:

核心思想

Self-Attention 允许序列中的 每一个元素 直接与序列中的 所有其他元素(包括它自己)进行交互和“关注”,以计算该元素的新的、上下文感知的表示。它动态地决定在编码或解码当前元素时,应该赋予序列中其他元素多少“注意力”或权重。

运作步骤

  1. 输入表示 (Input Representation):

    • 输入是一个序列的向量表示(例如,一个句子中每个词的嵌入向量),记为 X = [x1, x2, ..., xn],其中 xi 是第 i 个元素的 d_model 维向量。

    • 这些向量通常结合了词嵌入(Word Embeddings)和位置编码(Positional Encoding),以注入序列的顺序信息。

  2. 生成 Query, Key, Value 向量:

    • 对输入序列 X 中的 每一个 元素 xi,通过三个不同的线性变换(可学习的权重矩阵 W^QW^KW^V)生成三个新向量:

      • Query (qi): qi = xi * W^Q - 代表当前元素正在“询问”或“寻找”相关信息。

      • Key (ki): ki = xi * W^K - 代表当前元素可以用来“回答”其他元素查询的“标识”或“内容摘要”。

      • Value (vi): vi = xi * W^V - 代表当前元素实际携带的、将被聚合的“信息内容”。

    • 这些变换将输入向量从 d_model 维投影到 d_k (Query/Key) 和 d_v (Value) 维空间。通常 d_k = d_v

  3. 计算注意力分数 (Attention Scores):

    • 为了计算第 i 个元素(以其 Query qi 为代表)对第 j 个元素(以其 Key kj 为代表)的注意力分数(相关性),计算 qi 和 kj 的点积:

      • score(i, j) = qi · kj^T (^T 表示转置)

    • 这样,为序列中的每一对位置 (i, j) 都计算了一个分数。分数越高,表示元素 j 对理解元素 i 越重要。

  4. 缩放 (Scaling):

    • 点积分数可能会随着向量维度 d_k 的增大而变得非常大(方差增大),导致 softmax 的梯度非常小。因此,将分数除以 sqrt(d_k) 进行缩放,稳定训练:

      • scaled_score(i, j) = score(i, j) / sqrt(d_k)

  5. 应用 Softmax (归一化权重):

    • 对第 i 个元素对应的所有 j (j=1 to n) 的缩放分数应用 softmax 函数:

      • alpha(i, j) = softmax(scaled_score(i, j)) = exp(scaled_score(i, j)) / sum_k(exp(scaled_score(i, k)))

    • 这确保了:

      • 所有权重 alpha(i, j) 都在 0 和 1 之间。

      • 对于固定的 i,所有权重 alpha(i, j) 的总和为 1。

      • alpha(i, j) 表示在生成第 i 个位置的输出时,应该“关注”第 j 个位置的程度。

  6. 计算加权和输出 (Output as Weighted Sum of Values):

    • 第 i 个位置的 Self-Attention 输出向量 zi 是所有 Value 向量 vj 的加权和,权重就是上一步计算出的注意力权重 alpha(i, j)

      • zi = sum_j( alpha(i, j) * vj )

    • 这个 zi 就是元素 xi 的新的、上下文感知的表示。它融合了整个序列中所有与 xi 相关的元素(根据注意力权重)的信息。

矩阵形式表示

上述过程可以高效地用矩阵运算表示:

  1. Q = X * W^Q (Query 矩阵)

  2. K = X * W^K (Key 矩阵)

  3. V = X * W^V (Value 矩阵)

  4. Attention Scores = Q * K^T

  5. Scaled Scores = (Q * K^T) / sqrt(d_k)

  6. Attention Weights (A) = softmax(Scaled Scores) (按行 softmax)

  7. Output (Z) = A * V

多头注意力 (Multi-Head Attention - MHA)

原始的 Self-Attention 被称为 “单头注意力”。Transformer 使用了 多头注意力 来增强模型的表达能力:

  1. 并行计算多个头: 将 QKV 通过 h 个不同的线性变换(h 个头)投影到 h 个维度为 d_k' (通常 d_k' = d_k / h), d_k'd_v' (通常 d_v' = d_v / h) 的子空间中。

  2. 独立计算注意力: 在每个子空间(头)中独立执行步骤 2-6 的 Self-Attention 操作,得到 h 个输出矩阵 Z1, Z2, ..., Zh (每个维度为 n x d_v')。

  3. 拼接 (Concatenate): 将所有头的输出 Z1, Z2, ..., Zh 沿着最后一个维度拼接起来,得到一个 n x (h * d_v') 维的矩阵 Z_concat

  4. 线性投影: 将拼接后的矩阵通过一个最终的线性变换 W^O 投影回 d_model 维空间:

    • MultiHead(Q, K, V) = Concat(Z1, Z2, ..., Zh) * W^O

MHA 的优势:

  • 允许模型在不同的表示子空间中(例如,语法、语义、指代关系等)并行地关注不同位置的不同方面

  • 显著增强了模型的表示能力。

  • 是 Transformer 性能强大的关键因素之一。

Transformer 中的应用

  1. 编码器 (Encoder):

    • 使用 Multi-Head Self-Attention 层。每个位置的输出 zi 都融合了整个输入序列的信息。

    • 是真正的全局自注意力,能看到整个序列。

  2. 解码器 (Decoder):

    • 第一层: Masked Multi-Head Self-Attention:

      • 同样是 Self-Attention,但在计算注意力分数时引入了 掩码 (Mask)

      • 在生成目标序列的第 i 个位置时,解码器只能“看到”位置 1 到 i(以及编码器的最终输出),不能“看到”位置 i+1 及之后的未来信息(因为那些位置在预测时还未生成)。

      • 掩码通过在 softmax 步骤之前,将未来位置 (j > i) 的注意力分数设置为一个非常大的负数(如 -1e9)来实现。softmax 之后,这些位置的权重就接近于 0。

    • 第二层: Multi-Head Encoder-Decoder Attention:

      • 这不是 Self-Attention。它的 Q 来自解码器上一层的输出,而 K 和 V 来自编码器的最终输出

      • 这允许解码器在生成每个目标词时,关注编码器编码的整个源序列中最相关的部分。

Self-Attention 的关键优势

  1. 长距离依赖 (Long-Range Dependencies): 直接计算任意两个位置之间的关联,不受序列长度限制,彻底解决了 RNN/LSTM 的梯度消失/爆炸问题对长序列建模的影响。

  2. 高度并行化 (Massive Parallelization): 计算所有位置的 Query、Key、Value 以及所有注意力分数都可以完全并行进行(主要依赖矩阵乘法),极大地提高了训练和推理速度。

  3. 动态权重分配 (Dynamic Weighting): 注意力权重 alpha(i, j) 是动态计算的,基于当前输入序列的具体内容。模型可以灵活地为不同的上下文分配不同的重要性。

  4. 可解释性 (Interpretability - 一定程度上): 分析注意力权重矩阵 A 可以直观地看到模型在处理特定输入时关注了序列中的哪些部分(例如,某个词主要关注了哪些其他词)。

总结

Self-Attention 机制是 Transformer 架构的灵魂。它通过让序列中的每个元素直接关注序列中的所有其他元素(通过 Query-Key-Value 框架和点积注意力),并动态计算权重来聚合信息,实现了对序列数据高效、并行、且能有效捕捉长距离依赖关系的建模。Multi-Head Attention 进一步提升了其表达能力。Self-Attention 的成功奠定了现代大规模语言模型(如 BERT, GPT 系列)的基础。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐