Chatgpt是如何被训练出来的?

本文根据https://www.youtube.com/watch?v=VPRSBzXzavo,可以结合视频一起学习,我觉得讲的还不错,就整理了一遍。

ChatGPT可能不需要太多介绍,如果你使用过它的话。你可能已经看到它可以经常回答代码片段的问题,帮助总结文档,写连贯的短篇小说等等。现在它确实有很多限制,而且很容易出错,但它也代表了语言建模在过去几年中取得的进步。

此次我们将专门介绍ChatGPT的训练目标,该方法遵循与大约一年前发布的Instruct GPT相似的方法。那个模型特别针对指令遵循。用户提供一个请求,模型输出一个响应。ChatGPT扩展到更互动的对话,其中模型可以保留和使用交换过程中较早的上下文信息。训练解决方案有三个主要阶段:

  • 产生性预训练,其中我们对文本数据训练原始语言模型。

  • 监督微调,其中模型进一步训练以模拟人类表现的理想聊天机器人行为。

  • 来自人类反馈的增强学习,其中人类对替代模型输出的偏好将用于定义RL的奖励函数进行额外训练。

每个步骤,模型都是从前一步的结果微调的。也就是说,其权重将初始化为前一阶段获得的最终权重。我们将逐步介绍这些内容。

首先什么是语言模型?它基本上是自动回归序列模型的一个特例。给定一些观察变量X1到XT的历史记录,一个基本的序列模型的任务是预测XT加1。在训练期间,我们从数据集中提取序列,并调整模型的参数以最大化模型对真实XT加1的概率,这取决于历史记录。

这个预测下一步骤的范例已经应用于不同领域,如音频波形和分子图。在语言模型的情况下,我们将称为标记的个别变量可以表示单词或单词的子组件。

例如,给定句子的前四个单词,使用单词标记的语言模型将输出其词汇中的所有单词的概率分布,表示每个单词出现的可能性,至少根据模型的估计。绝大多数标记将获得接近零的概率,因为它们没有任何意义,但是一些合理的标记将获得一些非零概率质量。现在尽管语言模型仅训练用于预测文本数据中的下一个标记,但在推理过程中,我们通常想做的是实际生成标记序列。

在每个步骤中,我们可以从模型输出的概率分布中采样一个标记,并重复此过程,直到选择特殊的停止标记。该设置与具体的模型架构无关,通常现代语言模型是由数十亿个参数组成的大型transformers。

之前曾深入探讨了transformer的架构细节和数学原理。过去几年的示例模型包括OpenAI的GPT-3或谷歌的BERT。这些都是在互联网上抓取的大量文本上训练的:聊天表单、博客、书籍、脚本、学术论文、代码,包罗万象。

目前模型可以在推理过程中条件关注的历史数量是有限的,对于ChatGPT,底层语言模型可以关注大约3000个词的上下文,足够进行短暂的对话,但显然不足以输出整篇小说。通过在这种大量的非结构化异构文本数据上进行预训练,我们可以让模型学习单词、句子和段落之间在人类语言的不同使用情况下的复杂概率依赖关系。

但这时又产生了一个新的问题,为什么这个产生式建模公式(语言建模根基),不足以产生ChatGPT所表现的最终行为?为什么仅靠单一公式无法产生模型开发人员或最终用户希望模型执行的任务?

事实上,语言模型预训练所代表的任务是一系列混合任务。用户输入不一定足以在这些任务中作出明确区分。例如,用户提供此输入:"解释冒泡排序算法的工作原理。"

对我们来说,用户的需求是很明确的,但模型仅训练用于输出文本片段的合理完成或延续。所以在回应如"解释归并排序算法的工作原理"并不完全能反映精确的需求。毕竟在其训练数据的某个地方,存在包含不同主题的问题列表的文档,比如人类考试的试题。


我们想要模型执行的任务实际上只是数据中代表的任务的一部分。在现实的使用场景中,即使没有任何额外的训练,我们通常也可以通过提示来让语言模型执行所需的任务。我们通过首先使模型处于手动构造的示例上(prompt),该示例说明了所需的行为。但这需要用户额外工作,并且可能很乏味。


此外开发人员可能还对模型输出的其他特征有主观偏好。例如,他们可能希望模型拒绝回答寻求实施暴力行为或其他非法活动建议的询问。在处理概率模型时,可能难以完全消除违反这些规定的数据,但开发人员希望尽可能最小化它们的频率。

因此在第二阶段,模型将通过简单的监督学习进行微调。人工示范者首先进行对话,他们扮演双方角色:人类用户和理想的聊天机器人。这些对话聚合到一个数据集中,其中每个训练示例由特定对话历史与扮演聊天机器人的人类下一步回应组成。对于特定的历史记录而言,目标是最大化模型对相应响应中的标记序列的概率。这可以视为一种典型的模仿学习设置(行为克隆),我们试图模仿专家在输入状态下的动作分布。因此通过此步骤,模型比原始语言模型更善于响应用户请求,更少需要提示,但它仍然存在限制。这种模仿设置,无论是在语言还是其他领域(如驾驶汽车或玩游戏),都存在分布转移问题。模型训练期间的状态分布是由专家策略,即人类示范者的行为决定的,但随着推理的迭代,影响访问状态分布的是模型或代理本身。

一般来说模型并不完全学习专家的策略。它可能能够很好地近似,但各种实用因素可能限制此近似,包括:不够充分训练数据、环境的部分可观察性或者是优化困难等因素。

因此随着模型的训练,它可能会犯人类专家不太可能犯的错误。一旦发生此种问题,可能导致累积错误效应。理论上可以证明,预期错误实际上以长度的二次方增长。在语言模型的情况下,早期错误可能会使其偏离轨道,导致过度自信的断言或输出完全无意义的内容。
为了缓解这种情况,我们需要模型或代理在训练期间也采取行动,而不仅仅是被动观察。

一种方法是通过强化学习进一步微调模型:

某些RL设置已经具有预定义的奖励函数。如果我们考虑比如雅达利的游戏,那么随着游戏的进行会收集明确的奖励。如果没有这一点,我们通常需要手动构造某些奖励函数,但在语言案例中这当然很困难。在对话中表现良好是难以精确定义的。我们可以让标记者尝试直接分配数值得分,但这可能难以校准。

ChatGPT的开发人员根据人类偏好建立奖励函数。AI训练员首先与当前模型进行对话。然后,对于模型的任何给定响应,还会采样一组替代响应,人类标记者根据最喜欢到最不喜欢的顺序对其进行排名。为了将此信息提炼为适合强化学习的标量奖励,会对这些排名训练一个单独的奖励模型,该模型使用监督学习模型的权重初始化。给出K个输出的排名,我们可以形成K选择两个训练对。奖励模型将为每个对的每个成员分配一个标量分数,表示对数或未归一化的对数概率。分数越高,模型对该响应被首选的概率越大。用于损失函数的标准交叉熵将奖励模型视为二分类器。训练完成后,标量分数可用作奖励。这将使训练比纯监督设置更为互动。在强化学习阶段,我们的策略模型,即聊天机器人,将从最终的监督模型中微调。它在与人对话的环境中发出动作,即标记序列,给定某个状态,即对话历史,以及相应的动作,奖励模型返回数值奖励。开发人员选择使用近端策略优化或PPO作为强化学习算法。

现在,我们优化的学习奖励模型在这里是对我们真正关心的目标(人类主观评估)的良好近似,但它仍然只是一个近似。因此,InstructGPT论文的作者描述了通过将额外项添加到PPO目标中来避免此过度优化,该项惩罚RL策略与先前从监督微调学习的策略之间的KL散度。奖励模型学习和PPO的组合在几次迭代中重复。每次迭代中,更新的政策可以用于收集更多的响应进行偏好排名,并训练一个新的奖励模型。然后,政策通过另一轮PPO进行更新。这两个微调步骤,即监督学习和来自人类反馈的强化学习,对模型的性能产生了巨大影响。
尽管ChatGPT具有合理的复杂功能,但仍有很大的提高空间。它有时会吐出不准确或完全虚构的事实,并且无法链接到明确的来源。而且其行为仍然高度依赖于输入的具体措辞。