Causal Mask(因果掩码)
自回归模型中用于防止 token "看到未来"的掩码矩阵。在 Softmax 前将注意力分数矩阵的上三角设为 -∞,确保每个位置只能关注自身及之前的 token。
Causal Mask(因果掩码)
一句话理解
Causal Mask 是一块"挡板"——遮住注意力矩阵的上三角,让每个 token 只能看到自己和前面的内容,看不到未来。
为什么需要 Causal Mask
GPT 是自回归模型:生成第 5 个 token 时,只能基于前 4 个 token 预测。但 Self-Attention 默认会让每个位置关注所有位置——包括还没生成的"未来"位置。这在训练时会造成信息泄露:模型直接看到了答案,学不到真正的预测能力。
Causal Mask 解决这个问题:在计算注意力分数后、Softmax 之前,把上三角区域设为 −∞,经过 Softmax 后这些位置的权重变成 0。
掩码矩阵长什么样
对于一个长度为 4 的序列,Causal Mask 是:
text
t1 t2 t3 t4
t1 [ 0 -∞ -∞ -∞ ] ← t1 只能看自己
t2 [ 0 0 -∞ -∞ ] ← t2 能看 t1 和自己
t3 [ 0 0 0 -∞ ] ← t3 能看 t1、t2 和自己
t4 [ 0 0 0 0 ] ← t4 能看所有
下三角(含对角线)为 0,上三角为 −∞。
代码实现
python
import numpy as np
def create_causal_mask(seq_len):
# 上三角为 -1e9(近似 -∞),下三角和对角线为 0
mask = np.triu(np.ones((seq_len, seq_len)) * -1e9, k=1)
return mask
# 在 Attention 中使用:加法,不是乘法
scores = Q @ K.T / np.sqrt(d_k)
scores += mask # ← 关键:用 += 不是 *=
weights = softmax(scores)
WARNING
注意是加法 +=,不是乘法 *=
用 −∞ 加到分数上 → Softmax 后变成 0。如果用乘以 0,会让 Softmax 的输入变成 0 而不是 −∞,结果是均匀分布而不是零权重——完全达不到遮蔽效果。
Causal Mask vs Padding Mask
| 掩码类型 | 作用 | 形状 |
|---|---|---|
| Causal Mask | 防止看到未来位置 | (n×n) 上三角矩阵 |
| Padding Mask | 忽略填充 token | (n×n) 特定列为 −∞ |
GPT 只用 Causal Mask;BERT 只用 Padding Mask(因为 BERT 是双向的,允许看未来);编码器-解码器模型两种都用。