大模型强化学习入门漫谈(策略梯度, Actor-Critic,TRPO, PPO,GRPO等)
目录
Actor, Critic, Reference, Reward
前言:写这篇文章的目的是为了让自己能够更好的从头开始全部梳理一遍所有的逻辑关系,搞清楚一切的来龙去脉,这篇文章主要是以大模型视角下的强化学习来进行解读,大模型视角下主要侧重于两个算法PPO和GRPO,但是为了能够将最初开始的设计目标理的更清楚,所以会先从数学角度下的强化学习入手,搞清楚最最原始的目标,这个算法属于什么体系,以及这个体系的算法最初的目标函数是什么,一步步从策略梯度引入到TRPO到PPO。前面到A2C的部分主要参考赵老师的强化学习数学原理这本书的内容,推荐大家看一下,或者看赵老师的课程也可,很适合入门学习强化学习的一些基础概念和一些背后的原理。后面为我的一些个人阅读资料后的理解,本文AI浓度极低,可放心食用。
如果你对强化学习的基本概念,比如状态,状态价值函数,动作价值函数,回报等概念,推荐你可以先学习一下这些基础概念,可以先看看赵老师的书或者课程。
从策略梯度开始到PPO:数学视角
为了更好的解释PPO算法,我们首先需要搞清楚这个是属于哪一类的算法。很多人可能都听说过Actor-Critic 这一类算法,但是这些本质都是属于策略梯度算法这一大类。我们先从最原始的开始入手了解目标是什么。
从表格式迁移到函数式
在最初的强化学习中,大家都比较熟悉的是那种表格式的转移,机器人在网格里面走,然后避障,像是这种:

这种是属于比较简单的情况,且可以使用表格来进行表达动作的选择导致状态之间的转移变化。但是实际上现实情况里面是非常复杂的,我们往往无法使用表格来表达或者处理大型的状态或者动作空间,很多情况都是黑盒模型,所以我们需要引入函数来表达值,这也是强化学习与神经网络相结合的关键一步,之前的很多经典方法,比如基于采样的蒙特卡洛方法,基于时序差分(TD)的Q-learning,在与神经网络结合之后都演化出了不同的算法。具体怎么引入函数呢?实际上分为了两个方向进行演化,一个是值函数(Value-based)方法,一个是策略梯度(Policy Gradient, PG)方法。而大名鼎鼎的Q-learning在与值函数方法相结合之后, 就得到了DQN; 蒙特卡洛方法在于PG方法结合后,就得到了策略梯度方法中最经典的基于蒙特卡洛的REINFORCE算法。之后才一步步演化出Actor-Crtic 类的算法,什么A2C,A3C, PPO等等。那这两类方法到底分别用函数估计了啥呢?
从字面意义上看很好理解:一个是估计值函数,一个是估计策略函数。估计值函数的,最初是直接估计状态价值函数v,后续引入了时序差分之后,一些算法比如sarsa就转而估计动作价值函数了,其实本质都是一样,都是求解贝尔曼方程,sarsa是求解等式左边为动作价值函数的贝尔曼方程,是贝尔曼方程的另外一个形式。(这一段如果不太理解没有关系,重点关注策略梯度)
而策略梯度方法将重点放在更新策略, 这必然会有一个更新的目标,我们要让策略函数朝着哪一个方向去进行更新,是下一小节需要讨论的内容。
现在稍微讨论一个题外话,不知道大家最初是否和我一样有一个疑问,那就是为啥很多目前大模型应用的算法都去使用策略梯度类的方法了?我觉得是因为大模型本身天然契合策略梯度算法,主要是因为可微性、连续动作空间、稳定性与训练目标的自然契合。值函数方法不擅长处理“高维、连续、组合”动作空间,token那么多,词表那么多,对值函数算法来说确实是一个灾难了。而策略梯度比起来契合很多,策略就是我们的大模型本身。
目标函数和更新过程
目标函数
在强化学习数学原理的书中,目标函数可以分为两种,分别是以状态价值函数为基础的和以每一步的平均回报为基础的。

这是因为我们本身就是更期望策略能够获得尽可能多的奖励回报,而上图中的以状态价值函数为基础的Metric,其意义就是说从某个初始状态开始,能获得的期望回报,希望这个回报尽可能大,不论是从哪一个初始状态开始;而Metric是的时候,不同状态下,每一步所获的的平均回报。值得关注的一个点是以平均状态价值函数为Metric的时候,s的分布可以是稳态分布也可以是自定义的任何分布(也就是和策略相关),比如说直接给每一个状态的可能性都直接给一个均值
; 而Metric是
的时候,s的分布只能是稳态分布。
关于这个点书中没有太详细点解释,我的理解是如果是状态价值函数的话,我们更多刻画的是从某一个初始状态开始走到最后获得的所有奖励这样一个全过程,我们有时候会人为去更关注我们想要关注的一些state,看看这些state走到最后的奖励是不是最大化;而如果是每一步奖励的话,刻画的就是动态的一个过程了,如果不是使用的稳态分布,每一步的状态分布都不一样,那长期平均值就无法收敛到一个固定常数。
Anyway,我们更需要关注的点是,我们的本质目标是都是为了让奖励最大化(因为其实一定条件下,上面两个Metric都是等价的,本质也是回归到奖励上),目前所有主流的大模型强化学习的方法,也都是基于让奖励最大化这个目标来实现。
题外话:有些方法除外,比如说基于Gflownet思想的FlowRL, 这篇paper的思想是在于说让策略不是只学习最大奖励的那个策略,实际上应该是一个有高峰也有低峰的distribution,直接去学习这个distribution,而不是只押注在奖励分布的最高峰上。
更新过程
有了目标函数,我们只需要将目标函数对策略的参数
求梯度,然后让参数一步步做梯度上升即可,这个就是整体的一个思想。下面的问题在于如何求梯度。先上结论,不管目标函数是哪种以及s的分布是否和策略相关(d就是可以和策略无关,
是和策略相关),最终都可以归纳为下面形式:

具体来说是分成了下面几个情况,其实就是对应了前文里提到的三种可能的目标函数(基于状态价值函数两种,基于平均奖励的一种)。


这里最后的分布就是折扣访问分布。详细的推导过程其实对于后面学习并不是特别重要,重要的是记住形式,当然看了更好。下面这个定理9.3是折扣条件下,且d分布与策略相关的情况下的结果,还有一个定理9.5是说了在无折扣情况下的条件,那个就是严格取等号了,这里就不详细再展示,因为我们主要关注的也一般都是有折扣的情况。

基本上来说,除了这个S的采样分布有些差异之外,推导得到的梯度目标结果都是一致的。然后我们就可以通过这个式子来进行更新了,但是还有一个问题是在于我们如何求解这个q值,也就是在当前的策略下,给定状态和动作所产生的动作价值。
REINFORCE(基于蒙特卡洛的策略梯度方法)
我们回顾一下蒙特卡罗方法,它所解决的问题是,在没有精确的公式或者模型(model free) 的情况下,使用多次的轨迹采样来去近似动作价值(因为没有具体数学形式,就只能数据了,数据和公式总得有一个),和原先的policy iteration一样,也都是有一个policy evaluation + policy update的过程,并在迭代中使得策略不断收敛改进。至于为啥会收敛,可以参考值迭代和策略迭代这一部分更详细的推导,如果要简单介绍的话,那就是因为收缩映射的原理,会不断的压缩到这和贝尔曼方程的公式形式相关
将这个放在策略梯度方法的语境中也是一样的,原先策略改进的方法是直接选择最优动作来改进policy或者是的选择动作,现在这个通过选择最优动作更新policy table的过程变成了更新参数,同样估计q值是需要通过采样来进行估计的。下面放一个对比图。


看到这里有人会觉得奇怪了:诶,你这采样的s的分布条件呢?去哪里了?
在书中有这样一段话:

啥意思呢?这里意思是说原式子里面,策略梯度定理中的状态分布, 按照原先的条件,有两种情况,一种是在折扣情况且d与策略
无关的时候,
为折扣访问分布
,另一种就是在d与
有关的时候,为稳态分布
。所以,理论上,如果要unbiased估计这个期望,必须让状态样本s符合
, 意味着严格意义上来说,必须运行足够久让其收敛到长期分布(稳态或者折扣)才行。但是实际上我们不会严格这样做,因为样本稀缺,不可能等运行很久再拿来用。
Actor-Critic方法(基于时序差分的策略梯度方法)
如果你对时序差分,对sarsa, Q-learning这些经典方法不太了解,希望下面的比喻能够让你大概知道是做什么的。假如说我在山底下,然后我要测量一下山底到山顶的路大概多远,蒙特卡洛方法就是你每次都从山底往山顶上跑一次,可能有多种多样的路线,然后把每次跑的结果拿去更新;而时序差分是说我跑的时候会插路牌,跑太远估计不准,但是我跑的短能估计更准,我知道我目前到第一站走了多远,那只要算当前准确知道的那一段距离(山底到第一站)+ 第一站到山顶的距离就行,比起直接估计整段的路,一个精确值+一个更小的估计值,估计的肯定是更准一些。换成数学角度看也是一样的,原先的估计方法是直接求解下面这个贝尔曼方程:
现在转变为求解:
因为。
我们回顾一下数学解析形式的贝尔曼方程求解过程,一种是求逆的解析解,另外一种是直接应用了压缩映射原理迭代形式得到数值解。而这里因为是期望估计形式的贝尔曼方程,所以使用RM算法,将上面式子转换为一个RM算法的标准求解形式,得到价值函数的迭代形式。具体推导看下文:


在sarsa中,使用的是基于动作价值函数的贝尔曼方程,同样有这样的一种形式可以进行变换,得到对应的TD error和对应的TD target。而最经典的Actor Critic算法,就是把Value update的过程变成了基于值估计的sarsa,也就是说,把值函数估计用进来了,可以看下面的QAC伪代码:

这里以防不理解,讲一下Value update的这里的公式。同样是先从v入手,假如说是要搞一个网络去估计v的话,我们肯定是希望我们估计得到的和实际的
越接近越好吧,很自然想到了误差的平方乘个1/2(系数都无所谓了)。然而实际上我们没办法得到真实的那个
,所以就自然想到用TD target去代替(同样的,如果说直接用
近似那就是门特卡罗方法),TD target代进去就会发现,括号里面就是TD error。回过来看这个式子,这不就是以TD error平方求导结果为0构造的一个RM 算法形式吗,是不是顿时感觉前后的知识点全部都串起来了:) 至于把v替换成q依然是老方法换汤不换药,就是贝尔曼方程换个形式,基于值函数估计的sarsa算法形式就自然而然出来了:

那么这样有人会问:AC到底是属于哪一种类型的算法,不是都用到了吗?我看一般是归类为策略梯度的,这两者的明显差异性在前面的题外话有提到过,因为从优化目标来看,还是优化的是策略参数。Actor–Critic 是带有值函数估计器的策略梯度算法,不是纯的策略梯度也不是纯的值函数估计方法。
题外话:到目前为止,相信应该对蒙特卡洛和时序差分算法有一定的认识了,我们从bias和variance两个角度进一步来解读这两个方法,这两个方法都是通过数据来近似值的方法。蒙特卡罗从数学角度上来说是无偏估计的,但是高方差,因为每次都是直接估计完整trajectory,所以会导致方差很高;而时序差分方法是有偏估计,但是方差更小,因为引入的更少的随机变量。
A2C(关于Advantage)
这个算法开始,我们引入Advantage的概念,在后续的多个算法中,我们会持续看到Advantage的概念. 最初开始是因为降低方差而引入的这个概念。

在书中,证明得到了下面的那个式子等于0是恒成立的,因为b(S)就是关于S的一个scalar function.这里的b(S)在等于下面式子的时候是能够使得方差为0的(然而实际上我们不会真的去用这么一个复杂的式子, 通常是直接减去一个v(s), 具体见下文):

估计方差与采样方差( estimation variance & sample variance):那么问题来了,我们为啥需要减去一个b(S)? 我们不是之前说过了用TD方法,能够降低方差了吗?这里说一下我个人的理解,我觉得应该是分成两种方差来看,估计方差与采样方差。我们需要搞清楚这两件事情的区别,因为这里求期望本质还是要落回到采样的,TD相比于MC降低的是估计的方差,前面题外话提到过,因为引入了更少的随机变量,所以估计方差更小。而既然是选择了采样,不管是MC还是TD都会面临一个问题,那就是不同的action之间的差异性过大导致的方差大,这是采样这个方法本身就会引入的问题,与其直接使用原本的值,减去一个均值是不是就显得更好更柔和了?而因为我们都知道状态价值v(s)本身就是该状态下所有可能的q(s,a)的期望,我们就可以很自然的将其引入了,直接将权重给移去,可以得到一个次优的baseline。
![]()
现在原先需要去估计的就转变为了去估计
. 同样的,model free我们都还是要回归到采样获取数据这个问题上来,在这种情况下,我们如果是使用的MC算法,就是又回归到之前说过的REINFORCE算法去了,只不过多一个baseline;而如果是使用的基于值估计的方法,就最后将这个Advantage转化为了TD error,否则将会有两个网络同时去估计q和v,而将q转化为TD 形式之后,就可以转化为如下的式子:
此时只需要一个网络就能估计出v了
从TRPO到PPO
TRPO
关于TRPO,其实使用的并不多,但是PPO的最原始形式确实是来自于TRPO中的,所以简单讲一下TRPO。首先需要知道改进的点是什么,特别是需要注意的是,我们改进的点发生了变化。
策略梯度的缺陷
策略梯度的缺陷在于,我们无法准确的去控制步长,这会导致一个问题,有时候更新过度了,就会甚至比原先的那个策略更差劲。所以我们需要做的是怎么保证每次更新都使得比原先的策略好,有一种办法就是残差形式的改进,那有没有这样一个公式,能够让新策略的回报函数=旧策略的回报函数+某个残差呢?答案是有的。见下面原论文:

这个
是不是很熟悉,没错,之前在前面策略梯度目标函数和更新过程那一节提到过,只不过那一节里面这个
变成了
, 一样都是折扣访问分布。P(st=s)的意思就是在第t步访问到s的概率,这里面都隐含了s0的分布前提条件。
但是我们发现残差项是和新策略密切相关的,这让我们不好直接对这一项进行优化。因此,在TRPO中通过几个方法来解决这个问题。
TRPO的残差部分形式变换
首先就是关于这个, 其实关于不同分布下采样有一种方法是importance sampling重要性采样。这里的
就是一个状态分布而非采样,我们根本无法通过重要性采样来求新旧状态分布的比值,这个只能通过一个假设,那就是新旧状态基本一致,然后让新旧状态分布两者直接近似了。
第二点就是关于这个动作分布,原先式子是需要从新策略里面采样的,为啥呢,原先残差部分的式子其实就可以写成下面的期望形式:
这个式子里面的a还是必须是从新策略采样的,我们使用重要性采样之后,就可以使用从旧策略采样得到的a了,改写之后就得到如下的式子:
如果对重要性采样不太理解的,可以参考下面的小章节,如果比较熟悉的可以直接跳过。
重要性采样
我们假设x是从p1分布中采样的,但是我们需要计算的期望里面,x是从p0分布里面采样的,而p0这个分布又比较复杂,难以直接数学形式表达出来。下面是书中对这个重要性采样的一个例子解释:

对于求期望这个问题,之前有提到过,要么数据,要么公式(模型)。有数据对应的就是大数定律,如果有公式可以直接对分布积分就好了。我们肯定是没有公式的,为啥不能直接用大数定律呢?如过我们求期望的x是要求x是从p1采样的就没有问题了,因为我们本身就已经有了从p1采样得到的x,但是如果是要求从p0采样就不能这样子了,只能是使用定义去计算的构造重要性系数(importance weight) 使得x属于p1分布,除非我们知道p0的解析式或者是每一个x属于X的p0(x)的数值。
替代回报函数的本质是一阶近似和结合信赖域的约束
我们上文一直是在讲后面这个残差部分是怎么处理的,得到近似后的残差结果,当然这个近似的条件就是两个策略变化不大->让状态分布(折扣访问分布)是尽量保持一致可以直接近似的,而后面的动作采样就直接使用了重要性采样,实际上原策略的回报函数+这个近似后的残差,就是我们得到的新策略的替代回报函数。如下所示:
正是一个一阶近似,原论文中是这样子的,基本上也是一样,只不过不是期望形式:

那么话说回来,我们现在知道的是,直接优化残差,就能保证这个一阶近似是一定可以不断提升的哈,那这和我原先新策略的回报函数有啥关系?敲黑板!这里就要用到不等式了,至于具体不等式证明咋来的留给学数学的人去解决,我们只需要负责用和理解就行了。
作者在原文中说原先有些方法直接将新旧策略做一个mixture,然后得到一个不等式,不断去优化下界,自然而然的原先的式子也会被优化了。

但是这个适用性不太好,所以作者也是受了这个的启发,然后提出了一个新的不等式下界。

是不是有点像ELBO的那个味道,实际上这个TRPO确实是属于MM(Minorize-Maximization)算法,就是优化下界来不断提升原目标。TRPO就使用这个不等式作为出发点,使用KL散度近似TV距离,最终就得到TRPO的信赖域约束形式。
为什么说是信赖域约束?不等式是如何转变的?
这个问题在很多的资料都没有解释过,很多都是只提到了优化下界保证提升的条件,并没有说是怎么转变为最后的式子结果的。原论文中有一小段文字解释了:

这不就来了?这就是它叫信赖域约束的由来。原先更新式子,因为C依赖于这个, 导致数值比较大,惩罚过大使得更新太慢了,所以改成了一个约束的形式了。
然后我们现在先抛开这个证据下界准确推导的不谈,其实我们直接就从前面残差的时候就有差不多这种直觉了,我们要优化一个被近似之后的残差,而这个近似的条件就是策略不能变化太大,所以更新被约束在给定信赖域之内,如果学习过最优化原理就会对信赖域一类算法比较熟悉,但是这个直觉仍然是存在的,就是优化近似的残差,然后约束条件使得新旧策略尽量相近,如果都理解了会觉得这个算法整个设计思路都很清晰了,至于不等式怎么证明,证明过程压根不是我们要考虑的,我们需要知道的是怎么来的,怎么设计的,怎么用。
PPO
PPO的两个变体,讲点历史
OK,现在我们正式进入PPO环节了,不知道你看到这里,是否还记得原始的策略梯度算法,优化目标是什么,以及在TRPO中,优化目标被换成了什么,如果不太清楚建议返回去重新复习一下。
PPO的原始论文中提出了PPO的两个版本,一种是PPO-Clip, 也就是大家常见的一种:

还有一种是PPO-penalty, 这一种变体不常使用,openai文档中说最初使用的版本也是PPO-clip这个版本的变体。

除了这个之外,还想提一点历史。有些介绍里面是直接把GAE这个contribution放到PPO这个paper里面来了,实则非也,GAE这个是另外一篇paper了,只不过在大模型里面常常都喜欢拿GAE去替换优势函数,它就是一个优势函数的模块。值得注意的是,TRPO,GAE,PPO的作者全部是一个人,都是schulman。GAE的全称是(generalized advantage estimator), 来源于这篇论文https://arxiv.org/pdf/1506.02438。准确的时间线是TRPO->GAE->PPO。不过这里不打算讲GAE,后续用到了再去单独一小节讲。
GAE
这里博主主要参考的是这篇知乎的文章:
https://zhuanlan.zhihu.com/p/549145459
感觉讲的挺好。总体而言就是n step的折扣回报做一个加权平均。n step的折扣回报可以看作是TD方法和蒙特卡洛方法的一个中和。TD方法只展开一步,蒙特卡罗方法所有都展开了,中和一下就展开n步。而我们毕竟最关注的还是最近的,所以会有一个系数对这个n step来平滑下降。具体直接看这篇文章里面的图片:

PPO-Clip
这一节的内容我是主要学习的openai的文档以及ppo的原论文来讲解一下以及个人觉得可能会遇到的一些困惑,感兴趣可以直接看openai原文以及原始论文https://arxiv.org/pdf/1707.06347。
其实我们发现不管是PPO-penalty还是PPO-clip,都是围绕着TRPO中新旧策略变化的距离约束去改进的。PPO clip中的办法是直接对进行一个上限下限的裁剪,
就是原先那个新旧策略的比值,也就是前面TRPO中提到由于重要性采样引入的一个系数。但是我们可以将其看作是衡量新旧策略的一个差异的系数。下面我们详细探讨一下
这个新的需要去maximize的目标。对于这个新的目标一般可能会有下面的一些疑问:
1. 为啥从max变成min了,咋变过去的?
注意注意!只是需要max的目标变化了哈,从rtAt变成了下面这个玩意

本质上还是做max的,就是相当于max(min(....))
2. clip起到什么作用?这个min函数具体是什么意义呢,为啥套一个min函数
clip的作用就是踩一个刹车的作用,防止过度更新或者过度惩罚,限制在之间。下图来自于openai的文档,他们把这个min函数给简化了,将后面clip那一部分的给替换了。

因为At大于0的时候说明这个动作是有优势的,我们是希望能够在新策略中更多的给这个动作发生的机会,而At小于0的时候说明这个动作不好,我们则希望在新策略中更少给这个动作发生的机会。也就是奖励方向和惩罚方向。这个函数本身是和At的正负号挂钩的,我们也可以看看下面的openai中文档中的解释,总之就是奖励的时候不想让它超过1+epsilon,惩罚的时候不希望小于1-epsilon

3. 如果你还没有理解,我猜测你有这个疑问:为啥不直接用clip限制住就好了,还用个min干啥?用个min之后,最本质的区别就是在我们刚刚没有讨论到的At>0 ,且rt<以及At<0 且rt>
这两种情况,我们发现这两种情况是没有限制的,仍然取原来的值,为啥呢?因为我们本质就是希望能够让其限制在
范围内,考虑情况一(At>0 ,且rt<
),现在已经是小于
了,而At又本身就是大于0也就是本身就会把它往正常的方向拉一把,让它拉回到正常范围内,我们又为啥要踩刹车呢,根本没有这个必要对吧? 而At大于0,又超出
的时候,如果我们不限制住,还会继续变大,所以要clip踩刹车了。
看到这里,数学部分的强化学习就基本告一段落,后续PPO还会结合大模型具体应用场景再进一步的分析,下面再贴一个PPO-clip的伪代码图片(来源openai文档)来结束本章节,后续的GRPO放在大模型章节讲解。

大模型视角下的强化学习
这一节的参考文献:
1. https://zhuanlan.zhihu.com/p/677607581 知乎猛猿的文章
2. https://github.com/zhaochenyang20/Awesome-ML-SYS-Tutorial/tree/main/rlhf/OpenRLHF
3. https://verl.readthedocs.io/en/latest/algo/ppo.html post traing framework verl库的官方文档
4. https://arxiv.org/pdf/2203.02155 InstructGPT(GPT-3 finetune,结合了RLHF,第一次用是在这篇文章里面:https://arxiv.org/pdf/1909.08593,GPT-2)Ouyang et.al
5. https://arxiv.org/pdf/2402.03300 DeepSeekMath,提出GRPO的文章
RL与RLHF、RLVR
大家比较熟悉的应该是RLHF这个词。RLHF和RL,前者比后者多了HF也就是human feedback,RLHF和传统RL的区别在于,RLHF 中奖励不再来自环境,而是由人类反馈构造出来。然后用 RL 去最大化这个人类偏好奖励。
为什么对话类大模型通常都是说 RLHF?因为监督学习只能模范训练数据,而我们希望大模型输出人类喜欢/能接受的回复,是偏好优化问题。除了RLHF之外,在数学和code领域也常用RLVR(Reinforcement Learning with Verifiable Rewards),是可验证奖励,不需要人类反馈的,除此之外,还有RL AIF(AI Feedback),这个词出现的相对来说就没有前面的那么常见了。总之,根据feedback的类型有一些分类。
重视PPO
NLP语境下的强化学习
很多人应该都搜索看到过猛猿小姐姐写的这篇介绍PPO的通俗易懂的文章,网页一搜第一个推送的就是这个,对NLP语境下的强化学习那些基本概念解释的很好,我也不费笔墨了,大家直接去看这篇文章 https://zhuanlan.zhihu.com/p/677607581的第二节NLP中的强化学习部分。
这里就简单补充一点,关于这个奖励的设计,里面提到的是最基础的token level的奖励设计,也是最经典的,而实际上还可以有segment level,可以有sequence level的奖励设计。
Actor, Critic, Reference, Reward
How to design: Actor, Critic, Reference, Reward四种模型之间的关系
RLHF里面最经典的PPO post training 流程是包含了这四种模型的,但是它们并不是都是必须的,比如在GRPO中,可以省略掉critic model,奖励模型也可以省略掉,如果你是直接采用规则化设计的奖励。
首先,Actor model就是我们的需要更新的policy model,Critic model就是要训练的一个价值网络,价值网络在之前提到过就是用来计算那个优势函数用的。所以说,如果你的优势函数将v值给优化掉了,比如GRPO采用了群体策略去估计,就自然不需要去额外练一个价值网络模型了,能够省去不少空间。Reward model也很好理解,就是策略模型采取行动后(这里的情况是输出某个token之后)所获得的奖励。
Reference model可以是SFT之后的,也可以是没有SFT过的,但是Reference model是只参与推理,是参数冻结的。这里提到的没有SFT过直接RLHF的有一些模型比如deepseek r1 zero,deepseek r1是SFT了再强化学习训练的
而单步token的奖励又和Reference model相关了,Reference model就是最初始的模型。因为我们设计的时候对奖励施加了一个KL惩罚项,让新的策略模型能够和最初的那个参考模型输出分布尽量别太偏离了,防止出现模型说胡话或者灾难性遗忘等问题,然后在 t=T的时候加了一个Rt,这个Rt就是一整句话输出完了之后,reward model给的奖励(也可以是规则型的,比如math类的problem)。

当然,这个这样设计只是代表这个例子而已,知乎的文章中是引用的deepspeed chat的奖励设计,实际上这个是最经典的设计,也是最初来自于openai 2022年GPT3 RL的那篇论文,Ouyang et.al,也仅仅只能代表chat类的。大模型强化学习中的奖励设计规则五花八门,数学领域和code领域都有各种不同的设计,比如RLVR(可验证性奖励)就不是from humanfeed back了。奖励设计也是各个项目应用PPO或者GRPO之后主要去修改的方向。
题外话,其实在https://arxiv.org/pdf/2203.02155这篇论文中,并不是说最早版本的PPO- LM(也就是只有KL项,但是没有pretrain项)。在论文中,会发现还有一个pretrain项,是PPO-ptx,也就是pretrain mix。 目标是保留预训练语言建模能力,避免退化。这里不再细说。
How to train: Actor Loss, Critic Loss 以及奖励模型训练的一个例子
关于actor loss
如果你直接看那个文章跳到Actor Loss 小结的部分,就会发现我们在讲解数学原理部分的时候就已经得到了一模一样的公式了, 只不过知乎文章里面是直接应用了GAE的,一样的就是这个东西:

关于ppo_epochs
有个点值得注意的是,那里面提到说因为ppo epoch要复用很多次数据所以引入重要性采样。而我们经过前面的长期铺垫和学习之后,应该清楚就算这个ppo epoch是等于1的,仍然是要引入重要性采样,引入ppo epochs之后需要注意的是每次都是用最开始更新时候的那个策略模型比如你ppo_epochs = 5, 第五次更新时候 计算旧策略的那个分母,还是最初开始更新时候的旧策略所得到的,而不是我用ppo_epoch更新第四次得到的actor model 去算,因为我rollout的样本是用的原先策略得到的。
另外,其实这个ppo epochs不是只有actor model才有,在verl框架里面就是critic model也有的。

关于critic loss
这个我们在数学原理那一章节讲解Actor Critic 方法中就已经讲过了,在算法10.1的那个图下面value update的部分里面有提到过。如果我们要更新critic model,也就是估计价值的那个网络,本质就是在最小化TD error的平方。在很多实现的源码中,并不是直接用。
注意:这里一些写法里面是Rt(比如那个知乎文章),一些写法里面是Rt+1,其实都是代表的是从st到st+1转移过程中的奖励,在赵老师的课程中也有提到过这一点,不管是Rt还是Rt+1都并没有什么大问题,不影响理解。同样,Adv也是一样的
很多情况下都是直接使用的,其实是一个样的。如果Adv使用的是最简单的
,而不是GAE,拆开来看就是一回事。在一些博客中提到使用这个优势值,能刻画更为丰富的实时收益信息。(以防不清楚,Adv_t和A_t是一个东西)
GRPO
这个算法最早由deepseek math这篇论文里提出。相比于PPO,它主要改进的点是两个,一个是At的计算,另外一个就是直接在损失项里面加入KL约束,原先PPO不是在奖励里面去加约束吗?这里直接放到损失里面去了。原先在奖励里面是通过那个优势来间接的影响最终优化目标的,现在就是直接加在目标后面了。下面的是具体的目标函数,我们根据上面提到的两个点分开细说:

关于Advantage的改进
回顾一下Advantage,在A2C中我们就已经学习过了,知道它最初的目的是降低采样方差,它的本质是q-v,也就是衡量当前动作价值和当前状态价值的一个差值,而当前状态价值就是当前状态下所有可能动作价值的一个期望,所以我们知道,这个Advantage就是衡量的当前动作价值相比这个状态下动作的平均水平是好还是差。然后就有下面这个最原始的式子:
OK,但是不管怎么说,本质依然是q-v没错吧?那既然是衡量前动作价值相比这个状态下动作的平均水平是好还是差,我为啥不能用采样的方法去近似嘞?于是采样来了:

但是问题来了,如果我一次性采样很多条response,我压根无法保证不同response在输出到某个token的时候,它们前面的输出都是一样的呀,也就是我不能保证token level的state是一致的,而我们熟知的Advantage都是需要Token level的,state都是token level。我们需要注意的点是:GRPO里面是从token level转变到sequence level了,看下面的式子就明白

直接是让每个token的advantage都等于最终的一个奖励了。
Deepseek Math 中的Advantage具体设计
在论文里面并不是真的就一句说到底,然后给个reward就结束了,作为推理模型,是分步骤给奖励的,也就是说Sequence level to Segment level. 具体看论文就一目了然:

简而言之就是分段给奖励,Advantage也是分段式的。
关于KL penalty的变化以及log_prob
PPO里面的KL penalty
在探究GRPO里面的KL penalty项之前,我们再来看看PPO里面的。不知道大家有没有深入探究过这个KL penalty。我最开始看到这里这个式子是有疑问的,不知道大家和我的疑问是否有重合:

1. 为啥这个KL penalty 和标准计算KL散度式子不一样呀,不是计算分布差异吗?
2. 这里到底是整个词表分布还是就取出来对应动作的那个prob(标量)呀?是标量的话,那为啥说是对分布去进行约束?这个是不是有问题?为啥不把词表里面其他词的分布也拿来算?
注意:下面是博主的个人理解,并无相关的参考文献,如果错误请及时指出
ok,我们一个个来解答,在故事和推导的最开始,让我们回顾一下最常见最熟悉的KL散度公式:
其中p为真实分布,q是近似分布。也就是logp-logq,因为log里面除就等于log外面减。我们换到LLM里面的语境也是一样的,只不过把这个p外移了,写成期望的形式:
期望的本质都是回归到采样,我们是清楚的,但是疑问一般是在于:你这里的特定的St不是都只采样了一个At吗?又不是在一个St状态下同时采样好多次,或者我们不采样多次也没事,直接用整个词表分布不行吗?显然是不行的。词表可太大了,而且我们需要清楚我们的目标根本就不是让新的policy model和ref model在某个St状态下的输出分布尽量一致,而是轨迹level的,每个 token 的 KL 惩罚是轨迹 KL 的分解项,数学上 KL 是轨迹级的,但实现上是 token 累积估计的。因为st状态实在太多了,我们怎么可能把所有的St下,下一个token输出的分布都去做一个约束。不同的输出,会有不同的前缀,有无数的St。我们真正的目标是,其中
。
改写一下之后得到:
也就是:
我们再进一步来看,写成我们熟悉的那个带系数的:
这下我们清楚了,我们真正采样的其实是轨迹,而我们在更新actor过程中那么多batch轨迹就是一个policy里面rollout出来的,然后具体更新才会被分成mini batch啥的,不管咋样采样都是一个policy的。
GRPO里面的KL penalty


第二个式子是来源于Schulman的无偏估计器,下图是来源于GPT的公式推导:


此外,GRPO没有像和PPO一样,把惩罚项放在奖励中,而是当作一个正则项放在了目标函数中,这也是为啥使用这个无偏估计器的原因,因为能够这个相对于原始形式梯度更平滑,且始终保证单样本KL非负。
大模型强化学习常用的post training框架
1. verl 字节跳动的框架,非常常用。https://github.com/volcengine/verl,采用的是hybridflow的结构,single controller和multi controller结合。文档:https://verl.readthedocs.io/en/latest/index.html,此外这个codewalkthrough 也不错https://github.com/zhaochenyang20/Awesome-ML-SYS-Tutorial/tree/main/rlhf/verl

2. openrlhf 也是非常经典的框架。https://github.com/OpenRLHF/OpenRLHF 实现没有那么复杂
3. TRL 有很多经典的RL算法,和huggingface生态结合,但是不支持异步化https://github.com/huggingface/trl
4. ROLL:阿里的框架
此外还有很多框架,比如slime等等
Agentic RL以及论文阅读随笔(持续更新)
Agentic RL
Problem Formulation
在Agentic RL场景中,目标转换为下面的式子了,其实相比于原先就是多了Tool-call。


其中 R 是长度为 tR 的推理轨迹,与工具调用反馈的轨迹交错,y 是长度为 ty 的最终答案。
Surveys
1. The Landscape of Agentic Reinforcement Learning for LLMs: A Survey
https://www.arxiv.org/abs/2509.02547
2. A Survey of Reinforcement Learning for Large Reasoning Models
https://www.arxiv.org/abs/2509.08827
论文阅读随笔
To be continued
更多推荐



所有评论(0)