大数跨境
0
0

了解 ChatGPT 的演变: 深入了解 CodeX 及Instruct GPT

了解 ChatGPT 的演变: 深入了解 CodeX 及Instruct GPT AI算法之道
2025-01-25
2
导读:CodeX和InstructGPT核心技术讲解
点击蓝字
 
关注我们










01


引言



这是我们 GPT 系列的第三篇文章,也是最实用的一篇:最后,我们将谈谈如何有效地微调 LLM。

它的实用性在于,如果今天有人要求你训练自己的 LLM,你可以跳过预训练,直接使用开源 LLM 或 SLM;不过,很可能你仍然需要根据自己的数据和任务对它进行一些微调,而这正是本文可以提供帮助的地方。

更具体地说,我们将重点关注两个微调模型--Codex 和 InstructGPT,因为它们代表了解决 LLM 微调中的两类挑战:
  • Codex 需要将预先训练好的 LLM 适应不同的模式(代码),因为编程语言与自然语言相比有许多独特之处;
  • InstructGPT 的目标是使模型更加符合人类的偏好,而传统的语言建模目标无法自动实现这一点。
正如我们稍后将看到的,这两项挑战都要求在微调过程的每个阶段都要有创造性和谨慎性:如何收集高质量的数据、如何修改模型架构、如何有效地初始化模型、如何确定适当的目标以及如何对其进行适当的评估。
闲话少说,我们直接开始吧!






02


为什么需要微调?


正如我们在第二篇文章中所解释的那样,GPT-2 和 GPT-3 都可以看作是 OpenAI 为测试任务识别预训练的潜力而进行的实验。同时,作者还提到微调是未来研究的一个很有前景的方向,因为这可能有助于模型进一步提高在某些任务上的表现。

那么为什么需要微调呢?原因有三。
第一个原因当然是性能。预先训练好的模型更像是通才,可以很好地完成各种任务,但仍可能难以击败在特定任务上训练有素的专家。如果我们的目标是让这样一个专业模型帮助我们完成非常具体的任务,那么就一定要考虑微调。
另一个原因是,GPT-3 模型虽然普遍功能强大,但在遵循人类指令方面并不总是可靠的,尤其是当这些指令变得复杂时。这是因为,正如作者在 InstructGPT 论文中解释的那样,预训练目标主要侧重于语言建模,如预测下一个标记,但这种能力无法转化为指令跟踪能力。因此,需要一些特殊的微调策略。
此外,还有人担心安全和道德方面的问题,原因与自回归语言建模非常相似,即仅仅依靠自回归语言建模不足以强制模型避免生成有害或有偏见的答案。在这个问题上,微调也能让我们更好地控制生成过程。






03


微调的调整

通常来说,对 LLM 进行微调有两类挑战:一是需要适应新的模式,二是需要使模型符合人类的偏好。

以 Codex 为例,在前一种情况下,预先训练好的模型需要应用于不同的模式,这些模式具有一些独特的特征,例如,要处理代码脚本,它需要理解特定编程语言的基本语法,处理静态和动态类型,甚至推断类型,以及正确处理 Python 等语言中的缩进。

后一种情况在某种程度上更为棘手,因为 "对齐 "本身是一个相当模糊和有争议的概念,我们必须对其进行更明确的定义,并将其转化为一系列可衡量的方面,然后才能真正朝着这一目标进行微调。此外,即使我们已经确定了 "对齐 "的定义,实现这一目标也并非易事,因为没有现成的训练目标与之直接相关。

除此之外,我们还需要收集高质量的特定领域训练数据,并重新思考评估流程,包括评估数据集和使用的评估指标。

在后面的章节中,我们将了解 Codex 和 InstructGPT 是如何处理这些问题的。我们将特别强调他们是如何以创新和谨慎的态度实施每一个步骤的,任何想调整自己的 LLM 的人都可以从中学习到一些东西。






04


GPT-3.5

GPT-3.5 系列通常指在 GPT-3 基础上微调的模型系列,包括以下变体:

  • code-davinvi-002:Codex的一个版本

  • text-davinci-002:从 GPT-3 到 InstructGPT 的过渡模型

  • text-davinci-003: 与 InstructGPT 更为相似

总体而言,GPT-3.5 可被视为经过微调的 GPT-3,具有更强的指令跟随性、更高的生成质量。它是其他几个模型的基础,包括 ChatGPT、Codex、Whisper 和 DALL-E2 的文本模型,这证明了在专门任务中有效微调 LLM 的潜力。

在接下来的章节中,我们将深入探讨 Codex 和 InstructGPT。我们不会介绍它们微调过程中的每一个细节,而是将重点放在最能体现其创意的方面。






05


CodeX

Codex 模型于 2021 年发布,专门用于编写 Python 代码。以下是我们要强调的几个方面。

  • 代码生成能力评估

在为一项新任务建立模型时,首先想到的往往是如何正确评估这项任务。这一点非常重要,因为如果没有有效的评估标准,我们就无法确定我们是否真的取得了任何进展,有时我们甚至无法首先找出我们当前模型中的差距。

就 Codex 而言,作者首先意识到,基于匹配度的标准指标(如 BLEU 分数)并不适合用于衡量代码生成性能。

如果您不熟悉 BLEU 分数:它被广泛用于评估机器翻译等文本生成任务,通过比较重叠的短语并计算精确度得分,同时还考虑文本长度以确保平衡。

然而,同样的编码问题可以用不同的数据结构或算法来解决。例如,生成斐波那契数列可以用自上而下或自下而上的 DP 算法来实现,从而产生截然不同的代码脚本:

def fib_top_down(n, memo={}):    if n in memo:        return memo[n]    if n <= 1:        return n    memo[n] = fib_top_down(n-1, memo) + fib_top_down(n-2, memo)    return memo[n]
def fib_bottom_up(n): if n <= 1: return n dp = [0] * (n + 1) dp[0], dp[1] = 0, 1 for i in range(2, n + 1): dp[i] = dp[i-1] + dp[i-2] return dp[n]

在这种情况下,如果我们用 BLEU 分数来评估这两个解决方案与给定参考解决方案的对比情况,很有可能其中一个甚至两个解决方案的 BLEU 分数都很低,尽管这两个解决方案都是正确的。

另一种方法是采用作者所说的 "功能正确性 "进行评估,例如 Kulal 等人使用的 pass@k 指标,即针对每个问题生成 k 个代码样本,并对每个样本进行测试,如果任何样本通过了单元测试,则可以认为问题已经解决。最后,报告的是已解决问题的总比例。然而,正如作者所指出的那样,用这个定义计算 pass@k 会因这个过程的随机性而导致高方差,尤其是当 k 较小时。

为了缓解这一问题,作者提出了另一种估算 pass@k 的方法:不直接生成 k 个样本,而是在每个任务中生成 n ≥ k 个样本。随着生成和测试的样本越来越多,即使 k 很小,估算过程也会更加可靠。然后,根据有多少样本是正确的(假设有 c 个样本通过了单元测试),可以估算出一个无偏估计器,如下所示:

其中:

  • C(n,k)是从 n 个样本中选择 k 个样本的方法数;

  • C(n-c,k)是从 (n-c) 个错误样本中选择 k 个样本的方法数;

  • 因此,C(n-c, k)/C(n, k) 表示所选样本全部错误的概率;

  • 最后,1 - C(n-c,k)/C(n,k)表示至少有一个样本是正确的概率。

为了进一步证明优化 BLEU 分数不等同于优化功能正确性,作者还绘制了 4 个随机编码问题的正确(蓝色)和错误(绿色)解决方案的 BLEU 分数密度图,在这些问题中,BLEU 分数的分布显然是无法评估的:

除了优化评估指标,作者还建立了一个名为 HumanEval 的新数据集,其中包含 164 个手写编程问题。如下例所示,每个问题包括一个函数签名、一个文档字符串、一个正文和平均 7.7 个单元测试:

请注意,正如作者在论文中提到的,这些任务必须是手写的,否则用于评估的问题可能会与用于训练的问题重叠。此外,为了确保测试过程不会因恶意代码而带来任何风险,作者还创建了一个沙箱来执行代码脚本。





06


CodeX训练数据

谈到训练部分,第一个问题是如何收集高质量的训练数据。对于代码生成,好消息是我们可以利用 GitHub 上的海量代码库,但正如论文中提到的,仍然需要一些数据清理策略:

我们过滤掉了可能是自动生成、平均行长超过 100、最大行长超过 1000 或包含少量字母数字字符的文件。

请注意,这些清理策略大多是编程语言的专用策略,因此我们在清理自己的数据时可能需要提出其他想法。

其次,最重要的调整是对标记符的调整,原因很明显,GitHub 代码中单词的分布与自然语言有很大不同。在 Codex 的论文中,作者指出,在对空白进行编码时,情况尤其如此,这使得原始的 GPT-3 标记符号生成器的效果大打折扣。

为了解决这个问题,我们在词汇表中添加了一组额外的标记,用于表示不同长度的空白运行。正如论文中提到的那样,这一简单的修改可以使代码的Token数减少 30%。

因此,如果我们的模型需要处理的输入语料库呈现出与自然语言不同的分布,我们可能需要对分布进行一些研究,并对标记符进行一些修改。




07


CodeX评估结果

首先,下图显示了不同模型在 HumanEval 数据集上的通过率。总体而言,与 GPT-3 相比,Codex 的所有变体都显示出明显更好的性能,其中:

  • Codex(对代码进行微调)解决了 28% 的问题;

  • Codex-S(对独立功能进行了微调)解决了 37.7% 的问题;

  • Codex-S 生成 100 个样本,选择平均对数概率最高的一个,解题率为 44.5%;

  • Codex-S  oracle 选择通过单元测试的样本,解决了 77.5%的问题。

此外,还观察到与 GPT-3 类似的缩放规律,这表明使用更大的模型可以获得更好的性能:

作者还注意到,当 k 越大时,temperatures 越高越好,这凸显了仔细调整超参数的重要性:







08


Instruct GPT


Evaluation of Alignment

如何正确评估 "alignment"也很有挑战性,因为一致性的定义不像准确性等其他方面那么清晰。在这项工作中,作者将一致性定义为模型是否 "有益、诚实和无害",并将其转换为更可测量的属性:

  • Helpful: 通过测量模型是否能听从指令,甚至从少样本提示中推断出意图。

  • Honest:通过测量真实性,或者用作者的话说,"如果模型关于世界的陈述是真实的"。更具体地说,他们建议通过 TruthfulQA 数据集上的幻觉率来衡量。

  • Harmless: 通过衡量在客户助理的背景下,输出是否不恰当,是否诋毁受保护的阶级,或是否包含性或暴力内容",并以旨在衡量偏见和有害性的数据集为基准。

此外,为了确保微调过程不会导致训练前性能的严重倒退,评估过程还需要反映训练前和微调目标的质量。为此,我们在两个不同的数据集上对 InstructGPT 进行了评估:

  • 对应用程序接口分布的评估:这主要是为了评估微调质量,要求人工标注者评定哪种输出更受欢迎;

  • 在公共 NLP 数据集上进行评估:评估预训练和微调质量,包括传统的 NLP 数据集以及用于评估模型安全性(如真实性、毒性和偏差)的数据集。

接下来,我们将简要介绍 RLHF 的工作原理以及它在 InstructGPT 中的实现方式。







09


RLHF
下图显示了典型强化学习场景中的 5 个要素:

现在想象一下,您正在教您的小狗坐下,在这里您可以找到所有 5 个元素:

  • Agent:  您的小狗正在学习新指令 "坐下"。

  • Environment: 幼犬周围的一切

  • State: 小狗所处的状态(是否坐着)

  • Reward: 当小狗听从您的命令时,您给它的食物;

  • Action: 您的小狗能做什么,如坐下、跳跃或吠叫。

强化学习的工作原理是这样的:一开始,你的狗(代理)并不理解 "坐下 "的意思,但它会在你的房子(环境)里尝试各种不同的动作,比如跑、坐甚至吠叫(动作)。每当它坐下时,它就会得到食物(奖励)。随着时间的推移,您的幼犬学会了坐着就能得到食物,它似乎终于明白了 "坐下 "的意思。

使用 RL 训练模型的方法与试错法非常相似。RL 的关键在于精心设计奖励。这种奖励必须与目标紧密结合,否则Agent将无法学习到所需的行为。同时,这种奖励的产生应尽可能简单快捷,因为如果计算奖励的过程太慢或太复杂,那么 RL 过程也会变得极其缓慢,从而降低其在实际任务中的实用性。

例如,在一个游戏中,Agent的每一个动作都会自动从环境中得到一个分数,而这个分数直接关系到Agent在这个游戏中的表现。

然而,在现实世界的许多应用中,并不存在像游戏中的分数那样随时可用的奖励。相反,研究人员必须花大力气定义适当的奖励函数。此外,有些预期行为很难转化为奖励函数,例如,如何定义奖励函数来引导Agent更礼貌地回答问题?

这就是 RLHF:从人类反馈中进行强化学习。

还是以训练小狗为例,想象一下您的小狗终于学会了坐下,但有时它也会在坐着时吠叫,或者它会先跳到沙发上,而不是安静地坐在地板上。

在这种情况下,你能做什么?

使用 RLHF 时,您不会在小狗每次坐下时都给它食物。相反,您会通过比较它的行为来给予奖励。例如,如果小狗安静地坐在地板上,它得到的奖励就会比一边叫一边坐或跳到沙发上坐的奖励要多。这样,小狗就会知道安静地坐在地板上更好,即使您没有明确解释 "安静 "的含义。

正如我们之前提到的,简单快速的奖励是 RL 的关键所在,这使得让人类参与到训练环路中提供直接反馈是不现实的。为了克服这个问题,我们可以先收集一些人类的反馈,然后利用这些反馈来学习奖励函数,以模仿人类在比较两种行为时的偏好。

总之,RLHF 通常包括三个阶段:

  • 收集人类反馈:对模型输出进行取样,请人类评委比较哪个更好。

  • 通过模仿人类的偏好来学习奖励模型。

  • 在 RL 过程中,利用奖励模型训练出更好的策略。

如果您不熟悉 RL 术语:策略是指代理根据环境状态选择行动的策略。接下来,我们将介绍如何在微调 InstructGPT 中实施这种 RLHF 方法。




10


在InstructGPT中实施RLHF


InstructGPT 和 ChatGPT 使用相同的模型进行训练,RLHF 是微调的关键因素。

训练过程大致遵循我们在上一节中介绍的步骤,并特别关注数据质量和实施细节,我认为这两点对于 InstructGPT 的成功同样重要。

现在让我来细说一下。

步骤 1:收集训练数据,训练监督策略

在这一步骤中,要求人工标注者为每个提示提供高质量的所需行为示范。

Prompt dataset:首先,您需要有一个提示词数据集,以便从中抽取单个提示语样本,理想情况下,该提示词数据集应该既有用又多样化。

为此,作者采用了一种迭代方法:一开始,要求标注者手动编写一些种子提示词,然后利用这些数据通过监督学习训练一个模型。随后,该模型被部署到 OpenAI API 上,以收集用户的文本提示,这些提示后来形成了提示数据集。

下表显示了这一提示数据集的分布情况,因为多样性对于确保模型在各种任务中得到训练非常重要:

Human data collection: 在整个 RLHF 流程中,有三个部分需要人工数据,包括在步骤 1 中编写演示文稿、在步骤 2 中提供对比数据以及在微调后进行最终评估。

作者在论文中提到了许多确保数据质量的做法:

  • 首先,高质量的数据来自优秀的标注员。为了确保他们的数据标注能力,我们进行了一次筛选测试,以选出 "对不同人口群体的偏好敏感,并善于识别可能有害的产出 "的标注者。

  • 其次,为了确保所有打标人员的一致性,他们设置了一个入职流程来培训所有标注人员,并为每项任务提供了详细的说明。作者还提到,他们建立了一个共享聊天室来回答标注者的问题。

  • 最后,为了了解该模型如何适用于不同打标人员的偏好,我们又雇用了一组未通过筛选测试的标注员进行评估。

基于这些人类提供的数据,第一步使用监督学习对预训练的 GPT-3 模型进行了微调。该模型被称为基准策略,将用于在第二步中产生比较输出,并在第三步中初始化 PPO 算法。

步骤 2:收集对比数据并训练奖励模型

Comparison data collection: 一旦有了基准政策,就可以用它来为一些抽样提示生成输出结果,这些输出结果将由人工标注员进行审核并从优到劣排序。为了加快排序过程,将同时向人工标注者展示一组 K 个输出结果,其中 K 的范围为 4 到 9。

Reward model training:  奖励模型是在监督训练的基线策略上初始化的,方法是移除最后的嵌入层并在对比数据上进行训练。作者特别提到,将每个提示的所有比较数据作为一个批次进行训练,而不是对比较数据进行洗牌,有助于减轻过拟合。作者使用 6B 个参数对其进行了训练,以便为输入-响应对分配标量分数。需要注意的是,在决定奖励模型的大小时,我们需要寻求一种平衡:它需要足够大,以准确模拟人类的偏好,但也不能太大,因为它需要在 RL 过程中支持快速推理。

步骤 3:使用 PPO 奖励模型优化训练政策

至此,我们已经为使用 RLHF 对模型进行微调做好了一切准备:初始策略和奖励模型。这一步的训练遵循典型的 RL 流程:在每个事件中,当前策略("代理")将对新的提示("状态")进行采样并产生新的输出(模型的 "行动"),然后奖励模型将计算输出的奖励("报酬"),并据此使用 PPO 更新策略。

如果您对 PPO 不熟悉,也不用担心,它只是一种旨在帮助Agent慢慢更新策略的方法。

这里有几件事要提一下:

  • 在每个Token上都添加了每个Token的 KL 惩罚,以减轻奖励模型的过度优化。

  • 作者进一步尝试将预训练梯度混合到 PPO 梯度中,以固定在公共 NLP 数据集上的性能回归,这被称为 "PPO-ptx"。在本文中,InstructGPT 实际上指的是 PPO-ptx 模型。

请注意,步骤 2 和步骤 3 可以不断重复:
  • 有了更新的策略(来自步骤 3),我们就可以生成新的输出并收集更多的对比数据,重复步骤 2,就可以利用这些数据训练出新的奖励模型;

  • 有了新的奖励模型(来自步骤 2),重复步骤 3 就能得到更好的策略。





11


InstructGPT模型评估


由于篇幅有限,我们将不在本文中详述所有评估结果,而只重点介绍几项新发现。

最重要的发现或许是,结果表明 RLHF 的确可以改善对齐情况。下图显示了由人类评委评估的与有监督的 175B GPT3 模型的胜率。根据该图,PPO 和 PPO-ptx 都明显优于 GPT 基线,甚至 1.3B PPO 模型也优于 175B GPT-3。这一结果清楚地表明了 RLHF 的有效性。

作者还发现,InstructGPT 在真实性方面有所改善(幻觉率从 41% 降至 21%),在有害性方面略有改善(有害性输出减少 25%),但在减少偏见方面没有明显改善。

另一项发现是,PPO-ptx 可以最大限度地减少公共 NLP 数据集的性能回归,如下图所示。





12

结论

训练 LLM 通常涉及多个阶段,如预训练、监督微调以及RLHF 。对于我们手头的任务,我们通常可以从开源的预训练 LLM 开始,然后根据特定领域的数据对其进行微调。
归根结底,探索一项新任务总是既充满挑战又令人兴奋的,我希望从本文中学到的知识能帮助我们减少挑战,增加兴奋,并最终获得更多乐趣!:)



参考文档:https://towardsdatascience.com/understanding-the-evolution-of-chatgpt-part-3-insights-from-codex-and-instructgpt-04ece2967bf7




点击上方小卡片关注我




添加个人微信,进专属粉丝群!


【声明】内容源于网络
0
0
AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
内容 573
粉丝 0
AI算法之道 一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
总阅读256
粉丝0
内容573