Transformer Mask
Mask 防止读取 padding 或未来标签,是序列模型正确性的边界条件。
学习目标
- 三位置因果注意力的均匀权重
- 因果 mask 能替代语言模型目标右移吗?
- 说明:mask 的布尔方向由 API 决定;屏蔽 key 不自动排除 query 的损失和池化贡献。
为什么需要这个概念
因果 mask 限制 query 只读取当前及过去 key;padding mask 排除无效 key。mask 在 softmax 前修改分数,训练生成模型还需要输入与目标的正确移位。
学习前需要掌握
背景与问题
语言生成训练时整段文本已在内存中,若不屏蔽未来,模型可以偷看答案。padding 又会让无意义位置参与归一化,因此需要两种不同的可见性约束。
概念定义
因果 mask 限制 query 只读取当前及过去 key;padding mask 排除无效 key。mask 在 softmax 前修改分数,训练生成模型还需要输入与目标的正确移位。
直观理解
因果 mask 是不许翻后页,padding mask 是空白页不算内容;这两条规则解决不同问题。
核心原理
加性 mask 对允许位置加 0,对禁止位置加负无穷,使其 softmax 权重为零。布尔 mask 则依 API 解释。nn.MultiheadAttention 的 True 常表示禁止,而函数式 scaled_dot_product_attention 的布尔 True 表示允许,不能直接复用同一方向。
key_padding_mask 常为 ,因果 attn_mask 常为 或约定的批头形状。屏蔽 key 并不保证 padding query 的输出为零;后续池化、损失和指标仍需有效位置处理。
若一整行所有 key 都被屏蔽,softmax 可能产生非有限值,行为还取决于具体实现。应避免全空样本或定义明确策略。目标右移也不能由 mask 替代,否则训练标签仍可能与输入错位。
数学表达
核心公式
因果 mask 限制 query 只读取当前及过去 key;padding mask 排除无效 key。mask 在 softmax 前修改分数,训练生成模型还需要输入与目标的正确移位。
变量含义
Nbatch sizeD/H特征或隐藏维度
计算步骤
- 1第一行只见一个位置,权重为 (1,0,0)。
- 2第二行见两个位置,权重为 (0.5,0.5,0)。
- 3第三行见全部,权重均为 1/3。
代码对应位置
示例 1三位置因果注意力的均匀权重的最小验证:使用完整构造输入核对三位置因果注意力的均匀权重,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
N | batch size |
D/H | 特征或隐藏维度 |
完整数值示例
三位置因果注意力的均匀权重
已知条件
- 所有未屏蔽分数为 0,序列长度为 3
- 第 i 行只允许 key 位置不大于 i
计算步骤
- 第一行只见一个位置,权重为 (1,0,0)。
- 第二行见两个位置,权重为 (0.5,0.5,0)。
- 第三行见全部,权重均为 1/3。
计算结果
未来位置权重为 0,每行在允许位置上归一化。
处理前后对比
- mask 的布尔方向由 API 决定;屏蔽 key 不自动排除 query 的损失和池化贡献。
三位置因果注意力的均匀权重
这个例子直接在分数矩阵上演示屏蔽顺序。如果先 softmax 再把未来权重置零,第二行剩余权重会只有 2/3 而非 1,已经不是同一注意力分布。
代码的 blocked=True 明确表示禁止,因为它被用于 masked_fill;传给其他 API 前仍要按文档转换,不能从变量 dtype 推断方向。
计算与实现步骤
- 第一行只见一个位置,权重为 (1,0,0)。
- 第二行见两个位置,权重为 (0.5,0.5,0)。
- 第三行见全部,权重均为 1/3。
代码实现
示例 1
三位置因果注意力的均匀权重的最小验证
example_01.py用途:使用完整构造输入核对三位置因果注意力的均匀权重,输出只表示本例计算。
import torch
scores = torch.zeros(3, 3)
blocked = torch.triu(torch.ones(3, 3, dtype=torch.bool), diagonal=1)
weights = scores.masked_fill(blocked, float("-inf")).softmax(-1)
for row in weights.tolist():
print([round(v, 6) for v in row])代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对三位置因果注意力的均匀权重,输出只表示本例计算。
scores- 交叉验证各折的评价分数。
Step 1 · 1–6 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
scores = torch.zeros(3, 3)
blocked = torch.triu(torch.ones(3, 3, dtype=torch.bool), diagonal=1)
weights = scores.masked_fill(blocked, float("-inf")).softmax(-1)
for row in weights.tolist():
print([round(v, 6) for v in row])预期输出或运行结果
[1.0, 0.0, 0.0] [0.5, 0.5, 0.0] [0.333333, 0.333333, 0.333333]
常见错误 · 4 条
- valid/padding 方向反
- mask 轴错
- 所有 Key 被屏蔽
- 生成忘 causal
实际应用
- 自回归语言模型训练
- 合并 padding 与注意力可见性约束
常见错误
- valid/padding 方向反
- mask 轴错
- 所有 Key 被屏蔽
- 生成忘 causal
常见问题
因果 mask 能替代语言模型目标右移吗?
不能。mask 控制读取范围,移位定义某位置预测哪个下一 token;两者都正确才能避免偷看或目标错位。
这个示例能说明什么边界?
mask 的布尔方向由 API 决定;屏蔽 key 不自动排除 query 的损失和池化贡献。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。