← 返回题目列表

什么是因果掩码(causal mask)?双向、因果、prefix 注意力有什么区别?

高频 中等 第 2 / 25 题 更新于 2026/08/03
因果掩码causal mask注意力掩码prefix-LM

简化版

因果掩码是给自注意力加的一个「只许看左边」的限制:计算注意力时,把每个 token 对它右侧(未来)token 的分数设成 −∞,softmax 后权重变 0,于是每个位置只能关注自己和之前的 token。它保证自回归语言模型「预测第 i 个词时看不到第 i 个及以后的词」,避免信息泄漏。按可见范围分三类:双向(全可见,BERT 用于理解)、因果(只看左侧,GPT 用于生成)、prefix-LM(前缀部分双向、生成部分因果,兼顾理解与生成)。

详细版

因果掩码怎么实现

在注意力分数矩阵 S = QKᵀ/√d 上加一个掩码矩阵 M,再做 softmax:

S_masked[i][j] = S[i][j] + M[i][j]
M[i][j] = 0        若 j ≤ i   (允许看)
M[i][j] = −∞       若 j > i   (屏蔽未来)
softmax 后,被 −∞ 的位置权重≈0

这就是一个下三角可见的模式:位置 i 只能注意到 0…i。

为什么训练时需要它

decoder-only 是「用整句话并行训练、每个位置预测下一个词」。如果不加因果掩码,位置 i 在预测第 i+1 个词时能看到答案(未来 token),就作弊了,学不到真本事。因果掩码保证「预测未来只依赖过去」,让并行训练与自回归推理行为一致。

三种注意力可见性

类型可见范围用途代表
双向(bidirectional/full)全序列理解、编码BERT 编码器
因果(causal/单向)只看自己及左侧自回归生成GPT、Llama 解码器
prefix-LM前缀双向 + 后续因果输入充分理解 + 生成GLM、UniLM、T5 解码端对编码端

完整版教学

一、掩码的本质:在 softmax 前”屏蔽”某些位置

注意力的自由度在于「每个 token 能看谁」。掩码就是控制可见性的开关:想屏蔽哪对 (i,j),就在它们的注意力分数上加 −∞,softmax 后 exp(−∞)=0,权重归零,等于这条连接被切断。掩码不改变注意力的计算框架,只是决定信息能在哪些位置之间流动

因果掩码是最重要的一种,它切断了「看向未来」的所有连接,形成下三角可见结构。

二、为什么自回归模型必须加因果掩码

自回归语言模型的目标是 P(x) = ∏ P(x_i | x_1…x_{i-1})——每个词的概率只依赖它前面的词。训练时为了效率,我们把整句话一次性喂进去并行计算所有位置的预测,而不是一个个来。

问题来了:并行计算时,位置 i 的表示是通过注意力聚合全序列得到的,如果不加限制,它会「看到」位置 i+1、i+2 的内容——而这些正是它要预测的答案。这叫信息泄漏,会让模型学到「抄答案」的捷径,训练 loss 很低但推理时完全不会做(因为推理时未来还不存在)。

因果掩码通过屏蔽未来,保证训练时每个位置的可见信息,和推理时逐 token 生成到该位置时的可见信息完全一致——这是自回归模型能「并行训练、逐 token 推理」两者行为对齐的关键。

记忆钩子:因果掩码 = 防作弊。 预测未来只准看过去,训练与推理才一致。

三、因果掩码与 KV Cache 的天然契合

因果结构还带来推理红利。因为位置 i 只依赖 0…i,且这些位置的 K/V 不会因为后面新增 token 而改变,所以历史 token 的 K/V 可以缓存复用(KV Cache):生成第 t 个 token 时,只需算新 token 的 Q/K/V,与缓存的历史 K/V 做注意力即可,无需重算历史。

如果是双向注意力,新增一个 token 会改变所有位置的可见性(大家都要重新看这个新 token),就无法这样简单地缓存。这也是 decoder-only + 因果掩码在推理上高效的一个底层原因。

四、三种可见性各自的适用场景

双向(BERT):每个 token 看全序列,理解最充分,适合分类、抽取、句向量等判别任务。但不能自回归生成(生成时右侧不存在)。

因果(GPT):只看左侧,天然支持逐词生成,是所有生成式 LLM 的基础。代价是编码输入时也只能单向看(读 prompt 时后面的词看不到前面对后面的影响),理论上对纯理解任务略吃亏,但规模化后影响不大。

prefix-LM(前缀语言模型):一个折中设计——把序列分成「前缀(输入/prompt)」和「生成部分」,前缀内部用双向注意力(充分理解输入),生成部分用因果注意力(自回归产出)。GLM、UniLM 采用类似机制;T5 的解码器对编码器是交叉注意力、也体现了「输入双向 + 输出因果」的思想。它让模型在读输入时能双向理解,又能生成,兼顾两端。

五、掩码还能表达更多结构

掩码不止「因果」一种,它是一个通用工具:

  • Padding 掩码:屏蔽 batch 内为对齐长度而填充的 pad token,别让它们参与注意力。
  • 滑动窗口掩码(sliding window):只让每个 token 看最近 W 个 token(如 Mistral),把长序列的注意力成本从 O(n²) 降到 O(n·W)。
  • 文档/段掩码:训练时把多篇拼接的文档互相屏蔽,防止跨文档注意力串味。
  • prefix 掩码:如上,前缀双向、后缀因果。

掌握「掩码 = 在 softmax 前用 −∞ 控制可见性」这一机制,各种变体都是它的组合。

六、面试拆解算例

这类题最怕只讲术语,最好把它落成一次资源账。假设模型有 32 层、hidden size 为 4096、序列长度从 2K 增到 16K,标准注意力的相关度矩阵规模会从 2K × 2K 变成 16K × 16K,理论元素数量放大 64 倍。即使具体算子不会真的把所有中间矩阵都落到 HBM,复杂度曲线仍然决定了 prefill 延迟和显存压力会快速上升。

attention_scores_per_head = seq_len * seq_len
2K  ->  2,048 * 2,048   ≈ 4.19M
16K -> 16,384 * 16,384  ≈ 268.44M
放大倍数 ≈ 64
观察维度面试要说清的问题工程判断
张量形状Q/K/V、hidden state 或路由权重怎样变化能否解释实现差异
复杂度随层数、序列长度、head 数怎样增长谁先成为瓶颈
质量风险是否改变训练分布或表达能力会不会掉点
部署代价算子、框架、缓存是否支持能不能稳定上线
输入 token -> embedding -> 注意力/FFN/归一化模块 -> hidden state -> logits
                |             |                 |
             位置/掩码       显存与吞吐        质量与稳定性

所以回答「什么是因果掩码(causal mask)?双向、因果、prefix 注意力有什么区别?」时,推荐先讲结构变化,再讲这条变化怎样影响资源曲线,最后补一句质量和部署的边界。这样比单纯背「某某结构更快、更省」更像工程答案。

七、常见误区与追问

  • 误区:因果掩码是推理时才加的。 训练时就必须加(防止并行计算泄漏未来),推理时因果性由「未来还没生成」自然满足,但实现上仍用掩码保持一致。
  • 误区:被掩码位置分数设为 0。 是设为 −∞(softmax 前),使权重变 0;设成 0 反而会给它一个非零权重。
  • 追问:不加因果掩码会怎样? 训练时看到未来答案(信息泄漏),loss 虚低,推理时不会生成。
  • 追问:因果掩码为什么利于 KV Cache? 历史 K/V 不受未来影响,可缓存复用;双向注意力做不到。
  • 追问:prefix-LM 好处? 输入前缀双向理解更充分,同时保留生成能力,兼顾理解与生成。
  • 追问:padding 掩码和因果掩码冲突吗? 不冲突,二者可叠加(同时屏蔽 pad 和未来)。

八、加强记忆

因果掩码记「防作弊、下三角」:在 softmax 前把每个 token 对未来位置的分数设 −∞,使其只能看自己及左侧,保证自回归模型「预测未来只依赖过去」,让并行训练与逐 token 推理行为一致,还天然配合 KV Cache。三种可见性简要说区分:双向=全看(BERT 理解)、因果=只看左(GPT 生成)、prefix-LM=前缀双向+生成因果(兼顾)。再记一个通用心法——掩码就是用 −∞ 控制”谁能看谁”,padding、滑动窗口、跨文档隔离都是它的变体。