在大规模预训练模型普及之后,如何在低成本下复用多个已经微调好的模型成为工程与研究的焦点。模型合并尝试在参数层面直接融合不同模型,而不是通过集成推理或重新训练。其核心假设是:对于同一预训练初始化产生的多个微调模型,它们在权重空间中往往位于同一个低损失区域,通过对权重向量进行插值或算术操作,可以得到兼具多个模型能力的新参数。

这种做法的优势十分明显:推理阶段只运行一个模型,参数规模不变,也不引入额外延迟;同时不需要访问原始训练数据,规避了数据隐私与存储成本。接下来从模型合并的动机开始,逐步拆解Model Soup与Task Arithmetic两种代表性方法。
一、模型合并的动机与核心思想
传统的多模型融合通常依赖集成学习,例如对多个模型的输出概率取平均,或者在推理时进行投票。集成虽然稳定,但计算量与显存占用会随模型数量线性增长,不利于部署。权重平均则不同,它直接把多个模型的参数按一定规则相加或相加后归一化,得到一个单一模型。由于神经网络推理只使用一组参数,因此推理成本与单个模型完全相同。
权重平均的可行性建立在损失景观的几何特性上。许多研究表明,现代深度网络在训练后往往收敛到宽阔的平坦区域,而不是尖锐的极小值点。如果两个模型来自相同的预训练初始化,并且微调过程没有偏离太远,那么这两个参数点之间的连线路径上,损失值通常不会剧烈上升。这意味着参数插值后的模型仍然可能保持较低损失,甚至获得更好的泛化能力。
不过,模型合并并非万能。不同初始化、不同优化轨迹或差异过大的模型之间进行平均,可能会落入损失景观中的高损失区域,导致性能崩溃。因此,模型合并方法通常要求模型具备共同的初始参数,并且微调数据的分布差异处于可控范围。这也是Model Soup与Task Arithmetic等方法在设计时首先考虑的前提。
二、Model Soup:权重空间中的模型集成
Model Soup由Wortsman等人提出,最初应用于CLIP视觉模型的微调。其思路非常直观:对多个独立微调模型的权重做逐元素平均,得到一锅模型汤。根据平均方式不同,可以分为直接平均、均匀Soup与贪心Soup。直接平均即对所有模型权重求算术平均;均匀Soup则在平均前对各模型施加不同系数,最后归一化;贪心Soup从最优模型开始,不断尝试按顺序加入其他模型,只要验证集精度上升就保留新的平均结果。
与预测概率集成相比,Model Soup在推理时只加载一组参数,因此可以实现与单模型相同的速度。论文实验显示,即使微调模型使用了不同的超参数,如学习率、数据增强、随机种子等,这些模型的权重平均后往往也能取得超过单个最佳模型的准确率,同时提升分布外鲁棒性。这说明模型汤不仅是对参数的简单折中,还能借助损失景观的平坦性吸收不同训练轨迹带来的多样性。
实现Model Soup的代码并不复杂。下面给出一个最基础的均匀平均示例,假设所有模型结构完全相同:
import torch
def uniform_soup(models, weights=None):
if weights is None:
weights = [1.0 / len(models)] * len(models)
state_dict = models[0].state_dict()
for key in state_dict:
weighted_sum = None
for w, model in zip(weights, models):
param = model.state_dict()[key].float()
if weighted_sum is None:
weighted_sum = w * param
else:
weighted_sum += w * param
state_dict[key] = weighted_sum
return state_dict
这里为了清晰省略了设备转移与参数恢复,实际使用时应将所有权重移动到同一设备,并在加载前保证键名一致。贪心Soup需要在验证集上逐次评估,代码会更长,但核心仍是逐步添加候选模型并检查指标。
三、Task Arithmetic:用任务向量编辑模型行为
Task Arithmetic源自任务向量的概念。给定一个预训练模型权重θ_pre和一个在特定任务上微调后的权重θ_ft,任务向量定义为两者的逐元素差:τ = θ_ft - θ_pre。这个向量编码了从预训练状态到该任务能力的变化方向和幅度。通过将任务向量加到另一个模型上,可以为其添加对应任务能力;减去任务向量,则可以削弱甚至删除某些行为。
例如,在图像分类中,如果想合并两个微调模型A和B,可以分别计算任务向量τ_A和τ_B,然后用θ_new = θ_pre + α·τ_A + β·τ_B生成新权重。系数α和β控制每个任务的贡献强度,通常需要根据目标验证集进行调整。这种加性组合可以在一定程度上实现多任务能力的叠加,而不需要联合训练。
下面是任务向量组合的简单代码:
import torch
def combine_task_vectors(pretrained, finetuned_dicts, scales):
tv_list = []
for ft in finetuned_dicts:
tv = {k: ft[k] - pretrained[k] for k in pretrained}
tv_list.append(tv)
merged = {}
for k in pretrained:
val = pretrained[k].clone()
for tv, s in zip(tv_list, scales):
val = val + s * tv[k]
merged[k] = val
return merged
Task Arithmetic的优势在于控制粒度更细,可以通过改变系数实现从单任务到多任务之间的平滑过渡。不过该方法对任务向量质量要求较高,如果不同任务的任务向量方向冲突,直接相加可能导致负迁移。研究者提出了多种改进,例如对任务向量做剪枝,只保留幅度较大的参数变化,或对符号一致性进行筛选,以降低干扰。
四、两者对比与工程实践建议
Model Soup与Task Arithmetic虽然都属于权重平均范畴,但核心差异明显。Model Soup平均的是完整微调模型权重,更侧重于同任务下多个模型之间的稳定性与精度提升;Task Arithmetic则利用预训练模型作为锚点,对任务向量进行加减,更适合跨任务的编辑与组合。前者相当于在多个微调解之间寻找一个折中解,后者则试图把不同的能力增量线性叠加到基准模型上。
在实际工程中使用模型合并时,有几个关键点需要特别注意。首先,所有待合并模型必须共享相同的网络结构与预训练初始化,否则权重键和参数空间不匹配,直接相加没有意义。其次,微调过程应尽量温和,例如使用较小的学习率、较少的微调轮数,避免权重偏离预训练锚点过远。第三,平均或合并后应在目标验证集上进行评估,必要时搜索最优的缩放系数。对于Task Arithmetic,可以先做任务向量幅度裁剪,去掉噪声分量后再组合。
此外,模型合并并不能完全替代多任务训练或专门的模型融合技术。在任务差异较大或数据分布冲突时,直接权重平均可能会产生明显的性能下降。此时可以考虑只在部分层上进行合并,例如冻结底层、仅平均分类头或某些中间层,或者使用更复杂的合并策略,如基于Fisher信息的加权平均、子空间匹配等。总体上,将模型合并作为快速原型验证和推理部署优化手段,往往能以很低成本获得可观的收益。
模型合并权重平均Model Soup修改时间:2026-08-27 06:33:34