编程与 AI14 分钟阅读更新于 2026-08-03

不同长度句子如何一起送入 Transformer:从序列对齐到 Padding Mask

围绕输入序列长度、词嵌入和掩码的内容,解释不同长度句子如何组成批次,以及填充位置为什么必须被忽略。

相关工具

句子长度不同,为什么还要放在一起计算

自然语言句子的长度并不整齐。一条句子可能只有几个词元,另一条句子却有几十个词元,但 Transformer 的矩阵计算通常希望同一批次中的样本具有统一形状。把长度不同的句子分开计算会浪费并行能力,因此常见做法是把它们组织成一个批次。

文中把序列长度看成一个可以设置的超参数,基本上对应训练数据中允许处理的最长句子。批次中的短句需要补齐到统一长度,长句则要按照任务允许的上限处理。关键在于,补齐是为了计算方便,不是为了改变句子的语义。

Transformer 将不同长度句子补齐后组成批次的示意图
不同长度序列组成一个批次

短句补齐到统一长度后,多个样本可以组成规则张量并行计算。

Padding Token 是什么

补齐位置通常放入一个专门的 Padding Token。它和普通词元一样可以占据一个张量位置,但不代表句子中的真实内容。经过词嵌入后,它也可能对应一个向量,不过这个位置后续必须被标记出来,不能让注意力把它当成有意义的词。

Padding Token 只负责让不同样本的长度一致。它不等于结束标记,也不等于未知词。结束标记表示句子已经生成完毕,未知词表示某个内容无法直接对应词表,而 Padding 只表示当前样本在这个批次位置上没有真实词元。

对齐之后,张量多出了哪些位置

假设一个批次里有三条句子,真实长度分别是 4、6、8,批次长度取 8,那么第一条句子后面会有 4 个填充位置,第二条句子后面会有 2 个填充位置,第三条句子不需要补齐。最终它们可以组成统一的长度 8 的输入矩阵。

这种对齐让词嵌入、位置编码和注意力都能使用相同的矩阵形状,但也带来了一个问题:模型如果不加区分,就会认为每条句子都有 8 个真实词元。Padding Mask 就是在形状统一后,把真实长度信息重新带回注意力计算。

Transformer 批次中真实词元和 Padding 位置的对比图
真实长度与补齐长度

每条句子的有效区域不同,Padding Mask 记录哪些位置是真实词元。

Padding Mask 在注意力中做什么

注意力会为每个 Query 计算它与各个 Key 的相关性。如果不屏蔽填充位置,短句末尾的空位也可能获得一定分数,Softmax 后占用部分权重。这样,模型就会把注意力分给没有语义的内容,影响真实词元的表示。

Padding Mask 会在注意力归一化之前把这些空位的分数压低,使它们的权重接近于零。剩下的真实位置重新分配有效权重,模型仍然可以在统一形状的矩阵中只读取有效内容。这个过程不会删除填充列,只是让它们不再参与语义计算。

词嵌入和位置编码如何处理补齐位置

短句补齐后,Padding Token 也会经过词嵌入查表,形成一个与其他位置同宽的向量。位置编码通常也会按照张量位置加入,但这不意味着填充位置获得了真实语义。后续的 Padding Mask 仍然负责阻止它影响注意力。

换句话说,词嵌入解决的是把每个张量位置变成向量,位置编码解决的是告诉模型这个位置在序列中的顺序,Padding Mask 则说明这个位置是否真的属于当前句子。三者处理的是不同问题,不能用其中一个替代另一个。

Transformer Padding Token 经过词嵌入但仍需掩码忽略的示意图
补齐位置也能形成向量,但不代表有语义

Padding Token 可以完成嵌入和形状对齐,随后由 Padding Mask 排除其注意力影响。

编码器、解码器和损失计算都要记住有效长度

编码器自注意力需要忽略源序列中的 Padding 位置。解码器自注意力除了处理目标端的未来遮挡,也要忽略目标批次里的补齐位置。交叉注意力读取源序列记忆时,同样要屏蔽源端填充位置,避免目标端查询到空位。

损失计算也需要有效长度信息。目标序列补齐的位置没有真实答案,不应该参与交叉熵平均,否则模型会被迫学习预测一组不存在的标签。注意力掩码和损失掩码可能形状不同,但目的相同:只让真实内容影响结果。

批次长度怎么选择更合适

如果每个批次都按照全数据中的最长句子补齐,短句会带来大量无效位置,计算和显存利用率都会变差。常见做法是把长度相近的样本放在一起,让每个批次的补齐量更少。

长度上限也需要结合任务确定。过短会截断重要内容,过长则增加注意力计算成本。文中把最长句子长度视为可设置的超参数,实际使用时还要考虑训练数据分布、显存和模型希望处理的上下文范围。

把序列对齐放回 Transformer 主线

完整流程可以这样看:不同长度的词元序列先在批次中补齐,全部位置经过词嵌入并加入位置编码,再由 Padding Mask 告诉注意力哪些位置有效;编码器和解码器在统一形状下完成矩阵计算,损失计算则继续排除补齐标签。

Padding 不是一句话的内容,也不是模型要学习的语言规律,而是批量计算的外壳。只要把有效长度、填充标记和掩码配合起来,Transformer 就能在规则张量上处理长度不同的真实序列。

常见问题

Padding Token 会被模型当成一个普通词吗?

如果没有 Padding Mask,它确实可能参与注意力并获得权重。正确做法是保留它用于形状对齐,同时在注意力和损失计算中屏蔽它。

Padding 和结束标记有什么区别?

Padding 只为批次对齐服务,表示当前位置没有真实内容;结束标记表示序列已经完成,是生成过程中的真实控制信号。

为什么不把每条句子单独计算?

单独计算可以避免填充,但会失去批量矩阵计算的效率。通过长度相近的批次和 Padding Mask,可以在统一形状与计算效率之间取得平衡。