Decoder 的 Mask 为什么要下三角
一句话速记
自回归语言模型训练时,位置 t 只能依赖已出现的 token(位置 < t),不能「看见」未来 token;在注意力权重矩阵上对「看未来」的位置加 −∞(实现上常写很大的负数),softmax 后权重为 0,形成(因果)下三角可参与区域。
也叫 causal mask、future mask。
问题从哪来
- Self-Attention 若不做限制:位置 i 的 Q 会与所有位置 j 的 K 算相似度,包括 j > i 的「未来」位置。
- 训练 下一词预测(或同一段序列上的条件分布)时,若允许看未来,则 t 时刻的表示会泄露 t+1, t+2, … 的信息,标签与输入信息泄漏,模型学的是「作弊」,泛化崩坏。
因此必须保证:在计算位置 t 的输出时,注意力只能来自位置 ≤ t−1(或按实现约定 ≤ t)的一侧,不能来自右侧未来。
下三角是什么(按行看「谁可以 attend 谁」)
设序列长度 n,注意力分数矩阵 S 大小为 n × n,S[i][j] 表示位置 i 对位置 j 的(未 softmax 前)得分。
- 因果约束:位置 i 不允许 attend 到 j > i。
- 在矩阵上:允许区域为 下三角(含对角或不含对角依实现),上三角(严格未来)被 mask 掉。
常见两种表述(不同资料画图画法略不同,说清「不能看未来」即可):
- 上三角(不含对角)置为 −∞:softmax 后
attn[i,j]=0对 j>i。 - 也有资料称「下三角为有效区域」——与「掩掉上三角」是同一回事,别和矩阵行列约定杠死,讲约束语义。
与 BERT 的对比(高频追问)
| Encoder / BERT 类 | Decoder-only / GPT 类(训练时该层) | |
|---|---|---|
| 同一段序列的 Self-Attention | 无 因果 mask,位置 i 可看全文(双向) | 有 因果 mask,不能看未来 |
| 目标 | 掩码语言建模 MLM 等 | 下一 token / 自回归似然 |
推理时还要吗
- 自回归生成时,序列逐步变长,实现上常用 KV Cache 只算新一步;因果约束仍成立:新位置不能看还没生成的未来。
- 训练时整段前向一次算完 n 个位置,必须用显式 mask 矩阵 一次性表示「未来不可见」。
延伸追问
-
Q:对角线能不能 attend 自己?
答:看任务与实现。GPT 式「预测下一 token」里,位置 t 的 logits 常对应「给定前面 token 时下一个 token 的分布」,表示上位置 t 会用到当前及之前的上下文,实现细节各框架略有差异,**记「因果 + 不偷看未生成未来」**即可。 -
Q:为什么叫 causal(因果)?
答:强调时间方向:原因只能来自过去,不能来自未来。 -
Q:Encoder-Decoder 里 Decoder 自注意力是 causal,Cross-Attention 要吗?
答:Decoder 自注意力侧通常仍有 causal,防止生成目标端偷看尚未生成的目标词;Cross-Attention 的 Q 来自 Decoder、K/V 来自 Encoder 全句,Encoder 已整体给出,不是「生成步的未来」问题,不用 同一套「目标序列因果」mask(有单独的长度与 padding 处理)。详见 Self-Attention 与 Cross-Attention 的区别。
我的记法
TODO
状态
- 已背速记
- 能讲通俗版
- 能答追问
- 在实际场景中用上过
参考资料
- Vaswani et al., 2017(Masked Multi-Head Attention)
- 各框架
attention_mask/is_causal文档