一键扩展模型上下文并创建聊天模型

社区文章 发布于 2024年4月28日

扩展模型上下文的方法不计其数。然而,这些方法大多需要巨大的显存和漫长的训练时间。同样,创建聊天模型也需要大量的问答对和高昂的成本。

本文将介绍一种只需一键即可实现上下文扩展、聊天模型创建和知识迁移的方法。

简单 Diff 相加的局限性

简单地添加差异(diffs)有其局限性。事实上,我昨天写了一篇关于通过添加差异来扩展上下文的帖子,但因此原因我删除了它。虽然它在某种程度上适用于相同的基模型,但将其应用于经过大量微调的模型通常会导致不理想的输出和模型退化。

因此,我重新考虑了上下文扩展的方法,结果是,我想介绍一种不仅可以扩展上下文,还可以一键创建聊天模型并进行知识迁移的方法和代码。由于我想在博客上介绍一个简单的方法,详细代码请参考下面的链接。

考虑两种 Diff

首先,我们需要考虑两种差异(diffs)

  1. 具有所需信息(长上下文或聊天)的模型与基模型之间的差异。
  2. 基模型与目标模型(将要应用的模型)之间的差异。

在下面的示例中,我们将重点关注上下文扩展。

model_diffs = long_context_model - base_model # diff between long context and base
sigmoid_ratios = calculate_sigmoid_ratios(base_model, target_model)

calculate_sigmoid_ratios 函数中,我们使用 Sigmoid 函数根据基模型和目标模型中所有一维张量的最小值和最大值来分配比率。当然,使用其他激活函数可能更合适。

下面是理解比率计算过程的方法:如果基模型和目标模型之间存在较大差异(即差异较大),则将新信息应用于该元素将无法捕获上下文扩展或目标模型的信息。因此,在将差异应用于模型时,我们使用上述获得的比率来添加 diff * (1 - ratio),从而最大程度地减少模型退化并引导模型只捕获所需信息。

apply_model_diffs(target_model, model_diffs, sigmoid_ratios)

之后,我们可以通过使用差异和比率更新目标模型的权重来创建模型。整个过程在1分钟内完成,无需任何训练。

我们已经确认使用此方法创建的模型在高达 64k 的情况下实现了 100% 的检索。

应用于聊天模型创建(特别是针对非英语模型或特定领域模型)

同样的方法也可以应用于创建聊天模型。以下是创建韩语聊天模型的示例。

下面是仅使用差异(Chat Vector)的方法与本文介绍的方法之间的比较。

由于篇幅限制,输出比较请参考下面的“详细代码介绍”部分。

以下是 kobest 基准测试的结果(5-shot,准确率基准)

beomi/Llama-3-Open-Ko-8B-Instruct-preview (简单差异应用)

  • 平均值: 0.6220
  • boolq: 0.6254
  • copa: 0.7110
  • hellaswag: 0.384
  • sentineg: 0.8388
  • wic: 0.5739

maywell/Llama-3-Ko-8B-Instruct (方法应用)

  • 平均值: 0.6852
  • boolq: 0.7208
  • copa: 0.7650
  • hellaswag: 0.4440
  • sentineg: 0.9194
  • wic: 0.6040

我们成功实现了约 10% 的性能提升。

当然,kobest 并非评估聊天性能的基准,因此可以理解为在最小化模型性能退化的同时提供了 Instruct 格式。

代码已上传至 GitHub。如果您能进行实验并分享结果,我将不胜感激。

链接

社区

注册登录 发表评论