模型合并:把多个模型的权重融成一个
为什么要把模型合并
当我们把同一个基座模型(base model)分别微调到不同的下游任务上,往往会得到一堆各有所长的检查点:一个擅长写代码,一个擅长数学推理,一个更懂医学问答。传统做法是把它们各自部署、按请求路由,或者在推理时做集成(ensemble)。但集成需要同时加载多个模型,显存和时延都会成倍上升;而分别部署又要维护多套服务。
模型合并(model merging)给出了一条更省心的路:不重新训练,只把多个模型的权重(参数张量)按某种算法在数值上融合,得到一个兼顾多项能力的新模型。合并后的模型大小与原模型一致,推理成本不变,却可能同时拥有被合并模型的多种能力。这条思路在实践中非常有价值,原因有三:其一,省算力,免去联合训练或多任务训练的高昂开销;其二,保留原模型的推理效率,不像集成那样要跑 N 个模型;其三,操作纯粹在权重空间进行,工具链简单,几行脚本就能完成。
需要强调的是,模型合并不是万能药。它依赖于一些前提条件,且能力之间可能相互抵消。理解它「能做什么、不能做什么」,比记住具体公式更重要。
任务算术 Task Arithmetic
任务算术由 Ilharco 等人在 2022 年提出,是后续许多合并方法的思想基石。它的核心概念是任务向量(task vector)。
给定一个预训练基座 theta_0,以及它在任务 A 上微调后的权重 theta_A,定义任务向量:
tau_A = theta_A - theta_0
也就是说,任务向量是「微调后权重」减去「基座权重」得到的差值,它编码了模型为了做好任务 A 而在权重空间里移动的方向与幅度。任务算术的妙处在于,这些向量可以像普通向量一样做加减:
- 加法(合并能力):theta_new = theta_0 + lambda * (tau_A + tau_B),让一个模型同时偏向任务 A 与任务 B;
- 取负(遗忘/去偏):theta_new = theta_0 - lambda * tau_toxic,可用于抑制毒性和不良行为;
- 类比:tau_C + (tau_B - tau_A),用 A 到 B 的关系去迁移到任务 C,甚至无需 C 的训练数据。
其中的 lambda 是缩放系数,控制干预强度,通常需要少量验证集来挑选。任务算术成立的关键观察是:从同一基座出发的微调模型,往往落在权重空间里一个「误差较低的平坦盆地」中,因此参数的线性叠加不至于把模型推离可用区域。
模型合并的直觉:把每个模型的权重看作高维空间里的一个点
基座模型 theta_0
任务 A 微调后 theta_A = theta_0 + tau_A (tau_A 即任务向量)
任务 B 微调后 theta_B = theta_0 + tau_B
任务算术合并:
theta_merge = theta_0 + lambda * (tau_A + tau_B)
模型汤合并:
theta_merge = (theta_A + theta_B + ... + theta_N) / N
SLERP 插值(两模型之间):
theta_merge = SLERP(theta_A, theta_B, t), t 取 0 到 1
模型汤 Model Soups
模型汤(Model Soups)由 Wortsman 等人在 2022 年提出,思路朴素却有效:用不同的超参数配置对同一基座做多轮微调,得到一组模型,然后直接对它们的权重取平均(算术平均),得到的结果往往比网格搜索里挑出的单个最优模型还要好。
之所以叫「汤」,是因为它把多份「食材」炖成一锅,而非每次只挑最好的一份。关键前提是被平均的模型来自相同的初始化(即同一基座、不同超参或不同随机种子),它们大概率落在同一个低误差盆地里,因此平均后的点依然在低误差区域。模型汤不增加任何推理或显存成本,却常能提升准确率与分布外鲁棒性。
模型汤和任务算术的区别在于:模型汤直接平均完整权重,而任务算术先减掉基座得到任务向量再做线性组合。模型汤更偏「同任务不同配置的平均」,任务算术更偏「跨任务能力的加减」。
SLERP 球面线性插值
当只想把两个模型平滑地融合时,最直接的做法是线性插值(linear interpolation):theta = (1 - t) * theta_A + t * theta_B。但权重向量通常很长,直接用线性插值可能穿过「效果很差」的中间区域。
SLERP(Spherical Linear Interpolation,球面线性插值)改在单位超球面上做插值:先把两个权重向量各自归一化到单位球面,再沿球面的大圆弧做等角速度插值,最后按原模长缩放回去。相比线性插值,SLERP 在两点之间走的是更「自然」的弧线,能更平稳地过渡到中间模型,常用于把两个风格或能力不同的模型做折中融合。它的主要限制是计算上比线性插值略重,且更常用于两两合并,对多模型场景扩展不如平均类方法直接。
TIES-Merging
前面几种方法在合并多个任务专用模型时,常常出现性能明显下降。TIES-Merging(Yadav 等人,2023)指出,问题在于参数之间的干扰,主要来自两类:其一是冗余参数,即微调中只变动了很小幅度的参数,对任务贡献不大却会引入噪声;其二是符号冲突,即不同模型在同一参数位上的更新方向(正负号)不一致。
TIES-Merging 用三步解决:
- Trim(剪枝):把每个任务向量里变动幅度小于某个阈值的参数置零,只保留真正重要的更新;
- Elect Sign(选定符号):对每个参数位,统计所有保留更新中正、负符号的多数方,作为该位置的最终符号;
- Merge(合并):只取与最终选定符号一致的那些参数值做加权平均,丢弃符号冲突的部分。
通过「先剪冗余、再决符号、最后只合并方向一致者」,TIES-Merging 显著缓解了多模型合并时的性能塌方。它可看作对任务算术的精细化改良,也是后续许多合并工具(如 mergekit)里的核心算法之一。
适用前提与局限
模型合并能成立,依赖几条硬前提:
- 架构与基座必须一致。被合并的模型必须来自同一个基座、同一套网络结构,参数张量要对位。不同架构或不同词表的模型无法逐元素相加。
- 能力之间尽量正交或互补。若两个任务高度冲突(例如一个学向左、一个学向右),它们的更新会相互抵消,合并后两边都变差。任务向量的余弦相似度低时更适合相加。
- 微调需从同一初始化附近出发。这样才能保证各模型落在相近的低误差盆地,平均或插值后不至于掉出可用区。
此外,合并通常无法凭空创造全新能力,只是把已有能力重新分配与折中。缩放系数 lambda、剪枝阈值、符号选举方式等都依赖少量验证数据来调,并非完全零成本。
与 MoE、持续训练的关系
容易混淆的三类思路可以这样区分:
- 与 MoE(Mixture of Experts)的区别:MoE 在结构上内置多个专家子网络加一个路由,推理时动态激活部分专家,是有额外结构、有训练成本的稀疏模型;模型合并则是把多个完整模型压成一个普通稠密模型,推理无路由、无额外参数。MoE 保留多专家并存,合并则是「炖成一锅」。
- 与持续训练(continual / multi-task training)的区别:持续训练是用数据反复更新同一个模型,会引入灾难性遗忘,且算力开销大;模型合并则用现成检查点做免训练融合,省去训练,但缺乏对数据分布的直接拟合。
- 互补关系:实际工程中常见组合打法,例如先用多任务或继续训练得到若干专长模型,再用 TIES-Merging、DARE 等把它们合并,兼顾效果与效率。
值得一提的是 DARE(Yu 等人,2023)这类思路:它把任务向量里大部分增量参数随机置零(drop)并按 1/(1-p) 重缩放(rescale),在几乎不损失能力的情况下大幅稀疏化,从而缓解多模型合并时的参数干扰。它常作为合并流程里的「预处理插件」使用。
小结
模型合并让我们得以在不重新训练的前提下,把多个微调模型的权重融合成一个能力更全面的模型。任务算术用任务向量做加减,模型汤用同初始化模型的权重平均,SLERP 在单位超球面上做两两插值,TIES-Merging 则通过剪枝、符号选举与方向一致的加权平均来抑制干扰。它们的共同前提是架构与基座一致、能力尽量互补;代价是无法创造新能力、且需要少量验证数据调参。与 MoE、持续训练相比,合并胜在简单、省算力、推理零额外开销,是模型能力整合工具箱里性价比很高的一环。
参考与延伸阅读
- arXiv 2203.05482 —— Model Soups: Averaging Weights of Multiple Fine-Tuned Models Improves Accuracy without Increasing Inference Time(Wortsman et al., 2022, ICML)「已核验」
- arXiv 2212.04089 —— Editing Models with Task Arithmetic(Ilharco et al., 2022, ICLR 2023)「已核验」
- arXiv 2306.01708 —— TIES-Merging: Resolving Interference When Merging Models(Yadav et al., 2023, NeurIPS)「已核验」
- arXiv 2311.03099 —— Language Models are Super Mario: Absorbing Abilities from Homologous Models as a Free Lunch(DARE;Yu et al., 2023, ICML 2024)「已核验」