🧠 图解记忆:下三角只看左边,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 能一行行续写文本而不会提前看到自己要输出的内容。"
