一句话定义:左填充(Left Padding)和右填充(Right Padding),指的是同一批数据长短不一时,为了凑成整齐的矩阵,把补齐用的填充 token(padding token)放在序列的开头还是末尾。
为什么非补不可
模型一次处理一批(batch),底层是按矩阵算的,每一行长度必须一致。可现实里的句子有长有短,短的就得补。补上的符号本身没有意义,所以要额外给一个注意力掩码(attention mask),告诉模型"这些位置是凑数的,别当真"。
打个比方:拍集体照,人不够就摆空椅子。空椅子是 padding token;椅子上贴张"此位无人"的纸条,就是 attention mask。
两种摆法差在哪
AI 词典:自回归生成">自回归生成(decoder-only 模型)的做法是:读入整段,取"最后一个真实 token"那个位置的输出(logits),据此采样下一个词。不少实现图省事,直接取最后一位 [-1]。
- 左填充
[pad, pad, 我, 爱, 吃],最后一位是"吃",取对了。 - 右填充
[我, 爱, 吃, pad, pad],最后一位是 pad,取到的是空椅子的分数,整条输出就废了。
更麻烦的是它不报错,只是静默出错:程序跑得通,结果却胡言乱语。而且一批里每条序列长度不同,右填充时"最后真实位置"的索引条条不一样,批量取 [-1] 等于每条都取错,错法还各不相同——这就是"把最后一个真实 token 的预测位置整体搞乱"。
还有一层隐性影响:位置编码(positional encoding)。右填充时真实 token 从位置 0 开始,干净;左填充时前面垫了 pad,真实 token 的位置编号整体后移。主流框架会在你正确传入 attention mask 时自动算对位置编号,但手写推理流程、忘了传 mask,模型看到的"位置"就是错的,效果悄悄变差。
容易混淆的几个概念
| 概念 | 管什么 |
|---|---|
| Padding(填充) | 长度不够时补 |
| Truncation(截断) | 长度超了时砍 |
| Attention mask | 标记补的部分不参与计算 |
| Padding side | 补在哪一端 |
实际怎么选
- 自回归生成(对话、写作、代码补全,含带 KV cache 的批量推理):用左填充。
- 编码类任务(文本分类、情感分析、句向量):右填充更常见,因为常取首位或做池化。
- 训练 decoder-only 模型:两种都能用,前提是 attention mask 和位置编号都给对了。
给从业者的一句话:凡是"从末尾接着往下写"的场景,pad 一律放左边。上线批量推理前,先塞一条明显的短样本进去,确认输出是从第一个真实 token 接着走的,而不是从一串空椅子开始的。至于各个框架的默认值,以官方文档为准,别凭记忆。
