LLM is all you need.

Lecture 10: Instruction Finetuning, and RLHF

预训练可以通过作为参数初始化来提升 NLP 应用的效果,它让 LLM 成为了 “世界模型” !然而,仅仅进行语言建模并不等于能有效地帮助用户,这就是 Finetuning Paradigm 出现的原因。

指令微调(Instruction finetuning,Flan-T5)

指令微调指的是:收集包含多种任务的【指令,输出】对,并用这些数据微调语言模型。研究已经证明,在一组表述为指令的数据集上微调语言模型可以提高模型性能和对未知任务的泛化能力。在本文中,作者探索了指令微调,特别关注:

  • (1) 缩放任务数量;
  • (2) 缩放模型大小;
  • (3) 链式思维数据微调;

论文发现,在上述方面进行指令微调可以显着提高各种模型(PaLM、T5、U-PaLM)、提示设置(零样本、少样本、CoT)和评估基准(MMLU、BBH)。

指令是一组数据集,一组用指令表达的任务。使用指令数据进行微调使模型能够更好地响应指令,并减少对样本的需求。 一般的发现是,微调的效果与任务数量和模型大小成比例。两种关系都是正相关的(模型越大、训练任务越多,指令在少样本和零样本示例中性能提升更多)。

这项研究还使用思维链 (CoT) 数据对模型进行微调,CoT 数据指令微调的另一个重要好处是解锁零样本推理。这测试了模型在没有 CoT 的少量示例的情况下产生自己的推理技能的能力。

然而正如预训练模型一样,数据和模型规模成为了指令微调成功的关键。例如,Super Natural Instructions 数据集。这个数据集包含了超过1600个不同的任务和超过300万个示例。这样的大规模数据集可以帮助我们的模型学习到更广泛的语言模式和任务特定的知识。

同时,一个新的 Benchmark 也被提出来。Massive Multitask Language Understanding(MMLU)旨在衡量语言模型在57个不同的、知识密集型任务上的表现。这些任务覆盖了广泛的领域,包括但不限于历史、地理、数学、科学等,它们要求模型不仅要有强大的语言理解能力,还要有广泛的世界知识和推理能力。

MMLU的出现,为我们提供了一个全新的视角来评估语言模型的性能。传统的语言模型评估往往集中在单一任务上,比如 GLUE 或者 SQuAD,这些评估虽然重要,但它们并不能全面反映一个模型的多任务处理能力。

最后,说是指令微调,但感觉其实更像是我们现在所说的监督微调 (SFT)。这种方法简单直白,也易泛化到没见过的任务上。然而,监督指令微调也有几点局限性:

  1. 数据收集成本高昂: 为了训练和评估模型,我们需要大量的正确答案或期望输出,这些数据通常需要人工标注,这既耗时又昂贵。
  2. 开放性任务没有标准答案: 比如编写故事并没有一个“正确”的答案,可以有无数种创意和情节发展,每种都是独特的,对于这类人物的评估也有一定困难。
  3. 即使进行了指令微调,语言模型的目标与满足人类偏好的目标之间仍然存在不匹配。语言模型通常被优化以生成在统计上可能的输出,而不是那些最能符合人类期望和偏好的输出。

此外,其实指令微调的数据也并非需要很多 — — 研究表明大型语言模型中的几乎所有知识都是在预训练期间学习的,并且只需要有限的指令调优数据来教模型产生高质量的输出。

image-20241112183540281


人类反馈强化学习(RLHF)

为了对齐人类期望,我们引入了强化学习的概念。具体来说,对于语言模型(LM)生成的样本 ss,我们假设有一种方法可以获得人类对这个样本的奖励 RsR_s,数值越高表示越好。我们的目标是最大化从语言模型中抽取的样本的预期奖励 E[R(s)]E[R(s)]。这意味着我们可以直接从人类那里获得关于模型输出质量的反馈。

将 RL 与 LM 结合是一个比较新的领域,得益于新的RL算法的发展,特别是那些适用于大型神经网络模型的算法(例如PPO,由Schulman等人在2017年提出)。

为了最大化预期奖励 E[R(s)]E[R(s)],我们可以使用梯度上升的方法更新模型参数 θθ

𝜃_{t+1}=𝜃_t+𝛼∇_{\theta_t} 𝔼_{\hat s\sim p_{\theta_t}(s)} [R(\hat s)]

解释一下就是,对于当前模型(参数 θ\theta)生成的一个样本 s^\hat s(或者说是 response)。我们想最大化人类奖励的期望 RR,于是朝着梯度上升的方向更新 θ\theta .

最简单的方式是通过 蒙特卡洛采样 得到若干条样本,并更新参数,使得奖励高的样本更容易出现。

image-20241112154423461


How do we model human preferences?

现在对于任意的、不可微分的奖励函数 R(s)R(s) ,我们可以训练我们的语言模型来最大化预期奖励,感觉无敌了。但问题是让人类给样本打分实在是太慢,并且也很浪费钱。

为了克服这个问题,我们可以将人类偏好的建模视为一个独立的自然语言处理(NLP)问题。具体来说,我们可以训练一个 奖励模型 RM(s)RM(s),该模型能够根据已有的标注数据,预测人类的偏好。这样我们就可以在训练语言模型时采用这个模型的奖励输出,而不是直接依赖于人类的反馈。

除此之外,RLHF 还面临着噪声和道德问题。一般来讲,我们不直接要求人类给出具体的评分,而是让他们在两个输出之间进行比较。这种方法被称为 成对比较(pairwise comparisons) ,它通常更加可靠,因为:

  1. 简化决策:成对比较简化了评价者的任务,他们只需要判断两个选项中哪一个更好,而不是给出一个具体的评分。
  2. 减少噪声:由于比较是基于相对优劣,这有助于减少单个评价中的随机噪声。
  3. 校准一致性:成对比较可以帮助评价者建立更加一致的评价标准,因为他们可以直接看到比较的选项。

JRM(Φ)=E(s,s)D[logσ(RM(p(s))RM(g(s))] \mathcal{J}_{RM}(\Phi) = -\mathbb{E}_{(s, s') \sim D}[\log \sigma(R_M(p(s)) - R_M(g(s'))]

这里的 JRM(Φ)\mathcal{J}_{RM}(\Phi) 表示奖励模型的损失函数,RM(p(s))R_M(p(s))RM(g(s))R_M(g(s')) 分别是模型对正样本 p(s)p(s) 和负样本 g(s)g(s') 的评分。


ChatGPT: Instruction Finetuning + RLHF for dialog agents

ChatGPT 就是以上两种方法的集大成者:

  1. 使用人类反馈强化学习 (RLHF) 训练了这个模型,使用与 InstructGPT 相同的方法,但在数据收集设置上略有不同。

    我们使用监督微调训练了一个初始模型:人类提供了对话,他们在对话中同时扮演用户和 AI 助手。我们将新的对话数据集与 InstructGPT 数据集混合,并将其转换为对话格式。

  2. 为了创建强化学习的奖励模型,我们需要收集比较数据,这些数据由两个或多个按质量排名的模型响应组成。为了收集这些数据,我们采用了AI培训师与聊天机器人进行的对话。

    我们随机选择了一个模型编写的消息,采样了几个替代完成,并让AI培训师对其进行排名。使用这些奖励模型,我们可以使用近端政策优化 (PPO) 微调模型。

此外,在RLHF的研究中,由于获取大量的人类反馈既昂贵又耗时,许多研究工作开始探索使用模拟的GPT-4反馈作为人类反馈的替代品。根据 [Dubois et al 2023] 的研究,ChatGPT 喜欢一条条列表给你解释东西的习惯也可能是 RLHF 使然的结果。


Limitations of RL + RM & Removing the ‘RL’ from RLHF

然而,RLHF 仍面临着以下问题:

  • **人类偏好也有可能是不可靠的。**人类反馈可能会受到个人偏见、情绪状态或当时情境的影响,导致反馈结果不稳定或不一致。

  • “奖励黑客”(Reward Hacking) 也是一个常见问题。它指的是模型可能会学会奖励系统的偏好性,生成一些看似符合人类偏好但实际上没用的输出,以获得更高的奖励,但不能真正提高其性能。

  • RLHF 的训练过程十分繁琐。 首先我们得让模型生成若干样本,然后再用 Reward Model 对其打分,打完分之后再优化 LM 的生成策略并不断迭代,这样做会使得过程非常冗杂,并且会产生上述“奖励黑客”的问题。

image-20241112172517487


因此我们提出了 DPO(Direct Preference Optimization),旨在直接优化模型输出以符合人类的偏好。具体怎么实现的看隔壁 RL 笔记。

image-20241112173459799


Lecture 11: 参数高效的微调(PEFT)

1.1 Why PEFT?

首先,提示工程的局限性。

  • 效率问题:每次模型进行预测时,都需要处理提示,这增加了计算成本。
  • 性能问题:提示工程通常不如微调(Fine-tuning)效果好。
  • 对提示的敏感性:提示的措辞、示例的顺序等都会显著影响模型的表现。
  • 模型学习的不明确性:不清楚模型从提示中到底学到了什么。

其次,传统微调到参数高效的微调(PEFT)的转变。

  • 传统微调:更新模型所有参数,这在大模型上是不切实际的,计算成本过高。
  • 参数高效的微调:只更新模型的一小部分参数,这样可以显著降低计算成本,同时保持与传统微调相当的性能。

再其次,为什么需要高效的适应方法。

  • 当前AI范式:当前AI研究更注重准确性,而忽略了效率。这导致了训练和微调大规模语言模型的高能耗。
  • 环境成本:训练大规模语言模型需要大量的能源,这对环境造成了负担。
  • 资源集中化:随着训练成本的增加,AI开发逐渐集中在资金雄厚的组织(尤其是工业界),这限制了AI技术的普及。

1.2 PEFT 的不同视角

image-20250212101928572

  • 参数视角:通过稀疏子网络或低秩分解来减少参数量。
  • 输入视角:通过在输入中添加额外的参数(如前缀)来引导模型。
  • 功能视角:通过插入新的功能模块(如适配器)来适应新任务。

1.3 参数视角下的PEFT

从参数视角的PEFT来看,有稀疏子网络和低秩分解两种方法。

  1. 稀疏子网络

    • 稀疏性:指模型中大部分参数为零,只有少数参数是非零的。这种稀疏性可以通过剪枝(Pruning)来实现。

    • 剪枝:一种通过移除模型中权重较小的连接来减少参数量的方法。最常见的是基于权重大小的剪枝,即移除权重绝对值最小的连接;

    • 训练一轮后,根据权重的大小移除一部分权重。在剪枝后,对剩余的权重进行重新训练,以恢复模型的性能。通常会进行多次迭代的剪枝和重新训练,以逐步减少参数量。

    • 彩票假设(Lottery Ticket Hypothesis) :密集的、随机初始化的模型中存在一些子网络(“中奖彩票”),这些子网络在单独训练时可以达到与原始网络相似的测试精度,并且训练速度也差不多。

  2. LoRA(低秩适应)

    • 问题:对于每个下游任务,学习一套独立的参数 Δϕ 是非常昂贵的,因为参数量可能非常大。

    • 解决方案:通过低秩分解来表示任务特定的参数增量 Δϕ,从而减少需要训练的参数量。Key idea: encode the task-specific parameter increment Δ𝜙 = Δ𝜙(Θ) by a smaller sized set of parameters Θ, Θ ≪|𝜙|

    • 通常应用于Transformer中的自注意力模块。

    • image-20250212130042635

    • LoRA的优势: 在切换到不同任务时,可以通过减去 BA 并加上不同的 BA′ 来恢复权重 W

1.4 功能视角下的 PEFT

  • 适配器的作用:Adapter 是一种插入到预训练模型中的小型功能模块,用于适应下游任务。适配器可以插入到 Transformer 架构的每一层中,或者只插入到特定的层。
  • 适配器的结构
    • Down-projection:通过一个线性层 WdRh×dW_d∈R^{h×d} 将输入维度降低到 d
    • 非线性激活:通常使用ReLU或GELU等非线性激活函数。
    • Up-projection:通过另一个线性层 WuRd×hW_u∈R^{d×h} 将维度恢复到 h
    • 公式:适配器的输出可以表示为 fadapter(x)=Wu(σ(Wdx))f_{adapter}(x)=W_u*(σ(W_d*x)),其中 σ 是非线性激活函数。

1.5 其他高效的适应方法

  • 知识蒸馏(Knowledge Distillation):通过一个教师-学生框架,将预训练模型的知识蒸馏到一个更小的模型中,从而实现高效的模型适应。

  • 示例:Shridhar等人(2023)提出了一种知识蒸馏方法,通过教师模型指导学生模型的学习,从而在保持性能的同时减少模型的参数量。


总结

以上就是 CS224N 一些简单的学习笔记了,说实话现在大模型发展早超脱于这门课程中的内容,课程里最新的东西也是两年前的技术了。

要想赶上现在发展的趋势,还是得看近期的技术报告,补全自己的知识栈,以上。