跳过主要内容
CookLLM logoCookLLM 文档

Self-Attention 到 GQA

会员专享

从 Self-Attention 出发,依次拆开 Multi-Head、Causal Masking 与 GQA / MQA 的设计权衡

什么是 Attention 机制

Attention(注意力机制)是现代深度学习中最重要的创新之一,它使模型能够在处理序列数据时动态地关注不同位置的信息。

在 Transformer 架构中,Attention 机制的核心思想是:让每个位置的 token 根据其与其他 token 的相关性,对它们进行加权求和。

值得先说清楚它替代了什么。RNN 处理序列时,第 nn 个位置的信息要传到第 mm 个位置,必须经过 ∣m−n∣|m - n| 步递推,路径越长信号衰减越严重,而且这些步骤天然串行、无法并行。Attention 把这条路径压到常数:任意两个位置之间只隔一次点积。代价是计算量从 O(N)O(N) 变成 O(N2)O(N^2),显存也随序列长度平方增长。这笔交易是后面 FlashAttention、GQA、KV cache 等一整条优化线索的起点。

标准 Self-Attention 计算流程

给定输入序列,Self-Attention 通过以下步骤计算输出:

  1. 线性变换:将输入 XX 分别投影为 Query (QQ)、Key (KK)、Value (VV)

    Q=XWQ,K=XWK,V=XWVQ = XW_Q, \quad K = XW_K, \quad V = XW_V
  2. 计算注意力分数:通过 Query 和 Key 的点积计算相似度

    S=QKTDS = \frac{QK^T}{\sqrt{D}}

    其中 DD 是 head dimension,除以 D\sqrt{D} 用于数值稳定性(scaled dot-product)

  3. 应用 Softmax:将分数转换为概率分布

    A=softmax(S)A = \text{softmax}(S)
  4. 加权求和:用注意力权重对 Value 进行加权

    O=AVO = AV

直观理解:

  • QQ(Query):我想要什么信息?
  • KK(Key):我提供什么信息?
  • VV(Value):我实际包含的信息是什么?
  • 注意力分数:衡量"我需要的"和"你提供的"有多匹配

PyTorch 参考实现

import torch
import torch.nn.functional as F

def self_attention(X, W_q, W_k, W_v):
    """
    X: (batch, seq_len, d_model)
    W_q, W_k, W_v: (d_model, d_head)
    """
    Q = X @ W_q  # (batch, seq_len, d_head)
    K = X @ W_k
    V = X @ W_v

    # 计算注意力分数
    scores = Q @ K.transpose(-2, -1)  # (batch, seq_len, seq_len)
    scores = scores / (K.shape[-1] ** 0.5)  # 缩放

    # Softmax 归一化
    attn_weights = F.softmax(scores, dim=-1)

    # 加权求和
    output = attn_weights @ V  # (batch, seq_len, d_head)

    return output, attn_weights

登录以继续阅读

这是一篇付费内容,请登录您的账户以访问完整内容。