原文:
https://zhuanlan.zhihu.com/p/677607581
强化学习流程:
A: Action; R: Reward; S: State
目标:找到一个策略,这个策略根据当前观测到的环境状态和奖励反馈,来选择最佳的动作。
价值函数:
其中:
- Vt : t 时刻的总收益,注意这个收益蕴涵了“即时”和“未来”的概念
- Rt : t 时刻的即时收益
- Vt+1 : t+1 时刻的总收益,注意这个收益蕴涵了“即时”和“未来”的概念。而 Vt+1 对 Vt 来说就是“未来”。
- γ :折扣因子。它决定了我们在多大程度上考虑将“未来收益”纳入“当下收益”。
RLHF和强化学习的对应关系:
每生成1个Token:自己这个Token就是Action,用Reward模型、Actor和Reference模型计算得到该步Reward,用Critic模型计算得到预估价值V;
在RLHF-PPO阶段,一共有4个主要模型,分别是:
- Actor Model:这就是我们想要训练的目标语言模型
- Critic Model:它的作用是预估总收益 Vt
- Reward Model:它的作用是计算即时收益 Rt
- Reference Model:它的作用是在RLHF阶段给语言模型增加一些“约束”,防止语言模型训歪(朝不受控制的方向更新,效果可能越来越差)
其中:
- Actor/Critic Model在RLHF阶段是需要训练的;
- Reward/Reference Model是参数冻结的。
Actor loss的演化
1. 原始版
(后面公式都省略加和符号)
Vt是Critic模型推理得到的该时刻Value(包括当前和未来);P是Actor模型生成当前Token的概率;
符合直观逻辑:当Vt为正时,P越大,loss越小;当Vt为负时,P越小,loss越小;
2. 用"优势"替换“价值”
(走了一步的(前2项),显然比一步也没走的(第3项),预测的更靠谱)
3. 升级R (Reward)
直观上, Rt 应该表示每个Actor产出token At 带来的即时收益;
DeepSpeed中,用的是:
即,整句生成的sentence,之后最后1个token是加上了Reward模型的推理结果Rt;
其他token,都只是用Actor模型和Ref模型的偏离度,来作为Reward;即,Actor模型对该token的生成概率是P,则Ref模型对该token的生成概率Rref,必须大于P,也就是比Actor模型还认可该token结果(表明rlhf没有训歪),才认为是正向的Reward;否则就是负的Reward;
4. 升级"优势"(Advantage)
把"未来"的优势,也加入考虑:
实现上,从后往前,递推进行计算;
5. PPO-epoch: 引入新约束
在强化学习中,收集一个batch的经验是非常耗时的。对应到我们RLHF的例子中,收集一次经验,它要等四个模型做完推理才可以,正是因此,一个batch的经验,只用于计算1次loss,更新1次Actor和Critic模型,好像有点太浪费了。
所以,我们自然而然想到,1个batch的经验,能不能用来计算ppo-epochs次loss,更新ppo-epochs次Actor和Critic模型?如果我们想让一个batch的经验值被重复使用ppo_epochs次,等价于我们想要Actor在这个过程中,模拟和环境交互ppo_epochs次。举个例子:
- 如果1个batch的经验值只使用1次,那么在本次更新完后,Actor就吃新的batch,正常和环境交互,产出新的经验值
- 但如果1个batch的经验值被使用ppo_epochs次,在这ppo_epochs中,Actor是不吃任何新数据,不做任何交互的,所以我们只能让Actor“模拟”一下和环境交互的过程,吐出一些新数据出来。
防止超出范围,裁剪:
Critic loss的演化
1. 原始版本
目标:让一步也不走的V,更接近真实,也就是更接近走了一步的V;
2. "走了一步"的V
3. "一步没走"的V
4. 裁剪(不要偏离old太远)
![]()