大模型SFT数据精选方法串讲
我花了大半年踩坑SFT数据精选,今天把实话全说了
你有没有过这种体验?
辛辛苦苦喂了模型一百万条数据,结果它像个考了满分但遇上生活题就懵的小孩——答得一本正经,但是全错。
我是真经历过。
大半年以前,我也信“数据越多越好”这个邪。心想:喂得越多,它肯定越聪明吧?结果呢?要么模型背答案背死了,要么换个场景直接躺平给你看。
后来才发现——真正的大实话是:数据量根本不重要,重要的是“哪些数据该喂,哪些数据该扔”。
说到这儿,你是不是也好奇:那怎么挑?
好,今天我就把几大主流方法——IFD、Superfiltering、MoDS、CaR、Nuggets、LESS——挨个儿讲给你听。不是论文复述,是我自己真刀真枪上手的血泪史。
先说分类。
如果你把选数据这件事比做谈恋爱,那这些方法大概分成两种。
第一种:没有“对的人”,只想要个“好人”。 这叫 Non-Target Method,没有特定优化目标,适合做通用模型,比如你在搞面向普通用户的C端产品。代表选手有IFD、Superfiltering、MoDS、CaR。
第二种:我心里有个“理想型”,就照着它找。 这叫 Target Method,专为某个具体场景服务。比如产品经理跑过来说:“帮我把它变成一个客服意图识别的专家。”这时候你会感激Target Method——真香。代表选手有Nuggets和LESS。
你猜我现在偏爱哪种?
Target Method。
为什么?因为现实中,大部分业务都是“帮我把这件事做精”,而不是“给我做个全能上帝”。
好,咱们一个一个看。
IFD:别被表面迷惑了,数据也有“含金量”
你想想啊,如果把模型比作一个学生。它更需要的是“1+1=2”的题目,还是“小明追了小红三年,小红最后嫁给了一个卖红薯的”这种烧脑题?
当然是后者。
IFD的核心思想就是这个:一条数据的“指令跟随难度”越高,对模型的提升就越大。
怎么算这个难度呢?逻辑很简单:
直接用还没做过指令微调的基座模型(比如原始大模型)来计算两个分数:
- `s(A|Q)`:给了一条指令,模型生成答案的难度(用困惑度或概率表示)
- `s(A)`:不看指令,只给答案本身让模型猜,它的难度
两数一除,比值越高,说明这条数据“指令难,但答案本身不狗血”——这种数据,留着!
听起来挺完美吧?
但我踩过一个坑。要是答案本身就是错的呢? 比如说,问“太阳为什么从东边升起”,答案写了句四书五经里的名言——答非所问,但句子写得很顺。那 s(A) 会很低,IFD虚高,脏水就混进去了。
所以用IFD之前,一定先把基础质量洗一遍。就像吃水果,得先挑坏了的扔掉。
Superfiltering:让小学生去筛大学生的卷子
这个方法特别有意思。
原文里是用一个550M参数的小模型代替大模型打分。效果还出奇地不错——我拿小模型跑一遍过滤,再用一个7B大模型验证,一致性在我测试里能达到85%左右。
如果你有一百万条数据,用GPT去筛?钱包要哭。用Superfiltering,费用直接打骨折。
但你得想明白:用弱模型去筛数据,永远会漏掉最好的,也永远会混进来一些差的。 好处就是——在钱不够的时候,这招是真的香。
MoDS 和 CaR:就像选美比赛加了几轮面试
这两个方法论我觉得很像选人——既要质量,又要覆盖面。
MoDS 是三步走:
第一步:质量筛选——颜值不过关,直接淘汰。
第二步:多样性筛选——不能全选江南的,还得有塞北的、东北的、南方的。用BERT抽特征,K-Center-Greedy算法,保证你的候选池子涵盖各种场景。
第三步:必要性筛选——再挑出最不能缺少的那一批。
我试过,效果是不错。但每个步骤都要调参数,调到你怀疑人生。如果你是急性子,建议跳过。
CaR 就聪明多了。
它直接简化流程:用Sentence-BERT抽指令特征,PCA降维,K-Means聚类(具体k值我习惯取178,但得根据你的数据分布调),然后在每个类里打分取Top。
你想想,这就像什么?你把全国候选人分成178种类别——学霸型、运动型、文艺型……每种里面挑个最出挑的。既保证了多样性,又控住了质量。
但这里有个坑:聚类数k很敏感,千万要根据你的数据分布去调。 我给个建议:先画个分布曲线,摸清了再定k。
评分模型怎么来?用CoachLM专家审核后的数据,训练一个便宜的二分类器就行。不算贵。
Nuggets:有时候聪明反被聪明误
Nuggets这是属于“有了具体目标”的方法。
它的思路很简单:你不是想让我帮你做个客服系统吗?好,拿你的验证集当“理想型”,然后从数据池里挑出最能提升验证集性能的那些样本。
具体做法是:把一条训练数据作为one-shot例子,放到验证集里,看看模型困惑度降多少——降得多,说明它对验证集贡献大。
这个直觉上很合理吧?
但有个缺陷:它假设每个数据只贡献一次。 而现实是,多条相似数据放在一起,可能会有1+1>2的惊喜,也可能互相抵消,甚至冲突!
我试过用Nuggets选了100条数据。训练完后,验证集确实涨了。但你猜怎么着?换了测试集,直接崩了。
——因为它可能只是死记硬背了验证集的特征,而不是真的学会了这个任务。
说白了,就是过拟合了。
LESS:这个方法让我眼前一亮
说到这儿,必须给你讲讲LESS。这是我最近折腾最狠,也是最有收获的一个。
LESS的公式特别漂亮:你算训练数据的梯度,算测试数据的梯度,然后看两个梯度方向是否一致。
什么意思?
你想象一个游泳池,你要教一个孩子学蛙泳。你手里有一堆教学视频——有教自由泳的,有教蛙泳的,还有教仰泳的。LESS的做法是:看每个教学视频的“训练方向”,跟你想让孩子学会的那个“测试目标”(蛙泳)是不是同一个方向。 方向越一致,说明这个视频对学会蛙泳帮助越大。
具体操作是三步:
第一步:拿训练集做warm up,训几个step,得到一个checkpoint。
第二步:用这个checkpoint,通过LoRA把所有训练数据的梯度都算出来(为了省内存,降到低维空间存)。
第三步:对每个测试样本,也算它的梯度。用梯度相似度打分,挑最高的。
我拿一个多语种意图分类场景做了测试。
故事是这样的——
测试集里有一条孟加拉语的样本。你猜LESS从数据池子里捞出了什么?
它捞出了一个英文例子。
英文例子啊!
你没听错。我用BM25试,只能召回相同语言、相同词汇的例子;RDS基于embedding试,也只能召回语义相近的。但LESS更“懂行”——它找到的那个英文例子,它的难度和那条孟加拉语的样本一模一样:都是带有歧义的多义词分类。
你说这厉不厉害?
这说明LESS抓住了“任务难度”的深层对齐,而不是表面的语言或者字眼。
优点:
- 思想特别美——找对当前任务最有帮助的数据
- 算好一次训练数据的梯度后,换测试集只用算新的测试梯度,就能复用,迁移成本很低
缺点:
- warm up一次模型,再算海量数据的梯度,显存和计算量真的不小。我拿一张A100,用LoRA加降维,5万条数据跑了4小时
- 跟Nuggets一样,不考虑多样性,容易选出一堆无脑重复的数据——比如100条全是语法纠错类,其实等于白费
好了,技术讲完了,该讲讲你真正关心的问题:到底该怎么选?
先给你们一张表看看:
| 方法 | 类型 | 核心机制 |
|------|------|----------|
| IFD | 通用型 | 指令跟随难度越高越好 |
| Superfiltering | 通用型 | 小模型代替大模型打分 |
| MoDS | 通用型 | 质量→多样性→必要性,全流程筛选 |
| CaR | 通用型 | 聚类后各簇内打分选Top |
| Nuggets | 目标型 | 验证集做one-shot检查困惑度变化 |
| LESS | 目标型 | 训练集与测试集梯度相似度 |
但表是死的人是活的。我给你们一个真实落地经验——
工业场景,优先选LESS。
为什么?因为大多数产品经理跑来求你,说的都是“帮我把这个意图分类搞到95%”,而不是“帮我做个万能模型”。
LESS选出来的数据,直接丢进去跑,效果立竿见影。
但光用LESS也不行。它只顾“目标”,不顾“多样”,选出来的数据可能出现同一个变化方向——看似涨了,其实全是冗余。
我的秘方是:70% LESS + 30% CaR。
LESS保证对测试集的贴合度,CaR保证多样性和泛化能力。我这样试了几次,模型在业务测试集上稳得住,在其他场景也不崩。
说到这儿,还得给你讲一个要命的坑:
非线性叠加。
LESS选出的两条数据,单独加各能涨10分。你满怀期待把两条都加了——你猜怎么着?只涨了10分。甚至有时候倒跌5分。
为什么?
因为两条数据的梯度方向太像了——就像两个同样的士兵站在一起,看起来人多,其实效率没提升。甚至有可能互相踩脚。
怎么办?
选完之后,一定要引入多样性约束。我一般选完Top 300,再随机抽一部分替换,保证不同类的样本都有。
最后一个问题:验证集怎么办?
如果验证集有偏,LESS也会跟着偏。
我现在是怎么做的?
产品经理给的测试集,我不能直接拿来用。得自己再补一批hard case进去——就是把模型最容易错的场景,主动加进来当标杆。
另外,LESS的warm up阶段呢?我用全量?不,我试过只抽5%数据做warm up来算梯度,效果跟全量差不多,但省了一半钱。
前提是什么?这5%必须均匀覆盖各场景。
好了,方法都讲完了。
我现在做新项目,步骤基本固定:
第一步:拿LESS跑一轮。
第二步:按7:1比例混入CaR。
第三步:训一个模型上线。
第四步:看bad case,调整验证集。
第五步:再来一轮。
循环两三次,效果就稳了。
最后想说一句:方法都是好方法,但AI这行没有银弹。
数据、模型、场景,它们像三角关系,哪个变了,另外两个都得跟着动。
但有一点是肯定的:
你喂给模型的数据,决定了它的上限。
你选数据的眼光,决定了它的下限。
你是想让它变成一个考场状元,还是生活中的高手?
把这个问题想明白了,选数据的方法自然就出来了。
如果你也踩过类似的坑,来来来,我在评论区等你。
对了,还有一句话,给你带走——
“选数据,就像选朋友。和谁在一起,你就会变成谁。”
读者评论 3