QKV、Multi-Head Attention 与注意力头机制底层图谱
从 Q / K / V 投影、attention score、mask、softmax、head 拼接、GQA / MQA 到 KV Cache,理解 Transformer 内部“谁看谁、看多少、拿什么信息”
Hidden States
每个位置的向量
→
Q / K / V
三组线性投影
→
QK Score
匹配强度
→
Mask + Softmax
可见性 / 权重
→
Weighted V
读取内容
→
Output Projection
写回残差流
| 步骤 | 做什么 | 抓住的直觉 | 常见失败 |
| 输入 hidden state | 每个 token 位置都有一个当前层表示 | Attention 处理的是上下文化向量,不是原始文字 | 把注意力图误读成词典关系 |
| Q / K / V 投影 | 用三组权重把同一 hidden state 投成 Query、Key、Value | Q 负责找,K 负责被匹配,V 负责被读取 | 把 Q/K/V 当成三份不同文本 |
| QK 打分 | 用点积计算当前位置和历史位置的匹配强度 | 分数越高,越可能从那个位置读取信息 | 忽略缩放、位置编码和 mask 的影响 |
| Mask + Softmax | 屏蔽不可见位置,再把分数转成权重 | 模型只能看允许看的 token | mask 错导致偷看未来、看见 padding 或漏看上下文 |
| 混合 V | 按权重加权求和 Value 向量 | Attention 的输出是从可见位置搬来的信息混合 | 以为 attention 只是在“标重点” |
| 输出投影 | 把多头结果拼接并投影回模型维度 | 多个信息通道汇总后写回残差流 | 忽略 output projection 和后续层的再加工 |
一句话:
Q/K 决定“看哪里”,V 决定“拿什么”,mask 决定“能不能看”,softmax 决定“看多少”。
| 对象 | 来自哪里 | 它负责什么 | 可以怎么想 |
| Query | 当前位置 hidden state 乘以 Wq | 表达当前位置正在寻找什么信息 | 问题、检索意图、当前槽位需求 |
| Key | 各位置 hidden state 乘以 Wk | 表达每个历史位置有什么可被匹配的特征 | 索引、标签、可匹配线索 |
| Value | 各位置 hidden state 乘以 Wv | 表达命中该位置后可以读取的内容 | 实际搬运的信息包 |
| QK^T | Query 与所有 Key 做点积 | 生成 attention score | 当前位置对每个可见位置的匹配强度 |
| softmax(score) | 归一化后的权重 | 决定各位置 Value 混合比例 | 一个可学习的信息路由分布 |
为什么要除以 sqrt(d_k)
Q/K 维度越大,点积分数的尺度越容易变大。除以 sqrt(d_k) 是为了让 softmax 不至于过早变得极端,帮助训练稳定。
为什么 Q/K 会和 RoPE 强相关
RoPE 通常作用在 Q/K 上,让两个位置的 attention score 自然携带相对距离信息。位置机制不只是输入前贴标签,而是进入了“谁看谁”的匹配过程。
| Mask 类型 | 限制什么 | 典型场景 | 错误症状 |
| Causal mask | 当前位置不能看未来 token | decoder-only LLM 训练和生成 | 训练泄漏、评测虚高、生成行为异常 |
| Padding mask | 不让模型看 padding 位置 | batch 推理、不同长度样本混合 | batch 后输出和单条输出不一致 |
| Attention mask | 控制哪些 token 可见 | prefix、特殊模板、分段输入 | 模型漏看系统指令或看见不该看的片段 |
| Sliding window mask | 只允许看局部窗口 | 长上下文降成本 | 远距离依赖丢失、跨段推理变弱 |
| Block / sparse mask | 按块或稀疏规则可见 | 长序列、结构化文档、特殊架构 | 局部正常,长距离证据不稳定 |
排查直觉:
很多看起来像“模型玄学变笨”的问题,其实是 mask、padding side、position ids 或 KV Cache offset 错了。先排输入可见性,再谈模型能力。
为什么要多头
不同 head 在不同投影子空间里计算 attention。一个 head 可能偏局部搭配,一个偏括号匹配,一个偏指代,一个偏格式边界。它们并行提供多种信息通道。
头不是固定功能模块
head 的功能是训练中形成的,不是人工预先指定。某些头可能有可解释模式,但不能把一个头粗暴命名为“事实头”或“语法头”。
拼接后还要投影
所有 head 的输出会 concat,再经过 output projection 写回模型维度。后续层、MLP、残差流会继续加工,单个 head 不是最终答案。
| 机制 | 直觉 | 收益 | 边界 |
| Multi-Head Attention | 多个独立 head 并行读上下文 | 能同时捕捉不同关系 | 显存和计算更重 |
| Multi-Query Attention | 多个 Q head 共享一组 K/V | 显著降低 KV Cache 占用 | 可能牺牲部分表达灵活性,需要任务评测 |
| Grouped-Query Attention | 多个 Q head 分组共享 K/V | 在质量和推理成本之间折中 | 不同模型实现细节不同 |
| Head pruning | 裁掉低贡献 head | 压缩模型或解释结构 | 贡献依赖任务和层,不能只看注意力强弱 |
| 观察对象 | 能告诉你什么 | 不能直接证明什么 | 继续深入 |
| Attention pattern | 某个 head 在某层偏向看哪些位置 | 不能直接证明输出因果由它决定 | 可解释性 / 模型内部表征 |
| Induction-like pattern | 模型可能在复制、续写、模板匹配中利用历史模式 | 不能说明模型真的“理解规则” | Prompt / 上下文工程 |
| Attention ablation | 去掉或替换某些头后输出是否变化 | 单次样本不能代表全局功能 | 模型评测 |
| Activation patching | 某个中间状态是否参与特定行为 | 不能替代真实生产评测和安全审计 | 模型内部机制 |
实用边界:
Attention 可视化适合找线索,不适合直接当审计证据。要证明某个 head 真有作用,需要干预实验、消融、跨样本稳定性和外部行为评测。
| 主题 | Attention 层发生什么 | 工程后果 | 回读页面 |
| Prefill | 一次性为整个输入序列计算 Q/K/V 和 attention | 输入越长,首 token 等待越明显 | 推理计算 / KV Cache |
| Decode | 每个新 token 只新增当前 Q,并读取历史 K/V | 输出越长,总耗时越长 | 解码 / 采样 |
| KV Cache | 缓存每层每个历史 token 的 K/V | 省重复计算,但消耗显存 | 推理计算 / KV Cache |
| RoPE / position ids | Q/K 携带位置旋转或位置关系 | 位置错位会导致长上下文质量异常 | 位置编码 / RoPE |
| GQA / MQA | 减少 K/V head 数量 | 降低 KV Cache 和带宽压力 | 模型服务 / 网关 |
| FlashAttention | 优化 attention 中间结果和显存读写 | 提升长上下文 prefill 效率 | AI Infra / GPU |
| 症状 | 优先怀疑 | 检查动作 |
| 单条输入正常,batch 后异常 | padding mask、position ids、left/right padding | 对比 batch 与 single 的 token、mask、position ids |
| 长上下文越长越漏证据 | attention 稀释、位置偏差、Top-K 片段过多 | 做位置扰动、needle retrieval、chunk 排序对照 |
| 续写重复或突然跑偏 | KV Cache offset、cache position、stop sequence | 检查 past length、cache reuse 边界和 position continuity |
| 量化后代码或长文本能力掉 | Q/K/V 或 attention 输出精度敏感 | 按任务切片比较 logits、attention 稳定性和最终评测 |
| 可解释图看起来合理但答案仍错 | Attention pattern 只是线索,后续层和 MLP 改写了表示 | 做消融、activation patching 和外部行为评测 |
| 证据节点 | 必须记录的字段 | 用来排查什么 |
| 输入边界 | token_ids_hash、attention_mask_hash、position_ids_hash、padding_side | batch 后异常、padding 错位、位置错位和不可见 token 泄漏 |
| Q / K / V 投影 | layer_id、head_id、qkv_dtype、quantization_config、shape_summary | 量化、张量并行或模型转换是否破坏了注意力计算 |
| 注意力模式 | attention_pattern_summary、top_attended_positions、mask_violations、entropy | 长上下文漏证据、格式 token 过强、注意力过度集中或过度稀释 |
| KV Cache 连续性 | cache_position、past_length、kv_block_id、reuse_boundary、eviction_count | 续写重复、跨请求污染、cache offset 错误和长任务恢复失败 |
| 行为连接 | trace_id、needle_test_id、ablation_result、downstream_metric | 观察到的 attention 变化是否真的解释了输出行为,而不是漂亮图像 |
误区:QKV 是三份输入文本
Q、K、V 都是同一层 hidden state 经过不同权重投影得到的向量角色,不是三份不同材料。
误区:Attention 权重就是解释
注意力权重能显示信息路由倾向,但输出还受多头拼接、输出投影、残差流、MLP 和后续层影响。
误区:多头越多越强
head 数量会影响表达和成本,但能力还取决于深度、宽度、数据、训练目标和整体架构。更多 head 也意味着更多调度和缓存压力。
误区:KV Cache 不影响模型行为
正确的 KV Cache 只是复用历史状态;一旦 cache position、mask 或 prefix 复用边界错了,就会直接改变生成行为。
这张图在主线里的位置
Transformer 总览让你知道 Attention 是核心子层;RoPE 页解释位置怎样进入 Q/K;推理计算页解释 KV Cache 为什么贵;可解释性页解释 head 和 circuit 怎么分析。本页把这四者之间的 QKV 机制补成一条可排查、可互链的底层理解线。