DeepSeek 预训练数据笔记
Published:
这篇笔记总结 DeepSeek 在数据侧的核心做法:去重 -> 过滤 -> 重混,以及 tokenizer 与代码数据工程。
1. 三阶段数据管线:Deduplicate / Filter / Remix
1.1 去重(Deduplication)
- 目标:减少重复样本,提升数据多样性,降低模型对重复模板的过拟合。
- 做法:不仅在单批次 crawl 内去重,还做跨批次的全局去重(cross-full Common Crawl deduplication)。
- 工程上常见:MinHash / SimHash + 分块(chunking),避免长文档局部重复被漏掉。
1.2 过滤(Filtering)
- 目标:提高信息密度,剔除低质量内容。
- 维度:
- 语言质量:语种检测、乱码/语法异常过滤。
- 语义质量:连贯性或一致性分数过滤。
- 领域相关性:保留技术文档、论文、代码解释等高价值语料。
- 策略:对稀缺领域放宽阈值,避免长尾知识被误删。
1.3 重混(Remixing)
- 目标:平衡数据分布,增强长尾覆盖。
- 方法:
- 分层采样(按代码、数学、通用文本等分层)。
- 稀缺领域过采样或数据增强(回译、模板变体)。
- 控制主流领域占比,避免单一语种/单一体裁主导训练。
2. Tokenizer 设计要点
- 主体方案:Byte-level BPE(BBPE),兼容多语种和代码。
- 规则细节:
- CJK 与标点尽量不混并。
- 数字按单字符或更细粒度处理,降低 OOV 风险。
- 词表策略:
- 预留扩展空间,避免后续升级被词表卡死。
- DeepSeek-V3 的词表规模更大(常见描述为 128K 级别),并对换行/标点做了更鲁棒的训练处理。
3. DeepSeek-Coder 系列的数据工程
3.1 代码数据过滤
- 仓库范围、语言范围、时间范围先做硬约束。
- 再做规则过滤:
- 行长异常文件过滤。
- 字母占比过低文件过滤。
- 配置/模板噪声(XML/HTML/JSON/YAML)按规则筛掉。
- 语法错误文件剔除。
- 与测试集 n-gram 重叠清理,防止数据泄漏。
3.2 项目级结构保留
- 不只看单文件质量,还关注仓库内部依赖关系。
- 通过 import/include 等构图,再做拓扑排序,尽量让上下文顺序更符合真实工程结构。
- 好处:提升项目级代码理解与补全质量。
4. 一句话总结
DeepSeek 的数据方法不是“只堆 token”,而是把数据工程拆成可执行、可衡量、可迭代的流程:
全局去重 + 多维过滤 + 分布重混 + 代码专项工程 + tokenizer 协同优化。