PAD_TOKEN 完整详解

一、定义

PAD = Padding,填充标记,pad_token 是一个无实际语义、只用于补齐长度的特殊 Token。 对应有唯一的 pad_token_id,文本符号一般是 [PAD]

它和你前面学的 EOS 核心区别:

  • EOS:语义边界,代表句子 / 回答结束,参与 loss 计算、控制生成停止;
  • PAD:纯占位填充,无任何语义,训练时屏蔽 loss,推理不会生成。

二、为什么需要 PAD_TOKEN?

Transformer 模型训练必须输入等长张量,一批样本长短参差不齐,短句子后面要补一堆 PAD,让整批次所有序列长度统一,才能拼成二维矩阵并行计算。

示例: 样本 1 token 长度:[你, 好, </s>] 长度 = 3 样本 2 token 长度:[今, 天, 天, 气, 很, 好, </s>] 长度 = 7 取批次最大长度 7,短样本末尾补 PAD: 样本 1:[你, 好, </s>, [PAD], [PAD], [PAD], [PAD]]

三、PAD_TOKEN 使用场景

1. 训练阶段(最核心)

(1)SFT、预训练、DPO、RLHF 全部批量训练都要

1)输入 input_ids 末尾填充 PAD 对齐长度; 2)attention_mask 同步标记:真实 token=1,PAD=0 模型通过 mask 忽略 PAD 位置,不会对填充内容做注意力计算,避免无效计算、语义污染。

对于很多 Causal LM,通常将 pad_token 设置为 eos_token。

示例成对数据:

plaintext

input_ids: [123,456,2(eos),0(pad),0,0]
attention_mask: [1,1,1,0,0,0]
(2)loss 标签 labels 屏蔽 PAD

和 user 文本一样,PAD 位置全部设为 -100不参与交叉熵损失计算。 不会让模型学习预测 PAD,PAD 只是占位,不是合法输出。

2. 推理 / 批量生成场景

一次性批量多条提问,长短不一,同样用 PAD 补齐输入长度,搭配 attention_mask。

注意:模型永远不会主动生成 PAD,只会生成 EOS 停止输出。

3. 编码、向量化批量处理

批量文本向量化(检索、Embedding),多条文本长度不同,末尾补 PAD 统一维度。

四、关键规则 & 易错点

1. PAD 加在哪里?

只加在序列末尾,不会插在句子中间、不会替换原有 token。 正确:token1 token2 EOS PAD PAD 错误:token1 PAD token2 EOS

2. PAD 和 EOS 共存逻辑

一条完整样本结构固定: 真实文本 token → EOS(句子终止)→ 若干 PAD(补齐长度) 顺序不能颠倒。

3. 很多基座模型默认没有 pad_token(大坑)

LLaMA、Qwen 原始权重没定义 pad_token,代码会报错,两种标准解决办法:

  1. 复用 EOS 作为 pad token:

python

运行

tokenizer.pad_token = tokenizer.eos_token
tokenizer.pad_token_id = tokenizer.eos_token_id
  1. 新增一个特殊 token 作为 PAD(效果更好,但要微调适配)

4. 和 EOS 核心区分对比

表格

Token 作用 训练是否算 loss 模型是否会生成 放置位置
EOS_TOKEN 标记文本结束 ✅ 参与 loss ✅ 生成到 EOS 停止 真实文本最后
PAD_TOKEN 补齐批次等长占位 ❌ mask=-100 ❌ 永远不会输出 EOS 之后末尾

五、举一个 SFT 完整实例直观理解

原始问答 token: [<im_start>user, 1+1等于几, <im_end>, <im_start>assistant, 等于2, </s>] 长度 = 6

同批次另一条样本最大长度 10,末尾补 4 个 PAD: input_ids:[...等于2, </s>, PAD, PAD, PAD, PAD] attention_mask:[1,1,1,1,1,1,0,0,0,0] labels:[-100,-100,...等于2, </s>, -100,-100,-100,-100]

  • user / 系统 token:-100 不计算 loss
  • assistant 回答 + EOS:正常计算 loss
  • PAD 填充位:-100 完全忽略

六、总结

  1. PAD_TOKEN 唯一作用:批量训练 / 推理时补齐短文本,让一批序列长度相同;
  2. 仅放在每条序列 EOS 的后方,纯占位无语义;
  3. 配合 attention_mask 和 labels=-100,全程屏蔽填充部分,不参与计算、不参与损失;
  4. 模型只会输出 EOS,绝不会生成 PAD;
  5. LLaMA 等模型需手动设置 pad_token,否则批量训练报错。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐