在前面几篇文中,我们陆续介绍了奖励模型(Reward Model)在大模型训练过程中的作用「GPT 系列模型从第一性原理看 LLM 演进:GPT-1/2/3 到 InstructGPT 与 LLaMA 2 的范式变迁 」、「Bradley-Terry 模型详解:奖励模型 RLHF 目标函数的数学基础与梯度求解」、以及大模型中模型对齐这一方法论的提出「大模型对齐与奖励模型教程:详解 DeepMind Agent Alignment 到 InstructGPT RLHF 的演进」,相信大家对于什么是奖励模型在主观上已经有了一个非常清晰的认识。
对于使用奖励模型的目的我们很明确,那就是希望它能够根据 Prompt 和 ChatModel 的 Response 给出一个打分,然后将打分通过强化学习用于对 ChatModel 本身的优化。
那现在问题来了,我们应该如何来建模这个建立模型呢?
你是不是也好奇过为什么很多论文里给出来的奖励模型的目标函数都是下面这个样子?
$$ \begin{aligned} \ell(\theta)=-\log\sigma(r_{\theta}(x,y_{w})-r_{\theta}(x,y_{l})) \end{aligned}\ $$他到底是怎么一步一步来的?
关键字:大模型、LLM、奖励模型、OpenAI、RewardModel
1. 奖励模型原理#
在文章「到底是谁提出了大模型中的对齐问题?原来并不是出自 OpenAI」中我们提到,通常奖励模型并不是从零开始训练,而是直接使用一个或多个 SFT 过程中的 ChatModel 作为初始化 [1] [2] [3]。这样做的好处是奖励模型可以和 ChatModel 共享在预训练阶段学习到的知识内容(语言理解、事实知识、常识等),从同样的“知识水平”、同一基线出发 [1]。
因此,奖励模型的网络结构整体同预训练模型的架构一致,只是将最后的分类层替换成了一个回归层用于得分的预测。
现在,我们知道了奖励模型在前向传播时的过程,那对应的训练数据该如何标注呢?换句话说怎么来根据打分构建目标函数?
是对每一组 (Prompt , Response) 标记一个得分,然后进行有监督训练吗?
显然这样做不行!
由于不同的标注人员对于分数尺度的把控不一样,很有可能同一个样本不同的人标注出的分数会相差很远,所以就需要换一个角度来考虑这个问题。
什么角度呢?
那就是 “我比你好” 这样一个角度,即比较学习,其核心思想便是我们在前面介绍过的 Bradley-Terry 模型。
1.1 奖励模型思想#
Bradley-Terry 模型的思想是,假设每个对象 $i$ 都有一个潜在的 “能力” 用参数 $\pi_i=e^{\beta_i} (\pi_i > 0)$ 表示,当对象 $i$ 和 $j$ 进行两两比较时,$i$ 被选择的概率定义为
$$ P(i \succ j) = \frac{\pi_i}{\pi_i + \pi_j}=\frac{e^{\beta_i}}{e^{\beta_i} + e^{\beta_j}}\tag{1} $$这里 $\pi_i$ 可以理解为对象 $i$ 的一种能力或置信度,那么如果 $\pi_i = \pi_j$,则两个对象被选中的概率相等;如果 $\pi_i \gg \pi_j$,则对象 $i$ 基本总是胜出。
1.2 序列比较#
为了能够循序渐进地将奖励模型中目标函数的构建及变迁介绍清楚,我们先从 OpenAI 于 2019年9月发表的 Fine-tuning language models from human preferences 这篇论文 [2] 里的目标函数说起。
现在,设奖励模型为 $r_{\theta}(x,y)\in \mathbb{R}$ ,其中 $\theta$ 表示奖励模型对应的参数,$x$ 表示 Prompt ,$y$ 表示 Response,$(x,y)$ 共同作为奖励模型的输入。进一步,我们假设对于同一个 Prompt $x$,根据不同状态下(例如不同的温度或不同 Checkpoint)的初始 ChatModel 来生成 4 个候选 Response,即 $y=\{y_0,y_1,y_2,y_3\}$。此时,令 $b\in\{0,1,2,3\}$ 是由标注员在 4 个 Response 中选择的最优回答,由此便可以得到一个 6 由元组表示的标注样本 $(x,y_0,y_1,y_2,y_3,b)$ 。
因此,根据式(1)及 Bradley-Terry 模型的思想可知,对于每个样本来说我们需要最大化
$$ P(y_{b}|x,y)=\frac{e^{r_{\theta}(x,y_{b})}}{\sum_{j=0}^3e^{r_{\theta}(x,y_{j})}}\tag{2} $$进一步,当构造得到数据集 $S$ ,其中 $S_i = (x^{(i)},y_0^{(i)},y_1^{(i)},y_2^{(i)},y_3^{(i)},b^{(i)})$ ,对于第 $i$ 个样本 $S_i$ 来说式(2)将重写为
$$ P(y^{(i)}_{b^{(i)}}|x^{(i)},y^{(i)})=\frac{e^{r_{\theta}(x^{(i)},y^{(i)}_{b^{(i)}})}}{\sum_{j=0}^3e^{r_{\theta}(x^{(i)},y^{(i)}_{j})}}\tag{3} $$此时由式(2)可知,对于整个数据集 $S$ 来说需要最大化如下似然函数
$$ L(\theta)=\prod_{i=1}^nP(y^{(i)}_{b^{(i)}}|x^{(i)},y^{(i)})= \prod_{i=1}^n\frac{e^{r_{\theta}(x^{(i)},y^{(i)}_{b^{(i)}})}}{\sum_{j=0}^3e^{r_{\theta}(x^{(i)},y^{(i)}_{j})}}\tag{4} $$对式(4)两边同时取自然对数和相反数
$$ \ell(\theta)=-\log L(\theta)=-\sum_{i=1}^n\log\frac{e^{r_{\theta}(x^{(i)},y^{(i)}_{b^{(i)}})}}{\sum_{j=0}^3e^{r_{\theta}(x^{(i)},y^{(i)}_{j})}}\tag{5} $$最终,我们只需要在数据集 $S$ 上最小化式(5)便可以训练得到奖励模型。
到此,我们算是从 Bradley-Terry 模型的思想一步一步过渡到了奖励模型目标函数的构建过程。
下面,我们继续来看 OpenAI 基于此又发表的一篇论文 Learning to summarize from human feedback [3] 中的奖励模型目标函数。
1.3 成对比较#
2020年9月,OpenAI 再次使用奖励模型来让模型学习如何对一篇文章进行更好地摘要总结,其变化在于训练奖励模型的标注数据只有两个候选答案,如图2所示。
如图2所示,便是整个模型的对齐训练流程图,其中第①②步便是奖励模型的训练过程,奖励模型标注数据的候选结果从4个变成了2个。
如果大家对于 InstructGPT 还有印象的话一定会非常熟悉上面这张流程图,因两者都是用了同样的训练流程。从时间线来看,GPT-3 是2020年5月发布的,上面这篇论文是2020年9月发布的,InstructGPT 是2022年3月发布的,可以看出 InstructGPT 在使用人类反馈强化学习来对齐 GPT-3 之前其实是先进行了技术预研的。
现在,设 $y=\{y_j,y_k\}$, $y_j$ 是标注员在 2 个 Response 中选择的最优回答,由此便可以得到一个 3 由元组表示的标注样本 $(x,y_j,y_k)$ 。
进一步,根据式(2)可得对于每个样本来说我们需要最大化
$$ P(y_{j}|x,y)=\frac{e^{r_{\theta}(x,y_{j})}}{e^{r_{\theta}(x,y_{j})}+e^{r_{\theta}(x,y_{k})}}\tag{6} $$由于式(6)中分母只有两项,因此可以进行化简
$$ P(y_{j}|x,y)=\frac{1}{1+e^{r_{\theta}(x,y_{k})-r_{\theta}(x,y_{j})}}\tag{7} $$此时注意观察式(7)的形式,我们可以将其写为 sigmoid 函数的形式,即
$$ P(y_{j}|x,y)=\frac{1}{1+e^{-(r_{\theta}(x,y_{j})-r_{\theta}(x,y_{k}))}}=\sigma(r_{\theta}(x,y_{j})-r_{\theta}(x,y_{k}))\tag{8} $$当构造得到数据集 $S$ ,其中 $S_i = (x^{(i)},y_j^{(i)},y_k^{(i)})$ ,对于第 $i$ 个样本 $S_i$ 来说式(8)将重写为
$$ P(y^{(i)}_j|x^{(i)},y^{(i)})=\sigma(r_{\theta}(x^{(i)},y^{(i)}_{j})-r_{\theta}(x^{(i)},y^{(i)}_{k}))\tag{9} $$此时对于整个数据集 $S$ 来说需要最大化如下似然函数
$$ L(\theta)=\prod_{i=1}^nP(y^{(i)}_j|x^{(i)},y^{(i)})= \prod_{i=1}^n\sigma(r_{\theta}(x^{(i)},y^{(i)}_{j})-r_{\theta}(x^{(i)},y^{(i)}_{k}))\tag{10} $$对式(10)两边同时取自然对数和相反数
$$ \begin{aligned} \ell(\theta)=-\log L(\theta)&=-\sum_{i=1}^n\log\sigma(r_{\theta}(x^{(i)},y^{(i)}_{j})-r_{\theta}(x^{(i)},y^{(i)}_{k})) \end{aligned}\tag{11} $$此时,最大化式(10)等价于最小化式(11)。
写到这里有没有读者发现式(5)和式(11)与我们之前介绍过的某个模型的目标函数很像?
1.4 从交叉熵的角度看#
虽然我们是通过最大化整个似然函数得到了奖励模的目标函数,但是我们还可以从交叉损失的角度来直接理解,不用管它前面的过程。
从式(5)的形式我们可以看出它其实就是 Softmax 回归中的交叉熵损失,它衡量的就是多个候选结果这一分布与奖励模型对于每个候选结果是最优候选概率分布之间的误差。
例如对于某个 Prompt 来说其4个候选结果中,第2个是最优回答那么便可以构造 [0,0,1,0] 这样一个分布。同时,奖励模型对于输入 $(x,y_i)$ 来说分别可以得到 $P(y_0|x,y),P(y_1|x,y),P(y_2|x,y),P(y_3|x,y)$,最后便可以计算两者之间的误差
$$ -(0\cdot \log P(y_0|x,y)+0\cdot \log P(y_1|x,y)+1\cdot\log P(y_2|x,y)+0\cdot \log P(y_3|x,y))\tag{12} $$当然,在实际情况中我们只需要计算最优回答对应的预测概率即可,这样便得到了是(5)中的形式。
进一步,在成对比较中,根据式(8)可知,sigmoid 的函数图像如图3所示。
由图3可知:
① 当 $r_{\theta}(x,y_j)\gg r_{\theta}(x,y_k)$ 时,有 $z=(r_{\theta}(x,y_{j})-r_{\theta}(x,y_{k}))\gg0$ ,此时 $P(y_{j}|x,y)$ 接近于1,损失 $\ell$ 接近于0,而这也是我们希望得到的结果。
② 相反,当 $r_{\theta}(x,y_j)\ll r_{\theta}(x,y_k)$ 时,有 $z=(r_{\theta}(x,y_{j})-r_{\theta}(x,y_{k}))\ll 0$ $P_{\theta}(y_c\succ y_r)$, $P(y_{j}|x,y)$ 接近于0,损失 $\ell$ 接近于无穷大。
所以,我们希望人类偏好选择回答 $y_j$ 的打分要尽可能高于 $y_k$ ,即 $P(y_{j}|x,y)$ 约接近于1越好,而这直接通过交叉熵损失也可以体现。
2. InstructGPT 中奖励模型目标函数#
有了在 Learning to summarize from human feedback 这篇论文中对利用人类反馈强化学习来训练模型的技术预研后,OpenAI 在 2022年3月公开了 InstructGPT 模型 [4],而其中用到的关键技术同样也是基于人类反馈的强化学习来进行意图对齐。
如图4所示便是 InstructGPT 的训练流程图,不能说与图3中的流程类似,只能说是几乎一模一样。
可以看到,明显不同的一点是在训练奖励模型时,训练数据的标注候选结果又由2个扩充到了4个。
2.1 InstructGPT 训练流程#
InstructGPT 是基于 GPT-3 模型微调而来,且同时加入了人类反馈强化学习来优化模型,并最终得到了1.3B、6B 和 175B 这 3 个模型。对于每个模型来说,首先会根据对应参数规模的 GPT-3 模型通过有监督方法(Supervised Fine-Tuning, SFT)进行微调;然后再利用标注好的指令数据训练得到一个奖励模型对微调后 GPT-3 模型的输出进行打分;最后利用强化学习根据奖励模型对微调后的 GPT-3 模型的评分进行优化,以此得到 InstructGPT 模型。
不过最终 InstructGPT 所有3个版本的模型在训练过程中使用到的 RM 模型都是基于 6B 的 GPT-3 训练而来,因为作者研究发现基于 175B 的 GPT-3 训练得到的RM模型输出结果并不稳定且需要较多的计算资源。
2.2 数据集构建流程#
在 InstructGPT 的奖励模型的训练流程中,为了加快奖励模型的收敛速度,OpenAI 在收集人类反馈数据的时候让每个 Prompt 都生成了 $K$ 个候选答案并让标注人员对其进行排序,其中 $4 \leq K \leq 9$ 。这样对于任意一个输入 $x$ 所产生的 $K$ 个回答都能构建得到 $\binom{K}{2}$ 个成对比较的训练样本,并且对于每个训练样本来说,我们都希望 $r_{\theta}(x,y_{w})-r_{\theta}(x,y_{l})\gg0$。
这里的建模方式与式(2)中的有所区别!
进一步,便可以最小化式(12)进行求解
$$ \begin{aligned} \ell(\theta)=-\log\sigma(r_{\theta}(x,y_{w})-r_{\theta}(x,y_{l})) \end{aligned}\tag{12} $$但是,OpenAI 的研究人员发现这样会导致奖励模型出现过拟合的现象,其原因在于如果把 $K$ 个回答的排序拆成成对比较,那么每个回答会反复出现在 $K−1$ 个比较里,因此在反向传播时它的分数会被更新 $K−1$ 次。
假设我们有一个 Prompt $x$,并且收集了 $K$ 个候选结果 $y_0, y_1, \dots, y_{K-1}$ 。进一步标注员会对这 $K$ 个回答进行排序(比如 $y_2 > y_0 > y_3 > y_1...$)。
从 $K$ 个回答里,任意取两个答案,就能形成一个比较对,并且一共比较次数为
$$ \binom{K}{2} = \frac{K(K-1)}{2}\tag{13} $$例如:$K=4$,有 $y_0,y_1,y_2,y_3$,一共有 6 种比较情况
- $(y_0, y_1), (y_0, y_2), (y_0, y_3)$
- $(y_1, y_2), (y_1, y_3)$
- $(y_2, y_3)$
此时可以看出, 每个候选回答被使用 $K-1$ 次,因为每个回答会和所有其他回答都比一次, $y_0$ 要和 $y_1,y_2,y_3$ 比。 所以每个回答会在 $K-1$ 个对比中出现。
换句话说,在训练奖励模型时,这个回答的 reward 分数会被 更新 $K-1$ 次梯度,因为它参与了 $K-1$ 个比较。
If each of the possible $\binom{K}{2}$ comparisons is treated as a separate data point, then each completion will potentially be used for $K−1$ separate gradient updates. [4]
2.3 目标函数改进#
为此,OpenAI 研究人员将每个 Prompt $K$ 个候选结果所有两两比较的情况作为一个训练样本对待,即将式(12)改写为
$$ \begin{aligned} \ell(\theta)=-\frac{1}{\binom{K}{2}}\sum_{w,l}\log\sigma(r_{\theta}(x,y_{w})-r_{\theta}(x,y_{l})) \end{aligned}\tag{14} $$其中,$w,l$ 分别表示 $\binom{K}{2}$ 个两两成对比较中人类更偏好的回答和次偏好的回答,即希望模型学到 $r_{\theta}(x,y_{w})-r_{\theta}(x,y_{l})\gg0$
对于含有 $n$ 个样本来说,即 $n$ 个 Prompt 构建的数据集,只需最小化式(15)
$$ \begin{aligned} \ell(\theta)=-\frac{1}{\binom{K}{2}}\sum_{i=1}^n\sum_{w,l}\log\sigma(r_{\theta}(x^{(i)},y^{(i)}_{w})-r_{\theta}(x^{(i)},y^{(i)}_{l})) \end{aligned}\tag{15} $$到此,我们就把奖励模型目标函数的由来及发展给介绍清楚了。
从这里我们也可以看出 InstructGPT 的提出也是基于 OpenAI 自己前面一系列工作的叠加而产生的,并不是像之前很多文章提到的那样 InstructGPT 中用到的都是提出的新技术。
引用#
[1] Touvron H, Martin L, Stone K, et al. Llama 2: Open foundation and fine-tuned chat models[J]. arXiv preprint arXiv:2307.09288, 2023.
[2] D. M. Ziegler, N. Stiennon, J. Wu, T. B. Brown, A. Radford, D. Amodei, P. Christiano, and G. Irving. Fine-tuning language models from human preferences. arXiv preprint arXiv:1909.08593, 2019.
[3] Nisan Stiennon, Long Ouyang, Jeff Wu, et al. Learning to summarize from human feedback. NIPS ‘20. Curran Associates Inc., Red Hook, NY, USA, Article 253, 3008–3021.
[4] Ouyang L, Wu J, Jiang X, et al. InstructGPT: Training language models to follow instructions with human feedback[J]. Advances in neural information processing systems, 2022, 35: 27730-27744 .