10.16 InstructGPT与ChatGPT#
在前面几节内容中我们陆续介绍了GPT-1到GPT-3这3个模型的思想和原理。尽管随着模型规模的变大模型的效果也在稳步增长,但是却一直面临着一个重大的问题,那就是模型生成内容的安全性。在接下来的这节内容中我们将会分别介绍一种基于用户指令和对话内容微调而来的GPT模型。
10.16.1 InstructGPT动机#
由语言模型本身的建模方式可知,它的目标函数是通过前$k$个词来预测第$k+1$个词,而这也就决定了它难以根据用户输入的指令来生成对应有用的内容,因为两者的目标函数显然并不相同。简单来说就是模型知道得很多,但并不能理解用户的真实意图。例如用户输入提示“地球到底是圆的还是平的”,那么模型生成的结果可能是:
结果1: 地球到底是圆的还是平的 ,结果很近热:“大约三分之一受访者认为不确定,好在大部分人认为地球是圆的……
结果2: 地球到底是圆的还是方的 。其实,迄今为止,地球上生活的人仍然有人相信地球是方的。在这里,我不讨论的地……
为什么会出现这样的结果呢?那是因为这样的描述确存在于训练语料中,所以当用户输入“地球到底是圆的还是平的”这个提示时模型并不能理解其背后真实的意图,也就是不知道用户希望得到哪个回答。因此,我们需要将模型的输出和用户的真实意图进行对齐(Alignment)。
同时,随着模型生成能力的增强,对于生成内容的安全性和无害性也需要进行加强。基于这样的动机,2022年3月OpenAI团队在GPT-3模型的基础上加入人类反馈强化学习微调得到了InstructGPT模型[1]。从名字也可以看出,它的核心目的就是为了让模型能够理解用户所输入的指令。
例如对于指令“Explain the moon landing to a 6 year old in a few sentences.”来说,GPT-3和InstructGPT将会分别生成如下结果:
GPT-3:
Explain the theory of gravity to a 6 year old.
Explain the theory of relativity to a 6 year old in a few sentences.
Explain the big bang theory to a 6 year old.
Explain evolution to a 6 year old.
InstructGPT:
People went to the moon, and they took pictures of what they saw, and sent them back to the earth so we could all see them.
对于GPT-3来说它根本就没有理解用户的真实意图,只是随机生成了4个与问题无关的选项。相反,对于经过意图对齐后的InstructGPT来说,它用一句简单的回答解释了什么是登月,即:人们登上月球,拍摄了他们所看到的照片,然后将它们发送回地球,以便我们都可以看到它们。
10.16.2 人类反馈强化学习#
在正式介绍InstructGPT模型的原理之前,我们先来简单介绍一下强化学习的基本思想以及InstructGPT中所提出来的基于人类反馈的强化学习。
1. 强化学习
强化学习(Reinforcement learning, RL)是机器学习中的一个领域,它强调智能体(Agent)如何基于复杂环境(Environment)而采取相应行动(Action),以取得最大化的预期收益[2]。强化学习是除了监督学习和非监督学习之外的第3种机器学习方法,它的灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚刺激下,逐步形成对刺激的预期,产生能获得最大利益的习惯性行为。
如图10-46所示便是强化学习的原理示意图。对于图示中的智能体(狗)来说,它接收到外部环境的变化(训练员扔出木棍);然后采取相应的行动(原地不动、衔回来或衔走等);接着外部环境会根据智能体的行动给与对应的反馈(奖励或惩罚);最后智能体再次根据环境的变化采取相应行动并以此迭代整个过程,直到智能体通过与环境的互动逐渐学到一个优秀的策略,以在后续给定的任务中取得最大的奖励值。
因此,强化学习的学习过程通常分为以下步骤:
①观察环境:智能体观察环境的当前状态,这状态可以是一个完整的观测或是一部分观测,取决于问题的性质;
②执行动作:基于观察到的状态智能体选择一个行动执行并导致环境状态变化,其中这个选择可以是确定性的也可以根据概率采样,取决于智能体的策略;
④接收奖励:环境根据智能体的行动给予奖励或惩罚信号;
⑤更新策略:智能体根据奖励信号调整自己的策略,以便在相似的状态下做出更好的决策。
2. 人类反馈强化学习
人类反馈强化学习(Reinforcement Learning from Human Feedback, RLHF)是基于强化学习的一种改进算法,其核心思想是先通过人类反馈信息来训练一个奖励模型,然后通过该奖励模型对智能体的行为进行评估,最后智能体根据反馈信号来调整自己的策略[3]。
如图10-47所示便是人类反馈强化学习的原理示意图。与传统的强化学习相比,人类反馈强化学习最大的不同在于它会利用人类的反馈信息来对智能体的行为进行评估并给予指导以帮助智能体更有效地学习。而在强化学习中,智能体只能通过与环境的互动进行学习,并根据环境的奖励信号调整策略而没有直接的人类反馈信息参与。
10.16.3 InstructGPT原理#
总体来看,InstructGTP是基于GPT-3模型微调而来,且同时加入了人类反馈强化学习来优化模型,并最终得到了1.3B、6B和175B这3个模型。对于每个模型来说,首先会根据对应参数规模的GPT-3模型通过有监督方法(Supervised Fine-Tuning, SFT)进行微调;然后再利用标注好的指令数据训练得到一个奖励模型(Reward Modeling, RM)对微调后GPT-3模型的输出进行打分;最后利用强化学习根据奖励模型对微调后的GPT-3模型的评分进行优化,以此得到InstructGPT模型。
如图10-48所示便是InstructGPT训练过程的原理示意图,其训练过程整体上可以分为3个步骤:
**①通过有监督学习(Supervised fine-tuning, SFT)基于GPT-3进行微调。**从收集的指令数据中采样部分样本进行人工标注并将其用于GPT-3模型的微调,以此得到SFT模型。在这一过程中,SFT模型所优化的目标函数类似于式(10-12),但仅需考虑标注内容对应的损失。
**②通过有监督学习基于SFT模型训练得到奖励模型(Reward modeling, RM)。**首先将未标注的指令数据输入到SFT模型并采样得到$K$(此处$K=4$)个不同的生成结果;然后标注人员将生成的4个结果以A > B > C = D进行优劣排序构成指令-结果排序的标注数据;最后以SFT模型为基础,将最后的分类层和嵌入层替换为只有一个神经元的标量输出结果,利用标注数据训练得到奖励模型。这里值得一提的是,InstructGPT所有3个版本的模型在训练过程中使用到的RM模型都是基于6B的GPT-3训练而来,因为作者研究发现基于175B的GPT-3训练得到的RM模型输出结果并不稳定且需要较多的计算资源。
同时,由于RM模型的标注数据中标签是一个序列即排序问题,所以在实际建模过程中作者基于PairWise算法将其转化为了二分类问题。具体地,RM模型需要最小化如下目标函数
$$ \begin{aligned} \text{loss}(\theta) =-\frac{1}{ \binom{K}{2}}E_{(x,y_w,y_l)\sim D} \left[\log(\sigma(r_{\theta}(x,y_w)-r_{\theta}(x,y_l)))\right] \end{aligned} \tag{10-15} $$其中$\theta$表示RM模型对应的权重参数;$r_{\theta}(x,y)$是一个标量,表示RM模型根据输入指令$x$和标注$y$计算得到的结果;$\sigma(\cdot)$表示$\text{Sigmoid}$函数;$D$表示标注数据集;$K$表示对于排序情况的取值。
此时,对于一个输入指令来说,先随机取出一对答案$y_w$和$y_l$,并假设$y_w > y_l$且为正类;然后分别计算得到两者的奖励值$r_{\theta}(x,y_w)$和$r_{\theta}(x,y_l)$。由于$y_w > y_l$,所以我们希望模型能够学到$r_{\theta}(x,y_w)\gg r_{\theta}(x,y_l)$的结果。因此$1\cdot \log(\sigma(r_{\theta}(x,y_w)-r_{\theta}(x,y_l)))$便可以看作是一个二分类问题的交叉熵损失,它越大则表示$y_m$越好于$y_l$。因为这里是将排序序列两两进行组合,所以$\binom{K}{2}$表示取每种情况的均值。
**③通过强化学习以SFT模型为基础利用近端策略优化(Proximal Policy Optimization, PPO)进行迭代微调。**将未标注的指令输入到SFT模型中并生成相应的输出结果;然后将该结果输入到奖励模型中并得到一个奖励分数;最后根据分数利用PPO策略来对SFT模型进行迭代微调。在经过上述3个步骤以后便训练得到了最终的InstructGPT模型。具体地,PPO模型需要最大化如下目标函数
$$ \begin{aligned} \text{objective}(\phi)&=E_{(x,y)\sim D_{\pi^{\text{RL}}_{\phi}}}\left[r_{\theta}(x,y)-\beta\log\left(\pi^{\text{RL}}_{\phi}(y|x)/\pi^{\text{SFT}}(y|x)\right)\right]\\[3ex]&+\gamma E_{x\sim D_{\text{pretrain}}}\left[\log\left(\pi^{\text{RL}}_{\phi}(x)\right)\right]\tag{10-16} \end{aligned} $$其中$\phi$表示强化学习中策略模型对应的权重参数;$\pi^{\text{RL}}_{\phi}$是强化学习中所需要学习的策略,其初始值为$\pi^{\text{SFT}}$;$\pi^{\text{SFT}}$表示第①步中训练得到SFT模型;$x$表示PPO数据集采样得到的指令,$y$表示$\pi^{\text{RL}}_{\phi}$根据$x$所生成的结果,它会随着$\pi^{\text{RL}}_{\phi}$的优化而不断改变。
对于第1项$r_{\theta}(x,y)$来说,它是第②步训练得到的RM模型,用来评估每次$\pi^{\text{RL}}_{\phi}$优化后的结果,而整个目标函数的目的就是为了优化策略从而最大化奖励值$r_{\theta}(x,y)$。对于$\beta$所在的第2项来说,它是以KL散度作为惩罚项来保证随着策略的优化$\pi^{\text{RL}}_{\phi}$不会偏离$\pi^{\text{SFT}}$太远,即分别用两个模型对于同一个指令输入$x$概率分布的比值取对数进行衡量。如果两个概率分布越接近则这一项会趋于0,反之整个第2项则会小于0。对于$\gamma$所在的第3项来说,它额外加入了GPT-3预训练时对应的语言模型损失函数,目的是为了使得最终得到的$\pi^{\text{RL}}_{\phi}$模型在通用NLP任务上能保持一定的泛化效果。
10.16.4 InstructGPT评估及结果#
为了评估InstructGPT模型的有效性,OpenAI从不同的维度进行了对比。通过实验发现,尽管175B的GPT-3模型在参数规模上是InstructGPT 1.3B的100倍,但是在标注人员看来InstructGPT 1.3B在测试集上的效果要显著好于GPT-3 175B,并且在85%的情况下175B的InstructGPT模型都要优于175B的GPT-3模型。
如图10-49所示便是各个模型的相对于SFT 175B模型对应的胜率情况。在图10-49中,GPT表示原始的GPT-3模型、GPT(prompted)表示推理时加入小样学习的GPT-3模型、SFT表示经过有监督微调后的GPT-3模型、PPO表示加入人类反馈强化学习后的GPT-3模型、PPO-ptx(即InstructGPT)表示在训练时同时加入GPT-3中语言模型对应的目标函数,目的是为了同时兼顾在通用NLP任务上的表现。这是因为实验发现PPO模型在SQuAD、DROP和WMT 2015 等数据集上的结果有明显的降低,而这也被作者称之为GPT-3模型在对齐用户意图时的“对齐税”。从图10-49可以看出,仅1.3B对应的PPO模型的胜率在这一测试集上便能够超越所有175B的模型;同时,在大多数情况下模型规模扩大所带来的效果提升并不如模型训练方式改变所带来的提升。
从生成结果的真实性来看,InstructGPT在TruthfulQA数据集上的表现结果也整体优于GPT-3模型,仅仅只是在1.3B的InstructGPT上略差于同等规模的GPT-3模型。从生成结果的有害性来看,InstructGPT在RealToxicityPrompts 数据集上生成的有害输出相比于GPT-3少了约25%,但是在生成结果的偏见性上似乎并没有得到改善。同时,实验还发现InstructGPT在非英语语言和代码理解任务上有着较好的泛化效果,能够理解非英语输入并且生成相应的结果。在对于代码理解与总结的任务场景中,InstructGPT生成结果的可靠性也远高于GPT-3模型,而GPT-3模型只在50%的情况下能理解指令所描述的任务。
如图10-50所示便是GPT-3模型和InstructGPT模型对于同一个代码的解释说明。从两者生成的结果可以看出,GPT-3模型并没有理解指令所描述的任务意图;而对于InstructGPT来说则准确总结了该函数的相关作用。
10.16.5 InstructGPT数据集#
为了得到优质的标注数据来训练InstructGPT,OpenAI招募了40个人来对数据进行标注,其目的在于让标注人员能够敏感地区分不同人群的偏好以及能够有效辨认模型输出的潜在危害信息。为此,OpenAI还专门针对这一维度对招募的标注人员进行了测试,并提供了相应的培训流程和任务说明来指导标注人员。
1. 数据来源
为了得到指令类标注数据以及能够反映用户的实际意图,OpenAI首先通过标注人员收集了3类数据,包括:①仅让标注人员写出任务指令,但需要保证指令内容的丰富性和多样性;②对于少数任务指令再写出每个指令对应的多个回答内容;③让标注人员根据OpenAI API之前收集到的用户反馈写出对应的指令内容。在收集到这3类数据后,OpenAI利用SFT方法基于GPT-3模型训练得到了一个Beta版本的InstructGPT模型,并将其放在了OpenAI的在线Playground [4]中供用户使用,并开始收集相关的训练数据。
如表10-4所示便是根据Playground收集到的指令数据的分布情况,一共包含有10个类别,其中生成式指令占了45.6%、开放型问答指令占了12.4%、头脑风暴指令占了11.2%、聊天指令占了8.4%。同时,表10-4右侧表示部分指令的典型示例。
2. 数据集构建
在有了上述原始数据以后OpenAI基于此进一步构建了SFT数据集、RM数据集和PPO数据集来微调整个InstructGPT模型。对于微调SFT模型的数据集来说,它先采样一部分上面收集的指令数据;然后标注人员对其进行标注,即将原始指令和标注内容拼接在一起构造得到一个新样本;最后根据模型预测的输出结果同指令对应的真实标注内容计算损失来微调模型,即在计算损失时需要忽略掉指令部分的内容。对于RM模型的数据集来说,它是根据SFT模型的输出采样$K$个结果经标注人员排序后构建而来。对于PPO模型对应的数据集来说则相对简单,只需要使用高质量的指令数据即可。同时,在整个模型的训练过程中RM和PPO所使用的数据集也可以通过这两个模型的循环迭代进行构建,即通过RM的评价来训练得到PPO模型,进而再通过PPO模型来生成RM模型对应的标注数据进一步优化RM模型。
如表10-5所示便是3个数据集的数量及来源分布情况,其中超过96%为英语语种。在整个InstructGPT的训练过程SFT数据集大约14K,其中训练集约13K占比90%;RM数据集大约51K,其中训练集约33K占比65%;PPO数据集大约47K,其中训练集约33K占比66%。除了PPO数据集以外,SFT和RM数据集均包含Playground收集到的用户样本和由标注人员构造的样本。同时,为了保证SFT模型的训练样本更具有普适性,SFT数据集中有接近90%的训练样本都是由标注人员自行写出指令及对应的回答内容。
10.16.6 InstructGPT局限性#
尽管通过人类反馈强化学习后InstructGPT在对齐和理解人类指令上相较于GPT-3有了质的改变[5],但是InstructGPT依旧存在着一定的局限性。InstructGPT目前依旧存在着安全隐患问题,在用户的诱导下它仍旧会生成有害的、带有偏见的、色情和暴力的内容。同时,InstructGPT在生成内容的合理性方面存在着较大的不足,例如它会一本正经的胡说八道。
如图10-51所示便是GPT-3和InstructGPT根据同一个指令“为什么在冥想之后吃袜子很重要?”生成的内容。对于GPT-3来说很容易辨别其生成结果自然是答非所问。对于InstructGPT来说尽管它的答案也是错误的,但是在表述形式上却非常正式足以达到以假乱真的程度,而这也是后续OpenAI将要面对的问题。例如在图10-51的回答中,InstructGPT的回答是:“这个问题没有明确的答案,但有许多理论和想法可以解释冥想后明显需要吃袜子的原因。 一些专家认为,吃袜子的行为有助于大脑摆脱冥想带来的改变状态,而另一些专家则认为,这与……”。
10.16.7 ChatGPT#
在InstructGPT诞生大约8个月以后,也就是2022年11月,OpenAI在其官网悄然上线了一个名为ChatGPT的模型,并且一经发布便成为了一个现象级应用,仅仅两个月的时间注册用户就突破过了1亿。从它的名字来看,ChatGPT将主要提供于类似聊天机器人一样的对话服务,不过相比于之前传统的聊天机器人ChatGPT可算是有了质的飞跃。不过遗憾的是直到本书写作的2023年12月,OpenAI也并没有针对ChatGPT发布相关论文介绍,所以下面我们就仅从唯一的一篇官方博客进行简单的了解[8]。
ChatGPT可以看作是InstructGPT的一个孪生模型,它同样是根据用户输入指令来生成对应的内容,区别在于ChatGPT生成的内容更加注重内容的交互性和连贯性。从整体来看ChatGPT的训练过程和InstructGPT一致,都使用了基于人类反馈的强化学习来训练模型,唯一的区别在于训练数据的构建上。
如图10-52所示便是ChatGPT的训练原理示意图,可以看出它与InstructGPT的训练过程几乎一模一样,所以整个过程这里就不再赘述。与InstructGPT不同的地方主要集中在两点:①ChatGPT是基于GPT-3.5系列模型微调而来,而并不是基于GPT-3模型。②在ChatGPT的微调过程中使用到的均是对话形式的训练样本,即,对于SFT训练样本来说它一部分来自新收集的多轮对话内容,另一部分则是来自于InstructGPT中的训练数据但同样将其转换成了对话形式;对于RM训练样本来说则是先根据标注人员与SFT模型交流生成对话内容,然后随机选择其中SFT模型生成的内容并采样得到多个回答进行排序构建样本。
注:GPT-3.5系列模型具体有①专门用于代码生成的code-davinci-002模型;②InstructGPT之一的text-davinci-002模型;③text-davinci-002的升级版本text-davinci-003模型;④基于text-davinci-003并针对聊天场景优化的gpt-3.5-turbo模型。
由于ChatGPT是基于GPT-3.5系列模型微调而来,所以它具有强大的代码生成和纠错能力,能够理解用户意图生成对应的功能代码或修复代码错误。同时,基于对话内容的训练语料也使得ChatGPT能够准确理解与用户间的多轮对话内容,用户可以根据上下文来与ChatGPT进行对话,并且上下文最大长度能支持4096个词元[10],如下便是ChatGPT基于上下文环境的多轮对话结果。
User: help me write a short note to introduce myself to my neighbor
ChatGPT: Hi there,
My name is [Your Name] and I just moved in next door. I wanted to reach out and introduce myself. I’m looking forward to getting to know you and the neighborhood. If you ever need anything or just want to chat, please don’t hesitate to stop by or give me a call.
Best, [Your Name]
User: can you make it more formal?
ChatGPT: Dear Neighbor,
I am writing to introduce myself. My name is [Your Name] and I have recently moved in next door. I wanted to take a moment to reach out and say hello. I am looking forward to getting to know you and the neighborhood.
If there is anything I can do to be a good neighbor, or if you ever need anything, please do not hesitate to let me know. I am happy to help in any way that I can.
Sincerely, [Your Name]
虽然ChatGPT在生成内容和理解用户意图方面有了很大的提升,但是仍旧存在一些不足之处。首先ChatGPT偶尔依然会一本正经地胡说八道,作者认为一方面是因为训练集中可能确实没有对应的正确描述,并且如果控制过于严谨反而会导致模型产生更多原本可以避免的错误;另一方面是因为有监督训练方法本身就会对模型产生一定的误导,因为理想的答案取决于模型本身知道是什么而不总是依赖于训练语料是如何标注的 [8]。同时,ChatGPT对于用户的输入提示异常敏感,同一个问题采用不同的方式进行提问可能会得到截然相反的答案,所以随着ChatGPT的出现也诞生了一种新的研究方向——提示工程(Prompt Engineering),这部分内容我们在下一节内容中将会详细介绍。
10.16.8 小结#
在本节内容中我们首先介绍了InstructGPT提出的动机,即需要将模型的输出和用户的真实意图进行对齐;然后分别介绍了强化学习和基于人类反馈强化学习的基本思想;接着详细介绍了InstructGPT的训练步骤和实验结果,包括目标函数的构造、训练数据的来源和标注以及模型的结果分析和局限性等;最后简单介绍了ChatGPT模型的大致原理和数据集构建方法。在下一节内容中,我们将会详细介绍ChatGPT的具体使用方法和相关技巧。
引用#
[1] Ouyang L, Wu J, Jiang X, et al. Training language models to follow instructions with human feedback[J]. Advances in Neural Information Processing Systems, 2022, 35: 27730-27744.
[2] https://zh.wikipedia.org/wiki/强化学习
[3] https://en.wikipedia.org/wiki/Reinforcement_learning_from_human_feedback
[4] https://platform.openai.com/playground
[5] https://openai.com/research/instruction-following
[6] https://github.com/openai/following-instructions-human-feedback
[7] https://github.com/mli/paper-reading
[8] https://openai.com/blog/chatgpt
[9] https://platform.openai.com/docs/model-index-for-researchers