填充掩码(Padding Mask)是一组布尔标记,作用是告诉注意力机制(Attention):序列里哪些位置是补齐出来的空位,算权重时直接跳过。
为什么会有占位符
一批(batch)数据里,句子长短不一。一句"今天下雨"只有 4 个 token,另一句"我昨天下午在楼下咖啡店碰见了多年不见的老同学"有 20 个 token。GPU 喜欢规整的张量,所以短句会被补到 batch 内最长那条的长度,缺的位置填一个特殊占位 token,通常写作 <pad>。
形状是齐了,问题也来了:注意力会对序列里每个位置两两打分,再做 softmax 归一化。如果 <pad> 也参与,等于让一堆毫无语义的空位来投票——有效信息被稀释,句向量被噪声干扰。
打个比方
像一张 10 人会议的签到表,实到 6 人,剩下 4 行摆着空名字牌。统计"平均每人发言多久"时,不能拿 10 当分母。填充掩码就是那张"谁真的来了"的名单。
具体怎么屏蔽
在注意力分数矩阵上,把 <pad> 对应位置的分数加上一个极大负数(工程上常写 -1e9 或 -inf),softmax 之后这些位置的概率被压到 0,梯度也就传不过去了。
和相邻概念的区别
| 概念 | 屏蔽什么 | 动机 | 典型来源 |
|---|---|---|---|
| 填充掩码 | 补齐的 <pad> 位 | 空位不该有话语权 | input_ids != pad_id |
| 因果掩码(AI 词典:Causal Mask">Causal Mask) | 当前位置之后的 token | 生成时不许偷看未来 | 下三角矩阵 |
| 合并使用 | 两者都屏蔽 | 解码器训练常见 | 按位或 / 相加 |
一句话区分:因果掩码管的是"不许看未来",填充掩码管的是"别看不存在的"。两者常同时出现,很多实现里会被合并成一个统一的布尔掩码。
对从业者的实际意义
- 变长批处理是提升训练吞吐的关键手段,而填充掩码是它成立的前提;漏掉它,短句占比高的 batch 会明显掉点。
- 别忘了损失函数:交叉熵通常有
ignore_index参数,用来把<pad>位置排除在 loss 之外。注意力掩码和 loss 掩码是两件事,只做一半是常见 bug。 - 推理阶段若逐条处理,或按真实长度打包序列,可能不需要显式掩码。不同框架、不同注意力内核的接口写法不一致,具体以官方文档为准。
