EN

AI模型融合:SLERP、TIES、DARE与模型汤技术

无需额外训练,组合多个微调模型以创建更优模型

返回教程列表🌐 Read in English
高级28 分钟

AI模型融合:SLERP、TIES、DARE与模型汤技术

无需额外训练,组合多个微调模型以创建更优模型

模型合并把多个微调模型融合成一个,无需重训。基于 mergekit:linear/SLERP/TIES/DARE/task-arithmetic 等方法原理、真实 YAML 配置与适用场景。

模型融合(Model Merging)是一种在不增加推理成本的前提下,将多个预训练语言模型的能力合并到单一模型中的技术。与集成学习(Ensembling)需要同时运行多个模型不同,融合后的模型仅需一次前向传播,却能继承多个源模型的专长。arcee-ai/mergekit 是目前最主流的开源融合工具,支持从简单的加权平均到复杂的稀疏化合并等多种算法。

核心概念:任务向量(Task Vector)

理解大多数高级融合方法(TIES、DARE、Task Arithmetic)的关键在于“任务向量”。对于一个基础模型 θ_base 和在其上微调得到的模型 θ_finetuned,任务向量定义为:


τ = θ_finetuned - θ_base

这个向量捕捉了微调过程带来的参数变化方向与幅度。融合多个模型,本质上就是组合这些任务向量,再叠加回基础模型。

主流融合方法详解

#### 1. Linear(线性融合)

最简单的融合方法,直接对多个模型的对应参数进行加权平均。


θ_merged = Σ w_i * θ_i

适用场景

  • 融合同一模型的不同训练检查点(Model Soup)
  • 合并结构完全相同的模型
  • 注意事项

  • 所有权重必须非负且总和为 1
  • 对参数分布差异大的模型效果较差
  • mergekit YAML 配置示例

    yaml
    merge_method: linear
    models:
      - model: path/to/model1
        parameters:
          weight: 0.5
      - model: path/to/model2
        parameters:
          weight: 0.3
      - model: path/to/model3
        parameters:
          weight: 0.2
    dtype: bfloat16
    

    #### 2. SLERP(球面线性插值)

    SLERP 在参数空间的球面上进行插值,保持参数向量的范数,避免线性插值可能导致的“坍缩”问题。它只能用于两个模型的融合。

    
    θ_merged = sin((1-t)*Ω)/sin(Ω) * θ_1 + sin(t*Ω)/sin(Ω) * θ_2
    
    其中 Ωθ_1θ_2 之间的夹角,t 是插值系数(0 到 1)。

    适用场景

  • 在两个差异较大的模型间平滑过渡
  • 需要保持参数几何特性的场景
  • 注意事项

  • 需要指定 base_model(通常为 θ_1
  • 计算开销比 Linear 大
  • mergekit YAML 配置示例

    yaml
    merge_method: slerp
    base_model: path/to/base_model
    models:
      - model: path/to/model1
        parameters:
          t: 0.7
      - model: path/to/model2
    parameters:
      t:
        - filter: self_attn
          value: 0.3
        - filter: mlp
          value: 0.5
        - value: 0.4  # default
    dtype: bfloat16
    

    #### 3. Task Arithmetic(任务算术)

    将多个任务向量线性组合后加回基础模型。

    
    θ_merged = θ_base + Σ λ_i * τ_i
    

    适用场景

  • 合并多个在不同任务上微调的模型
  • 需要精确控制每个任务贡献度的场景
  • 注意事项

  • 必须指定 base_model
  • 缩放因子 λ 通常取 0.3-0.5
  • mergekit YAML 配置示例

    yaml
    merge_method: task_arithmetic
    base_model: path/to/base_model
    models:
      - model: path/to/math_model
        parameters:
          weight: 0.4
      - model: path/to/code_model
        parameters:
          weight: 0.3
      - model: path/to/chat_model
        parameters:
          weight: 0.3
    dtype: bfloat16
    

    #### 4. TIES(Trim, Elect Sign, and Merge)

    TIES 在 Task Arithmetic 基础上增加了两个关键步骤:

  • 修剪(Trim):只保留每个任务向量中幅度最大的 top-k% 参数(默认 20%)
  • 符号选举(Elect Sign):对每个参数位置,统计所有任务向量中保留参数的符号,取多数符号作为最终方向
  • 合并(Merge):只对与选举符号一致的任务向量进行平均
  • 适用场景

  • 合并大量(>3个)模型时减少参数冲突
  • 需要消除任务向量间的干扰
  • 注意事项

  • density 参数控制保留比例,过低会丢失信息,过高则退化为 Task Arithmetic
  • 对参数符号一致性要求高的场景效果显著
  • mergekit YAML 配置示例

    yaml
    merge_method: ties
    base_model: path/to/base_model
    models:
      - model: path/to/model1
        parameters:
          weight: 1.0
      - model: path/to/model2
        parameters:
          weight: 1.0
      - model: path/to/model3
        parameters:
          weight: 1.0
    parameters:
      density: 0.2  # 保留 20% 的参数
      normalize: true
    dtype: bfloat16
    

    #### 5. DARE(Drop And REscale)

    DARE 采用随机丢弃策略:对每个任务向量,随机丢弃大部分参数(通常 90%-99%),然后对剩余参数进行缩放以保持期望值。

    
    τ'_i = (τ_i * mask_i) / (1 - drop_rate)
    

    DARE 有两种变体:

  • dare_linear:直接对丢弃后的任务向量做线性组合
  • dare_ties:在 DARE 丢弃后,再应用 TIES 的符号选举机制
  • 适用场景

  • 任务向量中存在大量冗余参数时
  • 需要保留多个模型的关键能力同时减少干扰
  • 注意事项

  • drop_rate 通常设为 0.9,过低会引入噪声,过高会丢失信息
  • 与 TIES 相比,DARE 更激进地丢弃参数
  • mergekit YAML 配置示例

    yaml
    merge_method: dare_ties
    base_model: path/to/base_model
    models:
      - model: path/to/model1
        parameters:
          weight: 1.0
      - model: path/to/model2
        parameters:
          weight: 1.0
    parameters:
      density: 0.1  # 保留 10% 的参数(drop_rate=0.9)
      normalize: true
    dtype: bfloat16
    

    #### 6. Passthrough(直通)

    直接从一个模型中复制指定层,不进行任何融合。用于构建“弗兰肯模型”(Frankenmerging),即从不同模型中拼接层。

    适用场景

  • 替换模型的某些层(如将 Llama 的 MLP 层替换为 Mistral 的)
  • 构建非标准架构的实验性模型
  • 注意事项

  • 需要确保层维度匹配
  • 通常与 slices 配置配合使用
  • mergekit YAML 配置示例

    yaml
    merge_method: passthrough
    slices:
      - sources:
          - model: path/to/model1
            layer_range: [0, 16]
      - sources:
          - model: path/to/model2
            layer_range: [16, 32]
    dtype: bfloat16
    

    实战建议

  • 模型选择:确保所有源模型使用相同的 tokenizer 和架构。如果 tokenizer 不同,需在配置中指定 tokenizer_source: union 合并词汇表。
  • 参数调优
  • - 从 Linear 或 Task Arithmetic 开始,快速验证融合效果 - 如果模型间冲突明显(如输出质量下降),尝试 TIES 或 DARE - 使用 mergekit-evolve 进行进化搜索自动寻找最优参数

  • 常见陷阱
  • - 融合后模型输出重复或空白:检查 tokenizer 配置,确保特殊 token 正确映射 - 性能下降:降低融合权重或增加 density 参数 - 显存不足:使用 --cuda--lazy-unpickle 选项,mergekit 支持 8GB 显存运行

  • 评估:融合后的模型必须经过充分评估。推荐使用 lm-evaluation-harness 进行标准化测试,同时进行人工评估检查生成质量。
  • FAQ

    Q: 融合后的模型是否需要重新训练? A: 不需要。融合直接在权重空间操作,无需额外训练。但如果融合效果不理想,可以尝试在融合模型基础上进行少量微调。

    Q: 融合两个不同大小的模型(如 7B 和 13B)是否可行? A: 不可行。mergekit 要求所有源模型具有完全相同的架构和参数维度。不同大小的模型无法直接融合。

    Q: TIES 和 DARE 哪个更好? A: 没有绝对优劣。TIES 通过符号选举减少冲突,适合参数符号一致性高的场景;DARE 通过随机丢弃消除冗余,适合任务向量稀疏的场景。建议两者都尝试。

    Q: 融合后的模型能否商用? A: 取决于源模型的许可证。如果所有源模型都允许商用(如 Apache 2.0),融合模型通常也可商用。但需检查每个模型的许可证条款。

    Q: 如何选择融合权重? A: 可以从等权重开始,然后根据下游任务表现调整。对于 Task Arithmetic 类方法,权重通常设为 0.3-0.5;对于 Linear,权重总和必须为 1。

    *最后更新:2026 年 7 月。请以各工具官方文档为准。*

    所属主题:模型微调与训练