ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

无监督自蒸馏:让大模型自己教自己,实现稳定推理

无监督自蒸馏:让大模型自己教自己,实现稳定推理 大语言模型自己做自己的老师这听起来像一个很“激进”的研究方向但如果把它放进最近两三年的大模型后训练脉络里你会发现在语义上是完全成立的。单看这个标题核心信息其实就一句话不需要人工标注让模型在大量问题上先生成推理路径再用某种方式挑出更可信的结果拿这些结果继续训练同一个模型。这个循环可以反复执行所以论文标题才敢写“不需要任何标注”。但我更想提醒你的是这个方向的真正价值不是省下标注费而是把大语言模型从“偶尔会推理”推向了“稳定会推理”。单次采样能答对说明模型已经具备能力多次采样后还能稳定答对并且把这种正确路径固化进参数才是后训练真正要做的事。这篇文章不会替你把论文逐字复述一遍因为标题给我们的信息有限。下面我会优先讲清楚这类无监督自蒸馏方法的通用思考框架它解决的问题、隐藏的监督信号从哪里来、怎么落地、适合哪些任务、又会在哪些地方翻车。1. 无监督自蒸馏真正想解决的是“会”和“稳定用出来”之间的距离1.1 大模型“会但不稳”才是最真实的工程痛点很多人第一次接触大模型时会有一个直观体验同一道逻辑题今天跑能答对明天换个随机种子可能就答错温度调低一点答案变稳温度调高一点推理又飘。这种事不是模型“完全不会”而是它的推理能力没有得到充分对齐和固化。在模型内部正确推理路径可能只占输出分布里的一部分概率。你采一次样它有一定概率落在正确路径上采八次、采样六十四次正确路径出现的概率会提高。但问题在于模型最终输出时你不会每次都采样很多次你需要的是它“默认就走对”。自蒸馏解决的正是这个差距。它先把模型采样得到的多条推理路径收集起来用某种信号筛选出高质量的那部分再把它们当成训练目标让模型学会把概率集中到这些路径上。这个过程不改变模型的“知识上限”但改变模型行为。1.2 自蒸馏和传统知识蒸馏有什么不同传统知识蒸馏通常是这样一个大模型当老师一个小模型当学生老师生成的输出分布被作为监督信号学生去学老师的软标签。自蒸馏不一样。它的老师和学生是同一个模型或者说是同一个模型在不同迭代版本之间的自我修正。老师不是另一个参数规模更大的模型而是“当前模型在多轮采样后的高置信行为”。这里要重点理解一个细节同一个模型在温度比较低的时候可能只会复述训练时见过的模式但温度稍微调大一点模型可以生成出它训练数据里没直接见过的推理路径。自蒸馏的思路就是把这些“隐藏在输出分布深处”的正确路径找出来再通过训练让它们从低频变成高频。换个更直白的方式说模型原本已经会做某件事但做得很不稳定。自蒸馏是让模型把自己最靠谱的那一面复制给所有参数。1.3 它真正改变的是监督数据的生产方式以前想让模型提升推理能力最直接的办法是找人来写标准答案。把问题和答案拼成训练样本。用监督微调让模型学会输出答案。无监督自蒸馏把第 1 步变成了“从模型自己的采样里筛选”。人工不需要逐条写答案但需要设计筛选规则。这看起来只是把成本从“标注”转移到了“验证”但转移本身意义很大因为验证规则可以自动执行而人工标注不能无限扩张。只要你能找到一个可靠的自动验证信号数据规模几乎可以无限增长。2. 没有标注不等于没有监督关键要找到可自动计算的“老师”2.1 可验证任务不需要标注因为有确定性检查器“不需要标注”听起来违反了监督学习常识。其实在推理任务里有些任务的最终答案天然可以自动验证不需要人工给标签。典型例子是数学题。题干可以没有答案但模型如果得出了一个最终数字我们可以用另一个更可靠的检查器来验证比如表达式求值、符号计算、单元测试、代码运行。再比如 SQL 生成写完 SQL 后在测试数据库上执行把执行结果和预期表结构比对这也能自动验证对错。代码生成更常见直接跑编译器和测试用例结果确定且客观。这类任务里问题和“验证器”才是最重要的资产。模型负责生成推理路径验证器负责判断路径最后落到的答案是否正确。没有人工标注但有一个比模型本身更可靠的“裁判”。2.2 不可验证任务自洽性、置信度和自评价都只是弱信号并不是所有任务都有标准答案。开放问答、事实核查、逻辑故事推理很多都无法用一个脚本判断对错。这种情况下论文和工程里通常会用几种弱监督信号。第一种是自洽性。同一个问题采样多条推理路径如果最终答案高度一致就认为这个答案更可信。这个思想在推理任务里很常见但注意它只能处理有离散答案的任务。如果任务输出是开放式文本自洽性的含义会很模糊。第二种是模型自评分。让模型给自己的推理路径打分或者让另一个大模型当裁判。问题是模型对自己的错误往往并不敏感。它会偏好那些看起来流畅、符合自己写作风格的输出但不一定偏好更严谨的推理。第三种是启发式规则。例如检查推理路径是否包含必要的中间符号、是否按指定格式输出了步骤、是否调用了正确工具。这类信号实现简单但容易让模型学会“表面合规”。2.3 换个角度看无监督维护的是“分布”不是“正确答案”看完整条技术脉络你会发现“无监督”在这里的真正意思是不使用外部人工标注来定义正确答案而是用任务结构、验证规则和采样分布来定义“更可信的路径”。这带来一个认知升级自蒸馏不一定需要知道哪条路径是绝对正确的它只需要知道哪条路径比当前模型的默认输出更值得学习。只要筛选信号有一点点偏向高质量路径的能力多轮迭代之后模型分布就会往高质量方向移动。但也正因为这样风险也很明显。如果筛选信号本身有偏模型会越训练越偏而且这种偏会自我强化。后面我会专门讲这个坑。3. 一套可落地的四步流程采样、筛选、蒸馏、再迭代3.1 准备一个没有答案的问题集合第一步不是准备答案而是准备问题集合。这些问题可以来自现有数据集中只抽题目部分不要答案代码仓库里抽任务描述真实的用户查询日志根据已有文档自动构造的推理问题。如果条件允许最好把问题集合做一次去重和质量过滤。问题重复度太高会让模型在后面几轮蒸馏里过拟合到少数模式问题本身含糊不清又会触发大量无效推理路径。提醒不要一开始就把所有问题都投进去。先从 500 到 2000 条问题的子集跑通流程确认筛选信号有效再扩大规模。3.2 多路采样多样性比单条正确率更重要拿到问题集合后用当前模型对每个问题采样多条推理路径。常见写法是# 伪代码示例理解流程为主不要直接照抄 def generate_candidates(model, question, sample_k8): candidates [] for _ in range(sample_k): output model.generate( question, temperature0.7, do_sampleTrue, top_p0.95, max_new_tokens1024, ) candidates.append(output) return candidates采样参数很关键。温度太低采出来的路径基本一样多样性不够温度太高推理路径容易断裂。一般从temperature0.7、top_p0.9~0.95、sample_k4~8开始试。还要注意输出格式。很多推理任务需要让模型先输出思考过程再输出最终答案。如果格式不固定后面提取答案会非常痛苦。建议在提示词里明确指定格式例如请先逐步推理最后一行输出“最终答案...”如果模型输出经常不按格式走优先调提示词而不是靠筛选硬扛。3.3 筛选路径比“答对”更重要的是“路径可用”采样完成后要用筛选信号给每条路径打分或打标。不同任务选择不同信号任务类型推荐筛选信号注意事项数学题最终答案比对 最少步骤检查结果正确不代表路径一定正确代码生成编译 单元测试需要构造覆盖足够多的测试用例SQL 生成在测试库执行比对查询结果注意数据表权限和脏数据开放性推理自洽性投票 人工抽样只适合做弱筛选别当强标签安全对齐规则过滤 人工审核不能完全依赖自评分筛选之后把通过条件的路径收集起来组成训练集。每条样本一般长这样{ question: 一个矩形的长是宽的3倍周长为48求面积。, chosen_rationale: 设宽为x长为3x周长2(x3x)8x48所以x6面积为18*6108。, final_answer: 108 }这里有一个很关键的判断如果你发现通过率特别低比如采样了 8 条一条正确的都没有不要硬训。这通常说明当前模型对这个任务的能力还不够也可能是问题本身太难或提示词不清晰。一个稳妥做法是先跳过这些问题等模型能力提升后再重新采样。3.4 蒸馏微调用筛选后的分布对齐而不是简单复制筛选完成后就可以用训练集对模型做微调。这个阶段要注意几个地方。第一学习率不要太高。自蒸馏数据往往来自自己内容分布不够多样学习率过高很容易让模型在几轮内过拟合甚至出现“只输出类似格式、但推理质量下降”的情况。常见做法是从正常 SFT 学习率的一半开始试。第二epoch 不要太多。通常 1 到 3 个 epoch 就够。如果训太多轮模型会把筛选路径背下来出现记忆化而不是真正学会泛化。第三最好加一点正则。一些实现里会让模型同时保持对原模型输出的 KL 约束防止它在自蒸过程中偏离原始能力太远。这样做不是必须的但能有效抑制模型坍缩。# 伪代码思路筛选后训练一次 def self_distill_step(model, questions, checker, k8, threshold0.6): train_data [] for q in questions: candidates generate_candidates(model, q, k) scored [(score(c, checker), c) for c in candidates] best_score, best_path max(scored) if best_score threshold: train_data.append({question: q, rationale: best_path}) supervised_finetune(model, train_data, loss_typesft) return model这四步合在一起就构成了无监督自蒸馏的一个基础循环。第一轮跑完后你拿到了一个新模型接下来可以继续用新模型重新采样、重新筛选做第二轮、第三轮。4. 为什么推理任务是主场开放任务不要硬套4.1 推理任务有天然的可校验出口无监督自蒸馏之所以在推理任务上大放异彩核心原因不是模型变聪明了而是推理任务有一个“天然裁判”最终结果可以用确定性方式验证。数学题可以比对数字代码题可以跑测试SQL 题可以查结果逻辑题可以套规则。这些验证器不依赖人不依赖另一个大模型稳定性非常高。当筛选信号稳定性高的时候多轮迭代质量就有保障。这也是为什么标题里强调“推理能力”而不是笼统地说“语言能力”或“生成能力”。推理是一个很容易被自动验证器兜底的领域天然适合自蒸馏。4.2 开放生成、创意写作和价值观对齐仍然绕不开人类信号一旦离开可验证任务无监督自蒸馏就变得危险。创意写作没有标准答案你用自洽性选出来的“高分文章”可能只是风格上更接近模型常见输出的文本。价值观对齐更复杂模型很擅长生成听起来正确但实际有害的内容如果筛选信号只看“模型自己觉得不错”错误观念会被一轮轮放大。开放任务里不是完全不能做自蒸馏但你需要额外增加人工抽样审核、规则库、外部知识库比对等更强的约束。这个约束一旦存在你其实并不是在“无监督”而是在把监督信号换一种形式藏起来。4.3 一张表判断你的任务适不适合无监督自蒸馏任务类型是否适合原因数学应用题非常适合答案可自动比对推理路径多样代码生成 / 修复适合编译器和单元测试提供强反馈SQL / 表格查询适合查询结果可自动对比逻辑推理与规划可以如果有结构化状态检查器则更好开放问答谨慎需要自洽性或外部知识检查器创意写作 / 摘要不适合缺少客观正确性容易自我强化风格安全与价值观对齐不适合必须引入人工偏好和规则约束这不是说开放任务永远不能用自蒸馏而是说任务越开放越没有确定性验证器你就越需要额外的人工干预。干预成本一旦上来“无标注”的效率优势就会消失大半。5. 效果不升反降时按这条链路排查自蒸馏最大的谎言是“迭代几轮后模型肯定更强”。实际做的时候更常见的是第一轮涨点第二轮持平第三轮开始退步。如果遇到训练集通过率在涨、评估集效果却在跌不要怀疑自己看错了这很常见。按下面的链路排查。5.1 症状一训练集通过率涨了评测集却在跌这说明模型从“会推理”变成了“背题式输出”。它可能把训练时见过的高频格式记住了但没有形成真正的推理泛化能力。优先检查训练集和评测集的重叠度。如果训练集和评测集问题太相似训练集通过率的上涨几乎没有参考价值。更麻烦的是模型可能为了满足筛选规则输出一些看似合理但实际上是固定套路的推理文本。此时建议降低 epoch提升采样多样性增加问题集合的分布广度并且把评测数据严格隔离。5.2 症状二输出越来越短推理路径越来越像“复读机”这种情况通常是因为筛选规则奖励了“简单直接”或“格式统一”模型发现不需要复杂推理也能通过筛选。举例来说如果筛选只看最终答案是否正确模型很快会学会跳过中间推导直接给答案因为短文本更容易维持连贯性不容易出错。表面上看最终答案正确率没降但推理能力并没有提升。解决办法是给筛选规则增加复杂度比如要求推理路径必须包含不少于三个中间步骤或者用另一个经过校准的模型给路径质量打分。但要注意任何硬规则都可能被模型钻空子需要定期人工抽查。5.3 症状三通用能力明显下滑自蒸馏过程中模型把所有训练精力都放在了特定领域的推理路径上原有的一般性知识可能被覆盖。尤其是数学推理和代码生成这种“任务形态非常固定”的领域很容易让模型的其他能力退化。想避免这个问题可以在蒸馏微调数据里混入一部分通用指令样本加入原模型输出的 KL 约束在训练和评估过程中始终保留一组和推理无关的通用能力评测集。5.4 症状四自评分数很高人工一眼看出错误这说明你的筛选信号已经被模型“自我偏好”绑架了。模型生成了一段流畅的路径自评时又觉得这段路径很合理于是它拿到了高分。可一旦让外人来看中间的假设条件、逻辑连接、计算过程全是错的。此时要停止自评信号的自动迭代回到人工抽样审核。最直接的做法是从每一轮被选中的路径中随机抽 50 到 100 条让人工打标签然后统计筛选信号和人工判断的一致率。一致率低于 80% 时不要用这个信号继续做自动蒸馏。5.5 推荐排查顺序按下面这个顺序走通常能快速定位问题先看评估结果是整体下滑还是只有某个子任务下滑再看训练集抽查被选中的样本确认推理路径质量再看筛选信号计算筛选分数和真实正确率的相关性再看训练配置epoch、学习率、KL 约束是否设置合理再看采样参数采样数是否太少温度是否让模型失去多样性最后看迭代方式是否一直在用旧模型生成的数据而不是重新采样。一个容易被忽略的事实是无监督自蒸馏不是“完全不需要人盯”。它更像把人工从逐条标注前移到了任务设计、筛选规则和采样评估上。如果这些前置工作没有做好模型自己教自己的结果只会是把自己的错误教得更牢固。6. 如果只记住一个判断我要记住什么6.1 先跑一个最小的闭环如果你想在自己的模型上复现这类方法最稳的做法不是一上来就搭一个完整的数据飞轮而是先跑一个最小闭环。建议这样设计第一轮实验准备 500 个没有答案的推理问题用当前模型对每个问题采样 8 条路径用一个可自动执行的验证器筛出正确路径用筛出的路径微调模型只训 1 个 epoch在一个独立的、有答案的小评测集上对比前后效果。这一轮实验的目的不是追求大涨点而是验证你的验证器、采样策略和微调配置是否成立。只要评测集没有明显退步并且被选中的路径质量说得过去你就可以继续扩大规模。6.2 长期迭代时的工程纪律当实验从“跑通”走向“长期维护”时下面这些工程习惯会越来越重要每个迭代版本的模型都要保存下来能复现当时的采样和筛选结果记录每一轮的数据规模、通过率、评测集分数、采样参数不要把旧迭代的筛选结果直接混进新数据除非做了分布校准始终保留一部分人工审核集当作质量底线给“通过率”设定下限如果某类问题持续一轮都筛不出多少正确路径就暂停这类问题不要硬训。6.3 这类方法不会替代评测但会改变数据生产方式无监督自蒸馏不是要把人从模型训练中踢出去。它真正吸引人的地方是改变了“高质量数据从哪里来”这个问题的答案。过去我们靠标注后来靠爬取再后来靠模型生成配合人工筛选。现在这条路更激进模型可以自己生成数据自己设验证器自己筛出更可信的路径然后重新训练自己。它有自己的边界适用于有确定验证器、推理路径可评估的任务不适用于开放生成和价值观判断。它也有自己的风险自我强化、分布坍缩、格式优化替代真实推理。但无论如何这个方向已经很清楚地把“大模型自己教自己”从概念变成了可执行的训练流程。如果你手里正好有一批无标注的推理问题也有一套自动验证器那我建议你认真试一轮这种四步流程。先别追求三轮迭代后的精度先看第一轮是否能稳定选出一条比你当前默认输出更好的路径。如果能这个循环就值得转起来。
返回列表