人类渴望通过接管得到额外能力的欲望由来已久。超级马里奥便是人类这一梦想的表示,它可以通过网络物品得到额外的技能,如投掷火球和暂时无敌。
假设有几个大措辞模型:一位善于办理数学问题,另一位善于编写代码。在两种模式之间切换可能会很麻烦,因此可以考虑将他们结合起来,充分利用多个模型的上风。
图源:旺知识

作者:张长旺,旺知识,CCF理论打算机科学专业委员会
模型合并是最近盛行起来的一种将两个或多个大措辞模型合并为一个模型的新技能。这是一种相对较新的实验性方法,它乃至不须要GPU,就可以廉价地创建新模型。模型合并的效果出人意料地好,并在OpenLLM排行榜上产生了许多最前辈的模型。
在本文中,我们将磋商各种合并算法,研究如何实现这些算法,磋商其事情事理,并供应配置示例。我们将通过示例展示如何利用 mergekit 工具包合并 Mistral、WizardMath 和 CodeLlama 等模型。我们将利用mergekit创建我们自己的模型Marcoro14-7B-slerp,这个模型在02/01/24是Open LLM排行榜上表现最好的7B模型。
1 - 大措辞模型领悟算法
有几种组合模型的算法。个中许多算法利用各种加权均匀值组合。不过,也有一些算法提出了不同的方法。本章,我们将重点先容一些我们认为有前景的大措辞模型领悟算法技能。
图源:旺知识
1.1 - 任务向量模型编辑(EMTA)
任务向量模型编辑 (Editing Models with Task Arithmetic, EMTA)引入了一种利用"任务向量"修正神经网络行为的新模式。这些向量代表了预演习模型权重空间的方向,指向特界说务中性能的提升。
向量可以通过否定和加法等算术运算进行操作,从而有针对性地改变模型的行为:
否定以降落性能:否定任务向量可降落模型在目标任务上的性能,同时保持其在掌握任务上的行为。增加任务向量以提高多任务性能:添加任务向量可以同时提高模型在多个任务中的表现。类比任务改进:结合干系任务的任务向量(基于类比关系),纵然不该用第四项任务的数据,也能提高第四项任务的性能。任务向量编辑模型运算解释。(a) 任务向量是通过将预演习模型的权重减去微调后同一模型的权重得到的。(b) 否定任务向量会降落任务性能,但掌握任务不会发生本色性变革。(c) 将任务向量添加到一起可提高预演习模型在所考虑任务上的性能。(d) 当任务形成类比关系时,例如在两个不同数据源上进行监督和非监督学习时,只需利用别的三种目标和数据集组合的向量,就有可能提高监督目标任务的性能。
通过否定遗忘图像分类任务。结果显示了 CLIP 模型在我们希望遗忘的八项目标任务(Cars、DTD、EuroSAT、GTSRB、MNIST、RESISC45、SUN397 和 SVHN)和掌握任务(ImageNet)上的均匀准确率(%)。在目标任务中,否定任务向量会使预先演习的 ViT-L/14 的准确率降落 45.8 个百分点,而在掌握任务中则险些没有丢失。
降落措辞模型对负任务向量的毒性。结果显示的是 GPT-2 Large 模型。负任务向量使有毒代的数量减少了 6 倍,同时在对照任务(WikiText-103)上产生了具有可比易错性的模型。
利用外部任务向量提高目标任务的性能。对付 GLUE 基准中的四个文本分类任务,添加从拥抱脸部集线器下载的任务向量可以提高微调 T5 模型的准确性。
利用任务类比提高领域泛化。任务类比利用了有标记数据的赞助任务以及来自赞助数据集和目标数据集的无标记数据,提高了多个 T5 模型和两个情绪剖析目标任务的准确性,而无需利用目标任务中的任何标记数据。
任务向量运算的上风:
高效的模型编辑:这种方法为编辑模型供应了一种大略而有效的方法,可提高性能、减少偏差并利用新信息更新模型。模型和任务的通用性:该方法已被证明能很好地适用于各种模型和任务。总之,基于任务向量的模型编辑为掌握和提高神经网络模型在各种任务中的性能供应了一种新颖、通用的方法。
参考资料:Editing Models with Task Arithmetic, ICLR 2023, https://arxiv.org/pdf/2212.04089.pdf
1.2 - 球面线性插值(SLERP)
球面线性插值(Spherical Linear Interpolation, SLERP)是一种用于在两个向量之间平滑插值的方法。它保持恒定的变革率并保留矢量所在的球形空间的几何特性。
SLERP 办理了模型合并中传统权重均匀法的局限性。它供应了一种更细致的方法,在高维空间中以保留每个父模型独特特色和曲率的办法稠浊模型。
选择SLERP而不是传统线性插值有几个缘故原由。例如,在高维空间中,线性插值可以导致插值向量的幅度减小(即,它减小了权重的尺度)。此外,权重方向的变革常日代表比变革幅度更故意义的信息(如特色学习和表示)。
SLERP通过以下步骤实现:
归一化:输入向量归一化为单位长度,侧重于方向而非大小。角度打算:这些矢量之间的角度是通过它们的点积确定的。它根据插值因子和矢量间的角度打算比例因子。矢量称重和求和:用这些因子对原始矢量进行权衡,然后求和,得到插值矢量球面线性插值(SLERP)实现步骤
球面线性插值(SLERP)的上风:
平滑过渡:确保参数过渡更平滑,这在高维向量插值中至关主要。保留特色:保留两个父模型的明显特色和曲率。细致稠浊:考虑矢量空间中的几何和旋转特性,使稠浊结果准确反响两个模型的特色SLERP是目前最盛行的合并方法,但它仅限于一次只能合并两个模型。仍旧可以分层组合多个模型,如Mistral-7B-Merge-14-v0.1中所示。
配置示例:
slices: - sources: - model: OpenPipe/mistral-ft-optimized-1218 layer_range: [0, 32] - model: mlabonne/NeuralHermes-2.5-Mistral-7B layer_range: [0, 32]merge_method: slerpbase_model: OpenPipe/mistral-ft-optimized-1218parameters: t: - filter: self_attn value: [0, 0.5, 0.3, 0.7, 1] - filter: mlp value: [1, 0.5, 0.7, 0.3, 0] - value: 0.5dtype: bfloat16
这是经典的SLERP配置,运用于两个模型的每一层。请把稳,我们输入插值因子t值的梯度。自把稳力和MLP层的参数将利用OpenPipe/mistral-ft-optimized-1218和mlabonne/NeuralHermes-2.5-Mistral-7B的不同组合。其他层是两个模型的50/50稠浊。
此领悟模型公开在:https://huggingface.co/mlabonne/NeuralPipe-7B-slerp.
参考资料:https://github.com/Digitous/LLM-SLERP-Merge
1.3 - 修整选举合并(TIES)
修整选举合并(TrIm, Elect Sign & merge, TIES)旨在有效地将多个特定于任务的模型合并为单个多任务模型。它办理了模型合并中的两个紧张寻衅:
模型参数的冗余:它识别并肃清特界说务模型中的冗余参数。这是通过关注微调期间所做的变动、识别前k%最主要的变动并丢弃别的的来实现的。参数符号之间的不一致:当不同模型对同一参数提出相反的调度时,就会涌现冲突。TIES通过创建一个统一的符号向量来办理这些冲突,该符号向量代表所有模型中最紧张的变革方向。TIES分为以下三个步骤:
修剪:通过仅保留一小部分最主要的参数(密度参数)并将别的参数重置为零,减少特界说务模型中的冗余。选择符号:通过根据累积幅度的最紧张方向(正或负)创建统一的符号向量,办理不同模型之间的符号冲突。选择性合并:对与统一符号向量对齐的参数值进行均匀,不包括零值。它只合并那些与终极商定的标志同等的参数。TIES合并所涉及步骤的描述。我们将模型中的每个参数形象化为一个正方形。箭头表示在不同任务中通过微调对参数进行的更新(任务向量,τ)(用颜色表示),方向表示符号,长度表示大小。我们首先根据任务向量值的大小对其进行修剪,然后通过办理符号冲突为每个参数选择符号(γm,包含+1或-1的绿色向量)。末了,我们只选取与所选符号同等的值,并取其均匀值作为终极参数值。
均匀法或 TIES合并法产生的不同类型的冲突和合并输出。造成滋扰的参数用虚线箭头表示。
在有和没有验证集的情形下,比较多种微调设置和模式(NLP 和视觉)的模型合并方法。
TIES合并泛化效果更好。图示T5-Base 和 T5-Large 在六项保留任务中的分布外泛化。TIES合并扩展性更好。图示合并不同数量任务时的均匀性能。
与SLERP不同,TIES可以一次合并多个模型。事实证明,TIES合并方法在各种情形下都优于现有的几种合并方法。它能有效办理滋扰问题,尤其是符号滋扰,从而提高合并模型的整体性能。
配置示例:
models: - model: mistralai/Mistral-7B-v0.1 # no parameters necessary for base model - model: OpenPipe/mistral-ft-optimized-1218 parameters: density: 0.5 weight: 0.5 - model: mlabonne/NeuralHermes-2.5-Mistral-7B parameters: density: 0.5 weight: 0.3merge_method: tiesbase_model: mistralai/Mistral-7B-v0.1parameters: normalize: truedtype: float16
通过此配置,我们利用Mistral-7B作为基本模型来打算增量权重。我们合并相同的两个模型:mistral-ft-optimized-1218(50%)和NeuralHermes-2.5-Mistral-7B(30%)并进行归一化。在这里,密度意味着我们只保留每个模型50%的参数(另一半来自根本模型)。
请把稳,配置中的权重总和不即是1,但normalize:true参数会在内部自动对它们进行归一化。这个配置的灵感来自于OpenHermes-2.5-neural-chat-7b-v3-1-7B的作者供应的参数。
此领悟模型公开在:https://huggingface.co/mlabonne/NeuralPipe-7B-ties
参考资料:TIES-Merging: Resolving Interference When Merging Models, NeurIPS 2023, https://arxiv.org/pdf/2306.01708.pdf
1.4 - 剪枝缩放(DARE)
剪枝缩放(Drop And REscale, DARE)是一种无需重新演习或 GPU的新方法。它紧张侧重于学习相似(同源)模型的参数,以得到新的能力。它采取的方法与 TIES 相似,但有两个紧张差异:
三角参数剪枝:通过将大部分三角参数(微调参数与预演习参数之间的差异)设置为零来识别和肃清它们。这一过程不会明显影响模型的能力。较大的模型可以舍弃更多的这些参数。重新调度权重:包括一个重新调度权重的步骤,调度模型的权重以保持输出预期大致不变。这包括将重新调度后的模型权重与带有比例系数的根本模型权重相加。该算法按以下步骤运行:
剪枝:将微调后的权重重置为预先演习的原始值,减少不必要的参数变革。合并:均匀多个模型的参数,创建一个统一的模型。重缩放:调度合并模型的权重,以保持其预期性能。剪枝缩放(DARE)流程
在(a)中,DARE 可以有效肃清 WizardMath 90% 乃至 99% 的 delta 参数,而不会对 GSM8K 的性能造成太大影响。在(b)中,LM、MATH 和 Code 是 WizardLM-13B、WizardMath-13B 和 llama-2-13b-code-alpaca 的缩写。DARE 可以将多个特界说务的 SFT 措辞模型合并为一个模型,该模型支持所有 SFT 模型的实用程序。
DARE 和用 DARE 合并模型的示例。当 DARE 去掉 90% 乃至 99% 的 delta 参数时,其性能可与标准 SFT 相媲美。此外,DARE 还能办理合并模型时的参数滋扰问题,并得到同等的改进。我们在顶部表示不同元素在数学/代码干系任务中的能力。
通过任务算术合并基于解码器的 LM 的结果,个中 LM、Math 和 Code 是 WizardLM-13B、WizardMath-13B 和 llama-2-13b-code-alpaca 的缩写。我们用蓝色、绿色和赤色来区分每个单一模型,并用稠浊色来表示合并模型。单一模型、有 DARE 和无 DARE 的合并模型中的最佳结果和次佳结果用粗体和下划线字体标出。
总之,DARE 供应了一种独特而高效的方法,通过计策性地剪枝和重新调度参数来合并措辞模型,从而使模型具有更强和更多样化的功能,而无需进行大量的重新演习。
配置示例:
models: - model: mistralai/Mistral-7B-v0.1 # No parameters necessary for base model - model: samir-fama/SamirGPT-v1 parameters: density: 0.53 weight: 0.4 - model: abacusai/Slerp-CM-mist-dpo parameters: density: 0.53 weight: 0.3 - model: EmbeddedLLM/Mistral-7B-Merge-14-v0.2 parameters: density: 0.53 weight: 0.3merge_method: dare_tiesbase_model: mistralai/Mistral-7B-v0.1parameters: int8_mask: truedtype: bfloat16
在此配置中,我们利用darre_ties合并基于Mistral-7B的三个不同模型。这次,我选择总和为1的权重(总和应在0.9到1.1之间)。密度参数比论文中建议的稍高(<0.5),但看起来它始终供应更好的结果。
此领悟模型公开在:https://huggingface.co/mlabonne/Daredevil-7B这也是本文中最好的合并模型,乃至优于Marcoro14-7B-slerp。
参考资料:Language Models are Super Mario: Absorbing Abilities from Homologous Models as a Free Lunch, https://arxiv.org/pdf/2311.03099.pdf
1.5 - 直通(Passthrough)
直通(Passthrough)方法与之前的方法有很大不同。通过连接来自不同LLM的层,它可以天生具有大量参数的模型(例如,具有两个7B参数模型的9B)。这些模型常日被社区称为“弗兰肯合并”或“弗兰肯斯坦模型”。
这项技能是非常实验性的,但它成功地创建了令人印象深刻的模型,例如利用两个Llama270B模型的goliath-120b。最近发布的SOLAR-10.7B-v1.0也利用了相同的想法,在他们的论文中称为深度向上缩放。
配置示例:
slices: - sources: - model: OpenPipe/mistral-ft-optimized-1218 layer_range: [0, 32] - sources: - model: mlabonne/NeuralHermes-2.5-Mistral-7B layer_range: [24, 32]merge_method: passthroughdtype: bfloat16
天生的领悟模型将包含第一个模型的所有32层和第二个模型的8个附加层。这将创建一个统共40层和8.99B参数的领悟模型。此配置的灵感来自GML-Mistral-merged-v1。
此领悟模型公开在:https://huggingface.co/mlabonne/NeuralPipe-9B-merged
2 - 大措辞模型领悟实践
在本节中,我们将利用mergekit加载合并配置,运行它,并将天生的模型上传到HuggingFaceHub。
图源:旺知识
首先,我们直接从源代码安装mergekit,如下所示:
!git clone https://github.com/cg123/mergekit.git!cd mergekit && pip install -q -e .
不才面的块中,我们以YAML格式加载合并配置。我们还指定合并模型的名称以供将来利用。您可以在此处复制/粘贴上一节中的任何配置。
这次,我们将利用两个不同的模型:Marcoroni-7B-v3和Mistral-7B-Merge-14-v0.1,并将它们与SLERP方法合并。我们将配置保存为yaml文件,以用作合并命令的输入。
import yamlMODEL_NAME = "Marcoro14-7B-slerp"yaml_config = """slices: - sources: - model: AIDC-ai-business/Marcoroni-7B-v3 layer_range: [0, 32] - model: EmbeddedLLM/Mistral-7B-Merge-14-v0.1 layer_range: [0, 32]merge_method: slerpbase_model: AIDC-ai-business/Marcoroni-7B-v3parameters: t: - filter: self_attn value: [0, 0.5, 0.3, 0.7, 1] - filter: mlp value: [1, 0.5, 0.7, 0.3, 0] - value: 0.5dtype: bfloat16"""# Save config as yaml filewith open('config.yaml', 'w', encoding="utf-8") as f: f.write(yaml_config)
我们利用以下参数运行合并命令:
--copy-tokenizer: 从基本模型复制标记天生器--allow-crimes和--out-shard-size:将模型分成更小的分片,这些分片可以在RAM较低的CPU上打算--lazy-unpickle:启用实验性惰性unpickler以降落内存利用量此外,某些型号可能须要--trust_remote_code标志(Mistral-7B不适用)。
此命令将下载合并配置中列出的所有模型的权重并运行所选的合并方法(大约须要10分钟)。
# Merge models!mergekit-yaml config.yaml merge --copy-tokenizer --allow-crimes --out-shard-size 1B --lazy-unpickle
模型现已合并并保存在合并目录中。在上传之前,我们可以创建一个自述文件,个中包含重现性所需的所有信息。以下代码块定义了Jinja模板并自动利用合并配置中的数据添补它。
!pip install -qU huggingface_hubfrom huggingface_hub import ModelCard, ModelCardDatafrom jinja2 import Templateusername = "mlabonne"template_text = """---license: apache-2.0tags:- merge- mergekit- lazymergekit{%- for model in models %}- {{ model }}{%- endfor %}---# {{ model_name }}{{ model_name }} is a merge of the following models using [mergekit](https://github.com/cg123/mergekit):{%- for model in models %} [{{ model }}](https://huggingface.co/{{ model }}){%- endfor %}## Configuration\```yaml{{- yaml_config -}}\```"""# Create a Jinja template objectjinja_template = Template(template_text.strip())# Get list of models from configdata = yaml.safe_load(yaml_config)if "models" in data: models = [data["models"][i]["model"] for i in range(len(data["models"])) if "parameters" in data["models"][i]]elif "parameters" in data: models = [data["slices"][0]["sources"][i]["model"] for i in range(len(data["slices"][0]["sources"]))]elif "slices" in data: models = [data["slices"][i]["sources"][0]["model"] for i in range(len(data["slices"]))]else: raise Exception("No models or slices found in yaml config")# Fill the templatecontent = jinja_template.render( model_name=MODEL_NAME, models=models, yaml_config=yaml_config, username=username,)# Save the model cardcard = ModelCard(content)card.save('merge/README.md')
现在我们有了模型卡(ModelCard),我们可以将全体文件夹推送到Hub。
from google.colab import userdatafrom huggingface_hub import HfApiusername = "mlabonne"# Defined in the secrets tab in Google Colabapi = HfApi(token=userdata.get("HF_TOKEN"))api.create_repo( repo_id=f"{username}/{MODEL_NAME}", repo_type="model")api.upload_folder( repo_id=f"{username}/{MODEL_NAME}", folder_path="merge",)
该模型现已在mlabonne/Marcoro14-7B-slerp的HuggingFaceHub上供应。在另一台条记本中,我们可以利用以下代码在免费的T4GPU上考试测验该模型:
!pip install -qU transformers acceleratefrom transformers import AutoTokenizerimport transformersimport torchmodel = "mlabonne/Marcoro14-7B-slerp"messages = [{"role": "user", "content": "What is a large language model?"}]tokenizer = AutoTokenizer.from_pretrained(model)prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)pipeline = transformers.pipeline( "text-generation", model=model, torch_dtype=torch.float16, device_map="auto",)outputs = pipeline(prompt, max_new_tokens=256, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)print(outputs[0]["generated_text"])
我们问的问题是“What is a Large Language Model?”并收到以下输出:
A large language model is a type of artificial intelligence (AI) system that has been trained on vast amounts of text data. It's designed to understand and generate human-like language, making predictions on what words or phrases might come next in a sentence or document. These models use complex algorithms and neural network architectures to learn from the data and improve their performance over time. Some well-known large language models include GPT-3 from OpenAI and BERT from Google.
看起来不错,但我们须要更全面的评估。对付这种通用模型,有一些有趣的基准:
ChatbotArena(https://chat.lmsys.org/):根据人类投票体例了基于Elo的LLM排行榜。MT-bench(https://chat.lmsys.org/):它利用GPT-4作为判断者,对一组多轮问题的模型相应进行评分。NousResearch基准测试套件(https://github.com/teknium1/LLM-Benchmark-Logs):聚合了四个基准测试:AGIEval、GPT4ALL、TruthfulQA和Bigbench。GPT4ALL本身包括HellaSwag、OpenBookQA、Winogrande、ARC-Easy、ARC-Challenge、BoolQ和PIQA。开放大措辞模型排行榜(https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard):聚合了六个基准:ARC、HellaSwag、MMLU、Winogrande、GSM8K和TruthfulQA。不幸的是,我们无法将模型提交到ChatbotArena。我选择利用OpenLLMLeaderboard和NousResearch基准来评估它。
我将我们的模型提交到OpenLLM排行榜。正如先容所示,它在排行榜上排名最好的7B参数模型。以下是排行榜上的完全结果:
开放大措辞模型排行榜的问题在于这些基准是公开的。这意味着人们可以根据测试数据演习大措辞模型以得到更好的结果。通过合并最好的模型,我们也污染了我们自己的结果。可以安全地假设Marcoro14-7B-slerp受到污染,并且此合并中利用的一些模型已经在测试集上进行了演习。如果您想创建最佳模型而不是破解排行榜,我建议仅利用非合并模型来创建您自己的合并。
这便是为什么我们不想只依赖OpenLLM排行榜。对付NousResearch基准测试套件,我们利用LLMAutoEval通过大略的Colab条记本自动打算分数。以下是与精良的OpenHermes-2.5-Mistral-7B比较的结果:
我们在每个基准测试中都比这个模型有了显著的改进。请把稳,NousResearch基准测试套件与OpenLLMLeaderboard共享一些任务:ARC-Challenge、TruthfulQA、HellaSwag和Winogrande。据我所知,Bigbench是唯一一个100%不同的基准。然而,我们在这次合并中利用的模型之一仍旧可以在Bigbench上进行演习。
3 - 总结展望
在本文中,我们先容了将大措辞模型与五种不同方法合并的观点,我们先容了任务向量模型编辑(EMTA)、球面线性插值(SLERP)、修整选举合并(TIES)、剪枝缩放(DARE)、直通(Passthrough)的事情事理,并供应了配置示例。我们利用mergekit运行SLERP以创建Marcoro14-7B-slerp并将其上传到HuggingFaceHub。我们在两个基准套件上得到了出色的性能:Open LLM Leaderboard(表现最佳的7B模型)和NousResearch。
图源:旺知识
人类渴望通过接管得到额外能力的欲望由来已久。超级马里奥便是人类这一梦想的表示,它可以通过网络物品得到额外的技能,如投掷火球和暂时无敌。常日情形下,措辞模型的新能力可以通过监督微调(SFT)来实现。除了以上方案,我们创造,无需重新演习或GPU,基于编码器或解码器的措辞模型(LM)也可以通过接管同源模型的参数得到新能力,这为未来措辞模型的能力模块化组装供应了可能。
参考资料:
2023年大措辞模型(LLM)全面调研:事理、进展、领跑者、寻衅、趋势https://huggingface.co/blog/mlabonne/merge-modelshttps://slgero.medium.com/merge-large-language-models-29897aeb1d1a2023年Top10最具变革性人工智能研究-照亮AI打破之路