← 返回题目列表

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

高频 中等 第 2 / 25 题 更新于 2026/09/18
因果掩码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 前用 −∞ 控制可见性」这一机制,各种变体都是它的组合。

六、用四个 token 验证掩码

设序列长度为 4,位置 2(从 0 开始)只能读取位置 0、1、2。它在 softmax 前的第 2 行分数若为 [1.2, 0.3, 2.0, 4.5],因果掩码会把最后一项改成负无穷;softmax 后未来位置的权重严格为 0,而不是“比较小”。这样训练时虽然四个位置并行计算,每一行仍只使用推理时已经存在的信息。

原始分数: [1.2, 0.3, 2.0, 4.5]
因果掩码: [0,   0,   0,   -∞ ]
掩码之后: [1.2, 0.3, 2.0, -∞ ]
可见位置:  0    1    2    ×
Mask屏蔽对象不加时的后果
Causal当前 token 右侧的未来位置训练时偷看答案
Padding为批处理补出的空位置注意力被无效 token 稀释
Document拼接序列中的其他文档跨样本信息串扰

若 batch 中还存在 padding,需要再叠加 padding mask。两个 mask 都作用于 attention logits,但前者保证时间因果性,后者排除无效填充;把二者混为一种 mask,常会造成训练正常、批量推理却异常。

七、常见误区与追问

  • 误区:因果掩码把未来位置的分数改成 0。 应在 softmax 前加负无穷或足够大的负数;加 0 等于不屏蔽,未来位置仍会获得概率。
  • 追问:训练时为什么需要 Mask,推理时未来 token 明明不存在? 训练会并行计算整段序列的所有位置,不加 Mask 就会泄漏右侧答案;推理实现仍需正确处理批次、padding 和缓存偏移。
  • 追问:Padding Mask 与 Causal Mask 如何组合? 先构造各自允许访问的布尔关系,再取交集,或把两个加法 Mask 相加后统一加到 logits 上。
  • 误区:Prefix-LM 的前缀也只能单向注意。 Prefix-LM 通常让前缀内部双向可见,而生成区只能看整个前缀和已生成位置。
  • 追问:序列打包时只加普通因果 Mask 够吗? 不够;后一个样本仍能看到前一个样本,必须叠加文档边界 Mask 并正确重置 position ids。

八、加强记忆

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