增量预训练数据选取思路有哪些
P1 · llm_training
📊 考点:data-quality
🏷 标签:data-selection, domain-adaptation, data-mixing
1️⃣ 考察意图
面试官想考察你对大模型训练数据工程的系统性理解,而非简单背诵“质量、多样性”等概念。核心是看候选人能否从工程取舍和业务目标出发,设计数据选取策略。刁钻点在于:增量预训练面临“灾难性遗忘”与“领域适应”的平衡,以及数据规模、质量、混合比例之间的 trade-off。答好了能展示你不仅懂数据清洗,还懂训练 dynamics(如 loss 曲线监控、学习率调度),以及如何用数据驱动模型能力提升。
2️⃣ 标准答
增量预训练数据选取不是“挑好的”,而是“挑对的”。核心目标是在不显著遗忘通用能力的前提下,注入新知识或领域专长。以下从五个维度展开:
- 领域相关性:用“信号”而非“标签”筛选不要依赖人工标注领域标签(成本高、粒度粗)。改用无监督信号:比如用目标领域(如医疗)的预训练模型(如 BioBERT)计算文本的平均 log-perplexity,困惑度越低,相关性越高。
- 工程取舍:困惑度筛选会偏向模型已学过的模式,可能漏掉新颖但重要的文本。解法是结合关键词密度(如 MeSH 术语出现频率)做双通道过滤,召回率提升 15-20%。
- 实际坑:直接用通用模型(如 GPT-2)算困惑度会误杀领域术语多的文本(如“心肌梗死”在通用模型下困惑度高)。必须用领域预训练模型或微调后的分类器。 数据质量:分层过滤,避免一刀切
- 第一层:启发式规则(长度 > 50 tokens、重复率 < 0.8、特殊字符比例 < 5%)。第二层:模型质量评分,用小型语言模型(如 1.3B 参数)计算perplexity 分位数,只保留前 70% 的文本。
- 为什么这么做:低质量数据(如乱码、广告)会污染梯度,但过度过滤会损失多样性。保留 70% 分位数是经验值,在 C4 数据集上验证过【通用知识】。
- 落地坑:重复数据是隐形杀手。用 MinHash + LSH 去重,阈值设为 0.8(Jaccard 相似度),否则模型会记住模板(如“根据最新研究……”),导致生成重复内容。 数据多样性:覆盖“长尾”而非“头部”
- 使用聚类 + 采样:对候选数据做 K-means 聚类(K=1000),每类按比例采样,保证子领域(如“儿科” vs “外科”)都有代表。
- trade-off:均匀采样会稀释高频领域(如“心血管”),导致下游任务性能下降。解法是加权采样:对目标领域(如“罕见病”)上采样 3x,同时用课程学习(先易后难)安排训练顺序。
- 实际案例:在金融增量预训练中,财报数据(高频)和监管文件(低频)按 2:1 混合,最终在金融 NER 任务上 F1 提升 5%。 数据规模:不是越大越好,是“够用”就好
- 经验法则:增量数据量级为原始预训练数据的 1%-10%。例如,原始 1T tokens,增量取 10B-100B tokens。
- 为什么:数据太少(<1%)无法有效注入知识;太多(>10%)会导致灾难性遗忘,通用任务(如 MMLU)下降 3-5%。
- 工程取舍:用动态混合比例替代固定比例。训练初期(前 10% steps)用 1:1(增量:原始),后期逐步降到 1:10,通过 loss 监控调整。这比静态混合更鲁棒。 混合策略:防止遗忘的“记忆锚点”
- 必须保留 10%-30% 原始预训练数据作为 replay buffer。这些数据不是随机选,而是选高熵样本(模型预测不确定的),能最大化保留通用能力。
- 落地坑:直接拼接增量数据和原始数据会导致学习率冲突。解法是分阶段训练:先用低学习率(原始 LR 的 0.1x)在增量数据上微调 1 epoch,再混合原始数据用原始 LR 训练 0.5 epoch。这比单阶段训练遗忘率低 40%。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从数据筛选、规模控制、混合策略三个层面回答。筛选层面用领域困惑度和 MinHash 去重保证质量;规模层面控制在原始数据的 1%-10%,避免遗忘;混合层面用动态比例和 replay buffer 平衡新旧知识。总结一句:增量预训练数据选取的核心是‘在遗忘和适应之间找最优解’,而不是单纯堆数据。”
4️⃣ 高频追问 & 应对
追问 1:你怎么评估增量预训练的效果?只看下游任务指标够吗?
不够。必须监控通用能力退化。我会设置两组评估:一组是目标领域任务(如医疗 QA),另一组是通用基准(如 MMLU、HellaSwag)。如果通用任务下降 > 3%,说明数据比例或学习率有问题。另外,我会看训练 loss 曲线:如果增量数据 loss 下降快但原始数据 loss 上升,说明 replay buffer 不足,需要增加原始数据比例。
追问 2:如果数据量很大(比如 500B tokens),你怎么做数据去重?
用 MinHash + LSH 做近似去重,但 500B 级别需要分布式实现。我会用 Spark 或 Ray 做分片,每个分片计算 MinHash 签名(64 位),然后 LSH 分桶(band=20, rows=3)。实际坑是:去重阈值不能太严(如 0.9),否则会误删同义表达(如“心脏病” vs “心脏疾病”)。我会保留 0.8 阈值,并额外用 SimHash 做语义去重,召回率更高。
追问 3:增量预训练和全量预训练的数据选取有什么本质区别?
全量预训练追求数据多样性和规模,目标是学通用知识。增量预训练追求数据相关性和遗忘控制,目标是注入新知识。本质区别是:增量必须考虑数据分布偏移——增量数据分布和原始分布差异越大,越容易遗忘。所以增量数据选取要加分布对齐步骤,比如用 KL 散度过滤掉和原始数据差异过大的样本。
5️⃣ 避坑 · 常见错误答法
- ❌ “直接选领域相关的高质量数据就行,越多越好。” → ✅ “必须控制规模在 1%-10%,并混合原始数据防止遗忘。数据量越大,遗忘风险越高,需要动态调整比例。”
- ❌ “用 GPT-2 算困惑度来筛选领域数据。” → ✅ “用领域预训练模型(如 BioBERT)算困惑度,否则通用模型会误杀领域术语。同时结合关键词密度做双通道过滤。”
- ❌ “数据去重用 exact match 就行。” → ✅ “用 MinHash + LSH 做近似去重,阈值设为 0.8。exact match 会漏掉大量语义重复文本,导致训练效率下降。”
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“数据检索与筛选”角度切入,强调用 BM25 + embedding 双通道召回增量数据,并对比不同检索策略对下游任务的影响。
- 如果你只做过传统 NLP:用“数据增强”类比,说明增量预训练本质是“带约束的数据增强”,约束条件是通用能力不退化。可以提你用过回译或对抗训练做数据扩充。
- 如果你是校招无项目:聚焦论文复现,比如复现《Scaling Data-Constrained Language Models》中的混合策略,用 TinyStories 数据集做实验,展示你对数据比例和遗忘的理解。
7️⃣ 延伸阅读
- 《Scaling Data-Constrained Language Models》(2023)—— 数据规模与遗忘关系
- 《D4: Improving LLM Pretraining via Document De-duplication and Diversity》(2023)—— MinHash 去重实践
- 《Data Mixing Laws: Optimizing Data Selection for Language Model Pretraining》(2024)—— 混合策略理论
- 《Don't Stop Pretraining: Adapt Language Models to Domains and Tasks》(2020)—— 领域适应数据选取
- 《The Pile: An 800GB Dataset of Diverse Text for Language Modeling》(2020)—— 多样性数据构建