不同长度句子如何一起送入 Transformer:从序列对齐到 Padding Mask
围绕输入序列长度、词嵌入和掩码的内容,解释不同长度句子如何组成批次,以及填充位置为什么必须被忽略。
相关工具
句子长度不同,为什么还要放在一起计算
自然语言句子的长度并不整齐。一条句子可能只有几个词元,另一条句子却有几十个词元,但 Transformer 的矩阵计算通常希望同一批次中的样本具有统一形状。把长度不同的句子分开计算会浪费并行能力,因此常见做法是把它们组织成一个批次。
文中把序列长度看成一个可以设置的超参数,基本上对应训练数据中允许处理的最长句子。批次中的短句需要补齐到统一长度,长句则要按照任务允许的上限处理。关键在于,补齐是为了计算方便,不是为了改变句子的语义。

短句补齐到统一长度后,多个样本可以组成规则张量并行计算。
Padding Token 是什么
补齐位置通常放入一个专门的 Padding Token。它和普通词元一样可以占据一个张量位置,但不代表句子中的真实内容。经过词嵌入后,它也可能对应一个向量,不过这个位置后续必须被标记出来,不能让注意力把它当成有意义的词。
Padding Token 只负责让不同样本的长度一致。它不等于结束标记,也不等于未知词。结束标记表示句子已经生成完毕,未知词表示某个内容无法直接对应词表,而 Padding 只表示当前样本在这个批次位置上没有真实词元。
对齐之后,张量多出了哪些位置
假设一个批次里有三条句子,真实长度分别是 4、6、8,批次长度取 8,那么第一条句子后面会有 4 个填充位置,第二条句子后面会有 2 个填充位置,第三条句子不需要补齐。最终它们可以组成统一的长度 8 的输入矩阵。
这种对齐让词嵌入、位置编码和注意力都能使用相同的矩阵形状,但也带来了一个问题:模型如果不加区分,就会认为每条句子都有 8 个真实词元。Padding Mask 就是在形状统一后,把真实长度信息重新带回注意力计算。

每条句子的有效区域不同,Padding Mask 记录哪些位置是真实词元。
Padding Mask 在注意力中做什么
注意力会为每个 Query 计算它与各个 Key 的相关性。如果不屏蔽填充位置,短句末尾的空位也可能获得一定分数,Softmax 后占用部分权重。这样,模型就会把注意力分给没有语义的内容,影响真实词元的表示。
Padding Mask 会在注意力归一化之前把这些空位的分数压低,使它们的权重接近于零。剩下的真实位置重新分配有效权重,模型仍然可以在统一形状的矩阵中只读取有效内容。这个过程不会删除填充列,只是让它们不再参与语义计算。
词嵌入和位置编码如何处理补齐位置
短句补齐后,Padding Token 也会经过词嵌入查表,形成一个与其他位置同宽的向量。位置编码通常也会按照张量位置加入,但这不意味着填充位置获得了真实语义。后续的 Padding Mask 仍然负责阻止它影响注意力。
换句话说,词嵌入解决的是把每个张量位置变成向量,位置编码解决的是告诉模型这个位置在序列中的顺序,Padding Mask 则说明这个位置是否真的属于当前句子。三者处理的是不同问题,不能用其中一个替代另一个。

Padding Token 可以完成嵌入和形状对齐,随后由 Padding Mask 排除其注意力影响。
编码器、解码器和损失计算都要记住有效长度
编码器自注意力需要忽略源序列中的 Padding 位置。解码器自注意力除了处理目标端的未来遮挡,也要忽略目标批次里的补齐位置。交叉注意力读取源序列记忆时,同样要屏蔽源端填充位置,避免目标端查询到空位。
损失计算也需要有效长度信息。目标序列补齐的位置没有真实答案,不应该参与交叉熵平均,否则模型会被迫学习预测一组不存在的标签。注意力掩码和损失掩码可能形状不同,但目的相同:只让真实内容影响结果。
批次长度怎么选择更合适
如果每个批次都按照全数据中的最长句子补齐,短句会带来大量无效位置,计算和显存利用率都会变差。常见做法是把长度相近的样本放在一起,让每个批次的补齐量更少。
长度上限也需要结合任务确定。过短会截断重要内容,过长则增加注意力计算成本。文中把最长句子长度视为可设置的超参数,实际使用时还要考虑训练数据分布、显存和模型希望处理的上下文范围。
把序列对齐放回 Transformer 主线
完整流程可以这样看:不同长度的词元序列先在批次中补齐,全部位置经过词嵌入并加入位置编码,再由 Padding Mask 告诉注意力哪些位置有效;编码器和解码器在统一形状下完成矩阵计算,损失计算则继续排除补齐标签。
Padding 不是一句话的内容,也不是模型要学习的语言规律,而是批量计算的外壳。只要把有效长度、填充标记和掩码配合起来,Transformer 就能在规则张量上处理长度不同的真实序列。
常见问题
Padding Token 会被模型当成一个普通词吗?
如果没有 Padding Mask,它确实可能参与注意力并获得权重。正确做法是保留它用于形状对齐,同时在注意力和损失计算中屏蔽它。
Padding 和结束标记有什么区别?
Padding 只为批次对齐服务,表示当前位置没有真实内容;结束标记表示序列已经完成,是生成过程中的真实控制信号。
为什么不把每条句子单独计算?
单独计算可以避免填充,但会失去批量矩阵计算的效率。通过长度相近的批次和 Padding Mask,可以在统一形状与计算效率之间取得平衡。