DeepSeek 预训练数据笔记

Published:

中文 | English

这篇笔记总结 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 协同优化