简介
随着OpenAI发布的ChatGPT大火,越来越多人开始关注其中用到的RLHF(Reinforcement Learning from Human Feedback)技术,其字面意思是基于人类反馈的强化学习,核心思想是获取生成文本的人工反馈,使用强化学习对语言模型进行优化,旨在于生成人类偏好的答案,增加了答案的合理性和安全性——使生成模型与人类偏好对齐,提升监督学习的性能天花板。
技术原理
RLHF可以简单分解为三个核心步骤:
- 1.预训练语言模型(LM)
- 2.收集数据并训练奖励模型
- 3.通过强化学习微调 LM
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如下所示:
综上所述,在这个阶段,首先由冷启动后的监督策略模型为每个prompt产生K个结果,人工根据结果质量由高到低排序,以此作为训练数据,通过pair-wise learning to rank模式来训练回报模型。对于学好的RM模型来说,输入<prompt,answer>,输出结果的质量得分,得分越高说明产生的回答质量越高。
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}}$ 。