模型融合与组合
把两个微调模型的权重平均一下,常常得到一个两件事都能干的模型。效果好得出人意料,而没有人完全说得清为什么。
拿两个从同一底座微调出来的模型——一个做摘要,一个做分类。把它们的权重逐元素平均。
结果往往两件事都做得不错。不用训练,不用数据,几分钟的算术。
这件事按理说不该这么好使,而它偏偏好使,这本身就说明了微调是怎么改变模型的。
为什么它居然有效
解释的落脚点是模型共享同一个底座。从同一个起点微调,权重移动的距离相对较短;起点相同的模型倾向于待在同一片连通的权重空间区域里,插值在那里仍然讲得通。
把两个从不同初始化训练出来的模型融合,你得到的只是噪声。共同的血统才让平均有意义——两组权重描述的是同一个解的变体,而不是两个不相干的解。
方法
线性平均。 对相应参数取加权平均。最简单,效果比预期好,是应该先试的方法。
任务算术是更有启发性的框架。把任务向量定义为一个微调模型与其底座之差——也就是微调带来的变化。这些向量的行为有点像是可以相加相减的方向:
- 把两个任务向量加到底座上 → 得到一个两种能力兼具的模型
- 减去一个任务向量 → 压制那种行为
- 缩放一个向量 → 把某项能力调高或调低
这种表现确实出人意料,而且没有被完全解释清楚。但它有用,也把融合重新定义成了对变化做算术,而不是对模型做算术。
TIES 融合处理的是相互干扰。当多个任务向量在某个参数的方向上不一致时,朴素平均会把两边的贡献都抵消掉。TIES 先裁掉小幅变化,再用多数表决解决符号冲突,只对取向一致的成分做平均。融合多个模型时,它一般比朴素平均更好。
DARE 随机丢掉很大一部分任务向量条目,再把剩下的重新缩放,依据是大部分变化其实是冗余的。它常常能和其他方法叠加。
SLERP 沿球面路径而非直线插值,能更好地保持权重的模长。通常用于刚好两个模型的融合。
什么场景下有用
不重新训练就组合能力。 最主要的实用场景:把几个各自专精的微调模型融合成一个可部署的模型,省下同时服务好几个的成本。
找回通用能力。 把一个微调过度的模型往底座方向融合,可以恢复因灾难性遗忘丢掉的通用能力,同时保住大部分任务收益。这是过度微调的廉价补救。
平均检查点。 把同一次训练的几个检查点融合起来,常常胜过其中任何一个,而且零成本。
在社区微调之上再走一步。 开放权重模型发布里有相当一部分是融合产物,而不是从零训练出来的——评估它们时这一点值得知道。
局限
同架构、同底座。 没有商量余地。不同的模型家族没法融合。
质量不可预测。 有时融合结果胜过两个父模型,有时比两者都差。几乎没有理论能预测是哪种,所以只能靠实验——融合、评测、调权重、重复。好在足够便宜,试错是行得通的。
数量越多,干扰越大。 融合两个通常没问题。融合八个往往全面退化,因为任务向量之间的冲突越来越多。
不会产生新能力。 融合只是重新分配已有的东西,造不出两个父模型都没有的能力。
MoE 不是这个。 专家混合是在推理时在若干参数集合之间路由,让它们保持分离;融合则事先把它们压成一组。机制不同,代价也不同——融合不增加推理开销,MoE 不产生相互干扰。
实操要点
什么都要评,别只评融合的那几项任务。 通用能力退化是最常见的意外,而如果你只测融合的目标,它根本不会显形。
先从两个模型加简单平均开始。 失败了再上复杂方法。
融合 LoRA 适配器还要便宜——它们很小,适配器算术是同一个思路,只是规模小得多。
要点回顾
- 融合平均的是共享同一底座的模型的权重;共同血统才让它讲得通。
- 任务向量(微调模型减底座)可以相加、相减、缩放——出人意料,也没有完全解释清楚。
- TIES 和 DARE 处理相互冲突的变化之间的干扰;朴素平均是该先试的。
- 适合组合微调模型、找回被遗忘的通用能力、平均检查点。
- 质量不可预测,融合的模型越多干扰越大——评测要铺开。
下一篇: 混合检索