做大模型训练和批量推理时,都避免不了与padding打交道,可是有一种这样的现象:为什么同样是补占位符,训练用右填充,批量推理却必须换成左填充?有时候训练loss看着正常,但是批量推理就乱生成、答非所问?
核心原因不是padding本身有错,多数时候都是padding放错了边:训练默认右填充没问题,但自回归模型批量推理时,右填充会直接破坏token之间的位置关系。这篇文章把padding的前因后果讲清楚,搞懂"为什么训练右填充、推理左填充"。
一、基础背景:Padding在解决什么问题?
对于大模型的输入是一串token,在一个batch里,每条样本的长短大概率都是不同的,有的一句话就结束,有的是一整段长文。但GPU张量要求同批次的所有输入维度完全一致,不能长短混放。
Padding的作用,就是给短序列补上特殊的[PAD]占位token,把所有样本对齐到batch内最大长度,才能打包成一个张量并行计算。
那既然attention_mask已经能把[PAD]屏蔽掉,让模型根本"看不到"这些占位符,那[PAD]放左边还是放右边,不都一样吗?
先说结论:
- 训练阶段:左右填充在理论上都正确,有
attention_mask做屏蔽,业界默认约定用右填充。 - 自回归模型的批量推理:左填充是硬性要求,不是可选项。这一条如果你没搞懂,后面会花不少时间在莫名的生成质量问题上。
二、训练阶段:统一用右填充
右填充 = 真实文本放在序列左侧,[PAD]全部补在句子末尾。在训练阶段,其实左右填充都能够正常完成训练,因为训练时模型是一次性拿到query+response的,它是并行的预测所有位置。
所有真实token之间,相邻token的相对距离永远=1。[PAD]无论在在句子开头还是末尾,它都在在真实文本的前面或者后面,不会插入在真实token中间。但是业界还是统一规定了训练阶段采用右填充,主要有以下原因:
1. 贴合预训练数据的原生形态
预训练语料本身就是一段连续的文字——内容在前,写到哪就在哪里停止,末尾自然结束或截断。模型在海量文本上学到的就是这种"内容在前、空白在后"的分布。
右填充正好复刻了这个形态。反过来,如果训练时强行左填充,等于给模型一种它在训练集里几乎从未见过的数据格式,会引入不必要的分布偏移。
2. 对齐绝对位置编码
GPT-2这类模型使用可学习的绝对位置编码:每个token的位置id从0开始顺序计数,位置0就是序列的第一个真实token。
右填充时,真实文本恰好从position 0开始,位置编码和原始文本一一对应position_ids完全不用修正。
而左填充会把一串PAD顶在前面,真实文本的首词被挤到position = N(N是[PAD]个数),位置编码和预训练时的分布对不上,模型就很难学到稳定的位置表征。
3. 按框架和kernel的默认约定
HuggingFace、FlashAttention等主流库和底层算子,在设计时默认输入就是右填充格式。数据加载、mask生成、位置计算这些逻辑都是按这个约定写的,用右填充可以省掉大量改配置和排查问题的成本。
三、批量推理:为什么必须是左填充
LLaMA、Qwen这些Decoder-only模型,大多用的是RoPE这类的相对位置编码。
相对位置编码建模的是token与token之间的距离,而不是某个token在整个张量里的绝对下标。它的特性是:同一个batch里所有序列整体平移,token间的相对距离不变。
拿同一个batch的两条句子来直观对比:
右填充
今天 天气 很好 <EOS> PAD PAD有效序列末尾的<EOS>后面跟着2个PAD。
模型学到过的规律是"下一个token紧贴在上一个token后面"——即<EOS>到下一个token的相对距离 = 1,也就是说预测产生的下一个token应该是<EOS>的位置+1。
但在右填充的张量里,<EOS>离序列末尾的距离被后面大量PAD拉长了(距离 = 1+PAD个数)。模型在做自回归生成时,感知到的相对距离不再是1,相对位置关系错位。结果就是:批量推理时输出乱码、逻辑断裂、答非所问。
左填充
PAD PAD 今天 天气 很好 <EOS>PAD全部堆在序列最左边,此时<EOS>到下一个需要预测token的相对距离 = 1,和训练时学到的规律完全一致。而RoPE这些相对位置编码的特性对“整段文本整体右移”不敏感,token之间的相对距离保持不变,所以左填充是安全的。
**额外收益:左填充更容易做 KV 缓存优化。**左填充场景下,有效token是序列右侧连续片段,prefill时可以根据attention_mask直接丢弃左侧PAD对应的K/V,不写入KV Cache,省下显存与无效存储。
四、总结
- Padding 的本质:为了满足GPU批量张量计算,把不同长度的序列对齐到同一长度;
attention_mask用来屏蔽PAD参与注意力计算。 - 训练阶段:默认右填充。贴合文本原生分布、适配绝对位置编码,是行业约定而非硬性限制。
- Decoder-only批量推理:强制左填充。保护token间的相对位置关系,避免RoPE位置编码错位,保证生成质量。