Causal Mask(因果掩码)

自回归模型中用于防止 token "看到未来"的掩码矩阵。在 Softmax 前将注意力分数矩阵的上三角设为 -∞,确保每个位置只能关注自身及之前的 token。

Causal Mask(因果掩码)

一句话理解

Causal Mask 是一块"挡板"——遮住注意力矩阵的上三角,让每个 token 只能看到自己和前面的内容,看不到未来。

为什么需要 Causal Mask

GPT 是自回归模型:生成第 5 个 token 时,只能基于前 4 个 token 预测。但 Self-Attention 默认会让每个位置关注所有位置——包括还没生成的"未来"位置。这在训练时会造成信息泄露:模型直接看到了答案,学不到真正的预测能力。

Causal Mask 解决这个问题:在计算注意力分数后、Softmax 之前,把上三角区域设为 -\infty,经过 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,上三角为 -\infty

代码实现

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

注意是加法 +=,不是乘法 *=-\infty 加到分数上 → Softmax 后变成 0。如果用乘以 0,会让 Softmax 的输入变成 0 而不是 -\infty,结果是均匀分布而不是零权重——完全达不到遮蔽效果。

Causal Mask vs Padding Mask

掩码类型作用形状
Causal Mask防止看到未来位置(n×n)(n \times n)(n×n) 上三角矩阵
Padding Mask忽略填充 token(n×n)(n \times n)(n×n) 特定列为 -\infty

GPT 只用 Causal Mask;BERT 只用 Padding Mask(因为 BERT 是双向的,允许看未来);编码器-解码器模型两种都用。