ChatGPT中RLHF技术介绍


简介

随着OpenAI发布的ChatGPT大火,越来越多人开始关注其中用到的RLHF(Reinforcement Learning from Human Feedback)技术,其字面意思是基于人类反馈的强化学习,核心思想是获取生成文本的人工反馈,使用强化学习对语言模型进行优化,旨在于生成人类偏好的答案,增加了答案的合理性和安全性——使生成模型与人类偏好对齐,提升监督学习的性能天花板

技术原理

RLHF可以简单分解为三个核心步骤:

  • 1.预训练语言模型(LM)
  • 2.收集数据并训练奖励模型
  • 3.通过强化学习微调 LM

RLHF整体流程

Step1. 预训练语言模型

step1. 预训练模型训练过程
首先,采用经典的预训练目标训练一个语言模型, 也即冷启动阶段的监督策略模型。尽管GTP-3.5已经非常强大,但是它很难理解人类不同类型指令中蕴含的不同意图,也很难判断生成内容是否是高质量的结果。为了让GPT 3.5初步具备理解指令中蕴含的意图,首先会从测试用户提交的prompt(就是指令或问题)中随机抽取一批,靠专业的标注人员,给出指定prompt的高质量答案,然后用这些人工标注好的<prompt,answer>数据来 Fine-tune GPT 3.5模型。经过这个过程,我们可以认为GPT-3.5初步具备了理解人类prompt中所包含意图,并根据这个意图给出相对高质量回答的能力,但仅仅这样做是仍然不够。

这里可以用额外的文本或者条件对这个 LM 进行微调,例如 OpenAI 对 “更可取” (preferable) 的人工生成文本进行了微调,但并不是 RLHF 必须的一步(虚线表示)

Step2 训练奖励模型

这个阶段的主要目的是通过人工标注训练数据,来训练奖励模型模型。

首先,随机抽样一批用户提交的prompt(大部分和第一阶段的相同),使用第一阶段Fine-tune好的冷启动模型,对于每个prompt,由冷启动模型生成K个不同的回答,于是模型产生出了<prompt, answer1>, <prompt, answer2>….<prompt, answerK> 数据。之后,标注人员对K个结果按照很多标准(上面提到的相关性、富含信息性、有害信息等诸多标准)综合考虑进行排序,给出K个结果的排名顺序。

接下来,我们准备利用这个排序结果数据来训练回报模型,采取的训练模式其实就是平常经常用到的pair-wise learning to rank。对于K个排序结果,两两组合,形成$C_{K}^2$个训练数据对,ChatGPT采取pair-wise loss来训练Reward Model。

例如,用图1中例子(D > C > B > A)来讲,loss 应该等于:
$loss = - (r(D) - r(C) + r(D) - r(B) + r(D) - r(A) + r(C) - r(B) + … + r(B) - r(A))$

为了更好的归一化差值,我们对每两项差值都过一个 sigmoid 函数将值拉到 0 ~ 1 之间。可以看到,loss 的值等于排序列表中所有「排在前面项的reward」减去「排在后面项的reward」的和。 而我们希望模型能够「最大化」这个「好句子得分」和「坏句子得分」差值,而梯度下降是做的「最小化」操作,因此加上一个负号。具体的loss function如下所示:

奖励模型loss function
综上所述,在这个阶段,首先由冷启动后的监督策略模型为每个prompt产生K个结果,人工根据结果质量由高到低排序,以此作为训练数据,通过pair-wise learning to rank模式来训练回报模型。对于学好的RM模型来说,输入<prompt,answer>,输出结果的质量得分,得分越高说明产生的回答质量越高。

step 2. 奖励模型训练过程

Step3 通过强化学习微调 LM

我们将初始语言模型的微调任务建模为强化学习(RL)问题,因此需要定义策略(policy)、动作空间(action space)和奖励函数(reward function)等基本要素:

  • 策略(policy):语言模型
  • 动作空间(action space):所有token在所有输出位置的排列组合
  • 观察空间则是可能的输入token序列(即prompt)
  • 奖励函数:Step2中得到的reward模型 + 约束项

显然,策略就是基于该语言模型,接收prompt作为输入,然后输出一系列文本(或文本的概率分布);而动作空间就是词表所有token在所有输出位置的排列组合(单个位置通常有50k左右的token候选);观察空间则是可能的输入token序列(即prompt),显然也相当大,为词表所有token在所有输入位置的排列组合;而奖励函数(reward)则是基于上一章节我们训好的RM模型计算得到初始reward,再叠加上一个约束项。

具体来说,给定数据集的提示 x ,将生成两个文本 $y_1$ 和 $y_2$ ,一个来自初始语言模型LM,另一个来自微调策略的当前迭代LM。将来自当前策略的文本传递给 偏好模型RM 得到一个标量的奖励 ${\boldsymbol{r}}_{\theta}$ 。

为了确保模型输出合理连贯的文本,防止模型在优化中生成胡言乱语文本来愚弄奖励模型提供高奖励值,因此加上一个约束项,使得优化后的语言模型生成文本与初始语言模型不要偏差太多,一般分布差异的惩罚项被设计为输出词分布序列之间的 Kullback–Leibler (KL) 散度的缩放 ${\boldsymbol{r}}{KL}$ ,最终用于惩罚 RL 策略在每个训练批次中生成大幅偏离初始模型,因此RL更新规则的最终奖励是: $r=r{\theta} - {\lambda}{\cdot} {r_{KL}}$ 。

Step3. 强化学习优化语言模型过程

附录

数据集规模介绍

参考


文章作者: Xin Tang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Xin Tang !
  目录