专栏名称: NVIDIA企业开发者社区
NVIDIA 英伟达开发者社区是NVIDIA GPU开发者交流平台,通过此平台可第一时间获取NVIDIA GPU 开发相关的新产品、新工具、线上/线下活动的资讯。
目录
相关文章推荐
正和岛  ·  这一小县城,30万人靠“石头”年入460亿! ·  13 小时前  
界面新闻  ·  荣耀与阿里在AI领域展开合作 ·  19 小时前  
界面新闻  ·  更名、人事换防,北汽自主品牌大调整 ·  2 天前  
51好读  ›  专栏  ›  NVIDIA企业开发者社区

技术博客 | LLM 模型合并入门指南

NVIDIA企业开发者社区  · 公众号  ·  · 2024-10-31 17:25

正文


自定义 大语言模型(LLM) 时,组织面临的一个挑战是需要运行多个实验,而这些实验只能产生一个有用的模型。虽然实验成本通常较低,并且结果非常值得付出努力,但这个实验过程确实涉及“浪费”资源,例如在未使用其产品的情况下花费的计算资产、专用的开发者时间等。


模型合并结合了多个自定义语言模型(LLM)的权重,提高了资源利用率,并为成功的模型增加了价值。这种方法提供了两种关键解决方案。


  • 通过重新利用“失败的实验”来减少实验浪费

  • 提供经济高效的替代方案来进行训练


本文将探讨如何自定义模型、模型合并的工作原理、不同类型的模型合并,以及模型合并的迭代和发展方式。


重新定义模型定制

本节简要概述了模型如何进行自定义,以及如何利用此过程帮助直观地了解模型合并。


请注意,为了直观地理解模型合并,我们过度简化了所讨论的一些概念。建议您先熟悉自定义技术、Transformer 架构和单独训练,然后再深入了解模型合并。例如,请参阅 Mastering LLM Techniques:Customization


权重矩阵在模型中的作用

权重矩阵是许多热门模型架构中的必不可少组件,作为大型数字网格(权重或参数),存储模型进行预测所需的信息。


当数据流经模型时,数据会流经多个层,每个层都包含自己的权重矩阵。这些矩阵通过数学运算转换输入数据,使模型能够从数据中学习并适应数据。


要修改模型的行为,必须更新这些矩阵中的权重。虽然权重修改的细节并非必需,但务必要了解基础模型的每次自定义都会产生一组独特的更新权重。


任务自定义

针对特定任务 (例如总结或数学运算) 微调大型语言模型(LLM)时,对权重矩阵所做的更新旨在提高该特定任务的性能。这意味着对权重矩阵的修改会定位到特定区域,而不是均匀分布。


为了说明这一概念,可以考虑一个简单的类比,其中权重矩阵表示为长度为 100 码的体育场。当定制用于汇总的模型时,权重矩阵的更新可能会集中在特定区域,例如 10 到 30 码线。相比之下,定制用于数学的模型可能会将更新集中在不同区域,例如 70 到 80 码线。


有趣的是,在为相关任务 (例如法语摘要) 定制模型时,更新可能会与原始摘要任务重叠,从而影响权重矩阵的相同区域 (例如 25 到 35 码线)。这种重叠提供了一个重要的见解:不同的任务定制会显著影响权重矩阵的相同区域。


虽然前面的示例有意过度简化,但直觉是准确的。不同的任务自定义将导致更新权重矩阵的不同部分,而针对类似任务的自定义可能会导致更改各自权重矩阵的相同部分。


这种理解可以为定制大型语言模型和跨任务利用知识的策略提供指导。


模型合并

模型合并是一种策略的松散分组,涉及将两个或多个模型或模型更新合并到单个模型中,以节省资源或提高特定任务的性能。


本次讨论主要侧重于通过 Arcee AI 开发的开源库 (称为 mergekit ) 实现这些技术。该库简化了各种合并策略的实现。


许多方法用于合并不同复杂程度的模型。在这里,我们将重点介绍四种主要的合并方法:

  1. 模型池

  2. 球形线性插值 (SLERP)

  3. 任务算法 (使用任务向量)

  4. TIES 利用 DARE


模型池

Model Soup 方法 涉及对超参数优化实验所生成的模型权重求取平均值,如 Model Soups: Averaging Weights of Multiple Fine-Tuned Models Improves Accuracy Without Increasing Inference Time 所述,该方法可在不增加推理时间的情况下提高准确性。


此方法最初通过计算机视觉模型进行测试和验证,但在大语言模型方面也取得了前景良好的结果。除了从实验中产生一些额外价值外,此过程简单且不需要计算密集型计算。


创建模型汤的方法有两种:朴素和贪婪。朴素的方法是依次合并所有模型,而不管它们各自的性能如何。相比之下,贪婪的实现遵循一个简单的算法:


  • 按所需任务的性能对模型进行排序

  • 将性能最佳的模型与第二个性能最佳的模型合并。

  • 评估合并模型在所需任务上的性能。

  • 如果合并的模型表现更好,请继续下一个模型;否则,跳过当前模型,使用下一个最佳模型重试。


这种贪婪的方法确保生成的 Model Soup 至少与最佳单个模型一样出色。


图 1: 使用贪婪模型 Soup 模型合并技术,Model Soup 方法的性能优于构成模型。

创建模型的每个步骤都通过两个或多个模型权重的简单加权和归一化线性平均值来实现。尽管推荐使用,但加权和归一化都是可选的。mergekit 库的实现如下所示:


res = (weights * tensors).sum(dim=0)

if self.normalize:

res = res / weights.sum(dim=0)


虽然这种方法在计算机视觉和语言领域已经取得了可喜的成果,但它面临着一些严重的局限性。具体来说,无法保证模型的性能会更高,线性平均值可能会导致性能降低或一般性下降。


下一种方法,SLERP,解决了一些特定的问题。


SLERP

球形线性插值(Spherical Linear Interpolation,SLERP)是 1985 年发表的论文 《Animating Rotation with Quaternion Curves》 中引入的一种方法。这是一种计算两个向量之间平均值的“更智能”的方法。从技术意义上说,它有助于计算曲面上两个点之间的最短路径。


此方法擅长组合两个模型。经典示例是想象地球上两点之间的最短路径。从技术上讲,最短路径是一条穿过地球的直线,但实际上它是地球表面上的一条曲线。SLERP 计算此平滑路径,用于为两个模型求平均值,同时保持其独特的模型权重“曲面”。


以下代码片段是 SLERP 算法的核心,能够在两个模型之间提供如此出色的插值:


# Calculate initial angle between v0 and v1

theta_0 = np.arccos(dot)

sin_theta_0 = np.sin(theta_0)

# Angle at timestep t

theta_t = theta_0 * t

sin_theta_t = np.sin(theta_t)

# Finish the slerp algorithm

s0 = np.sin(theta_0 - theta_t) / sin_theta_0

s1 = sin_theta_t / sin_theta_0

res = s0 * v0_copy + s1 * v1_copy

return maybe_torch(res, is_torch)


任务算法 (使用任务向量)

这组模型合并方法利用任务向量以各种方式组合模型,增加复杂性。


任务向量:捕获自定义更新

回顾一下自定义模型的方式,更新模型的权重,并在基础模型矩阵中捕获这些更新。我们不将最终矩阵视为全新模型,而是将其视为基础权重和自定义权重之间的差值(或增量)。这引入了任务向量的概念,即包含基础权重和自定义权重之间增量的结构。


这与低秩适应(Low Rank Adaptation)背后的直觉相同,但没有进一步分解表示权重更新的矩阵。


通过减去基础模型权重,可以轻松地从自定义权重中获取任务向量。


任务干扰:更新冲突

回顾一下运动领域的示例,不同的自定义设置之间的更新权重可能会重叠。有一些直观的理解是,与为两个或多个单独的任务定制相比,为同一任务定制会导致更新权重冲突率更高。


这种“冲突更新”概念更正式地定义为任务干扰,它涉及两个或多个任务向量之间重要更新的潜在碰撞。


任务算法

如论文《 Editing Models with Task Arithmetic》所述 ,任务算法是任务向量方法的最简单实现,具体流程如下:

  1. 获取两个或多个任务向量,并将其线性合并,如 Model Soup 中所示。

  2. 获得生成的合并任务向量后,系统会将其添加到基模型中。

这个过程简单而有效,但有一个关键的缺点:没有注意到要合并的任务向量之间的潜在干扰。


TIES 合并

如论文《TIES-Merging:在合并模型时解决干扰》所述 ,TIES(TrIm Elect Sign and Merge)是一种方法,它采用了任务算法的核心思路,并将其与启发式算法相结合,以解决任务向量之间的潜在干扰。


一般程序是,对于合并的任务向量中的每个权重,考虑每个传入权重的大小,然后是每个传入权重的符号,然后取剩余权重的平均值。


图 2 : TIES 过程的直观表示

此方法旨在通过在合并过程中优先考虑对任何给定权重更新具有最显著权重更新的模型来解决干扰问题。其本质是,在合并过程中,优先考虑“关心”该权重的模型,而不是那些对该权重不那么“关心”的模型。


DARE

在论文“ 语言模型是超级马力欧:从同源模型中吸收能力作为免费午餐 ”中,DARE 并不是一种直接的模型合并技术。相反,它是一种可与其他方法一起考虑的增强。DARE 源自以下内容:


使用 p 比率丢弃增量参数,并将剩余参数重新缩放为 1/(1 – p),以近似原始嵌入。







请到「今天看啥」查看全文