自 ChatGPT 发布以来,已经吸引了无数人的关注。但是,ChatGPT 是如何实现的呢?虽然其内部实现的细节尚未公布,但我们可以从最近的研究中了解其基本原理。
作为 OpenAI 发布的最新语言模型,ChatGPT 在准确度、叙述细节和上下文连贯性方面比其前身 GPT-3 有显著提升。和其他大型语言模型一样,ChatGPT 能够生成不同样式、不同目的的文本,而且非常注重交互性。
OpenAI 使用监督学习和强化学习相结合的方法来调优 ChatGPT,其中强化学习组件是 ChatGPT 独一无二的优势。OpenAI 使用了「人类反馈强化学习」(RLHF)的训练方法,该方法在训练中使用人类反馈,以最小化输出中的无益、失真或偏见。
本文将分析 GPT-3 的局限性及其产生的原因,同时解释 RLHF 的原理,并说明 ChatGPT 如何使用 RLHF 克服了 GPT-3 存在的问题。最后,我们将探讨这种方法的局限性。
在机器学习中,模型的能力指的是它在特定任务或一组任务上的执行能力,通常通过优化目标函数来评估。例如,一个用于预测股票市场价格的模型,其能力可以通过衡量其预测准确性的目标函数来评估。如果该模型能够准确地预测股票价格随时间的变化,则认为该模型具有很高的能力。
然而,一致性则关注模型是否符合人类的期望,而不是仅仅在训练数据上表现良好。这种一致性问题可以通过问自己“目标函数是否符合预期”来解决。例如,如果要训练一个鸟类分类器,将鸟分类为“麻雀”或“知更鸟”,那么使用对数损失作为训练目标可能会导致模型在测试集上的精度较差,因为对数损失并不能完全反映人类分类鸟类的方式。
大型语言模型,如GPT-3,都是基于大量文本数据进行训练的。这些模型可以生成类似人类的文本,但其目标函数是词序列上的概率分布,用于预测下一个单词。虽然这种建模方式在数学上可能是高效的,但与人类生成语言的方式不同。人类往往会根据情境选择最适合的文本序列,并使用已知的背景知识和常识来辅助这一过程。因此,当大型语言模型用于需要高度信任或可靠性的应用程序时,可能存在一致性问题。
一致性问题可能表现为模型提供无效帮助、虚构不存在或错误的事实、缺乏可解释性以及内容偏见有害等方面。这些问题源于模型训练方式与期望使用模型的方式之间存在的差异,因此需要在模型训练和使用的过程中注意一致性问题的可能性。
ChatGPT 通过一种叫做 RLHF(Reward Learning from Human Feedback)的技术,利用人类反馈来解决语言模型中的一致性问题。这种技术可以将人类反馈转化为一种奖励信号,从而让模型能够更好地学习到正确的语言使用方式。
具体来说,ChatGPT 首先使用传统的语言模型训练方法进行预训练,然后在一些特定的任务上接收人类反馈。这些任务通常是与自然语言处理相关的,例如问答、文本生成等。当模型在执行任务时,会将其输出提交给人类评估员进行评估,评估员会根据输出的质量和准确性给出相应的奖励或惩罚。这些奖惩信号可以通过 RLHF 技术转化为模型的奖励信号,从而让模型更加关注重要的错误,并且能够更好地区分重要的错误和不重要的错误。
通过 RLHF 技术,ChatGPT 可以更加准确地学习到语言的统计结构和使用模式,从而生成更加自然、流畅的文本。此外,RLHF 技术还可以帮助 ChatGPT 更好地理解语言,使得它能够更好地应对一些更加复杂的自然语言处理任务。
- 有监督的调优:预训练的语言模型在少量已标注的数据上进行调优,以学习从给定的 prompt 列表生成输出的有监督的策略(即 SFT 模型);
- 模拟人类偏好:标注者们对相对大量的 SFT 模型输出进行投票,创建了一个由比较数据组成的新数据集。在此数据集上训练新模型,被称为训练回报模型(Reward Model,RM);
- 近端策略优化(PPO):RM 模型用于进一步调优和改进 SFT 模型,PPO 输出结果是的策略模式。
步骤 1 只进行一次,而步骤 2 和步骤 3 可以持续重复进行。在当前最佳策略模型上收集更多的比较数据,用于训练新的 RM 模型,然后训练新的策略。接下来,将对每一步的细节进行详述。
步骤 1:监督调优模型
第一步是收集数据,以训练有监督的策略模型。
数据收集:选择一个提示列表,标注人员按要求写下预期的输出。对于 ChatGPT,使用了两种不同的 prompt 来源:一些是直接使用标注人员或研究人员准备的,另一些是从 OpenAI 的 API 请求(即从 GPT-3 用户那里)获取的。虽然整个过程缓慢且昂贵,但最终得到的结果是一个相对较小、高质量的数据集(大概有 12-15k 个数据点),可用于调优预训练的语言模型。
模型选择:ChatGPT 的开发人员选择了 GPT-3.5 系列中的预训练模型,而不是对原始 GPT-3 模型进行调优。使用的基线模型是最新版的 text-davinci-003(通过对程序代码调优的 GPT-3 模型)。
为了创建像 ChatGPT 这样的通用聊天机器人,开发人员是在「代码模型」而不是纯文本模型之上进行调优。
由于此步骤的数据量有限,该过程获得的 SFT 模型可能会输出仍然并非用户关注的文本,并且通常会出现不一致问题。这里的问题是监督学习步骤具有高可扩展性成本。
为了克服这个问题,使用的策略是让人工标注者对 SFT 模型的不同输出进行排序以创建 RM 模型,而不是让人工标注者创建一个更大的精选数据集。
第二步:训练回报模型
这一步的目标是直接从数据中学习目标函数。该函数的目的是为 SFT 模型输出进行打分,这代表这些输出对于人类来说可取程度有多大。这强有力地反映了选定的人类标注者的具体偏好以及他们同意遵循的共同准则。最后,这个过程将从数据中得到模仿人类偏好的系统。
它的工作原理是:
- 选择 prompt 列表,SFT 模型为每个 prompt 生成多个输出(4 到 9 之间的任意值);
- 标注者将输出从最佳到最差排序。结果是一个新的标签数据集,该数据集的大小大约是用于 SFT 模型的精确数据集的 10 倍;
- 此新数据用于训练 RM 模型 。该模型将 SFT 模型输出作为输入,并按优先顺序对它们进行排序。
对于标注者来说,对输出进行排序比从头开始打标要容易得多,这一过程可以更有效地扩展。在实践中,所选择的 prompt 的数量大约为 30-40k,并且包括排序输出的不同组合。
步骤 3:使用 PPO 模型微调 SFT 模型
这一步里强化学习被应用于通过优化 RM 模型来调优 SFT 模型。所使用的特定算法称为近端策略优化(PPO),而调优模型称为近段策略优化模型。
什么是 PPO?该算法的主要特点如下:
- PPO 是一种用于在强化学习中训练 agent 的算法。它被称为「on-policy」算法,因为它直接学习和更新当前策略,而不是像 DQN 的「off-policy」算法那样从过去的经验中学习。PPO 根据 agent 所采取的行动和所获得的回报不断调整策略;
- PPO 使用「信任区域优化」方法来训练策略,它将策略的更改范围限制在与先前策略的一定程度内以保证稳定性。这与其它策略使用梯度方法形成鲜明对比,梯度方法有时会对策略进行大规模更新,从而破坏策略的稳定性;
- PPO 使用价值函数来估计给定状态或动作的预期回报。价值函数用于计算优势函数,它代表预期收益和当前收益之间的差异。然后使用优势函数通过比较当前策略采取的操作与先前策略将采取的操作来更新策略。这使 PPO 可以根据所采取行动的估计价值对策略进行更明智的更新。
在这一步中,PPO 模型由 SFT 模型初始化,价值函数由 RM 模型初始化。该环境是一个「bandit environment」,它会产生随机 prompt 并期望对 prompt 做出响应。对于给定的 prompt 和响应,它会产生相应的回报(由 RM 模型决定)。SFT 模型会对每个 token 添加 KL 惩罚因子,以尽量避免 RM 模型的过度优化。
性能评估
因为模型是根据人工标注的输入进行训练的,所以评估的核心部分也基于人工输入,即通过让标注者对模型输出的质量评分来进行。为避免训练阶段涉及的标注者的判断过拟合,测试集使用了来自其它 OpenAI 客户的 prompt,这些 prompt 未出现在训练数据中。
该模型基于三个标准进行评估:
- 帮助性:判断模型遵循用户指示以及推断指示的能力。
- 真实性:判断模型在封闭领域任务中有产生虚构事实的倾向。
- 无害性:标注者评估模型的输出是否适当、是否包含歧视性内容。
该模型还针对传统 NLP 任务(如解答问题、阅读理解和摘要)的零样本学习的性能进行了评估,开发人员发现在其中一些任务上模型的表现比 GPT-3 要差一些,这是一个「一致性税」( alignment tax) 的例子,其中基于 人类反馈强化学习的一致性程序是以降低某些任务的性能为代价的。
这些数据集的性能回归可以通过称为预训练混合的技巧大大减少:在通过梯度下降训练 PPO 模型期间,通过混合 SFT 模型和 PPO 模型的梯度来计算梯度更新。
ChatGPT 的工作可以分为三个步骤:有监督的调优、模拟人类偏好和近端策略优化。
在有监督的调优阶段,ChatGPT 使用少量已标注的数据来调优预训练的语言模型,以学习从给定的 prompt 列表生成输出的有监督的策略。这个有监督的策略模型被称为 SFT 模型。接着,在模拟人类偏好阶段,标注者们对相对大量的 SFT 模型输出进行投票,以创建一个由比较数据组成的新数据集。这个数据集被用于训练一个新模型,即训练回报模型(Reward Model,RM)。最后,在近端策略优化(PPO)阶段,RM 模型被用于进一步调优和改进 SFT 模型,以输出更好的策略模式。
在 ChatGPT 的开发中,选择了 GPT-3.5 系列中的预训练模型作为基线模型,而不是对原始 GPT-3 模型进行调优。ChatGPT 还使用了一个叫做「代码模型」的技术来增强聊天机器人的功能,使它可以处理用户输入的代码,并生成相应的代码输出。