AB
AiBoss
Wiki

什么是模型合并(Model Merging)?

模型合并(Model Merging)是一种在权重空间直接组合多个已训练模型、无需额外训练即可得到多任务模型的技术。它把多个任务专用微调模型合成一个通用模型,推理成本与单个模型相当。本文介绍其动机、工作机制、TIES-Merging 与 mergekit 等实例,以及边界与常见误解。

模型合并(Model Merging)是一种在模型权重空间直接对多个已训练模型进行组合、从而得到一个多任务模型的技术,整个过程不需要额外的训练。它要解决的问题是:迁移学习带来了大量任务专用微调模型,而每个模型通常只能完成单一任务、彼此之间无法互相受益;模型合并试图把这些分散的能力汇集到一个模型里。

为什么重要

按照 arXiv 论文《TIES-Merging: Resolving Interference When Merging Models》的描述,迁移学习——也就是在下游任务上进一步微调预训练模型——能带来显著优势,包括更好的下游表现、更快的收敛以及更高的样本效率。这些优势导致任务专用微调模型大量涌现,但它们通常只能执行单一任务,且不能从彼此受益。

在此背景下,模型合并技术作为解决方案出现:把多个任务专用模型组合成一个多任务模型,而不进行额外训练。然而该论文指出,已有的合并方法往往忽略不同模型参数之间的干扰,在合并多个模型时会造成较大的性能下降。

与传统的集成(ensembling)相比,模型合并的差别在于成本结构。mergekit 的官方文档称,传统集成需要同时运行多个模型,而合并后的模型保持与单个模型相同的推理成本,同时往往能达到相当甚至更好的表现。该文档还列举了在权重空间直接操作的若干用途:把多个专用模型组合成一个多用途模型、在没有训练数据的情况下在模型之间迁移能力、在不同模型行为之间寻找最优权衡、在保持推理成本的前提下提升表现,以及通过有创意的模型组合创造新能力。

工作机制

模型合并的核心做法是不触碰训练流程,而是直接对已训练模型的参数(权重)做算术或结构化组合。围绕这一核心,不同方法在细节上差异很大。

论文提出的 TIES-Merging 方法(全称 TRIM, ELECT SIGN & MERGE)给出了一个分三步的流程,用来处理合并中的干扰问题:

  1. 裁剪(Trim):重置那些在微调过程中只发生了很小变化的参数。论文认为,这类冗余参数值是干扰的来源之一。
  2. 选举符号(Elect Sign):解决符号冲突。论文指出,不同模型对同一个参数取值正负号的不一致,是另一大干扰来源。
  3. 合并(Merge):只合并那些与最终达成一致的符号相符的参数。

论文称,TIES-Merging 在覆盖多种模态、领域、任务数量、模型规模、架构和微调设置的多样场景中,优于若干已有方法;论文还分析了不同类型干扰对模型参数的影响,并强调解决符号干扰的重要性。

在工具层面,mergekit 是一个用于合并预训练语言模型的工具箱。其官方文档称,它采用 out-of-core(核外)的方式,以便在资源受限的情况下执行相当复杂的合并:合并可以完全在 CPU 上运行,也可以在显存低至 8 GB 的情况下加速执行。文档列出的特性包括:支持 Llama、Mistral、GPT-NeoX、StableLM 等模型;支持多种合并方法;支持 GPU 或 CPU 执行;通过张量惰性加载降低内存占用;受 Gryphe 的 BlockMerge_Gradient 脚本启发的参数插值梯度;按层拼装语言模型的「Frankenmerging」;专家混合(Mixture of Experts)合并;LoRA 抽取;进化式合并方法;用于复杂工作流的多阶段合并;以及对原始 PyTorch 模型的合并。

mergekit 的主入口脚本是 mergekit-yaml,它接收一个 YAML 配置文件和一个输出路径,例如 mergekit-yaml path/to/your/config.yml ./output-model-directory,并可附加 --cuda、--lazy-unpickle 等选项。

典型例子

素材中出现过若干具体对象,可作为理解模型合并的实例。

  • TIES-Merging:论文提出的合并方法,作者为 Prateek Yadav、Derek Tam、Leshem Choshen、Colin Raffel、Mohit Bansal,论文发表于 NeurIPS 2023,共 23 页、13 幅图、14 张表。论文摘要称其代码已公开。
  • mergekit:arcee-ai 维护的模型合并工具箱,仓库中可见 311 次提交,文档中列出的合并方法涵盖 LoRA 抽取、专家混合合并、进化式合并方法、多阶段合并(mergekit-multi)、原始 PyTorch 模型合并(mergekit-pytorch)以及分词器移植(mergekit-tokensurgeon)。
  • FrankensteinAI:mergekit 文档提到,该团队构建了一个由 mergekit 驱动的托管平台,面向不希望做本地环境配置或硬件调试、偏好浏览器体验的用户,并提供社区画廊与排行榜,用于分享和比较合并后的模型。
  • BlockMerge_Gradient:mergekit 文档说明其参数插值梯度特性受 Gryphe 的该脚本启发。

边界与常见误解

首先需要区分模型合并与集成。mergekit 文档明确把两者对照:传统集成需要运行多个模型,而合并模型保持与单个模型相同的推理成本。因此「合并等于把多个模型一起跑」是一种常见误解。

其次,合并并不等于免费获得能力。TIES-Merging 论文的核心论点恰恰是:已有合并方法常常忽略参数间的干扰,在合并多个模型时会出现较大的性能下降。论文把干扰归为两类来源——冗余参数值造成的干扰,以及不同模型对同一参数取值符号的分歧。这说明合并的效果高度依赖方法选择,而不是任意权重相加都能奏效。

第三,关于「不需要训练」这一点需要限定范围。论文与 mergekit 文档所描述的是合并阶段不需要额外训练;被合并的模型本身仍然是经过预训练与微调的产物。mergekit 文档提到可以在没有训练数据的情况下在模型之间迁移能力,但这指的是合并过程本身不依赖训练数据,并不意味着模型能力凭空产生。

第四,资源需求存在下限。mergekit 文档称合并可以完全在 CPU 上运行,也可在低至 8 GB 显存的情况下加速,并采用张量惰性加载来降低内存占用;这些是工具层面的工程约束,具体到不同规模模型与不同合并方法,实际开销会不同。

最后,关于效果的主张应归于提出者。TIES-Merging 优于若干已有方法的结论来自该论文自身的实验设置;mergekit 关于合并模型「往往能达到相当甚至更好的表现」的表述来自其官方文档。这些都属于特定来源的说法,而非已被普遍验证的定论。

参考资料