一、Padding 的 mask 操作是什么?
1. 为什么需要 Padding?
想象你在学校交作业,老师要求每个人都交 5 页纸。
- 有的同学写了 3 页,剩下 2 页是空白的(Padding)。
- 有的同学写了 5 页,刚好交满。
在深度学习里:
- 每个句子(或序列)长度可能不一样。
- 为了让模型一次处理多个句子,我们会把它们补齐到相同长度。
- 补齐的部分就叫 Padding (用一个特殊的符号表示,比如
<PAD>)。
2. 为什么需要 mask?
回到交作业的例子:
- 老师批改作业时,会跳过空白页,只看你写了内容的部分。
- 如果老师把空白页也算进去,可能会给你打零分,因为空白页没有信息。
在模型里:
- Padding 部分是没有意义的,只是为了对齐长度。
- 如果模型把 Padding 也当成正常信息计算,会影响结果。
- mask 操作就是告诉模型:"这些位置是 Padding,你计算时忽略它们!"
3. mask 操作的"魔法"
mask 操作就像给老师一个**"忽略清单"**:
- 清单上打 1 的位置 → 有效内容(需要处理)。
- 清单上打 0 的位置 → Padding(忽略)。
模型在计算时,会根据这个清单:
- 只对 1 的位置进行计算。
- 对 0 的位置直接跳过或设为无效值。
二、稍微深入一点:mask 在代码里是怎么实现的?
我们用一个简单的例子来说明。
1. 原始数据
假设我们有 3 个句子,长度分别是 3、4、2:
句子1:我 爱 你 → 长度 3
句子2:我 喜 欢 吃 苹果 → 长度 4
句子3:你 好 → 长度 2
2. Padding 补齐
我们把它们补齐到最长长度(这里是 4):
句子1:我 爱 你 <PAD> → [1, 1, 1, 0]
句子2:我 喜 欢 吃 苹果 → [1, 1, 1, 1]
句子3:你 好 <PAD> <PAD> → [1, 1, 0, 0]
这里的 [1, 1, 1, 0] 就是一个 mask 矩阵:
1表示有效 token。0表示 Padding。
3. mask 在注意力计算中的作用
在 Transformer 的注意力机制里:
- 每个 token 会和其他所有 token 计算相似度(注意力分数)。
- 如果某个 token 是 Padding(mask=0),我们会把它的注意力分数设为 -∞(负无穷)。
- 在 softmax 计算时,
-∞会变成 0,相当于这个位置的权重被完全忽略。
例子 :
假设注意力分数是:
[ 2, 3, 1, -∞]
经过 softmax 后:
[0.245, 0.731, 0.024, 0]
Padding 部分的权重变成了 0,模型就不会关注它了。
三、常见的 mask 类型
1. Padding Mask
-
作用:忽略 Padding 部分。
-
形状:
[batch_size, seq_len] -
例子:
[1, 1, 1, 0]
[1, 1, 1, 1]
[1, 1, 0, 0]
2. Sequence Mask(未来信息屏蔽)
-
作用:在语言模型中,防止模型看到未来的 token(比如翻译时,不能提前知道后面的词)。
-
形状:
[seq_len, seq_len] -
例子(上三角为 0):
[1, 0, 0, 0]
[1, 1, 0, 0]
[1, 1, 1, 0]
[1, 1, 1, 1]
四、总结
小白一句话总结:
Padding mask 就是给模型一个"忽略清单",告诉它哪些位置是补齐的无效内容,计算时不要理它们!
技术一句话总结:
Padding mask 是一个 0/1 矩阵,0 表示 Padding 位置,在注意力计算时会被设为 -∞,从而被 softmax 置零,实现忽略效果。