当前位置: 首页 > news >正文

理解和使用语言模型的监督微调 (SFT)

大型语言模型(LLM)的训练通常分为几个阶段,包括预训练和几个微调阶段;见下文。 虽然预训练的成本很高(即几十万美元的计算费用),但微调 LLM(或执行上下文学习)的成本却很低(即几百美元或更低)。 鉴于高质量的预训练 LLM(如 MPT、Falcon 或 LLAMA-2)可以广泛获得并免费使用(甚至是商业化的),我们可以通过在相关任务中对 LLM 进行微调来构建各种功能强大的应用。

在这里插入图片描述
在最近的人工智能研究中,有监督微调(SFT)是对 LLM 进行微调的最广泛应用形式之一。 这种方法收集了高质量 LLM 输出数据集,在此基础上使用标准语言建模目标直接对模型进行微调。 SFT 使用简单/成本低廉,是对齐语言模型的有用工具,因此在开源 LLM 研究社区内外很受欢迎。 在本概述中,我们将概述 SFT 背后的理念,了解该主题的相关研究,并举例说明实践者如何只需几行 Python 代码就能轻松使用 SFT。

有用的背景信息

要深入理解 SFT,我们需要对语言模型(以及一般的深度学习)有一个基本的了解。 让我们来了解一些相关的背景信息,并简要温习一下几个重要的概念。

语言模型。 SFT 是针对 LLM 的一种流行的微调技术。 因此,我们需要对语言模型有一个基本的了解。 以下资源可用于快速了解这些模型的工作原理:

  • Transformer 架构 : 几乎所有的现代语言模型和许多其他深度学习模型都基于这架构。
  • Decoder-only Transformers:这是大多数生成式 LLM 所使用的变换器架构的具体变体。
  • LLM 简史:从 GPT 的创建到 ChatGPT 的发布,LLM 经历了几个阶段。
  • 下一个 Token 预测:这一自我监督训练目标几乎是 LLM 所有功能的基础,也被 SFT 所使用!
  • 语言模型预训练: 语言模型是通过大量无标记文本语料进行预训练的。
  • 语言模型推理:语言模型可用于通过自回归下一个标记预测生成连贯的文本序列。

Transformers library 本概述中的代码依赖于 transformers 库,它是目前最强大的深度学习库之一。 此外,该库还有大量的教程和文档,是任何深度学习或 LLM 相关项目的实用学习资源。

在这里插入图片描述
训练 LLM。 语言模型的训练过程通常分为三个阶段;见上文。 首先,我们对语言模型进行预训练,这是(迄今为止)计算量最大的训练步骤。 在此基础上,我们通常通过三步框架(见下文)与监督微调(SFT)和来自人类反馈的强化学习(RLHF)进行配准。

在这里插入图片描述
上述步骤构成了标准化的训练流水线,被大多数最先进的 LLM(如 ChatGPT 或 LLaMA-2)所采用。 与预训练相比,SFT 和 RLHF 的计算成本较低,但它们需要整理数据集–无论是高质量的 LLM 输出还是 LLM 输出的人类反馈–这可能比较困难且耗时。

有时,在应用 LLM 解决下游任务时,我们需要做得更多一些。 特别是,我们可以通过特定领域微调或上下文学习(见下文)来进一步专门化语言模型(如有需要)。 特定领域微调只需进一步训练模型–通常是通过语言建模目标,类似于预训练/SFT–在与下游任务相关的数据上进行训练,而上下文学习则是在语言模型的提示中添加额外的上下文或示例,作为解决问题的上下文。

在这里插入图片描述
什么是对齐? 最后,我们在上面的讨论中多次使用了一个术语,理解这个术语非常重要:对齐。 一个预先训练好的语言模型通常是没有用的。 如果我们用这个模型生成输出结果,结果很可能是重复的,而且没有什么帮助。 要创建一个更有用的语言模型,我们必须使该模型符合人类用户的愿望。 换句话说,我们的语言模型不是生成最可能的文本序列,而是学会生成用户所希望的文本序列。

“在收集偏好注释时,我们重点关注有用性和安全性。 有用性是指 Llama 2-Chat 的回复在多大程度上满足了用户的要求并提供了所需的信息;安全性是指 Llama 2-Chat 的回复是否不安全”。

通过上文概述的 SFT 和 RLHF 三步框架完成的这种调整,可用于鼓励 LLM 中的各种行为和特性。 通常情况下,训练模型的人员会选择一套或几套标准,在整个调整过程中加以强调。 常见的对齐标准包括:提高指令跟踪能力、抑制有害输出、使 LLM 更有帮助等等。 例如,LLaMA-2 的对齐标准是 i) 有帮助和 ii) 无危害/安全;见上文。

什么是SFT?

监督微调(SFT)是 LLM 对齐过程中的第一个训练步骤,实际上非常简单。 首先,我们需要策划一个高质量 LLM 输出数据集–这些数据集基本上就是 LLM 表现正确的示例;见下文。 然后,我们直接通过这些示例对模型进行微调。 在这里,微调的 "监督 "意义来自于我们正在收集模型应该模仿的示例数据集。 然后,模型在微调过程中学会复制这些示例的风格。

在这里插入图片描述
与下一个标记预测的关系 有趣的是,SFT 与语言模型预训练并无太大区别–预训练和 SFT 都将下一个标记预测作为基本训练目标! 主要区别在于使用的数据。 在预训练期间,我们使用大量原始文本数据来训练模型。 相比之下,SFT 使用的是高质量 LLM 输出的监督数据集。 在每次训练迭代过程中,我们都会抽取几个示例,然后使用下一个标记预测目标在这些数据上对模型进行微调。 通常情况下,下一个标记预测目标只应用于每个示例中与 LLM 输出(如上图中的响应)相对应的部分。

这是从哪里来的?

三步配准过程(包括 SFT 和 RLHF)最初是由 InstructGPT 提出的,它是 ChatGPT 的前身和姊妹模型。 由于 InstructGPT 和 ChatGPT 的成功,这个三步框架已经标准化并相当流行,从而被用于后来的各种语言模型中(如 Sparrow 和 LLaMA-2 )。 目前,通过 SFT 和 RLHF 进行对齐在研究和实际应用中都得到了大量使用。

在 SFT 之前进行微调。 尽管 SFT 近来很流行,但语言模型微调早已成为一种流行的方法。 例如,GPT[直接对其评估的每个任务进行微调(见下文),而纯编码器语言模型(如BERT)–由于不常用于生成任务–几乎完全使用微调方法来解决下游任务。 此外,一些 LLM 采用的微调方法与 SFT 略有不同;例如,LaMDA[9] 在各种辅助任务上进行微调,Codex[10] 在代码语料库上进行特定领域的微调(即基本上在不同数据上进行更多的预训练)。

在这里插入图片描述
值得注意的是,SFT 与通用微调略有不同。 通常情况下,对深度学习模型进行微调是为了教会模型如何解决特定任务,但这会使模型更加专业化,降低通用性–使模型成为 “狭义专家”。 与通用模型相比,微调后的模型可能会更准确地解决所微调的任务(例如,参见 GOAT ),但可能会失去解决其他任务的能力。 相比之下,SFT 是对齐语言模型(包括通用基础模型)的核心组成部分。 由于我们对模型进行微调是为了模仿一种正确的风格或行为,而不是为了解决某个特定的任务,因此它不会丧失通用的问题解决能力。

SFT 的利弊

在这里插入图片描述

SFT 使用简单–训练过程和目标与预训练非常相似。 此外,这种方法在进行配准时非常有效,而且与预训练相比,计算成本很低(即成本低 100 倍,甚至更高)。 如上图所示,单独使用 SFT(即不使用任何 RLHF)在模型的指令跟踪能力、正确性、一致性和整体性能方面都有明显的优势。 换句话说,SFT 是提高语言模型质量的高效技术。 但是,我们应该记住,它并不完美! 以下是我们应该考虑的几个缺点。

在这里插入图片描述
创建数据集。 SFT 的结果在很大程度上取决于我们策划的数据集。 如果该数据集包含一系列不同的示例,能够准确捕捉所有相关的对齐标准,并描述语言模型的预期输出,那么 SFT 就是一种很好的方法。 然而,我们如何保证用于 SFT 的数据集能全面捕捉到我们希望在配准过程中鼓励的所有行为呢? 这只能通过对数据进行仔细的人工检查来保证,而人工检查 i) 不具有可扩展性,ii) 通常成本高昂。 作为一种替代方法,最近的研究探索了为 SFT 生成数据集的自动框架(如自我指导 ;见上文),但数据质量无法保证。 因此,尽管 SFT 非常简单,但需要对高质量的数据集进行整理,而这是很困难的。

在这里插入图片描述
增加 RLHF 是有益的。 最近的研究表明,即使在为 SFT 策划了高质量的数据集之后,执行 RLHF 还能带来更多好处。 换句话说,仅通过 SFT 对语言模型进行微调是不够的。 这一发现在最近发表的 LLaMA-2 中尤为明显,它通过 SFT 和 RLHF 两种方法进行对齐;见上文。 对于 SFT,LLaMA-2 使用了一个大型对话会话数据集(共 27,540 个实例),该数据集经过人工整理,以确保质量和多样性。 尽管 SFT 使用了大量高质量的数据源,但进一步执行 RLHF 仍能在有用性和安全性(即 LLaMA-2 的对齐标准)方面产生巨大优势;见下文。

在这里插入图片描述
此外,作者还指出,在执行 SFT 之后,语言模型能够生成与人类撰写的对话会话质量相似的对话会话。 因此,为 SFT 创建更多数据的益处不大,因为我们可以利用模型本身为 SFT 自动生成更多数据。

“我们发现,从由此产生的 SFT 模型中采样的输出结果往往能与人类注释者手写的 SFT 数据相媲美,这表明我们可以调整优先次序,将更多的注释精力投入到基于偏好的 RLHF 注释中”。

简而言之,目前研究界的共识似乎是,最佳的配准方法是:i) 在质量非常高的中等规模示例数据集上执行 SFT;ii) 将剩余精力投入到人类偏好数据的收集上,以便通过 RLHF 进行微调。

在实践中使用 SFT

既然我们已经理解了 SFT 的概念,那就让我们来探讨一下这个概念是如何在实际和研究应用中被使用的。 首先,我们将举例说明如何在 Python 中执行 SFT。 然后,我们将概述最近发表的几篇关于 SFT 主题的论文。

SFT 的实现

如前所述,SFT 的实现与语言模型预训练非常相似。 在引擎盖下,任何 SFT 的实现都将使用下一个标记预测(也称为标准语言建模)目标,我们已经广泛了解过这一点。 实际上,使用 SFT 训练 LLM 的最佳工具之一是变换器强化学习(TRL)Python 库,该库包含 SFT 的实现,只需几行代码即可用于微调现有的语言模型。

在这里插入图片描述
执行 SFT。 TRL 构建在 HuggingFace 转换器库之上,可以使用上图所示代码通过 SFT 训练语言模型(本例中为 Meta 的 OPT 模型)。 这个简单的示例展示了通过 SFT 训练模型是多么容易! 由于简单易用,通过 SFT 对模型进行微调在开源 LLM 研究社区中非常流行。 访问一下开放 LLM 排行榜(Open LLM Leaderboard)就会发现许多有趣的例子。 使用 SFT 对预先训练好的 LLM 进行微调,是目前训练开源 LLM 最简单有效的方法之一。

除了 SFT 的这一基本定义之外,我们可能还想使用一些有用的(和更高级的)技术,例如只对模型响应(而不是完整的对话或示例)实施监督,用共享提示模板增强所有响应示例,甚至采用参数高效微调(PEFT)方法(例如 LoRA )。 有趣的是,TRL 定义的 SFTTrainer 类具有很强的适应性和扩展性,足以处理上述各种情况。 有关实现的更多详情,请参阅下面的链接。

人工智能研究中的 SFT 用例

鉴于 SFT 是对齐过程的标准组成部分,人工智能文献对其进行了大量探讨。 我们将概述几篇对 SFT 提供了宝贵见解的出版物。 与往常一样,以下概述的出版物并非详尽无遗。 有关 SFT(以及一般人工智能)主题的论文数量庞大。 不过,我已经尽我所能,重点介绍了研究界最有价值的一些见解。 如果有遗漏,请随时在评论中与我和其他人分享!

InstructGPT。 大多数语言模型所使用的三部分对齐过程–包括 SFT 和 RLHF–最早是由 InstructGPT 使用的,尽管之前在 [21] 中已经对文本摘要模型进行了探索。 这篇论文为 LLM 最近的许多进展奠定了基础,并包含了许多关于配准过程的宝贵见解。 与 OpenAI 最近提出的模型不同,InstructGPT 的训练过程和架构细节在出版物中完全公开。 因此,该模型为创建功能强大的语言模型提供了大量启示,

在这里插入图片描述

模仿模型。 最近,随着 LLaMA 的发布,开源语言模型大量涌现,SFT 在模仿学习中得到了广泛应用。 也就是说,我们可以

  1. 从开源基础模型开始。
  2. 从专有语言模型(如 ChatGPT 或 GPT-4)中收集对话会话数据集。
  3. 在所得数据集上训练模型(使用 SFT)。

这些模型(如 Alpaca、Koala 和 Vicuna)的训练成本很低,而且表现相当出色,突出表明利用 SFT 可以用相对较少的计算量获得令人印象深刻的结果。 虽然后来发现早期的模仿模型与专有模型相比表现不佳,但最近在较大模仿数据集上训练的变体(如 Orca )表现良好。 将 SFT 与模仿学习结合起来,是一种廉价而简便的方法,可以制作出不错的 LLM。

在这里插入图片描述
LIMA。 模仿学习的研究表明,使用专有语言模型为 SFT 生成大型数据集是一种有用的方法。 相比之下,平行研究探讨了是否可以通过较小的、精心策划的数据集来实现对齐。 在 LIMA [16] 中,作者为 SFT 策划了一个只有 1K 例子的数据集,由此产生的模型与顶级开源和专有 LLM 相比具有相当的竞争力;见上文。 在这种情况下,成功的关键在于对数据进行人工检查,以确保数据的质量和多样性。 这些结果在 LLaMA-2 中得到了证实,作者发现,规模适中、质量和多样性标准较高的数据集可为 SFT 带来最佳结果。

Open-source alignment。 在最近提出 LLaMA-2 之前(甚至之后),开源 LLM 主要使用 SFT 进行配准,RLHF(如果有的话)用得很少。 例如,MPT 模型的几个变体以及 Falcon 和 LLaMA 的 Instruct 版本都是在各种不同的数据集上使用 SFT 创建的(其中许多数据集在 HuggingFace 上公开提供!)。 此外,如果我们快速浏览一下开放 LLM 排行榜,就会发现许多顶级模型都是流行基础模型(如 LLaMA-2 或 Falcon)的版本,这些模型都是通过 SFT 在不同数据组合上进行微调的。 值得注意的例子包括 Platypus、WizardLM、Airoboros、Guanaco 等。

结语

在本概述中,我们了解了 SFT、它在实践中的应用以及当前研究中对它的认识。 对于人工智能从业者来说,SFT 是一个强大的工具,因为它可以用来以数据高效的方式将语言模型与人类定义的某些目标相一致。 虽然通过 RLHF 可以获得更多好处,但 SFT 使用简单(即与预训练非常相似),计算成本低廉,而且非常有效。 这些特性使得 SFT 在开源 LLM 研究社区中被大量采用,几乎每天都有各种新模型被训练(使用 SFT)和发布。 如果能获得高质量的基础模型(如 LLaMA-2),我们就能通过 SFT 高效、轻松地对这些模型进行微调,以处理各种不同的用例。

相关文章:

  • 贷款并非只看利息低,还有很多你知不道的地方
  • 探索未来IT技术的浩瀚星河:一场跨越时代的数字盛宴
  • 沉浸式艺术创作:FLUX.1模型下的Java开发者体验之旅
  • python基础之绘图turtle与分词
  • HarmonyOS鸿蒙开发实战(5.0)自定义路由栈管理
  • c# 将调试信息到VS输出窗口
  • Thingsboard规则链:fetch device credentials节点详解
  • 【GUI设计】基于图像分割和边缘算法的GUI系统(7),matlab实现
  • 第一章 初识Docker
  • QMT如何获取股票基本信息?如上市时间、退市时间、代码、名称、是否是ST等。QMT量化软件支持!
  • 408算法题leetcode--第15天
  • 着色器ShaderMask
  • Python 课程18-SQLAlchemy
  • C++ bitset(位图)的模拟实现
  • RabbitMQ 快速入门
  • 【技术性】Search知识
  • 30天自制操作系统-2
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java编程基础24——递归练习
  • Shell编程
  • SSH 免密登录
  • uva 10370 Above Average
  • 力扣(LeetCode)965
  • 日剧·日综资源集合(建议收藏)
  • 使用 QuickBI 搭建酷炫可视化分析
  • 推荐一个React的管理后台框架
  • 物联网链路协议
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 函数计算新功能-----支持C#函数
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #mysql 8.0 踩坑日记
  • (C++20) consteval立即函数
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (多级缓存)多级缓存
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)3D模板阴影原理
  • (转)winform之ListView
  • (转)菜鸟学数据库(三)——存储过程
  • (转)程序员疫苗:代码注入
  • .dwp和.webpart的区别
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net下的富文本编辑器FCKeditor的配置方法
  • .net专家(张羿专栏)
  • @Autowired @Resource @Qualifier的区别
  • @RequestParam详解
  • @RunWith注解作用
  • [Bugku] web-CTF靶场系列系列详解⑥!!!
  • [C#]winform部署官方yolov10目标检测的onnx模型
  • [C#]使用C#部署yolov8-seg的实例分割的tensorrt模型
  • [C++] 从零实现一个ping服务
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】
  • [codeforces]Checkpoints