Skip to content
🔗 分享本题
查看我的学习进度 →

因果掩码动漫知识图:下三角可见性保证每个位置只能关注自身和左侧历史,在 Softmax 前把未来位置分数设为负无穷,使其注意力概率为零

🧠 图解记忆:下三角只看左边,Mask 在 Softmax 前把未来分数变成负无穷;点击图片可查看原图。

Causal Mask = 在 Self-Attention 中屏蔽未来的 Token,确保模型只能看到当前位置及之前的词。

为什么需要因果掩码?

自回归生成的要求:预测第 t 个 Token 时,只能用前 t-1 个 Token 的信息

如果不加掩码:
  预测 Token[3] 时,Attention 能看到 Token[0],1,2,3,4,5... → 作弊了!

加上因果掩码后:
  预测 Token[3] 时,只能看到 Token[0],1,2 → 严格左到右生成 ✅

掩码矩阵示例

序列: [BOS, 我, 爱, AI, EOS]

Attention 掩码矩阵(下三角矩阵):

          我    爱    AI
BOS       1     0     0     0   ← BOS 只能看到自己
我         1     1     0     0   ← 我能看到 BOS + 我
爱         1     1     1     0   ← 我爱能看到 BOS + 我 + 爱
AI         1     1     1     1   ← AI 能看到前面所有
EOS        0     0     0     0   ← EOS 不参与预测

实现细节

python
import math
import torch

def causal_mask(seq_len):
    mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1)
    mask = mask.masked_fill(mask.bool(), float('-inf'))  # 未来位置设为负无穷
    return mask  # Softmax 后这些位置的概率 → 0

def forward_with_causal_mask(q, k, v, causal_mask_mat):
    scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(d_k)
    scores = scores + causal_mask_mat  # 未来位置变为 -inf
    weights = torch.softmax(scores, dim=-1)
    output = torch.matmul(weights, v)
    return output

因果掩码 vs 双向掩码

类型能否看未来代表模型适用任务
Causal Mask(单向)❌ 不能GPT 系列, LLaMA, Qwen文本生成(自回归)
Bidirectional Mask✅ 能BERT文本理解(分类、抽取)
MLM Mask(随机掩码)部分BERT/T5填充任务

面试高频追问

  • Flash Attention 如何处理因果掩码? Flash Attention 在分块(block-wise)计算时,对于包含未来 Token 的 block 直接设负无穷,保证精确因果约束且 IO 最优
  • Decoder-only 一定是因果的吗? 是的——这是它与 Encoder-only(双向注意力)的根本区别

面试话术:

"因果掩码是自回归生成的核心保障:预测每个 Token 时只能看到前面的词,看不到后面的。实现上是给未来位置加一个负无穷的大数,Softmax 后那些位置的概率就是 0。这是 Decoder-only 模型的标志性设计,也是为什么 GPT 能一行行续写文本而不会提前看到自己要输出的内容。"