Transformer中掩码张量的核心作用如何实现?
摘要:掩码(Mask)是 Transformer 能正确工作的核心机制之一。它用来控制哪些位置可以被注意力看到。Transformer 中有两种典型掩码:填充掩码(Padding Mask)和未来信息掩码(Subsequent Mask)。Tra
掩码(Mask)是 Transformer 能正确工作的核心机制之一。它用来控制哪些位置可以被注意力看到。Transformer 中有两种典型掩码:填充掩码(Padding Mask)和未来信息掩码(Subsequent Mask)。Transformer 中使用填充掩码和未来信息掩码的位置(注意力层)如下表所示。
注意力层
填充掩码
未来信息掩码
核心原因
编码器自注意力
✅ 必须用
❌ 不用
源序列有 padding,无未来信息
解码器自注意力
✅ 必须用
✅ 必须用(专属)
目标序列有 padding + 防偷看未来
编码器解码器交叉注意力
✅ 必须用
❌ 不用
关注编码器输出(源序列 padding)
1 掩码张量的本质
掩码张量是一个布尔型张量(最终会转为 0/1 矩阵):
标记为True:当前位置可见,自注意力可以正常关注
标记为False:当前位置屏蔽,自注意力会完全忽略该位置
2 两种掩码的作用
2.1 填充掩码(Padding Mask):处理输入的不定长序列
在自然能语言处理中,句子长度参差不齐,batch 训练时需要用0填充短序列(比如把 ["我","爱","AI"] 和 ["学习"] 补成等长:["我","爱","AI"]、["学习","0","0"]),但这些填充的0是无意义噪声,自注意力如果关注这些位置,会学到无效信息。
填充掩码能识别序列中的填充位置,将其标记为False,让自注意力完全忽略 padding 噪声。
2.2 未来信息掩码(Subsequent Mask):防止解码器“偷看未来”
未来信息掩码的引入是为了解决一个问题——并行训练与自回归推理的矛盾。在 Transformer 的解码器中,生成过程是自回归的。也就是说,生成第 \(t\) 个词时,只能依赖于第 \(1\) 到 \(t-1\) 个词,绝对不能看到第 \(t+1\) 个词。
推理阶段:这很好办。模型生成第一个词,再根据第一个词生成第二个,依次类推。天然满足“看不见未来”。
训练阶段:为了加速,Transformer 使用了Teacher Forcing,将整个目标序列一次性输入模型,利用并行计算加速。
这就带来一个问题:如果不加限制,当模型计算第 \(t\) 个位置的注意力时,它可以通过注意力机制直接“看到”第 \(t+1, t+2...\) 个词的信息。 这就是所谓的“信息泄露”。如果模型能提前看到答案,它就会“偷懒”,直接复制答案,导致模型无法真正学习预测能力。
未来信息掩码强制模型生成第 \(t\) 个词时,只能关注第 \(1\) 到 \(t-1\) 个历史位置,彻底屏蔽 \(t\) 之后的所有未来位置。
在计算 Self-Attention 的缩放点积注意力时,公式如下:
\[\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}} + M\right) V
\]
这里的 \(M\) 就是掩码张量,形状和\(QK^T\) 计算出的相关性得分矩阵相同。
计算得分:\(QK^T\) 计算出的相关性得分矩阵。
应用掩码:代码中 False (对应矩阵中的 0) 的位置,通常会被加上一个巨大的负数(如 \(-1e9\))。
Softmax归一化:在 Softmax 阶段,\(e^{-\infty} \approx 0\)。这就意味着被掩码掉的位置,其权重变为 0。
结果:在计算第 \(t\) 行的注意力时,第 \(t\) 列之后的所有列权重都为 0,模型无法“看见”未来的词,只能关注当前及之前的词。
