左:输入(Image/text),通过计算预测值和真实标签值之间的损失更新模型
右:环境(数据),agent(模型)在环境产生某个动作(预测值),从而获得奖励模型的打分,通过最大化打分更新agent(模型),从而再次回到环境产生新一轮的动作。
基本概念
还是解释一下一些概念,从NLP的角度举一些例子。
首先是RL中的Policy,State,Action。
接下来介绍Reward,Return,Q,V。
PS:这里要注意区分价值和奖励:价值是未来累计奖励的期望。奖励是我们做出该动作后立即获取的收益。
一、RLHF 的基本原理
RLHF的训练过程可以分解为三个核心步骤:
- 指令微调(SFT)
- 训练奖励模型
- 训练强化学习策略,微调 LM
指令微调(SFT)
指令微调SFT (Supervised fine-tuning) 的数据集是问答对,即 (prompt, answer) 对,prompt我们可以理解为指令或问题,answer就是针对该指令或问题的高质量答案。SFT 就是在预训练模型基础上利用这些人工标注的数据进一步微调。
Training Reward Model
训练奖励模型,即通过手动对同一提示的不同输出进行排序来分配相应的分数,然后进行监督奖励模型的训练,生成一个用人类偏好校准的奖励模型(RM,也称为偏好模型)。图3所示为训练奖励模型的整体流程步骤,从图中可以看出训练奖励模型的基本目标是获得一个模型,该模型接收一系列的文本,之后返回每个文本对应的标量奖励,该奖励会在数字值的大小上代表人类偏好,越大表示越接近人类偏好,越小表示越脱离人类偏好。标量奖励的输出是RLHF最为关键的一步,对RLHF过程中的强化学习RL算法至关重要。
数据部分:
首先是这一部分数据的构成,每一条数据由query,chosen response, rejected response构成,chosen response相较于rejected response质量更高。里面对于每条query包含了positive_passages和negative_passages两个部分,positive部分可以视为chosen,negative部分视为rejected,就可以采样构建我们训练Reward Model的数据了:
{
“query”: “联合国总部在哪里?”,
“chosen”:“联合国总部大楼(亦称联合国大厦)是联合国总部的所在地,位于美国纽约市曼哈顿东侧,属于国际领土,因此只要是会员国国民持有护照就可以进入,包括与美国无邦交的联合国会员国。联合国总部大楼位于纽约市,其西侧边界为第一大道、南侧边界为东42街、北侧边界为东48街、东侧边界为东河,从联合国总部大楼可以俯瞰东河。此大楼于1949年和1950年间兴建,土地购自于当时的纽约房地产家,面积阔达17英亩(约6.87973公顷)。在此之前,洛克斐勒家族有意提供其在纽约州威斯特彻斯特郡洛克菲勒庄园的土地,但因距离曼哈顿遥远而作罢;之后,纳尔逊·洛克菲勒便协助新的土地的购买,其父小约翰·戴维森·洛克菲勒则捐助了850万美元协助兴建大楼。”,
“rejected”: “联合国的15个专门机构(如教科文组织)都没有设在总部。然而,有一些“自治附属机构”(如联合国儿童基金会)的总部设在联合国总部。”
}
模型结构
Reward Model相较于原始的SFT Model,在后面加上了一个value head,value head是一个Linear,输入维度为模型的hidden_dim,输出维度为1,输出表示模型预测每一字符获取的得分。DeepSpeed-Chat中使用最后一个字符的得分作为整个response的得分(当然也可以使用整个句子中每个字符的平均分作为整体的得分)。
输入:用户问题+模型回复
训练目标
训练Reward Model是一个排序任务,针对query,输入chosen和rejected response,训练目标尽可能的使得chosen和rejected的差值更大,损失函数为:
可以看到loss 的值等于排序列表中所有「排在前面项的reward」减去「排在后面项的reward」的和,模型能够最大化chosen答案得分和rejected答案的差值,但是梯度下降是做的最小化操作,因此需要对整个 loss 取负数才能实现差值最大化效果。
就是Training Reward Model的全部过程,基于rank loss训练了一个打分模型。在第三步强化学习中,reward模型将扮演环境的角色,针对模型预测的字符给出奖励分数。
奖励模型接收一系列文本并返回一个标量奖励,数值上对应人的偏好。我们可以用端到端的方式用 LM 建模,或者用模块化的系统建模 (比如对输出进行排名,再将排名转换为奖励) 。这一奖励数值将对后续无缝接入现有的 RL 算法至关重要。
奖励模型会计算未来期望
RLHF
RLHF基于A2C方法,这一步包含了四个模型:
Actor Model:由SFT之后的模型初始化而来。作为策略(policy)模型,用于接收上文,做出动作,预测下一个字符。学习完毕之后,我们最终使用的就是这个模型。
Reference Model:和Actor Model同样初始化自SFT Model,训练过程中冻结参数,用于和Actor Model做对比,保证模型不要偏离原始SFT Model太多。
Reward Model:作为环境(env),训练过程中冻结参数,针对每一个状态,给出奖励分数。
Critic Model:由Reward Model初始化而来,用于近似价值函数,输入为状态s,估计当前状态的价值V。
训练过程
接下来梳理一遍训练过程。训练过程整体分为两步:maker experience和learn。
首先是make_experience,首先在训练数据中抽取一部分query,然后Actor Model生成答案。然后我们依据这条答案获取我们所需要的经验:
actor_logits:由Actor Model产生,包含对答案所有词的概率分布。
reference_logits:由Reference Model产生,包含对答案所有词语的概率分布,用于和actor logits进行对比,防止actor model偏离SFT Model太远。
reward_score: 由Reward Model产生,为当前句子状态下,立即获取的收益分数。
values:由Critic Model产生,估计当前句子状态下,到完成生成,可以获取的回报。
PPO 算法优化奖励函数计算步骤如下:
- 将提示X输入初始 LM 和当前微调的 LM,分别得到了输出文本 y1,y2,将来自当前策略的文本传递给 RM 得到一个标量的奖励 rθ
- 将两个模型的生成文本进行比较计算差异的惩罚项,通常设计为输出词分布序列之间的 Kullback–Leibler (KL) 散度的缩放.
- 这一项被用于惩罚 RL策略在每个训练批次中生成大幅偏离初始模型,以确保模型输出合理连贯的文本。如果去掉这一惩罚项可能导致模型在优化中生成乱码文本来愚弄奖励模型提供高奖励值。
为什么要有Ref模型?
更新时为了防止模型跑偏,所以设置了一个参考模型进行校正。使得模型参数更新后尽可能的还是在0附近进行更新。
最后的损失函数目标:最大化打分函数,最小化两个模型的数据分布
参考文献:
https://zhuanlan.zhihu.com/p/677607581
https://baijiahao.baidu.com/s?id=1775649242061272275&wfr=spider&for=pc