PPO---loss推导,四个模型各自特点和代码解读

一 为什么提出PPO

训练AC时需要与环境交互来采样很多轨迹,然后利用这些轨迹训练Actor和Critic;然而,这一过程是十分费时的,这可能导致我们无法高效的采集大量数据,进而充分的训练模型。因此,我们考虑是否能将已有的轨迹数据复用以提高训练效率。

这一思路将我们指向了off-policy RL的道路。具体而言,我们希望有两个策略网络π1和π2,其中π1不断与环境交互收集数据,这些数据可以重复使用以训练π2的参数。
有了这些铺垫,我们终于得到了一个可以高效训练的RL算法:Proximal Policy Optimization(PPO),近期获得很大关注的InstructGPT、ChatGPT便在底层使用了PPO进行强化学习。

PPO是一种对上述Off-policy RL目标的实现,分析其优化目标不难发现,它首先最大化原始优化目标A*π2/π1,其次又防止π2/π1偏离1太多,即控制了两个分布的差距。

PPO(Proximal Policy Optimization)是OpenAI在2017提出的一种强化学习算法,是基于策略优化的算法,用于训练能够最大化累积奖励的智能体。PPO算法通过在每次更新时限制新策略与旧策略之间的差异,从而更稳定地更新策略参数。这种方法有助于避免训练过程中出现的不稳定性和剧烈波动,使得算法更容易收敛并学习到更好的策略。
即:PPO是RLHF实施用到的具体算法

二 训练步骤

2.1 RLHF流程

  1. 收集人类反馈,人工标注数据
    以summary任务为例,随机从数据集中抽取问题,对于每个问题,生成多个不同的回答
    人工标注,判断哪个回答更符合人类期望,给出排名
  2. 训练奖励模型(reward model, RM)
    对多个排序结果,两两组合,形成多个训练数据对
    奖励模型接受一对输入输出数据,给出评价:回答质量分数 (标量奖励,数值上表示人的偏好)
    调节参数使得高质量回答的打分比低质量的打分要高。
  3. 采用PPO强化学习,优化策略(Proximal Policy Optimization,近端策略优化)
    从数据集中抽取问题,使用PPO模型(包括ref model、actor model)生成回答(即不需要人工标注),并利用第二阶段训练好的奖励模型打分
    把奖励分数依次传递,由此产生策略梯度,通过强化学习的方式更新PPO模型参数,训练目标是使得生成的文本要在奖励模型上获得尽可能高的得分。
    在这里插入图片描述

2.2 PPO算法流程

  • step1:prompt 输入 actor model 得到 response
  • step2(重要性采样): prompt + response 分别输入到 actor_model 和 reference model 得到 log_probs、ref_log_probs、reward_score、values,这部分的数据可以重复利用。
  • step3 计算 critic_loss、actor_loss,更新 actor_model。

大致上,ppo 主要就这个三个步骤。

整个流程下来,很繁琐,难训练,所以目前主流大模型很少使用原始的这套 RLHF 流程,更多使用 dpo 算法,而且 RLHF 的数据有限,很难对所有的 response 有一个公平的 reward

在这里插入图片描述

三 四个模型

  • Actor model、Reference model: 开始的时候这两个模型是一样的,用途是一样的。
  • Critic model、Reward model: 开始的时候这两个模型是一样的,但是用途是不一样的,
    一个是用来产生 critic value,一个是用来产生 reward 的,虽然结构是一样的。

Actor 和 critic model 会随着 ppo 训练更新
而Reward/Reference Model是参数冻结的。

3.1 actor模型

如上,原始的大模型,以及需要被训练的大模型
参数会被一直更新
输入query
输出response

actor_loss 的核心是重要性采样

3.2 ref模型

如上,和actor同结构和大小,可以用actor初始化,或者上一轮actor参数初始化
输入query + response
输出logits

3.3 reward模型

模型结构上,model的最后一层last hidden state作为输入,输出为1维,得到value值。这样做可以帮助模型更好地学习序列的价值函数
输入query + response
reward值
Reward Model:奖励模型,它的作用是计算==即时收益 ==
在这里插入图片描述
在这里插入图片描述

为什么Critic模型要参与训练,而同样是和收益相关的Reward模型的参数就可以冻结呢?
这是因为,Reward模型是站在上帝视角的。这个上帝视角有两层含义:
第一点,Reward模型是经过和“估算收益”相关的训练的,因此在RLHF阶段它可以直接被当作一个能产生客观值的模型。
第二点,Reward模型代表的含义就是“即时收益”,你的token At 已经产生,因此即时收益自然可以立刻算出。

3.4 critic模型 - critic/value model

参数会被一直更新
输入query + response
critic值
Critic Model:评论家模型,它的作用是预估==总收益 ==
在forward传播时,reward model是在句子级别上进行操作,而critic model则是在token级别上进行操作。这种设计使得模型能够更好地捕捉序列中的细节信息。
在这里插入图片描述
模型结构与reward一致,critic参数可以由reward model参数来初始化。这样做的目的是为了方便模型参数的共享和初始化。

为什么要单独训练一个Critic模型用于预测收益呢?
这是因为,当我们在前文讨论总收益 Vt(即时 + 未来)时,我们是站在上帝视角的,也就是这个
就是客观存在的、真正的总收益。但是我们在训练模型时,就没有这个上帝视角加成了,也就是在
t 时刻,我们给不出客观存在的总收益 Vt ,我们只能训练一个模型去预测它。

所以总结来说,在RLHF中,我们不仅要训练模型生成符合人类喜好的内容的能力(Actor),也要提升模型对人类喜好量化判断的能力(Critic)。这就是Critic模型存在的意义。我们来看看它的大致架构:
在这里插入图片描述
Reward/Critic模型和Actor模型的架构是很相似的(毕竟输入都一样),同时,它在最后一层增加了一个Value Head层,该层是个简单的线形层,用于将原始输出结果映射成单一的 Vt 值。
在图中, Vt表示Critic模型对 t 时刻及未来(response完成)的收益预估。

Rt, Vt 同时存在的意义

在这里插入图片描述
在这里插入图片描述
那么哪一个结果更靠近上帝视角给出的客观值呢?
当然是结果2,因为结果1全靠预测,而结果2中的 Rt 是事实数据。
我们知道Critic模型也是参与参数更新的,我们可以用MSE(上帝视角的客观收益-Critic模型预测的收益)来衡量它的loss。但是上帝视角的客观收益我们是不知道的,只能用已知事实数据去逼近它,所以我们就用在这里插入图片描述 来做近似。这就是 Rt, Vt 同时存在的意义

四 loss计算和优化

计算优势函数,指导策略更新。
通过剪切目标函数约束策略变化,更新Actor和Critic参数。

  • 剪切机制:剪裁新旧策略比率在[1-ε, 1+ε],防止过度优化
  • KL散度:衡量新旧策略差异,确保渐进式改进。

实践中:
Critic Model的设计和初始化方式也有很多种
例如和Actor共享部分参数、从RW阶段的Reward Model初始化而来等等。
我们讲解时,和deepspeed-chat的实现保持一致:从RW阶段的Reward Model初始化而来。

如上,共享时:
Critic Model 和 Actor Model 具有共享的底层编码器[底层大模型一样],比如状态特征提取层。该共享编码器负责对输入的状态信息(如图像、文本等高维特征数据)进行处理和特征提取,将其转化为公共的中间表征,为后续两个模型的不同任务输出提供基础。

4.1 KL散度和优势函数

4.1.1 直观解释

Actor接收到当前上文 St ,产出token At ( P(At|St) )
Critic根据 St, At ,产出对总收益的预测 Vt
那么Actor loss可以设计为: 在这里插入图片描述
求和符号表示我们只考虑response部分所有token的loss,为了表达简便,我们先把这个求和符号略去(下文也是同理),也就是说

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值