PAD_TOKEN和EOS_TOKEN
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,代码会报错,两种标准解决办法:
- 复用 EOS 作为 pad token:
python
运行
tokenizer.pad_token = tokenizer.eos_token
tokenizer.pad_token_id = tokenizer.eos_token_id
- 新增一个特殊 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 完全忽略
六、总结
- PAD_TOKEN 唯一作用:批量训练 / 推理时补齐短文本,让一批序列长度相同;
- 仅放在每条序列 EOS 的后方,纯占位无语义;
- 配合 attention_mask 和 labels=-100,全程屏蔽填充部分,不参与计算、不参与损失;
- 模型只会输出 EOS,绝不会生成 PAD;
- LLaMA 等模型需手动设置 pad_token,否则批量训练报错。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)