大模型融合算法原理与 mergekit 工具实践
模型合并(Model Merging)是近年来兴起的一种新技术。它允许将多个预训练模型合并成一个模型,这样做不仅可以保持原有质量,还可以获得额外的好处。
假设我们有几个模型:一个擅长解决数学问题,另一个擅长编写代码。在两种模型之间切换是一个很麻烦的问题,但是我们可以将它们组合起来,利用两者的优点。而且这种组合的方法通常不需要额外的 GPU 微调即可完成推理能力的整合。
本文将介绍几种主流的合并算法,研究如何实现它们,并深入分析其工作原理。最后将使用 mergekit 工具演示如何合并 Mistral、Wizard Math 和 Code Llama 模型。
模型合并算法
有几种用于组合模型的算法。其中许多使用加权平均组合。但在本文中,我将重点介绍一些更高级的算法,并将它们按复杂度递增的顺序排列。
1. Task Vector
这种方法引入了一种使用'任务向量'(Task Vector)修改神经网络行为的方法。这些向量表示预训练模型权重空间中的方向,可以表示在特定任务上改进的性能。
向量可以通过算术运算来计算,比如加法或者减法,从而允许在模型中进行有针对性的行为改变。例如,将数学任务的向量加到基础模型上,可以提升数学能力。
Task Vector 提供了一种简单而有效的方法来编辑模型,从而实现性能改进、减少偏差和使用新信息更新模型。该方法已被证明可以很好地处理各种模型和任务,为控制和改进神经网络模型在各种任务中的性能提供了一种新颖而通用的方法。
2. SLERP
SLERP(Spherical Linear Interpolation,球面线性插值)解决了传统加权平均方法在模型合并中的局限性。它提供了一种更细致的方法,以一种保留高维空间中每个父模型的独特特征和曲率的方式混合模型。
SLERP 的优点:
- 平滑过渡:确保更平滑的参数过渡,在高维矢量插值中至关重要。
- 特征保存:保持两个父模型的不同特征和曲率。
- 细致的混合:考虑矢量空间中的几何和旋转属性,从而产生准确反映两种模型特征的结果。
SLERP 流程:
- 输入向量归一化为单位长度,关注方向而不是大小。
- 这些向量之间的角度是用它们的点积确定的。它根据插值因子和矢量之间的夹角计算尺度因子。
- 将原始向量与这些因子加权并求和,得到插值向量。
SLERP 能够以一种平滑地在参数之间转换的方式合并模型,并保留每个模型的独特特征,使其成为复杂模型合并任务的首选方法。尽管 SLERP 在同时合并两个模型方面很流行且有效,但它主要限于两两组合。
3. TIES
传统的模型合并在处理不同模型参数之间会获得不同的干扰。当合并多个模型时,这种干扰会导致性能的大幅下降,特别是符号冲突(Sign Conflicts)。
为了克服这些挑战,TIES(Trim, Merge, and Prune)方法引入了三个步骤:
- 重置:在微调期间只发生轻微变化的参数被重置,这一步有助于减少冗余。
- 解决冲突:解决了由于不同模型的参数值符号不同而产生的冲突,通过投票机制确定最终符号。
- 合并:只合并那些与最终商定的符号一致的参数。
TIES-Merge 方法已被证明在各种设置下优于几种现有的 merge 方法。它有效地解决了干扰问题,特别是符号干扰,增强了合并模型的整体性能。
4. DARE
DARE(Drop And REscale)不需要再训练或 GPU。它主要关注于学习类似(同源)模型的参数,它使用与 TIES 类似的方法,但有两个主要区别:
- Delta 参数的修剪:通过将它们设置为零来识别和消除大多数 Delta 参数(微调和预训练参数之间的差异)。这个过程不会显著影响模型的功能。较大的模型可以较大比例丢弃这些参数。
- 重缩放权重:增加了一个重缩放步骤,其中调整模型的权重以保持输出期望大致不变。这可以将模型的'大'比例权重添加到具有比例因子的基本模型的权重中。
算法的工作步骤如下:
- 修剪:将微调权重重置为原始预训练值,减少不必要的参数更改。
- 合并:将多个模型中的参数进行平均,以创建一个统一的模型。


