ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

大模型 Padding:为什么训练时右填充、批量推理时必须左填充

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