模型合并是一种将两个或多个大型语言模型(LLM)组合成单个模型的技术。这是一种相对较新且具有实验性质的方法,可以低成本创建新模型(无需 GPU)。模型合并在效果上出奇地好,并在 Open LLM Leaderboard上创造了许多先进的模型。
Mergekit是一个可以用来合并LLM的库。在github上可以找到:https://github.com/arcee-ai/mergekit
接下来,咱们就介绍Mergekit中的算法。
合并算法
我们将重点介绍目前在 mergekit 中实现的四种方法。请注意,还有其他方法存在,例如线性合并和任务算术合并 (Task Arithmetic)。如果您有兴趣阅读关于模型合并的论文,我推荐 Hugging Face 上的这个优秀合集[2]。
SLERP
球面线性插值 (SLERP) 是一种平滑地在两个向量之间进行插值的方法。它保持恒定的变化率并保留向量所处球面空间的几何特性。
相较于传统的线性插值,选择 SLERP 有以下几个原因:
-
在高维空间中,线性插值会导致插值后向量幅值减小(即,它会缩小权重的量级)。
-
此外,权重的方向变化通常代表着更有意义的信息(例如特征学习和表示),胜过单纯对幅值的改动。
SLERP 的实现步骤如下:
-
将输入向量标准化为单位长度,确保它们代表的是方向而非幅值。
-
-
如果向量近似共线,则出于效率考虑,SLERP 会退回到使用线性插值。否则, SLERP 会基于插值因子 t(t = 0 表示 100% 取自第一个向量,t = 1 表示 100% 取自第二个向量) 和向量之间的夹角来计算缩放因子。
-
这些缩放因子用于加权原始向量,然后将加权后的向量相加,得到最终的插值向量。
SLERP 是目前最流行的合并方法,但它一次只能组合两个模型。当然,依然可以通过层级结构组合多个模型,例如 Mistral-7B-Merge-14-v0.1 中就展示了这种方式。
TIES
TIES-Merging 方法由 Yadav 等人的 这篇论文:
TIES-Merging: Resolving Interference When Merging Models
[3] 提出,旨在将多个针对特定任务的模型有效地合并为单个多任务模型。它解决了模型合并中的两个主要挑战:
-
模型参数冗余:TIES-Merging 能够识别并消除任务特定模型内的冗余参数。聚焦于模型微调期间所做的变更,识别其中变化幅度最大的前 k% 参数,并将其余参数舍弃。
-
参数正负号冲突:当不同的模型对同一参数提出相反方向的调整建议时就会出现冲突。TIES-Merging 通过创建一个统一的正负号向量来解决这些冲突,该向量代表了所有模型中最主要的变化方向。
TIES-Merging 可分为以下三个步骤:
-
修剪(Trim):仅保留一小部分 最重要的参数(通过密度参数控制),并将其余参数重置为零,从而减少任务特定模型中的冗余。
-
选定正负号(Elect Sign):根据累积变化幅度中最主要的方向(正或负),创建一个统一的正负号向量,以此解决不同模型之间的正负号冲突。
-
不重叠合并(Disjoint Merge):对与统一正负号向量保持一致的参数值进行平均,同时排除零值。
与 SLERP 不同,TIES 可以一次性合并多个模型。
DARE方法
DARE 方法由Yu(
Language Models are Super Mario: Absorbing Abilities from Homologous Models as a Free Lunch
[4]) 等人在2023年提出,它采用了一种与TIES相似的方法,但有两个主要区别:
-
剪枝:DARE随机地将微调后的权重重置为它们的原始值(即基础模型的权重)。
-
重缩放:DARE对权重进行重缩放,以保持模型输出的预期值大致不变。它使用一个缩放因子,将两个(或更多)模型经重缩放后的权重添加到基础模型的权重中。
Mergekit 库对 DARE 方法的实现提供了两种方式:包含 TIES 的正负号选定步骤(dare_ties)或不包含(dare_linear)。
你可以在 Hugging Face Hub 的 mlabonne/Daredevil-7B 上找到 DARE 模型。它也是本文中表现最好的合并模型,甚至超过了 Marcoro14-7B-slerp。
直通合并(Passthrough)
直通合并方法与之前介绍的方法有显著的不同。它通过串联不同大型语言模型(LLM)中的层来创建模型,可以生成具有独特参数量级的模型(例如,用两个 70 亿参数的模型组合出 90 亿参数的模型)。这类模型常被社区戏称为 "frankenmerges" (科学怪人合并)或 "Frankenstein models" (弗兰肯斯坦模型)。
这种技术仍处于高度实验阶段,但它已经成功构建出一些令人印象深刻的模型,例如由两个 Llama 2 70B 模型组合而成的 goliath-120b。最近发布的 SOLAR-10.7B-v1.0 也运用了同样的思路,在他们的论文(
SOLAR 10.7B: Scaling Large Language Models with Simple yet Effective Depth Up-Scaling
[5])中被称为 "depth-up scaling" (深度扩展)。