PPO算法原理详解(上):从策略梯度到近端策略优化的演进之路

PPO算法原理详解(上)

前言

在强化学习的发展历程中,策略梯度方法(Policy Gradient)一直是最重要的技术路线之一。从最原始的REINFORCE算法,到TRPO,再到如今广为人知的PPO(Proximal Policy Optimization,近端策略优化),策略优化方法经历了从"简单但不稳定"到"复杂但可靠",再到"简单且可靠"的演进过程。

PPO算法由OpenAI在2017年提出,凭借其实现简单、训练稳定、效果优异的特点,迅速成为深度强化学习领域最主流的算法之一,也是如今大语言模型对齐训练(RLHF)的核心算法基础。

本文将分为上下两篇,上篇我们将从策略梯度的基本原理出发,一步步理解PPO为什么会被提出,以及它解决了什么问题。


一、策略梯度方法基础

1.1 什么是策略梯度

在强化学习中,我们的目标是学习一个策略 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s),即在状态 s s s 下采取动作 a a a 的概率,使得累计期望回报 J ( θ ) J(\theta) J(θ) 最大:

J ( θ ) = E τ ∼ π θ ∑ t = 0 T γ t r ( s t , a t ) J(\theta) = \mathbb{E}{\tau \sim \pi\theta} \left \\sum_{t=0}\^{T} \\gamma\^t r(s_t, a_t) \\right J(θ)=Eτ∼πθt=0∑Tγtr(st,at)

其中 τ = ( s 0 , a 0 , s 1 , a 1 , . . . ) \tau = (s_0, a_0, s_1, a_1, ...) τ=(s0,a0,s1,a1,...) 是一条轨迹, γ \gamma γ 是折扣因子。

策略梯度方法的核心思想是:既然要最大化 J ( θ ) J(\theta) J(θ),那就直接对参数 θ \theta θ 求梯度,然后沿着梯度上升的方向更新参数。

1.2 策略梯度定理

直接求 ∇ θ J ( θ ) \nabla_\theta J(\theta) ∇θJ(θ) 看起来很复杂,因为期望是对策略本身采样得到的。但幸运的是,我们有策略梯度定理(Policy Gradient Theorem):

∇ θ J ( θ ) = E τ ∼ π θ ∑ t = 0 T ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ G t \nabla_\theta J(\theta) = \mathbb{E}{\tau \sim \pi\theta} \left \\sum_{t=0}\^{T} \\nabla_\\theta \\log \\pi_\\theta(a_t\|s_t) \\cdot G_t \\right ∇θJ(θ)=Eτ∼πθt=0∑T∇θlogπθ(at∣st)⋅Gt

其中 G t = ∑ k = t T γ k − t r ( s k , a k ) G_t = \sum_{k=t}^{T} \gamma^{k-t} r(s_k, a_k) Gt=∑k=tTγk−tr(sk,ak) 是从时刻 t t t 开始的未来累计回报。

这个定理的直观解释非常清晰:

  • 如果某个动作带来了正的回报 G t > 0 G_t > 0 Gt>0,那么我们就增大这个动作在对应状态下的概率
  • 如果某个动作带来了负的回报 G t < 0 G_t < 0 Gt<0,那么我们就减小这个动作的概率

1.3 REINFORCE算法

最简单的策略梯度算法就是REINFORCE,它直接用策略梯度定理来更新参数:

θ ← θ + α ⋅ ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ G t \theta \leftarrow \theta + \alpha \cdot \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t θ←θ+α⋅∇θlogπθ(at∣st)⋅Gt

REINFORCE算法流程:

  1. 用当前策略 π θ \pi_\theta πθ 采样多条完整轨迹
  2. 计算每一步的累计回报 G t G_t Gt
  3. 按照上面的公式更新参数

虽然REINFORCE很直观,但它有几个致命问题:

  • 方差极大:轨迹采样的随机性导致梯度估计的波动非常大
  • 样本效率极低:每条轨迹只能用一次,更新完就扔掉
  • 步长难选:学习率大了训练不稳定,小了收敛太慢

二、从优势函数到TRPO:解决策略梯度的痛点

2.1 优势函数的引入

为了降低梯度估计的方差,研究者们引入了优势函数(Advantage Function)的概念:

A t = G t − V ( s t ) A_t = G_t - V(s_t) At=Gt−V(st)

其中 V ( s t ) V(s_t) V(st) 是状态价值函数,表示在状态 s t s_t st 下平均能获得的回报。

优势函数 A t A_t At 的含义是:在状态 s t s_t st 下,采取动作 a t a_t at 比平均水平好多少。

  • A t > 0 A_t > 0 At>0:这个动作比平均好,应该多做
  • A t < 0 A_t < 0 At<0:这个动作比平均差,应该少做

用优势函数代替原始回报,梯度估计的方差会大大降低。这就得到了Actor-Critic框架。

2.2 为什么需要信赖域

即使有了优势函数,策略梯度方法仍然有一个根本问题:步长不好控制。

如果我们一次更新走得太远,策略可能会"崩掉"------比如原来还能正常玩游戏的智能体,更新完之后突然就只会乱按按键了。这在深度强化学习中尤其常见,因为神经网络的表示能力很强,一点点参数变化都可能导致策略发生巨大改变。

那怎么办呢?一个很自然的想法是:每次更新不要走太远,保证新策略和旧策略不要差太多。

这就是TRPO(Trust Region Policy Optimization,信赖域策略优化)的核心思想。

2.3 TRPO的目标函数

TRPO用新策略和旧策略之间的KL散度来衡量两个策略的差异大小,然后在KL散度不超过某个阈值的约束下,最大化目标函数:

max ⁡ θ    E t π θ ( a t ∣ s t ) π θ o l d ( a t ∣ s t ) A t \max_\theta \; \mathbb{E}_t \left \\frac{\\pi_\\theta(a_t\|s_t)}{\\pi_{\\theta_{old}}(a_t\|s_t)} A_t \\right θmaxEtπθold(at∣st)πθ(at∣st)At

s.t. E t K L ( π θ o l d ( ⋅ ∣ s t ) ∥ π θ ( ⋅ ∣ s t ) ) ≤ δ \text{s.t.} \quad \mathbb{E}_t \left KL\\left( \\pi_{\\theta_{old}}(\\cdot\|s_t) \\parallel \\pi_\\theta(\\cdot\|s_t) \\right) \\right \le \delta s.t.EtKL(πθold(⋅∣st)∥πθ(⋅∣st))≤δ

这里的 π θ ( a t ∣ s t ) π θ o l d ( a t ∣ s t ) \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)} πθold(at∣st)πθ(at∣st) 称为概率比 (probability ratio),记为 r t ( θ ) r_t(\theta) rt(θ)。

TRPO的直觉非常好:

  • 先约束新策略不要偏离旧策略太远(信赖域)
  • 然后在这个安全范围内,尽可能让优势大的动作概率提高

2.4 TRPO的问题

TRPO虽然效果很好,但它有一个巨大的缺点:实现太复杂,计算代价太高。

为了解决这个约束优化问题,TRPO需要:

  1. 用共轭梯度法(Conjugate Gradient)计算自然梯度方向
  2. 用线搜索(Line Search)确保更新后约束仍然满足
  3. 每一步都要计算Fisher信息矩阵向量乘积

这导致TRPO的代码实现非常复杂,调试困难,而且训练速度慢。很多研究者和工程师想要一个"效果差不多,但简单得多"的算法。


三、PPO的诞生:简单又可靠的策略优化

3.1 PPO的设计哲学

正是在这样的背景下,OpenAI的John Schulman等人在2017年提出了PPO算法。PPO的设计目标非常明确:

在保持TRPO大部分优点的同时,尽可能简化实现,让普通工程师也能轻松跑起来。

PPO的核心思路是:既然TRPO用硬约束来限制策略更新幅度,那我们能不能不用约束优化,而是直接在目标函数里"惩罚"那些更新过大的情况?

3.2 PPO的概率比视角

PPO仍然使用概率比 r t ( θ ) = π θ ( a t ∣ s t ) π θ o l d ( a t ∣ s t ) r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)} rt(θ)=πθold(at∣st)πθ(at∣st) 来表示新策略相对旧策略变化了多少:

  • r t ( θ ) > 1 r_t(\theta) > 1 rt(θ)>1:新策略下这个动作的概率变大了
  • r t ( θ ) = 1 r_t(\theta) = 1 rt(θ)=1:新旧策略在这个动作上概率一样
  • 0 < r t ( θ ) < 1 0 < r_t(\theta) < 1 0<rt(θ)<1:新策略下这个动作的概率变小了

如果我们不加任何约束,直接最大化 r t ( θ ) ⋅ A t r_t(\theta) \cdot A_t rt(θ)⋅At 会发生什么?

  • 当 A t > 0 A_t > 0 At>0 时,为了让目标更大, r t ( θ ) r_t(\theta) rt(θ) 会趋向无穷大------也就是无限提高这个动作的概率
  • 当 A t < 0 A_t < 0 At<0 时,为了让目标更大(因为乘了负数), r t ( θ ) r_t(\theta) rt(θ) 会趋向0------也就是把这个动作概率降到0

这显然太极端了,一次更新就把策略改得面目全非。

3.3 PPO的核心思想预览

那PPO是怎么解决这个问题的呢?它用了一个非常巧妙的**裁剪(Clip)**技巧,直接把概率比限制在 1 − ϵ , 1 + ϵ 1-\\epsilon, 1+\\epsilon 1−ϵ,1+ϵ 的范围内,不允许更新超出这个区间。

关于PPO的Clip机制的详细原理、目标函数推导、伪代码和实践技巧,我们将在下一篇文章中详细讲解。


小结

本篇我们从策略梯度的基本原理出发,回顾了从REINFORCE到TRPO的演进历程:

  1. REINFORCE:最简单直接的策略梯度,但方差大、不稳定
  2. Actor-Critic + 优势函数:降低了梯度估计的方差
  3. TRPO:引入信赖域约束,保证策略更新稳定,但实现复杂

正是因为TRPO的复杂性,才有了PPO的诞生。PPO用一种极其简单的方式实现了和TRPO类似的效果,这也是它能成为深度强化学习最流行算法的原因。


下一篇预告:PPO算法原理详解(下)------Clip机制深入剖析与实践指南,我们将详细讲解PPO的裁剪目标函数、PPO-Clip与PPO-Penalty的区别、GAE优势估计、完整伪代码以及实际训练中的调参技巧。

相关推荐
沐言人生1 小时前
开源的健身教练Skill,让Agent当上了私教
人工智能
云栈开源日记1 小时前
机器人运动规划从A*到Minimum Snap四大算法全解析
算法·ai·机器人
归秋1421 小时前
深度解读Work Agent长程任务执行的底层机制与落地能力
人工智能
H.莓飛1 小时前
【数据结构】栈
linux·开发语言·数据结构·算法·centos
czq_26867194871 小时前
Python打卡第30天
python·机器学习
蜗牛互联网1 小时前
Computer Use公共预览的安全设计:应用、动作与数据三维门禁
java·人工智能·后端·安全·策略模式
狂奔蜗牛(bradley)1 小时前
EtherCAT DC 分布式时钟同步的 ModelSim 仿真:从帧模板到从站行为建模
人工智能·嵌入式硬件·fpga开发·架构
Dawson Zhu1 小时前
Agent上下文压缩的“状态保真“取舍框架解读
人工智能·语言模型·架构·aigc·agi
Shulex1 小时前
跨境电商智能售后中台架构演进:从浅层文本生成到业务流闭环驱动
人工智能