欢迎光临
我们一直在努力

Java 程序员第 48 阶段7:Transformer 架构总览与自注意力直觉,Causal Mask:Decoder 如何做到看不见未来

1. 自回归生成的核心约束

生成式模型是自回归的:第 t 个词只能基于前 t-1 个已生成的词来预测。如果 Decoder 在算第 t 个位置时「偷看」了第 t+1、t+2 个词,训练和推理就出现了不一致——训练时它见过答案,推理时却没有,模型会学到错误的条件概率。

所以必须有一道「墙」,挡住未来。这道墙就是因果掩码(Causal Mask)。

(见图 figure_07_1)

2. 下三角掩码

实现方式很直接:在注意力分数矩阵 Q·Kᵀ 上,把所有「未来位置」的分值设为 -∞。经过 Softmax 后,exp(-∞)→0,这些位置权重变成 0,相当于「完全看不到」。

结果就是分数矩阵的上三角全被屏蔽,只保留对角线及左下(当前位置看自己和左边)。数学上:score[i][j] = -∞ when j > i。

3. 矩阵视角

把注意力分数铺成一个 n×n 方阵,因果掩码就是把它上三角全涂黑。第 0 行只能看第 0 列,第 i 行只能看第 0…i 列,第 n-1 行能看全部。

这个结构的美妙之处在于:它用一次矩阵运算同时约束了所有位置的可见性,GPU 上极其高效。可视化注意力矩阵时,你会看到一条清晰的「只左下有效」的三角形。

(见图 figure_07_2)

4. 训练与推理一致性

训练时,模型一次性拿到整句话,用下三角掩码并行算所有位置(每个位置只看左边,所以并行安全);推理时,模型逐 token 生成,每步只喂入已生成部分,逻辑完全一致。

关键点:训练和推理用的是同一套因果约束,所以训练学到的「基于前文预测后文」的能力,能无缝迁移到推理时的逐词生成。这是自回归模型能 work 的根本保证。

(见图 figure_07_4)

5. 为什么 Mask 不能省

如果去掉 Mask,Decoder 在训练时就直接看到了未来答案(标签泄漏),损失函数会「作弊」地降到很低,但你一推理就原形毕露——生成出来的文本语无伦次或复读。

很多初学者复现 GPT 时生成效果崩,第一反应查学习率,其实大半是因果掩码方向写反了(把下三角写成上三角),模型在「看未来」。Mask 是底线,不是优化项。

(见图 figure_07_3)

6. Java 侧观察

你调 LLM API 续写时,因果性由模型内部保证,你不用管。但有一个工程提醒:不要在 prompt 里把答案也放进去。比如做填空题,你若把「标准答案」写进上下文,等于人为破坏了 Mask 该有的因果约束,模型会直接抄你给的答案,输出失去泛化意义。

一句话:因果掩码保证「模型只能基于已知预测未知」,任何破坏这个前提的写法都会让输出退化。

/** 下三角掩码示意 */
public class CausalMask {
double[][] mask(double[][] scores) {
int n = scores.length;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
scores[i][j] = Double.NEGATIVE_INFINITY;
return scores;
}
}

位置可见范围被 Mask 位置Softmax 后权重
pos 0 仅 pos 0 pos 1…n 未来为 0
pos i pos 0…i pos i+1…n 未来为 0
pos n 全部 正常
赞(0)
未经允许不得转载:171主机测评 » Java 程序员第 48 阶段7:Transformer 架构总览与自注意力直觉,Causal Mask:Decoder 如何做到看不见未来
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址