IS PPO on-policy or off-policy

最近R1大火之后,重新看了看这一块,加上这几天看到很多关于PPO到底是on-policy和off-policy的争论。以及PPO里面公式那个比值(p_i)的推导和意义,现在重新整理一下。

Background:

Value-based v.s. Policy-based:

这个是强化学习里面最基础的两个概念,几乎所有的强化学习方法、论文、书籍、教程都会以这两个来展开。具体这两个之间的差别,我看到一个比较好的解释是:

  • 基于值的方法:我去餐馆里面吃饭,我只需要评估当前我的胃口、和这个餐馆的主要餐品就行,核心是对状态,而不是动作进行优化和迭代。

  • 基于策略的方法:我去餐馆里面吃饭,我最重要的是点什么菜,而对当前我的感受、环境不关心。核心是对最后的执行动作,而不是当前我的状态进行优化和迭代

如果用比较哲学的话来说,就是value-based-model更加在意“认识自我”,而policy-based-model更加注重“怎么做”。因此:

认识自我的过程可以不依靠我自己的动作产生,比如依靠读论文、看书、看别人的名人传记(experience)。所以很多value based的方法都是off-policy的,即不依靠自己的动作产生。最后的动作执行是在对自身认知够了之后的利益最大化实现,也就是argmax(value)。

而“怎么做”的过程更像是一种行千里路的过程,即不断的探索,不断的去做,不断动手,通过反馈,得到了应该怎么做的方法,对自身的认知不一定很高,但是得到了如何做的最佳方案。这个过程依靠大量和真实世界自己的交互,因此特别多的policy-based的方法都是on-policy的。我自己做->收集信息->得到反馈->迭代下一轮的动作。

更进一步:

policy-based的方法更加唯物主义:黑猫白猫,抓到耗子是好猫,摸着石头过河,我要的是动作,是怎么干。

value-based的方法更加唯心一些😂:我是谁?我跟世界的关系是什么?我的价值是什么?先认知自己,再改变世界。

下面是GPT-4.5的总结:

区别点Value-based 方法Policy-based 方法
学习目标学习“价值”函数(给动作打分)直接学习“策略”(动作概率分布)
输出内容输出每个动作的价值(数值)输出动作的概率(概率分布)
决策方式根据分数,选“最优动作”根据概率,随机地抽取动作
应用场景离散动作空间下很好用,连续动作时难用连续或高维动作空间非常适合
典型例子DQN、Q-learningPPO、REINFORCE、Actor-Critic

现在一般都是唯物,而且LLM时代模型主要还是侧重于对生成效果的优化,且生成的tokens直接就是所谓动作(action),因此我们从policy-based的method来介绍。

Policy-based method:

首先我们看一下标准的policy-based method的基本公式(假设states的转移概率可以忽略)

$$\begin{equation} \begin{aligned} &\mathbb{E}_{a\sim\pi_{\theta}(a|s)}(R(a,s))=\sum_a \pi_{\theta}(a|s)*R(a,s) \end{aligned} \end{equation} $$

其中 $$R(a,s)$$是一个标准的回报(return),很多算法都是在设定这个,不过一般分成两种:

1)MC-monte-carlo

假设总共有T个时刻,当前时刻为t,则未来的return为:

$$\begin{equation} R(a,s)_{MC}=r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}+\cdots+\gamma^{T-t} r_{T} \end{equation}$$

其中gamma是折扣因子,表示未来的reward对我当前的影响逐渐降低(尽量只看眼前的reward)

这个公式可以看出,所谓蒙特卡洛,就是为了得到当前状态真实的回报(return),我直接进行采样(也叫作rollout)(上面的公式2表示只采样一次),然后得到所有过程(t->T)的reward,然后根据折扣因子做一个加权求和就行。

这种方法是无偏的unbiased(毕竟我都真实的在场景中采样一次了,得到的return肯定是真实的return),但是方差会很大,原因是我采样可能有时候好,有时候坏,所以最后的return可能会突然高,突然低。

2)TD(0)

既然MC的方法最重要的问题是方差太大,因此我们需要一种方法降低这个方差,这种降低方差的做法有很多,其中一个比较著名的就是temporal difference的方法,目标还是估计上面的那个R(a,s),直接上公式:

$$\begin{equation} R(a,s)_{TD}=r_t+\gamma V\left(s_{t+1}\right) \mid \approx G_{t: t+1} \end{equation}$$

可以看到,这个公式里面把未来的return不是全部rollout(像MC那样子),而是用了一个value function V 来做了一个近似,这个V肯定是方差很小的(因为s_t+1变化不会很大)。但是是有偏的,因为V并不能真实一点不差的刻画未来的return。

3)GAE( $$TD(\lambda)$$)

GAE(Generalized advantage estimation)就是把上面的两个方法结合在一起,在Policy里面叫GAE,在value-based方法里面叫TD(\lmabda)。核心就是把上面的公式3进行扩展,公式3里面的TD(0)是只有一步,方差小但是偏差大,我们逐渐增加步数,如下(n步):

$$\begin{equation} G_{t: t+n}=r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}+\cdots+\gamma^{n-1} r_{t+n-1}+\gamma^n V_{}\left(s_{t+n}\right) \end{equation}$$

当n为无限大的时候,就又变成了MC了:方差大,无偏差。

因此GAE就是把这中间的过程全部结合起来,加权平均:

$$\begin{equation} G_t=\frac{\sum_{n=1}^T w_n G_t^{(n)}}{\sum_{n=1}^T w_n} \end{equation}$$

其中w是权重,一般可以设置为: $$w_n=\lambda^{n-1}$$

所以最后的return为:

$$\begin{equation} G_t^\lambda \triangleq(1-\lambda) \sum_{n=1}^{\infty} \lambda^{n-1} G_{t: t+n} \end{equation}$$

这个注意其中用到了几何级数求和公式(Geometric Series Formula)。

梯度迭代:

上面这三种方法都是如何获取回报(公式1里面的R)的策略。真正在做迭代的时候,我们可以直接对公式一进行求导。得到标准Policy-based的基本方法(REINFORCE):

$$\begin{equation} \begin{aligned} \mathcal{L}_{\theta}&=\mathbb{E}_{a\sim\pi_{\theta}(a|s)}(R(a,s))=\sum_a \pi_{\theta}(a|s)*R(a,s)\\ \nabla \mathcal{L}_{\theta} &= \sum_a \nabla \pi_{\theta}(a|s)*R(a,s) \\ &=\sum_a \pi_{\theta}*\nabla\log(\pi_{\theta})*R(a,s) \quad //注意用了一个导数的变换 \\ &=\mathbb{E}_{a\sim\pi_{\theta}(a|s)}[\sum_tR(a_t,s_t)\nabla\log(\pi_{\theta}(a_t|s_t))] \quad //注意我们把时间因子加进去\\ \end{aligned} \end{equation} $$

所以实际训练的时候,如果是最简单的REINFORCE方法,就是:

1)用当前策略采样得到一系列的a,r

2)计算这一系列的动作(也叫作trajectory)在当前策略的对数概率(注意这个策略是参数化的)

3)用reward乘以这个对数概率,然后求梯度就行了,梯度反过来优化参数。

当然这个公式里面R(a,s)是和动作概率结合在一起影响实际的模型迭代的,因此,如果是TD方法,还需要有额外的value-function来估计R。

注意:

1)上面的R(a,s)的各种各样的方法中,核心还是bias-variance的trade-off。-baseline啥的,本质上也是在优化这个R,让他对真实的估计更加稳定,且无偏。

2)为了降低方差,一般都会引入一个可学习的函数更好的评估当前的状态,即value-based方法,在Policy-gradient任务中这一类都是叫做actor-critic的方案。其中critic就是评估者,对当前状态进行评估,核心还是更好的找到一个R。

VS 有监督学习 VS DPO:

通过公式(7)的最后一行,我们可以看出来他跟有监督学习的差别:

  1. RL(具体是这个REINFORCE里面)是对每一个时刻的决策(或者如果没有时间t,就是整个决策)进行提升或者降低,如果reward高,就提升这个决策的概率,如果reward低,就降低这个决策的概率,所以叫reinforcement learning

  2. Supervised Learning:所有样本都是ground truth,都是最好的action,因此直接提升这些样本的似然值就行。即R==1。

  3. DPO:它的公式为:

$$\begin{aligned} & \nabla_\theta \mathcal{L}_{\mathrm{DPO}}\left(\pi_\theta ; \pi_{\text {ref }}\right)= \\ & -\beta \mathbb{E}_{\left(x, y_w, y_l\right) \sim \mathcal{D}}[\underbrace{\sigma\left(\hat{r}_\theta\left(x, y_l\right)-\hat{r}_\theta\left(x, y_w\right)\right)}_{\text {higher weight when reward estimate is wrong }}[\underbrace{\nabla_\theta \log \pi\left(y_w \mid x\right)}_{\text {increase likelihood of } y_w}-\underbrace{\nabla_\theta \log \pi\left(y_l \mid x\right)}_{\text {decrease likelihood of } y_l}]], \end{aligned}$$

DPO的公式可以看出是让好的样本似然值高,坏的样本似然值低,也是对整体的一个把控,这个把控是通过对比得到的。所以DPO里面的P是preference的意思。

(关于DPO,还有更多的想法,这个以后再说)

on-policy和off-policy:

我也事先假设读者对on-policy和off-policy有一个初步的了解,但是实际在看很多实现和方法的时候,还是会分不清,特别是能讲清楚这两个的区别的。

在实际情况下,很多的策略不是自己执行的,而是另外一个策略执行的,这种情况我们把执行动作的策略叫做 $$\pi_{b}$$,也叫作behavior policy,而进行梯度迭代的策略叫做目标策略target policy $$\pi_{\theta}$$, 这两个策略如果是一致的,那么我们叫on-policy,如果不一致,叫off-policy,定义看起来非常简单(下面会深入探究一下)。

还是对公式7的最后一行,我们看到期望下面的采样是通过当前策略得到的,即:$$a\sim\pi_{\theta}(a|s)$$,但是如果是别的策略得到的话,公式就不成立了,所以需要变换一下:

$$\begin{equation} \begin{aligned} &\mathbb{E}_{a\sim\pi_{\theta}(a|s)}[R(a,s)\nabla\log(\pi_{\theta}(a|s))] \quad //注意这个时候还是on-policy,省略t\\ &=\sum_a \pi_{\theta}(a,s)R(a,s)\nabla\log(\pi_{\theta}(a|s)) \quad \\ &=\sum_{a} \pi_{\theta}(a,s)*\frac{\pi_{b}(a,s)}{\pi_{b}(a,s)}R(a,s)\nabla\log(\pi_{\theta}(a|s)) \\ &=\sum_{a} \pi_{b}(a,s)*\frac{\pi_{\theta}(a,s)}{\pi_{b}(a,s)}R(a,s)\nabla\log(\pi_{\theta}(a|s)) \\ &=\mathbb{E}_{a\sim\underline{\pi_{b}}(a|s)}\frac{\pi_{\theta}(a,s)}{\pi_{b}(a,s)}R(a,s)\nabla\log(\pi_{\theta}(a|s)) \\ &=\mathbb{E}_{a\sim\underline{\pi_{b}}(a|s)}p_a R(a,s)\nabla\log(\pi_{\theta}(a|s)) \end{aligned} \end{equation} $$

这个behavior-policy替换target-policy求期望的过程也叫作重要性采样:importance sampling,p_a就是两个策略的比值。对梯度的估计是无偏的。

记住这一点,非常重要:公式(8)是通过替换采样概率得到的梯度公式,本质上的off-policy的。即通过一个别的策略得到的trajectory来估计当前的策略。

注意,在实际的情况下,公式8中的那个比值(官方叫法是重要性得分,importance score)p_a,和现在通常理解的PPO里面的策略的比值虽然形式上一模一样,但是意义不一样。公式8里面这个替换本质上是off-policy的,所以通过这个重要性采样让对目标策略的迭代是无偏的,而PPO里面的这个比值是策略提升的概率比,是on-policy的。

TRPO->PPO:

在policy-based RL里面,有一类非常重要的方法叫做策略提升,即policy-improvement。这类方法是TRPO和PPO类的基础。先看看S(utton)和B(arto)对策略提升的定义:

策略改进的意义在于,它为如何从一个已有的策略系统地寻找更优策略提供了理论基础和方法论。简而言之:

  • 评估与改进结合:通过计算当前策略 π 的价值函数 vπ,我们可以评估在某个状态 s 下,如果采取不同于 π(s) 的动作 a,是否能够获得更高的期望回报。

  • 贪婪策略的构造:利用状态—动作价值函数 qπ(s, a) 来比较当前策略与更改策略的优劣,若在某状态下 qπ(s, a) 大于 vπ(s),则说明在该状态选择 a 并继续执行 π 将比原策略更好。通过在所有状态上选择使 qπ 最大的动作,形成一个“贪婪”策略 π′。

  • 理论保证:政策改进定理证明了,如果在每个状态上满足 qπ(s, π′(s)) ≥ vπ(s),那么新策略 π′ 的价值函数必然不低于旧策略 π 的价值函数,即 vπ′(s) ≥ vπ(s)。如果在某些状态严格大于,则整体上π′一定比 π 更好;反之,如果无处可改,则表明原策略已经是最优策略。

  • 策略迭代的核心:这一过程正是策略迭代算法的核心,交替执行策略评估和策略改进,最终可以收敛到最优策略。

总的来说,策略改进的重要意义在于,它为如何利用当前策略的评估结果来构造更优策略提供了一种系统化、理论上有保证的方法,从而在强化学习中推动策略不断向最优解逼近。

即我们除了当前的策略,还可以通过值(策略评估)来找到一个更好的策略。

所以类似TRPO,和PPO这一类算法的核心,都是通过当前的value-function,找到一个更好的action,如果这个action比当前策略的reward高,那么就用这个新的action来提升当前的策略。

我们先看看最原始的On-Policy Policy Improvement Algorithms的基础,他们会设置一个Policy improvement lower bound,即我们提升策略的下限(直接截图了,原始论文:https://arxiv.org/pdf/2206.13714 ):

这个里面的J就是目标函数,我们总是希望汇报增长,其中pi是我们要优化的策略,pi_k是当前的策略,下面一项是两个策略之间通过某种度量的差值,不能太大,要不然优化可能会发散,因此这种方法也叫作constrained policy optimization,重新写一下是:

所以policy improvement的目标可以写成:

在这里就说一下为什么PPO是on-policy的吧:注意虽然也有两个策略的比值,而且推导也是依靠了importance sampling,但是本质上这个目标函数是为了提升当前的策略,而公式8里面只是为了替换off-policy的采样策略而必须构造的无偏估计。这个是核心的PPO和之前off-policy的做法的差别。因此PPO是on-policy-Improvement。

后面的TRPO,PPO以及比较新的VMPO都是这个的变体差别在于如何确定第二项,即新老策略的差值

TRPO:

第二项为:

而对第一项进行线性展开(泰勒)

第二项可以表示为:

其中F是费舍尔信息矩阵,表示参数变化的敏感度,就是矩阵的二阶信息了,实际会用 $$\mathbf{F}_k=\boldsymbol{g}_k \boldsymbol{g}_k^{\top}$$ 近似

所以最后的梯度更新可以表示为:

其中:

这个涉及到求逆,一般会用共轭梯度法来求解(所以TRPO很慢,就是求这个共轭梯度的计算很慢)。

  • 在TRPO的原始论文中(https://arxiv.org/pdf/1502.05477),写了一个这个方法和policy-gradient方法的区别:

所以从形式上:policy-gradient(公式8这一类)是在参数空间的一个限制,而TRPO这一类是在输出空间的限制。

PPO(Proximal Policy Optimization):

有一种更高效的方法,我们看到TRPO的第二项是两个策略的比值在一定范围内,但是这个超参数很难设置,并且实际计算两个分布的比值是很困难的。PPO提出了一个更简单的方法,就是限制新旧策略的比值的范围,来直接省去第二项的计算。

如何限制 $$r_t(\theta)$$的大小?,就是下面这样一个简单的clip

为什么PPO是on-policy的?

虽然我们看到上面的公式里面,还是有一个 $$\pi_{old}$$,但是请注意这个策略和off-policy里面的behavior-policy(公式8里面的 $$\pi_{b}$$)本质不同。PPO里面的old只是当前“待提升的”策略,本质和目标的策略是非常同频的,因此他是on-policy的方法。而off-policy的策略就是其他的策略,并且off-policy的这个比值只是为了对期望回报的无偏估计。

我们来看看actor-critic的算法(on-policy)和PPO算法的区别:

注意其中第六行中间的那一项At的计算,因为用了log技巧,是不传梯度的。

注意其中的第11行中间的那一项。在求梯度的时候,虽然clip了,但是还是会从 $$p_t$$进行梯度传递。因此如果只有这一项的时候,对 $$\pi_{\theta}(a_t|s_t)$$求梯度又等于对他的对数似然求梯度然后再乘以本身的概率。

实际在计算PPO梯度的时候,其实和PG的梯度是等价的:

$$\begin{equation} \begin{aligned} p_t(\theta)&=\frac{\pi_{\theta}(a_t|s_t)}{\pi_{old}(a_t|s_t)} \\ \nabla_{\theta} p_t(\theta)&=\frac{\nabla_{\theta}\pi_{\theta}(a_t|s_t)}{\pi_{old}(a_t|s_t)} \\ &=\frac{\pi_{\theta}(a_t|s_t) \nabla_{\theta}\log \pi_{\theta}(a_t|s_t)}{\pi_{old}(a_t|s_t)} \\ &= p_t(\theta)\nabla_{\theta} \log \pi_{\theta}(a_t|s_t) \end{aligned} \end{equation}$$

只要再乘以一个A,看起来就是和off-policy policy gradient里面的算法是一模一样的了。但是off-policy方法不需要这两个policy很接近,只是提供一个采样策略而已。

GRPO:

GRPO(https://arxiv.org/pdf/2402.03300)本质上是对上面算法7里面11行那里A的优化,和MC-monte-carlo,TD啥的属于同一类优化advantage估计的。因为本身这个value function会占用大量资源。而作用只是更好的估计A,因此可以通过采样多次求平均来更好的估计。如原文所述:

我个人认为这个方法能work的原因在于当前模型已经很强了,几乎不存在一个样本里面方差非常非常大的情况,因此更加稳定。而传统的游戏任务里面,一个inference阶段的方差会特别大,甚至fail,所以需要改用基于value的不断找到能提升值估计的策略。

总结:

PPO的计算方法和off-policy-policy gradient里面的计算方法最后通过公式求导几乎是一模一样的,但是本身推导过程是不太一样的。PPO本质是一个策略提升的方法,即在当前的策略上如何更好的找到一个新策略,新策略比老策略好,但是不能离得太远(在trust region之内)。所以更像是一种【局部off-policy】的算法。而真正off-policy里面的的所谓旧策略只是提供一个采样的方案,最后的比值是根据重要性采样而让最后期望是无偏的来设计的,不在乎他们之间差距有多大。

留下您的评论

回复列表:

By王炳宁 on March 11, 2025 | 类别 ML

关于本站