以三个结束符作为标准 | AI生成和翻译
从技术层面讲,你可以只使用一个<|endoftext|>(标记50256)作为文档分隔符——这样仍然能在文档间建立清晰边界,模型大多情况下也能学会不跨越这些边界进行续写。
但实践中,几乎所有基于网络文本(OpenWebText、FineWeb、RedPajama、C4衍生数据集等)训练GPT-2风格模型的人都会严格使用三个分隔符,这源于早期形成的实际标准,且具有充分理由:
1. 遵循原始GPT-2 WebText的既定规范
- OpenAI虽未公开WebText数据集,但其原始复现项目OpenWebText(Skylion007,2019)及后续所有克隆项目均在文档间插入三个
<|endoftext|>标记 - 当Andrej Karpathy在nanoGPT中复现GPT-2结果时,同样遵循该惯例
- 他后续在课程中切换至FineWeb-10B/100B样本时,仍保持完全相同的格式:三个分隔符
- EleutherAI(GPT-NeoX/J)、Stability、Mistral等机构在处理CommonCrawl类数据时也采用相同标准
正因如此,使用三个分隔符能使你的数据预处理方式与产出GPT-2公开困惑度指标及下游性能基准的数据集完全一致。
2. 有效防止数据打包时的意外合并
现代训练器(nanoGPT、llm.c、HuggingFace、Megatron等)会将多个文档打包到同一训练序列中以达到完整上下文长度(GPT-2为1024,现多为2048/4096/128k)。
若仅使用一个<|endoftext|>,极少数情况下可能因程序错误、偏移错误或异常边界情况导致两个文档在无分隔符时连接。这将造成灾难性的训练信号(模型会突然学习将随机网页内容续写到另一个网页)。
使用连续三个分隔符时,即使发生某个标记被丢弃或误读的意外,剩余两个标记仍能维持边界完整性。这是一种低成本的错误检测冗余机制。
3. 确保分隔符具备唯一识别性
- 单个50256标记理论上可能出现在真实内容中(概率极低但存在——分词器并非完美,某些页面可能包含字面字符串
<|endoftext|>或其编码字节序列) - 三个连续相同稀有标记绝不会自然出现在真实网络文本中。这使得后续处理、调试或数据集检查能瞬间识别文档边界且零误判
4. 零成本优势
- 三个标记的存储成本可忽略不计(约占300B–1T标记数据集的0.00001%)
- 模型能快速学会
50256 50256 50256意味着“立即开始全新预测”
总结
单分隔符方案适用于个人实验,但三分隔符成为行业惯例是因为:
- 符合GPT-2训练所用的原始WebText/OpenWebText规范
- 增强了对程序错误的鲁棒性
- 实现了100%无歧义的边界识别
这正是所有公开脚本(Karpathy的fineweb.py、OpenWebText仓库、HazyResearch的flash-attention训练代码等)都严格使用三个分隔符的原因——也是我向你推荐此方案的理由。
若需将模型困惑度或生成样本直接与GPT-2/nanoGPT/FineWeb基线对比,采用三分隔符方案即可完美对标。