如何合并大型语言模型?

2024年01月24日 由 alex 发表 411 0

模型合并是最近流行起来的一种新技术。它可以将多个模型合并为一个模型。这样做不仅能保证质量,还能获得额外的好处。新模型开始在任务中表现得更好,这一点在 Open LLM 排行榜上得到了清楚的证明:


4


在本文中,我们将探讨各种合并算法,研究如何实现这些算法,并深入探讨其工作原理。我们将通过示例展示如何使用 mergekit 工具包合并 Mistral、WizardMath 和 CodeLlama 等模型


合并算法


有多种合并模型的算法。其中很多都使用加权平均值的各种组合。不过,也有一些算法提出了不同的方法。在本文中,我将重点介绍一些我认为有趣的算法,并按照复杂度递增的顺序排列。


1. 任务矢量算术


这种方法引入了一种使用 "任务向量 "修改神经网络行为的新范式。这些向量代表了预训练模型权重空间的方向,指向特定任务中性能的提升。


可以通过求反和加法等算术运算来操作向量,从而有针对性地改变模型中的行为:


5


  • 否定法降低性能: 否定任务向量会降低模型在目标任务上的表现,同时保持其在控制任务上的行为。
  • 为提高多任务性能而添加: 添加任务向量可以同时提高模型在多个任务中的表现。
  • 类比任务改进: 结合相关任务的任务向量(基于类比关系),即使不使用第四项任务的数据,也能提高第四项任务的性能。


任务向量运算的优势:


  • 高效的模型编辑: 这种方法为编辑模型提供了一种简单而有效的方法,可提高性能、减少偏差并利用新信息更新模型。
  • 模型和任务的通用性: 该方法已被证明能很好地适用于各种模型和任务。


总之,基于任务矢量的模型编辑为控制和提高神经网络模型在各种任务中的性能提供了一种新颖、通用的方法。


2. SLERP


SLERP 解决了模型合并中传统权重平均法的局限性。它提供了一种更细致的方法,在高维空间中以保留每个父模型独特特征和曲率的方式混合模型。


SLERP 的优势:


  • 平滑过渡:确保参数过渡更平滑,这在高维向量插值中至关重要。
  • 保留特征:保留两个父模型的明显特征和曲率。
  • 细致混合:考虑矢量空间中的几何和旋转特性,使混合结果准确反映两个模型的特征。


SLERP 的实施步骤:


6


  • 归一化: 输入向量归一化为单位长度,侧重于方向而非大小。
  • 角度计算: 这些矢量之间的角度是通过它们的点积确定的。它根据插值因子和矢量间的角度计算比例因子。
  • 矢量称重和求和: 用这些因子对原始矢量进行权衡和求和,从而得到插值矢量。


SLERP 的特点是能够以参数之间平滑过渡的方式合并模型,并保留每个模型的独特特征,因此是复杂模型合并任务的首选方法。虽然 SLERP 在同时合并两个模型方面非常流行和有效,但它仅限于成对组合。


3. TIES


传统的模型合并方法面临着巨大的挑战,尤其是在处理不同模型参数之间的干扰方面。在合并多个模型时,这种干扰会导致性能大幅下降。


为了克服这些挑战,TIES 方法引入了三个步骤:


7


  1. 重置参数: 它可以重置在微调过程中仅发生微小变化的参数。这一步骤有助于减少冗余。
  2. 解决符号冲突: 它能解决因不同模型参数值符号不同而产生的冲突。
  3. 选择性合并: 只合并与最终商定的符号一致的参数。


事实证明,TIES-合并方法在各种情况下都优于现有的几种合并方法。它能有效解决干扰问题,尤其是符号干扰,从而提高合并模型的整体性能。


4. DARE


DARE 是一种无需再训练或 GPU 的新方法。它主要侧重于学习相似(同源)模型的参数,以获得新的能力。它采用的方法与 TIES 相似,但有两个主要区别:


  1. Delta 参数的修剪:通过将其设置为零来识别并消除大多数 Delta 参数(微调参数和预训练参数之间的差异)。此过程不会显着影响模型的功能。较大的模型可以丢弃较高比例的这些参数。
  2. 重新调整权重:包括一个重新调整权重的步骤,调整模型的权重以保持输出预期大致不变。这包括将重新调整后的模型权重添加到带有比例系数的基础模型权重。


该算法按以下步骤运行:


8


  • 剪枝:将微调后的权重重置为预先训练的原始值,减少不必要的参数变化。
  • 合并:平均多个模型的参数,创建一个统一的模型。
  • 重缩放:调整合并模型的权重,以保持其预期性能。


总之,DARE 提供了一种独特而高效的方法,通过有策略地剪枝和重新调整参数来合并语言模型,从而使模型具有更强和更多样化的功能,而无需进行大量的重新训练。


实施


为了合并模型,我们将使用 mergekit,这是一个专为合并预训练语言模型而设计的工具包。它支持上述所有算法,而且设置非常简单。模型合并只需 CPU 即可运行,但只需 8GB 的 VRAM 就能加快速度。


1. 安装 mergekit:


python3 -m pip install --upgrade pip
git clone https://github.com/cg123/mergekit.gitclone https://github.com/cg123/mergekit.git
cd mergekit && pip install -q -e .


2. 在 YAML 文件中编写合并配置:


我将把 LLM 与混合架构结合起来: Mistral-7b、WizardMath-7b 和 CodeLlama-7b。以下是我的 ultra_llm_merged.yaml 配置:


models:
  - model: mistralai/Mistral-7B-v0.1  # no parameters necessary for base model
  - model: WizardLM/WizardMath-7B-V1.0
    parameters:
      density: 0.5  # fraction of weights in differences from the base model to retain
      weight:   # weight gradient
        - filter: mlp
          value: 0.5
        - value: 0
  - model: codellama/CodeLlama-7b-Instruct-hf
    parameters:
      density: 0.5
      weight: 0.5
merge_method: ties
base_model: mistralai/Mistral-7B-v0.1
parameters:
  normalize: true
  int8_mask: true
dtype: float16


3. 运行合并:


mergekit-yaml ultra_llm_merged.yaml output_folder \
    --allow-crimes \ # Allow mixing architectures# Allow mixing architectures
    --copy-tokenizer \ # Copy a tokenizer to the output
    --out-shard-size 1B \ # Number of parameters per output shard
    --low-cpu-memory \ # Store results and intermediate values on GPU. Useful if VRAM > RAM
    --write-model-card \ # Output README.md containing details of the merge
    --lazy-unpickle  # Experimental lazy unpickler for lower memory usage


就是这样!现在,你可以部署该模型!


结论


我们已经探索了合并模型的主要可能性,并深入研究了几种算法的工作原理。我相信,在不久的将来,我们会看到越来越多的模型是通过合并创建的。这是一种无需微调就能将有用技能结合起来的经济有效的方法。

文章来源:https://medium.com/@slgero/merge-large-language-models-29897aeb1d1a
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消