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,模型无法“看见”未来的词,只能关注当前及之前的词。
阅读全文