在大语言模型完成 SFT 监督微调后,下一阶段是构建一个奖励模型来对问答对作出得分评价。奖励模型源于强化学习中的奖励函数,能对当前的状态刻画一个分数,来说明这个状态产生的价值有多少。在大语言模型微调中的奖励模型是对输入的问题和答案计算出一个分数。输入的答案与问题匹配度越高,则奖励模型输出的分数也越高。
奖励模型(RM 模型)将 SFT 模型最后一层的 softmax 去掉,即最后一层不用 softmax,改成一个线性层。RM 模型的输入是问题和答案,输出是一个标量即分数。
由于模型太大不够稳定,损失值很难收敛且小模型成本较低,因此,RM 模型采用参数量为 6B 的模型,而不使用 175B 的模型。
奖励模型的训练数据是人工对问题的每个答案进行排名,如下图所示:
对于每个问题,给出若干答案,然后工人进行排序,而奖励模型就是利用排序的结果来进行反向传播训练。奖励模型的损失函数采用 Pairwise Ranking Loss,公式如下所示:
$loss(θ)=−(K2)1E(x,yw,yl) Dlog(σ(rθ(x,yw)−rθ(x,yl)))$
其中:
D
:人工对答案进行排序的数据集;
x
:数据集D
中的问题;
K
:每个问题对应的答案数量;
yw
和yl
:问题x
对应的K
个答案中的两个,且yw
的排序比yl
高,由于是一对,也称 pairwise; rθ(x,y)
:需要训练的 RM 模型,对于输入的一对x
和y
得到的标量分数;
θ
:RM 模型需要优化的参数。
如何理解 RM 模型的损失函数呢?
RM 模型的目标是使得排序高的答案yw
对应的标量分数要高于排序低的答案yl
对应的标量分数,且越高越好,也就是使得损失函数中的rθ(x,yw)−rθ(x,yl)
这个差值越大越好。将相减后的分数通过 sigmoid 函数,差值变成 - 1 到 1 之间,由于 sigmoid 函数是单调递增的函数,因此σ(rθ(x,yw)−rθ(x,yl))
越大越好。σ(rθ(x,yw)−rθ(x,yl))
约接近 1,表示yw
比yl
排序高,属于 1 这个分类,反正属于 - 1 这个分类,所以这里也可以看成是一个二分类问题。再加上 logistic 函数,也就是相当于交叉熵损失函数。对于每个问题都有K
个答案,在损失函数前除以CK2
,使得损失函数值不会因为K
的变化而变化太多。损失函数的最终目标是最小化loss(θ)
,与最大化rθ(x,yw)−rθ(x,yl)
相对应。
奖励模型中每个问题对应的答案数量即K
值为什么选 9 更合适,而不是选择 4 呢?
K=9
时,每次计算 loss 都有 36 项rθ(x,y)
需要计算,RM 模型的计算所花时间较多,但可以通过重复利用之前算过的值(也就是只需要计算 9 次即可),能节约很多时间。奖励模型的损失函数为什么会比较答案的排序,而不是去对每一个答案的具体分数做一个回归?
每个人对问题的答案评分都不一样,无法使用一个统一的数值对每个答案进行打分。如果采用对答案具体得分回归的方式来训练模型,会造成很大的误差。但是,每个人对答案的好坏排序是基本一致的。通过排序的方式避免了人为的误差。
奖励模型通过与人类专家进行交互,获得对于生成响应质量的反馈信号,从而进一步提升大语言模型的生成能力和自然度。与监督模型不同的是,奖励模型通过打分的形式使得生成的文本更加自然逼真,让大语言模型的生成能力更进一步。
大语言模型完成奖励模型的训练后,下一个阶段是训练强化学习模型(RL 模型),也是最后一个阶段。大语言模型微调中训练 RL 模型采用的优化算法是 PPO(Proximal Policy Optimization,近端策略优化)算法,即对设定的目标函数通过随机梯度下降进行优化。近端策略优化是一种深度强化学习算法,用于训练智能体在复杂环境中学习和执行任务。通过智能体的训练,使得其在与环境的交互中能够最大化累积回报,从而达成指定任务目标。这里的智能体在大语言模型中指的就是 RL 模型。
RL 模型的初始模型采用 SFT 微调之后的大语言预训练模型。训练 RL 模型的数据集只需要收集问题集(Prompt 集),不需要对问题进行标注。问题集通过 RL 模型生成答案文本,然后将问题和答案输入上一步训练的 RW 模型进行打分,来评价生成的文本质量,而训练 RL 模型的目标是使得生成的文本要在 RW 模型上获得尽可能高的得分。
将初始语言模型的微调任务建模为强化学习(RL)问题,需要定义策略(policy)、动作空间(action space)和奖励函数(reward function)等基本要素。
策略就是基于该语言模型,接收 prompt 作为输入,然后输出一系列文本(或文本的概率分布);而动作空间就是词表所有 token 在所有输出位置的排列组合;观察空间则是可能的输入 token 序列(即 prompt),为词表所有 token 在所有输入位置的排列组合;而奖励函数则是上一阶段训好的 RM 模型,配合一些策略层面的约束进行的奖励计算。该阶段流程如下图所示:
RL 模型训练的损失函数公式如下:
$objective(ϕ)=E(x,y)∼DπϕRLrθ(x,y)−βlog(πϕRL(y∣x)/πSFT(y∣x))+γEx∼Dpretrainlog(πϕRL(x))$
其中:
πSFT
:SFT 模型;
πϕRL
:强化学习中,模型叫做 Policy,πϕRL
就是需要调整的模型,即最终模型。初始化是πSFT
; (x,y)∼DπϕRL
:x
是 RL 数据集中的问题,y
是x
通过πϕRL
模型得到的答案;
rθ(x,y)
:对问题x
和答案y
进行打分的 RM 模型;
πϕRL(y∣x)
:问题x
通过πϕRL
得到答案y
的概率,即对于每一个y
的预测和它的 softmax 的输出相乘;
πSFT(y∣x)
:问题x
通过πSFT
得到答案y
的概率;
x∼Dpretrain
:x
是来自大语言模型预训练阶段的数据;
β
、γ
:调整系数。
RL 模型的优化目标是使得损失函数越大越好,损失函数可以分为三个部分,打分部分、KL 散度部分以及预训练部分。
x
,通过πϕRL
模型得到答案y
,然后再把这对(x,y)
代入 RW 模型进行打分,即损失函数公式中的rθ(x,y)
。该分数越高,代表模型生成的答案越好。πϕRL
会发生变化,x
通过πϕRL
生成的y
也会发生变化,而rθ(x,y)
奖励模型是根据πSFT
模型的数据训练而来。如果πϕRL
和πSFT
差的太多,则会导致rθ(x,y)
的分数估算不准确。因此需要通过 KL 散度来计算,πϕRL
生成的答案分布和πSFT
生成的答案分布之间的距离,使得两个模型之间不要差的太远。损失函数公式中的log(πϕRL(y∣x)/πSFT(y∣x))
就是在计算 KL 散度。由于 KL 散度是越小越好,而训练目标是损失函数越大越好,因此在前面需要加上一个负号。Ex∼Dpretrain[log(πϕRL(x))]
。如果没有该项,那么模型最终可能只对这一个任务能够做好,在别的任务上会发生性能下降。因此,需要将预训练阶段的目标函数加上,使得前面两个部分在新的数据集上做拟合的同时保证原始的数据也不会丢弃。最终优化后的πϕRL
模型就是大语言模型的最终模型。
通过强化学习的训练方法,迭代式的更新奖励模型(RW 模型)以及策略模型(RL 模型),让奖励模型对模型输出质量的刻画愈加精确,策略模型的输出则愈能与初始模型拉开差距,使得输出文本变得越来越符合人的认知。这种训练方法也叫做 RLHF。
目前,RLHF 技术对训练大语言模型具有极大的影响力,训练出来的效果好于之前的方法。但是,RLHF 训练出来的大语言模型仍然可能输出有害或事实上不准确的文本,需要不断不断改进。此外,在基于 RLHF 范式训练模型时,人工标注的成本还是非常高昂的,RLHF 性能最终仅能达到标注人员的知识水平。这里的人工标注主要是为 RM 模型标注输出文本的排序结果,而若想要用人工去撰写答案的方式来训练模型,那成本更是不可想象。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。