30秒快速回答

模型合并(Model Merging)是一种无需重新训练即可将多个微调后的AI模型「融合」成一个新模型的技术。 它直接操作模型的权重参数,通过数学方法将不同模型的能力叠加,得到一个兼具多个模型优势的新模型。相比传统微调和模型蒸馏,它的成本几乎为零,是开源社区2025-2026年最活跃的探索方向之一。

一句话价值:用零训练成本,把「擅长写代码的模型」和「擅长写中文的模型」合并成一个「擅长写中文代码」的模型。


1. 什么是模型合并?为什么需要它?

在开源AI生态中,经常出现这样的场景:HuggingFace 上有 A 模型擅长数学推理,B 模型擅长创意写作,C 模型指令遵循度很高。你作为开发者,想要一个同时具备这三种能力的模型,传统做法是:

  • 继续微调:在 A 模型上继续训练 B 的能力,但需要算力和数据,且容易「灾难性遗忘」
  • 模型蒸馏:用多个教师模型训练学生模型,但流程复杂、计算成本高

模型合并给出了第三种答案:直接对权重做数学运算,把多个模型的「能力向量」叠加起来。

其核心假设来自线性模式连通性(Linear Mode Connectivity):在神经网络的损失函数空间中,两个独立微调得到的解之间存在低损失路径,对这些解的权重进行插值,往往能保留它们的能力。

方式 训练成本 数据需求 效果可控性 典型用时
继续微调 需要 中等 数小时~数天
模型蒸馏 中高 需要 较高 数小时
模型合并 不需要 视算法而定 数秒~数分钟

2. 三种主流合并算法

2.1 简单线性插值(Linear / SLERP)

最基础的做法:把两个模型的权重按比例相加。

merged_weight = α × model_A_weight + (1-α) × model_B_weight

球形线性插值(SLERP) 是升级版,它在高维球面上做平滑插值,避免简单线性插值导致的幅度衰减。适合合并同一基座模型上的两个微调变体。

# SLERP 合并伪代码
import torch

def slerp(t, v0, v1):
    """球面线性插值:在 v0 和 v1 之间按比例 t 插值"""
    omega = torch.arccos(torch.clamp(
        torch.dot(v0 / torch.norm(v0), v1 / torch.norm(v1)), -1, 1
    ))
    if omega < 1e-6:
        return (1 - t) * v0 + t * v1
    so = torch.sin(omega)
    return (torch.sin((1 - t) * omega) / so * v0 
            + torch.sin(t * omega) / so * v1)

2.2 TIES-Merging(解决参数干扰)

当合并3个以上模型时,简单加权会引入大量干扰。TIES-Merging(Trim, Elect Sign, Merge)分三步解决:

  1. Trim(修剪):只保留每个模型中变化幅度最大的 Top-K 参数,丢弃微小变化(视为噪声)
  2. Elect Sign(选举符号):统计每个参数在所有模型中的变化方向(正/负),按多数投票决定最终符号
  3. Merge(合并):只对符号一致且显著的参数做加权平均
TIES 核心思想:
┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  模型 A 权重  │    │  模型 B 权重  │    │  模型 C 权重  │
└──────┬──────┘    └──────┬──────┘    └──────┬──────┘
       │ 减基座模型        │                    │
       ▼                  ▼                    ▼
   任务向量 A          任务向量 B          任务向量 C
       │                  │                    │
       └──────────────────┼────────────────────┘
                          ▼
                  Trim(只保留 Top-K)
                          ▼
                  Elect Sign(投票决定方向)
                          ▼
                  Merge(加权平均)
                          ▼
                    最终合并模型

2.3 DARE(随机丢弃再合并)

DARE(Drop And REscale)的思路更激进:既然模型中大量微小的参数变化可能是冗余的,不如随机丢弃大部分任务向量中的参数,再把剩下的放大补偿

具体步骤:对每个模型的任务向量(微调后的权重减去基座权重),以概率 p(常用 0.9,即丢弃 90%)随机置零,再将保留的参数乘以 1/(1-p) 做缩放补偿,最后对多个模型做加权合并。

DARE 非常适合合并大量模型(5个以上),它的随机丢弃起到了类似 Dropout 的正则化效果,能有效抑制合并后模型在某个任务上过拟合。

算法 适用场景 核心技巧 模型数量上限
SLERP 合并2个同源模型 球面插值 2
TIES-Merging 合并3-5个模型 修剪+选举+合并 ~5
DARE 大规模多模型融合 随机丢弃+缩放补偿 10+

3. 实战:用 mergekit 合并模型

社区最成熟的合并工具是 mergekit(由 Charles Goddard 开发),被 HuggingFace 的 Open LLM Leaderboard 上大量模型使用。

# 安装
pip install mergekit

# 配置文件 merge_config.yml
models:
  - model: mistralai/Mistral-7B-v0.1        # 基座模型
  - model: teknium/OpenHermes-2.5-Mistral-7B # 通用对话能力
    parameters:
      weight: 0.5
  - model: WizardLM/WizardMath-7B-V1.1       # 数学推理
    parameters:
      weight: 0.5
merge_method: ties
base_model: mistralai/Mistral-7B-v0.1
parameters:
  normalize: true
  density: 0.5           # TIES 的 Top-K 密度
  weight_mask_apply: magnitude
dtype: float16

# 执行合并
mergekit-yaml merge_config.yml ./merged-model --cuda

合并完成后,就可以像普通模型一样加载使用:

from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("./merged-model")
tokenizer = AutoTokenizer.from_pretrained("./merged-model")

4. 模型合并的局限与边界

尽管模型合并很强大,但它并不是「万能融合器」:

  • 同架构限制:被合并的模型必须有相同的网络结构(层数、隐藏维度、注意力头数等),通常要求来自同一个基座模型
  • 能力冲突:某些能力天然互斥,例如「创造力」和「事实精确性」合并后可能两者都变差
  • 评估困难:合并效果缺乏统一的自动化评估标准,很多时候靠人工评测
  • 天花板效应:合并不能突破各源模型的能力上限,它只是重新组合已有能力

经验法则:如果两个模型的能力是「互补」的(如编码+中文、数学+指令遵循),合并效果通常较好;如果是「互斥」的(如安全+越狱),强行合并往往有害。


总结

模型合并在2026年已经成为开源AI模型生态的「标配」技术。它让开发者可以像搭积木一样组合模型能力,无需高昂的训练成本。核心方法从简单的 SLERP 到更精细的 TIES-Merging、DARE,逐步解决了多模型合并时的参数干扰和冗余问题。

延伸阅读建议

  • mergekit 官方文档:了解更详细的配置和高级合并策略
  • TIES-Merging 论文:深入理解修剪和选举的数学原理
  • HuggingFace Open LLM Leaderboard:浏览排行榜上合并模型的实际表现
  • diosblog 相关文章:什么是模型蒸馏? | 怎么微调 AI 模型? (内容由AI生成,仅供参考)