跳到主要内容

孤儿微调:基础模型废弃后如何恢复领域专业知识

· 阅读需 10 分钟
Tian Pan
Software Engineer

2024年1月4日,OpenAI 下线了 /fine-tunes 接口。每一个基于 Ada、Babbage、Curie 和 Davinci 微调的模型都停止了响应。那些花费数月在这些模型上构建生产系统的团队——精心设计的提示、标注的数据集、标签流水线——一觉醒来发现收到的是 HTTP 404。微调模型没有迁移,学到的行为没有迁移,领域专业知识就此消失。

这不是小概率事件。2024年8月,Google 彻底关闭了 PaLM API,没有任何向后兼容的宽限期。与 OpenAI 至少允许现有 GPT-3.5 微调模型继续运行(只是禁止新的训练任务)不同,Google 的关闭意味着生产推理在同一天停止。如果你的微调 PaLM 模型处于关键路径上,你就遭遇了服务中断。

业界的模型迭代节奏正在加速。OpenAI 每六到九个月就会发布并废弃一批模型,Anthropic 给出十二个月。Meta 没有发布 Llama 的正式时间表,这可能更糟——开源生态系统分叉,微调工具链滞后,而你在 Llama 2 上训练的 LoRA 在 Llama 3 上无法直接使用,需要大量返工。信号很明确:拥有一个微调模型就意味着要为它最终沦为孤儿做好规划。

真正失去的是什么(远不止推理访问)

常见的理解框架是:废弃是一个访问问题——你的模型关闭了,你需要一个新的。真正的问题更难。通过微调获得的领域专业知识与特定模型的权重、分词器和内部表示紧密耦合,你无法把它解压缩后放入更新的基础模型。

当基础模型版本改变时,至少有三件事会在你的微调之下发生变化:

分词器。 新模型扩展了词汇表并调整了字节对编码。在 GPT-3.5 中作为单一单元的标记,在 GPT-4 中可能被拆分为多个标记。你的微调数据隐式地由旧模型的分词方式塑造——领域特定的缩写、产品名称、代码标识符。在新的分词器上,即使字符串完全相同,这些示例的结构看起来也会不同。

嵌入空间。 基础模型预训练期间学到的内部向量表示是不可移植的。微调让 GPT-3.5 通过潜在空间的特定几何区域,将某些领域概念映射到某些输出行为。GPT-4 生活在不同的空间里。当应用于其他地方时,来自你微调示例的梯度更新指向毫无意义的方向。

校准基线。 微调后的模型不仅学到了该说什么,还学到了该有多自信。如果你的医疗摘要微调学会了在模糊的临床笔记上谨慎输出,那种校准是特定于旧模型不确定性曲面的。在新的基础模型上,你得到的是不同的先验。标准微调工作流程不会保留这一点——它们针对输出准确性进行优化,而非不确定性对齐。

为什么"在新模型上重新训练"行不通

应对废弃微调的显而易见的回应是在新基础模型上运行相同的训练任务。在生产中做过这件事的工程师知道它并不那么简单。有两种结构性失败模式。

灾难性遗忘。 在狭窄领域数据集上微调现代通用模型,会将其参数推向你的领域,同时远离通用能力。针对参数量从 1B 到 7B 不等的模型的研究一致表明,狭窄领域微调后,通用推理任务上的准确率下降 15–25%。你的新医疗摘要模型在临床笔记上可能表现良好,但在其他所有任务上表现糟糕——这种退化不会出现在你的领域内评估套件中。

当团队做看似自然的事情时,问题会加剧:重用最好的领域示例。这里的精心筛选适得其反。高质量、高置信度的训练输出造成了推理时的分布不匹配。微调后的模型失去了使基础模型在生产中有用的不确定性表达和自我纠正行为。它学会了在你的筛选过程从未包含的输入上自信地犯错。

从收集输出中产生的分布偏移。 没有原始训练数据的团队通常通过对其历史输入集运行废弃的微调并收集输出来提取数据集。这可行,但会放大旧模型的系统性偏差。如果废弃的微调有某种失败模式——某类它处理不当的输入——你刚刚把那种失败模式标注进了新的训练集。你得到的是以更大置信度复制相同错误的新微调。

三条恢复路径

考虑到上述失败模式,实际恢复需要在三种根本不同的策略之间做出选择。正确的选择取决于你还能访问什么。

合成并蒸馏(废弃模型仍在运行)。 如果你在 OpenAI 的向后兼容窗口内,或正在运行自托管模型,最可靠的方法是通过合成数据生成进行行为蒸馏。生成一个覆盖你领域的大型多样化输入集——不仅仅是历史输入,还有变体、边界情况和相邻查询。对所有内容运行废弃的微调并收集其输出,包括在多个温度设置下的输出。温度变化捕获了近似模型不确定性分布的东西,而不仅仅是其点估计。

然后使用此合成数据集在新基础模型上训练 LoRA。关于 Trans-LoRA 技术的研究表明,即使只有五个种子示例,经过判别器过滤的合成数据集也能在异构模型家族之间实现无损迁移——Llama 2 到 Llama 3,Llama 到 Gemma。判别器步骤至关重要:它过滤掉落在你真正关心的分布之外的合成输出,防止"放大错误"问题。

从原始数据重新标注(仍有训练语料)。 如果你对微调数据集进行了版本控制但不再有废弃的模型,重新标注是最干净的路径。原始输入约束了分布;变化的是新模型从其自身能力生成新的输出。这通常意味着新的微调实际上比你要替换的更好——更新的基础模型有更强的先验,而重新标注迫使你审视原来的黄金标签是否真的正确。

这里的关键补充是混合。仅在领域数据上重新标注会重新制造灾难性遗忘问题。使用指令分布重建来生成合成的通用训练示例,与领域数据并排。关于 Llama-3-70B-Instruct 的研究表明,你可以恢复基础模型训练时的近似指令分布——编码、数学、推理、对话任务,比例真实——并以大约 30–50% 的体量将其与领域数据混合。这保留了使该模型值得微调的通用能力。

提示编码专业知识(微调风险超过收益)。 对于新基础模型比你微调的那个实质上更强的狭窄领域偏移,参数更新可能没有必要。提示级蒸馏从废弃的微调中提取推理模式和领域特定启发,并直接将它们编码在系统提示中。新模型通过上下文学习应用它们,而非权重更新。

这种方法的性能上限低于微调,但以该上限换来了对灾难性遗忘的完全规避,以及再次切换基础模型的完全灵活性。对于以六到十二个月为周期运营模型的团队,每个周期重新微调的累积成本是可观的。当领域偏移足够小时,提示编码打破了这种循环。

结构性修复:将微调视为版本化工件

在 2024 年 1 月废弃事件中受到最小影响的团队,并不是在恢复方面更出色——他们有不同的准备方式。区分他们的模式:

归档训练数据,而不仅仅是模型。 你无法从头重新训练的微调模型是一种负债。保留了带有适当版本控制的标注数据集的团队可以在几天内完成重新标注。没有这样做的团队不得不从零开始重建,或者接受上文所述的收集输出带来的风险。

描述微调的行为,而不仅仅是准确率。 在废弃迫使你行动之前,对广泛的评估集运行你的微调模型,包括领域外输入、触发不确定性的提示和故意模糊的案例。记录它做了什么,而不仅仅是它在目标任务上做得有多好。这个行为规范成为任何替代模型的验收测试。

明确验证校准。 领域评估上的准确率是必要的,但不充分。一个达到相同准确率分数但表达不当置信度的替代微调,在生产中更糟糕——它会悄无声息地失败,而不是将案例标记出来供人工审查。比较废弃模型和替代模型之间的不确定性输出分布,而不仅仅是答案准确率。

在过渡期间运行并行推理。 在可用时,同时将流量样本路由到旧的和新的微调。它们输出的差异是诊断信号。在特定输入集群上的高度差异意味着新模型没有捕获旧模型拥有的某种学到的行为——而那些集群正是你需要在切换前集中额外蒸馏或标注工作的地方。

十四个月的时钟

今天,模型废弃的平均时间线是从 GA 到下线六到十四个月。对于构建在封闭 API 模型上的生产微调,这意味着每年大约两个周期,你的微调要么顺利度过过渡,要么悄悄退化,要么完全崩溃。

这种复利效应被低估了。如果你微调一次,并在每次废弃时做好重新微调,你就能维持能力,并且随着更强基础模型的到来可能还会提升它。如果你微调一次,把每次废弃当作紧急情况处理,你就会积累技术债:未经充分测试的替代品、保留的失败模式、退化的校准。

实际含义是,微调策略和废弃策略需要一起设计。一个建立时有归档训练数据、有记录的行为预期、有经过测试的蒸馏路径的微调,并不比没有这些的微调昂贵多少——但它在十八个月内的预期价值要高得多。领域专业知识是可以恢复的。孤儿问题是一个规划问题,而不是技术问题。


2024年1月被坑的团队,大多只被坑了一次。2026年会被坑的是那些袖手旁观、认为不会发生在自己身上的人。

Let's stay in touch and Follow me for more thoughts and updates