资讯动态

LLM数据配比消融实验:去重、质量过滤与领域比例的调优实践

发布时间:2026/10/27 8:22:01 来源:尧图企业网站定制
模型能力的上限往往不在结构里而在喂进去的数据里。这是我做LLM训练到现在最深的体会。同一个架构、同一份算力预算训练数据的去重强度、质量过滤策略和领域配比稍作调整下游效果可以差出好几个点。这篇是LLM Training Lab系列的第17篇我想把最近一组围绕“数据配比”做的消融实验完整复盘一遍三个变量各自怎么影响训练效果、组合起来又会有什么坑、最终我们是怎么定出生产配置的。先说明实验边界。这组消融全部跑在1.2B参数左右的小模型上中文场景为主训练数据整理后约55B token。用小模型的逻辑很简单同样的结论在1B上跑一轮只要几十卡时在7B上跑一轮是几倍的算力成本。数据配比这种需要多组对比的活儿先用小模型压低成本把边界探出来再用7B对少数关键配置做验证是性价比最高的做法。下面所有数值都是这个规模下的趋势不能直接当大规模训练的结果抄但规律本身我认为有参考价值。1. 实验设计三个旋钮怎么拆开、怎么对比消融实验最忌讳一上来就同时动好几个变量。三个维度——去重强度、质量过滤、领域比例——任何一个单独调都能影响最终loss和基准分同时动两个出了问题根本说不清是谁干的。所以我把实验拆成三组第一组固定质量过滤和领域配比只扫去重强度的5个档位。第二组固定去重强度和领域配比只扫质量过滤的4档阈值。第三组固定去重强度和质量过滤只扫5组领域配比。每组实验跑同样步数15B token约训练集总量的四分之一轮用同一套评估集通用能力看MMLU、中文理解看CMMLU、代码看HumanEval、数学看GSM8K外加域内困惑度。中间检查点每500步存一次方便后面画loss曲线。基线配置我定了这么一套去重采用minhash LSH 阈值0.8的标准操作质量过滤用perplexity和分类器双通道卡掉最底下约30%的数据领域配比按原始语料的自然分布通用:代码:数学:中英其他 ≈ 70:15:8:7。这个基线不是随便拍的是参考了实验室之前十几组经验整理出来的“不犯错”配置。消融时每组只偏离其中一个维度这样任何分数变化都能归因。还有两个容易被忽略的设计细节。第一每次实验用完全相同的种子和数据切分顺序否则loader的采样随机性会把真正的配比效应淹没掉。第二所有档位的训练都跑满同样的步数和batch size不做loss早停因为配比实验关注的是模型后期稳定性和基准分数不是训练到多少步能停下来。这两点没做到所谓消融就是自欺欺人。2. 去重强度不是越干净越好遗忘曲线会咬人2.1 五个档位怎么定义先把去重强度量化。我们对原始语料做了三个层次的处理组合出五个档位档位处理方式语料保留比例0档完全不去重只去掉完全相同URL和空行100% (约55B)1档精确去重md5完全重复句子剔除约92%2档minhash LSH jaccard≥0.8去重近似重复剔除约78%3档jaccard≥0.6去重更激进约65%4档3档基础上叠句子级前缀去重公共substring裁掉约51%2档是我们之前的基线所以第一组消融其实是重点看0、1、3、4这几个相邻档位怎么移动。2.2 核心结果loss降了分数未必升跑完15B token域内困惑度确实随着去重强度单调下降0档时验证集困惑度在11.8左右4档降到了9.6。这个不意外去重越狠训练数据里重复样板越少模型被反复背诵同一段话的概率越低困惑度自然好看。但下游基准的曲线完全不是单调的档位验证困惑度MMLUCMMLUHumanEvalGSM8K0档11.826.130.49.84.21档10.927.831.211.65.02档10.228.432.614.16.53档10.027.931.815.35.84档9.627.230.112.74.93档的HumanEval冲到15.3但MMLU和GSM8K反而比2档回落了。4档更明显困惑度全场最低HumanEval、GSM8K全都崩。这不是噪声两个种子下结果方向一致。为什么困惑度一路变好、下游能力却走回头路我的理解是激进去重实际在改变数据的“经验分布”。去重把近似重复的表述全部杀掉后模型看到的语料形态变得更“书面标准化”少了很多真实世界里的稀疏表达、同义改写、嘈杂上下文。这会让模型在训练集上收敛得很漂亮但面对评测集那些“不那么干净的问题”时反而泛化减弱。另一个更隐蔽的问题是遗忘当重复文本从几十份降到一份模型对这个知识点的记忆强度会被其他大权重样本稀释训练后期对早期知识的遗忘更明显——这个在GSM8K上尤其突出受训于第10B到15B token之间的数学文本一旦被后续代码文本挤掉推理步骤就接不上。2.3 实操建议两级去重不是一竿子到底踩完这组实验我们的生产配置最终选了2档而不是追求更低的困惑度。具体做法是第一级minhash LSH jaccard0.8拿掉高相似重复文本这一步能砍掉20%左右冗余。第二级句子级exact hash去重针对的是爬虫数据里大量出现的“模板句”——标题、免责声明、公共页脚这类按整句hash派除掉。不要对全部语料做jaccard0.6以下的激进模糊去重。如果你确实需要提高数据“多样性”用采样加权把稀有来源提上来比把近似重复文本硬删掉安全得多。代码数据尤其要小心很多代码仓库自带README模板、MIT许可证长文激进模糊去重会把不同repo里的许可文本误判成重复结果就是所有项目的README被抽掉好几份后面模型写代码时版权声明和注释风格都会异常“干净”——这种干净不是好事是多样性的流失。3. 质量过滤低分数据不是垃圾是垫脚石3.1 过滤器怎么搭、阈值怎么扫质量过滤我们用了两条通道。第一条是规则通道按文档长度、符号字占比、语言检测、perplexity控制在正常范围。第二条是学习通道用一个小号的fastText分类器标注了一批“高质量人工标注样本”和“明显噪声样本”做二分类输出一个0到1的质量分。两条通道打分后加权合并然后按阈值切。这一组扫了4档A档保留质量分前50%的数据B档保留前70%删掉最低30%C档保留前85%D档只删明显乱码和机器生成垃圾大概是前93%实验结果如下档位保留比例MMLUCMMLUHumanEvalGSM8K训练loss走势A50%29.333.813.57.8全程平稳B70%28.432.614.16.5平稳C85%27.531.915.87.2中段有波动D93%26.030.710.24.8后期loss偏高A档的MMLU比baselineB档高了近一个点GSM8K也上去了但HumanEval掉了。C档HumanEval最高但通用能力回落。D档全面崩溃这证实了只删乱码、不做质量过滤是不够的噪声数据会持续拖住模型。3.2 一个反直觉的现象保留30%“低分”反而提升数学推理这个发现不在计划内。A档数据只有50%按理说信息量最少为什么GSM8K反而最好我们把A档训出来的模型拿来逐题分析发现它对推理题目的格式泛化能力更强。原因在于质量分的最低30%并不都是垃圾——里面有大量社区问答、论坛求助帖、带错别字的解题过程这些文本的优势是富含“人的真实推理痕迹”跳过步骤、甚至结论错误但思维方式更像人。经过规则和分类器过滤留存下来的50%全是“标准答案体”反而让模型学到了模板化的推理输出对评测集里偏口语化、背景夹缠的数学题适应能力差。所以我们后面做了一个补充实验在B档保留数据里人为往训练集回填2%质量分最低的真实帖子文本从被删掉的数据里抽样GSM8K进一步涨到7.6HumanEval不降。这说明高质量数学代码数据的骨架必须要有但低分数据提供了“路标”——它让模型知道界限在哪里、什么样的推理路径算走岔这在数据科学里叫对比信号。全高分的世界没有对比模型学不出好坏边界。3.3 分类器训练的三个坑分类器这条路我们不是第一次走这次踩了新坑如果只讲阈值不讲坑相当于只给地图不给陷阱清单标注集合不能只标“完美文本”和“乱码文本”一定要掺入“看起来正常但内容空洞”的文本比如纯列表堆积、无上下文的问答片断。否则分类器会把空洞内容打出高分。不要用目标模型自己训完的输出去构建负样本这会造成模型自我强化——它觉得通顺的就是高质量又绕回“重复舒服文本”的循环。用通用语料库随机文本做负样本更干净。分类器分数和perplexity分数要分开观察二者相关性过高时说明文本长度一直在干扰判断。长文档perplexity天然偏高按长度分桶归一化后再合并才能真实反映质量维度。4. 领域比例这里藏着最大的效果杠杆也最容易顾此失彼4.1 比例是怎么扫的领域配比这组实验我们把语料按领域分成四桶通用文本、代码、数学推理、中英其他问答、对话、百科。基线比例是70:15:8:7然后扫五组组别通用:代码:数学:其他MMLUHumanEvalGSM8KR170:15:8:7基线28.414.16.5R250:25:15:1027.916.87.9R330:40:20:1025.818.68.4R450:15:25:1026.913.29.6R560:20:12:828.115.67.4明显看到通用能力MMLU与代码、数学比例呈反比但有意思的是MMLU跌幅很慢通用从70%减到30%MMLU只掉了2.6个点而HumanEval和GSM8K各涨了4.5和1.9个点。这说明通用语料里面有大量的“冗余支持”——很多通用文本的知识密度低删掉后对通用任务理解损失没有想象中那么大。但别高兴太早R3组里CMMLU已经掉到28.9中文通用理解受损明显说明通用语料对中文场景仍有不可替代的作用。4.2 三个细节决定了领域比例实验成不成立领域配比实验有三件事做不好结论基本不可信。第一领域分类器要固定且不过拟合。我们用fastText在残差语料上做了8个领域类训练后手动抽查分类器对“数学题带故事的文本”“代码注释里的中文句子”分得不够稳定于是改成了规则优先代码由文件扩展名和AST可解析性兜底数学由公式密度和解题步骤关键词兜底分类器只对通用/其他做二次细分。这样分类噪声最大的两栏就被结构性控制了。第二采样顺序必须固定。领域比例变了之后我们仍按同样顺序把各领域数据拼接进global batch而不是每个batch内重新shuffle。因为领域间分布差异大如果每个batch都随机shuffle模型会频繁切换任务模式损失函数震荡剧烈配比效应会被高方差掩盖。真实世界里你也不会让模型每步都在法庭文书和GitHub代码之间横跳保序采样更接近真实的课程式训练。第三数学语料按难度分层后再按比例抽取。这里有个容易掉进去的坑纯按“数学总数占比”扩数学数据会把大量重复的基础四则运算题灌进去信息量没增加“数学字面占比”却上去了。我们在数学桶内部按字符串长度分三层短题、中题、长题每层保证固定最低采样量禁止短题全部占满配额。R4组能做到GSM8K 9.6而不崩HumanEval和这个分层有很大关系——如果只堆总量模型常见症状是四则运算熟练、推理题答不上来分数虚高。4.3 比例一块调还是两层调做领域配比时一个反直觉的发现是把数学比例直接拉高到25%GSM8K确实涨到9.6但MMLU只掉了1.5个点表面上赚翻了。可是看分科目细项MMLU里的STEM部分跌了3.8个点是社会科学在托底才让总分没那么难看。这提醒我领域比例评估不能只看总分要拆细项尤其是当你想给数学加权的场景。我们后来在实用配置里用了一个折中先定性别配比再把每个batch的末尾5%位置替换为数学与代码的“refresher”样本。这些refresher选自被比例削减掉的高质量代码/数学文本位置固定在batch尾部让模型在一个batch的最后集中强化推理模式。这个技巧同时从R3和R4各借了一半——训练得到的MMLU回到27.9GSM8K保持在8.8两边都满意。如果你在生产里想给某个领域临时加权重可以考虑类似方式而不是直接把整体比例拉偏这样对通用能力伤害最可控。5. 三个维度的交叉效应为什么分开调都对、合起来就翻车5.1 一组交叉验证的失败案例三组单变量消融做完我们直接按各自最优档组合了一个“理论最优配置”去重4档最激进、质量过滤A档保留前50%、领域比例R4数学拉高。结果非常难看MMLU 24.3、HumanEval 11.9、GSM8K 8.1连单变量的谷值都比不上。复盘原因有三层第一激进去重把过滤后仅剩50%数据里的“近似重复群”又压缩了一遍两个操作合在一起导致语料规模只有原来的25%左右信息多样性严重不足。第二高质量数学数据对去重强度更敏感。数学文本里“因为AD平行于BC所以角ADB角CBD”这种标准句式jaccard0.8勉强不误判但到4档jaccard0.6时就被当成重复文本处理掉了等于是把最有用的数学逻辑骨架给抽走了。第三领域比例拉偏数学后batch顺序里刷题文本密集排列模型进入“答题模式”出不来本身就容易过拟合叠加激进去重让每道题只剩一个表达过拟合就更严重评测里稍微换个问法就不会了。这组交叉验证告诉我们单变量的最优解不是全局最优解数据配比是一个多维约束优化问题甚至有点像一个脆弱的生态系统挪一块板子就要检查另外几块有没有塌。5.2 联合调优的顺序策略吃了一次亏就长记性了。我们的联合调优顺序改为先固定去重强度在2档因为它是三个变量里对下游分数最“钝”的一个不灵敏就不会引发不可控波动。再调质量过滤阈值找到“低分数据保留率”上限让信息量够用又不至于被噪声拖累。最后用领域比例做精细调节因为领域比例对基准分的影响最直接放到最后调可以在前两个变量确定的底板上精准找位置。这个顺序多跑了好几轮但每一轮都能稳定复现。反过来做的话领域比例一变前面两个变量的最优解全变一天能跑出来的有效实验会少一半。另一个重要发现是质量过滤和领域配比之间存在“阈值补偿”关系。当我们把数学领域比例从8%拉到15%时质量过滤B档删30%自动变成了A档删50%的效果——因为数学语料本身质量方差小过滤器删掉的多是低分通用文本。但通用比例不降时同样把质量过滤推到A档损失就藏在知识广度和CMMLU里。所以换领域比例后要么重新扫一遍质量过滤梯度要么接受现结果并压低增删幅度。5.3 最终生产配置长什么样经过上面所有轮次我们锁定的生产配置是维度配置去重minhash LSH jaccard0.8 句子级精确去重不做4档激进模糊去重质量过滤保留质量分前70%另回填2%真实低分帖子文本领域比例通用55% : 代码20% : 数学12% : 其他13%每个batch尾部放5%推理refresher这个配置在7B模型上验证过一次MMLU 39.6、GSM8K 31.5虽不算顶尖但在同等算力规模里比最初基线高了近3个点的综合分。更重要的是所有分数稳定没有出现反复偏离的小方差抖动这对生产训练很重要——宁可平均分低半档也不要那种某天版本刷新后忽高忽低的配置。6. 跑数据配比实验最容易忽略的三件小事实验本身说完了最后补几个工程层面的心得。数据配比实验不需要高深的模型知识但对流程自律要求很高很多动辄几十卡时的实验就是毁在这些小事上。第一每个配比实验单独存一份数据清单。清单至少包含数据版本的hash、各领域token占比、去重参数、过滤阈值、采样种子。不要只记在你脑海里也别只写在实验平台描述里——两季之后你根本想不起“5203版本”是什么配比清单文件能省掉你翻代码翻半天的命。第二中途加数据是大忌。我们踩过一次去重强度实验跑到8B token时发现某个数据源有重复拉取手动reload了数据流结果后面所有检查点的loss都带了一次跳变那一整组实验只能作废。配比实验一旦启动数据流必须冻结哪怕发现数据有脏样本也先记下来下个版本再清理。第三评估集要做“防污染预演”。领域比例改变后数学题一下变多要提前确认评测集里的题没有出现在任何一个版本的训练数据里。我们用ngram重叠扫描过从通用语料里抽出来的题和评测集重叠度最高到0.3%直接导致GSM8K虚高0.7个点。这个量级足以改变消融结论的方向千万别拿污染过的分数去配置选择。这三件事在能跑32卡时的团队里最容易被当成“辅助工作”往后排但实践下来它们对实验质量的影响不小于模型结构上的调整。数据配比这摊事本质上是在“让模型见多识广”和“让模型研读经典”之间反复找平衡点。我这组实验做下来最朴素的收尾建议是每次只动一个变量动之前把假设写清楚动完把结果记全。配比实验不产出什么激动人心的新方法但它决定了你能不能在同样的算力下多挤出几个点而这几个点往往就是项目上线与不上线的差别。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑