精读笔记 07:PPO——近端策略优化算法

论文全名:Proximal Policy Optimization Algorithms
作者:John Schulman, Filip Wolski, Prafulla Dhariwal, Alec Radford, Oleg Klimov(OpenAI)
发表时间:2017 年 7 月(arXiv:1707.06347v2, 2017 年 8 月修订)
机构:OpenAI
原文链接:https://arxiv.org/abs/1707.06347


为什么大模型学习者要读这篇强化学习论文?

你可能会问:我在学大语言模型(LLM),为什么要看一篇 2017 年的强化学习论文?

答案只有一句话:PPO 是 RLHF(基于人类反馈的强化学习)的核心引擎。

InstructGPT、ChatGPT、GPT-4 的训练分三步:
1. 有监督微调(SFT)——让模型学会基本的指令跟随
2. 奖励模型训练(RM)——训练一个"裁判",对模型回答打分
3. PPO 强化学习优化——用 PPO 算法,让语言模型在奖励模型的打分下不断改进自己

第三步直接用的就是 PPO。没有 PPO,就没有 ChatGPT 那种"听话、有帮助、无害"的行为模式。OpenAI 的论文 InstructGPT(2203.02155)原文写道:"we fine-tune language models on a range of downstream tasks using proximal policy optimization (PPO)"。

这篇论文是大模型对齐技术的底层基石,读懂它,才能真正理解 RLHF 在做什么。


阅读地图

章节 内容 精读重点
前置知识(本文补充) 强化学习基础概念 必读,新手入口
Abstract 一句话总结 PPO 必读
§1 Introduction 为什么需要 PPO 必读
§2.1 Policy Gradient 策略梯度方法背景 重点
§2.2 Trust Region (TRPO) PPO 的前辈 TRPO 重点
§3 Clipped Surrogate Objective PPO 核心创新 精读重中之重
§4 Adaptive KL Penalty 另一种变体(次要) 了解即可
§5 Algorithm PPO 算法伪代码 重点
§6 Experiments 实验结果 重点段落精读
§7 Conclusion 总结 快速扫读

第零部分:新手必读——强化学习基础概念铺垫

在正式进入论文之前,我们需要建立几个概念。如果你从没接触过强化学习,这部分至关重要。

什么是强化学习(Reinforcement Learning, RL)?

想象一只狗在学新把戏:

强化学习就是这个逻辑的数学化版本。三个核心角色:

概念 英文 通俗解释 对应大模型场景
智能体 Agent 正在学习的角色(那只狗) 语言模型
环境 Environment 智能体所在的世界 用户 + 奖励模型
状态 State (s) 当前的处境 目前生成到的文本
动作 Action (a) 智能体做的事 选择下一个词(token)
奖励 Reward (r) 做某动作后得到的反馈 人类评分员或奖励模型的打分
策略 Policy (π) 在每个状态下选择动作的规则 语言模型本身(给定上文,输出每个词的概率)

用公式写:策略 π(a|s) = 在状态 s 下,智能体选择动作 a 的概率。

对于语言模型来说,s 是"到目前为止生成的所有文字",a 是"下一个词",π 就是模型的参数决定的概率分布。

目标:最大化累积奖励

强化学习的目标是找到一个最优策略 π,使得智能体在整个交互过程中获得的总奖励最大*。

不是只看眼前一步,而是要看长远。比如下棋,眼前吃掉对方一个棋子(正奖励)但可能导致之后输棋(巨大负奖励)——好的策略要权衡长远。

这种"放眼未来"的累积奖励,通常写成带折扣因子 γ 的形式(γ ∈ [0,1],越远的奖励折扣越多):

G_t = r_t + γ·r_{t+1} + γ²·r_{t+2} + ...

什么是优势函数(Advantage Function)?

优势函数 A(s, a):表示在状态 s 下,执行动作 a 比"平均水平"好多少。

类比:你在考试中某道题得了 90 分,班级平均 75 分,那你这道题的"优势"是 +15 分。优势函数告诉算法:哪些动作值得鼓励,哪些值得惩罚。

策略梯度(Policy Gradient):边学边改

策略梯度方法的基本思想:
- 让智能体和环境互动,收集一批经历(轨迹)
- 计算每个动作的优势函数
- 往好的方向增大概率,往坏的方向减小概率
- 用梯度上升更新模型参数

这叫"策略梯度",因为是沿着能让奖励增大的方向调整策略参数。

核心难题:步子迈多大?

策略梯度有一个致命问题:每次更新时,步子迈多大?

这就是所谓"学崩"(catastrophic collapse)。在强化学习里,一旦学崩,很难恢复——因为下一批训练数据是用新(坏)策略采集的,会产生一个恶性循环。

PPO 就是为了解决这个问题而生的。


第一部分:Abstract(摘要)精读

原文

We propose a new family of policy gradient methods for reinforcement learning, which alternate between sampling data through interaction with the environment, and optimizing a "surrogate" objective function using stochastic gradient ascent. Whereas standard policy gradient methods perform one gradient update per data sample, we propose a novel objective function that enables multiple epochs of minibatch updates. The new methods, which we call proximal policy optimization (PPO), have some of the benefits of trust region policy optimization (TRPO), but they are much simpler to implement, more general, and have better sample complexity (empirically). Our experiments test PPO on a collection of benchmark tasks, including simulated robotic locomotion and Atari game playing, and we show that PPO outperforms other online policy gradient methods, and overall strikes a favorable balance between sample complexity, simplicity, and wall-time.

逐句翻译

"We propose a new family of policy gradient methods for reinforcement learning, which alternate between sampling data through interaction with the environment, and optimizing a 'surrogate' objective function using stochastic gradient ascent."

译文:我们提出了一类新的用于强化学习的策略梯度方法,这类方法交替进行两件事:一是通过与环境交互来采样数据,二是使用随机梯度上升优化一个"替代"目标函数。


"Whereas standard policy gradient methods perform one gradient update per data sample, we propose a novel objective function that enables multiple epochs of minibatch updates."

译文:标准策略梯度方法每采集一批数据只做一次梯度更新,而我们提出了一种新颖的目标函数,使得可以对同一批数据进行多轮(epoch)小批量更新。


"The new methods, which we call proximal policy optimization (PPO), have some of the benefits of trust region policy optimization (TRPO), but they are much simpler to implement, more general, and have better sample complexity (empirically)."

译文:这种新方法被我们称为近端策略优化(PPO),它具备信任域策略优化(TRPO)的部分优点,但实现更简单、适用范围更广,且在经验上具有更好的样本效率


新手讲解

摘要传达了三个关键信息:

1. PPO 是什么?
一种强化学习算法,专门用来训练"策略"(比如语言模型)。

2. PPO 解决了什么问题?
- 旧方法(普通策略梯度):每批数据只能用一次,很浪费
- PPO:设计了一个特殊的目标函数,让同一批数据可以反复用多次——这大幅提高了数据效率

3. PPO vs TRPO:
TRPO(Trust Region Policy Optimization,信任域策略优化)是 PPO 的前辈,也解决了步子太大的问题,但实现复杂。PPO 用一个更简单的"裁剪"技巧达到了类似效果。

类比:PPO 是 TRPO 的"平价简化版"——性能相当,但工程师用起来方便得多。


第二部分:Introduction(引言)精读

关键段落原文与翻译

段落一:现有方法的问题

In recent years, several different approaches have been proposed for reinforcement learning with neural network function approximators. The leading contenders are deep Q-learning [Mni+15], "vanilla" policy gradient methods [Mni+16], and trust region / natural policy gradient methods [Sch+15b]. However, there is room for improvement in developing a method that is scalable (to large models and parallel implementations), data efficient, and robust (i.e., successful on a variety of problems without hyperparameter tuning). Q-learning (with function approximation) fails on many simple problems and is poorly understood, vanilla policy gradient methods have poor data efficiency and robustness; and trust region policy optimization (TRPO) is relatively complicated, and is not compatible with architectures that include noise (such as dropout) or parameter sharing (between the policy and value function, or with auxiliary tasks).

译文:近年来,已有多种基于神经网络的强化学习方法被提出。主要竞争者包括深度 Q 学习(DQN)、"原版"策略梯度方法和信任域/自然策略梯度方法。然而,在开发一种可扩展(适用于大型模型和并行实现)、数据高效且鲁棒(即无需调超参也能在各类问题上成功)的方法方面,仍有改进空间。Q-learning 在许多简单问题上失败且难以理解;原版策略梯度方法数据效率和鲁棒性差;而 TRPO 相对复杂,且与包含噪声(如 dropout)或参数共享(策略与价值函数共用参数,或辅助任务)的架构不兼容。

新手讲解:2017 年的强化学习领域有三大主流方法,各有缺陷:
- DQN:只适合离散动作(比如游戏按键),不适合连续控制(比如机器人关节角度)
- 原版策略梯度:简单但不稳定,数据效率低
- TRPO:稳定但复杂,实现困难,和神经网络的常见技巧(dropout、参数共享)不兼容

PPO 的定位是:填补这个空缺,做一个简单、稳定、通用的算法。


段落二:PPO 的方案

This paper seeks to improve the current state of affairs by introducing an algorithm that attains the data efficiency and reliable performance of TRPO, while using only first-order optimization. We propose a novel objective with clipped probability ratios, which forms a pessimistic estimate (i.e., lower bound) of the performance of the policy.

译文:本文希望通过引入一种算法来改善现状,该算法能达到 TRPO 的数据效率和可靠性能,同时只使用一阶优化(first-order optimization)。我们提出了一种带有裁剪概率比(clipped probability ratios)的新颖目标函数,它构成了策略性能的悲观估计(即下界)。

新手讲解

一阶优化(first-order optimization)是什么?就是只用梯度(一阶导数)来更新参数,也就是普通的梯度下降/上升。而 TRPO 需要二阶导数(Hessian 矩阵)和共轭梯度,计算成本很高。PPO 只用一阶优化,实现简单,且与 Adam 优化器直接兼容。

"裁剪概率比"(clipped probability ratios)是 PPO 的核心技术,后面第三节详细展开。

"悲观估计/下界"(pessimistic estimate / lower bound)这个概念很重要:PPO 的目标函数设计是保守的——它宁可少拿点好处,也要防止策略更新过头。这就像开车时,宁可少踩一点油门,也不要猛踩导致失控。


段落三:实验结论预告

Our experiments compare the performance of various different versions of the surrogate objective, and find that the version with the clipped probability ratios performs best. We also compare PPO to several previous algorithms from the literature. On continuous control tasks, it performs better than the algorithms we compare against. On Atari, it performs significantly better (in terms of sample complexity) than A2C and similarly to ACER though it is much simpler.

译文:我们的实验比较了多种替代目标函数变体,发现带裁剪概率比的版本效果最好。我们还与文献中的多种算法进行了比较。在连续控制任务上,PPO 优于所有对比算法。在 Atari 游戏上,就样本效率而言,PPO 显著优于 A2C,与 ACER 相当,但实现更简单得多。

新手讲解:实验在两类任务上进行:
- 连续控制(MuJoCo 物理引擎模拟的机器人):Hopper、Walker、HalfCheetah 等,类似教机器人走路
- Atari 游戏(像 Breakout、Pong 等 49 款经典游戏):智能体学会玩游戏

结论:PPO 在这两类任务上都表现很好,是性能与简单性的最佳平衡点。


第三部分:背景知识——策略梯度与 TRPO(Section 2)

2.1 策略梯度方法

原文

Policy gradient methods work by computing an estimator of the policy gradient and plugging it into a stochastic gradient ascent algorithm. The most commonly used gradient estimator has the form

ĝ = Ê_t [∇_θ log π_θ(a_t | s_t) Â_t] (公式 1)

where π_θ is a stochastic policy and Â_t is an estimator of the advantage function at timestep t.

译文:策略梯度方法通过计算策略梯度的估计值,并将其代入随机梯度上升算法来工作。最常用的梯度估计量具有如下形式:

ĝ = E_t [∇_θ log π_θ(a_t | s_t) · Â_t]

其中 π_θ 是随机策略,Â_t 是时刻 t 的优势函数估计量。

新手讲解

这个公式乍看吓人,让我们分解它:

整体含义:如果一个动作的优势 Â_t > 0(比平均好),就提高它的概率;如果 Â_t < 0(比平均差),就降低它的概率。 提高/降低的幅度,就是梯度的大小。


原文(关于重复使用数据的问题)

While it is appealing to perform multiple steps of optimization on this loss L_PG using the same trajectory, doing so is not well-justified, and empirically it often leads to destructively large policy updates.

译文:虽然对同一条轨迹多次优化目标函数 L_PG 很有吸引力,但这样做缺乏理论依据,并且经验上经常导致破坏性的大幅策略更新。

新手讲解:这就是核心矛盾。我们想用同一批数据多训练几次(提高数据效率),但这样做会让策略更新幅度过大,"学崩"。PPO 的核心目标就是解决这个矛盾。


2.2 TRPO(信任域策略优化)

原文(TRPO 的优化问题)

In TRPO [Sch+15b], an objective function (the "surrogate" objective) is maximized subject to a constraint on the size of the policy update. Specifically,

maximize_θ Ê_t [ π_θ(a_t | s_t) / π_θ_old(a_t | s_t) · Â_t ] (公式 3)

subject to Ê_t [KL[π_θ_old(· | s_t), π_θ(· | s_t)]] ≤ δ. (公式 4)

译文:在 TRPO 中,在对策略更新幅度施加约束的条件下,最大化一个"替代"目标函数。具体地:

最大化:Ê_t [ π_θ(a_t | s_t) / π_θ_old(a_t | s_t) · Â_t ]

约束条件:Ê_t [KL[π_θ_old(· | s_t), π_θ(· | s_t)]] ≤ δ

新手讲解:逐项拆解 TRPO

"替代目标"(surrogate objective)
公式里的 π_θ(a_t|s_t) / π_θ_old(a_t|s_t) 是什么?

这叫"重要性采样比"(importance sampling ratio),记作 r_t(θ)。
- 分子 π_θ(a_t|s_t):策略选择动作 a_t 的概率
- 分母 π_θ_old(a_t|s_t):策略选择动作 a_t 的概率(收集数据时用的策略)
- 比值 r_t = 新概率 / 旧概率

这个比值的含义:如果 r_t > 1,说明新策略更倾向于这个动作;r_t < 1,说明新策略更不倾向于。

为什么需要这个比值?因为我们用旧策略收集的数据来训练新策略,这两个策略不一样,需要这个比值来做"校正"。

KL 散度约束(KL[π_old, π_new] ≤ δ)
KL 散度(KL divergence)是衡量两个概率分布"有多不同"的指标。约束 KL ≤ δ 就是说:新策略和旧策略不能差太远,最多差 δ 那么多。

这就是 TRPO 的"信任域"思想:在一个可信任的小区域内更新,不要跑太远。

TRPO 的问题
这个带约束的优化问题需要用共轭梯度法求解,还需要计算 Fisher 信息矩阵(二阶量),实现非常复杂,也不能直接用 Adam 等一阶优化器。


原文(TRPO 的惩罚形式)

The theory justifying TRPO actually suggests using a penalty instead of a constraint, i.e., solving the unconstrained optimization problem

maximize_θ Ê_t [ π_θ(a_t|s_t) / π_θ_old(a_t|s_t) · Â_t − β · KL[π_θ_old(·|s_t), π_θ(·|s_t)] ] (公式 5)

for some coefficient β. [...] TRPO uses a hard constraint rather than a penalty because it is hard to choose a single value of β that performs well across different problems.

译文:支持 TRPO 的理论实际上建议使用惩罚项而非约束,即求解如下无约束优化问题:

最大化:Ê_t [ r_t(θ) · Â_t − β · KL[π_θ_old, π_θ] ]

其中 β 是某个系数。TRPO 使用硬约束而非惩罚项,是因为很难为不同问题选择一个通用的 β 值。

新手讲解:惩罚形式更直观:目标函数 = 性能提升 - β × 策略偏移量。β 越大,对偏移的惩罚越重。但问题是 β 这个超参数很难调——不同任务、不同训练阶段,最优的 β 都不一样。PPO 通过裁剪技巧彻底绕开了这个问题。


第四部分:PPO 核心——裁剪替代目标(Section 3)【精读重点】

大白话先说:PPO 在做什么?

学开车时,教练会告诉你:方向盘不要猛打,每次微调一点点。猛打方向盘可能翻车,小幅调整才安全。

PPO 就是把这个原则用数学表达出来:
- 每次更新策略时,新策略和旧策略的差别不能超过一定比例
- 如果差别超了,就把它"裁剪"(clip)掉,不给额外奖励
- 这样就把每次更新的"步子"限制在了安全范围内


原文与翻译

概率比的定义

Let r_t(θ) denote the probability ratio r_t(θ) = π_θ(a_t | s_t) / π_θ_old(a_t | s_t), so r(θ_old) = 1.

译文:令 r_t(θ) 表示概率比 r_t(θ) = π_θ(a_t | s_t) / π_θ_old(a_t | s_t),因此 r(θ_old) = 1。

新手讲解

r_t(θ) 就是一个简单的比值:新策略和旧策略在同一个动作上的概率之比。


TRPO 的替代目标(作为基准)

TRPO maximizes a "surrogate" objective

L^CPI(θ) = Ê_t [ π_θ(a_t | s_t) / π_θ_old(a_t | s_t) · Â_t ] = Ê_t [ r_t(θ) Â_t ] (公式 6)

译文:TRPO 最大化"替代"目标:

L^CPI(θ) = Ê_t [ r_t(θ) · Â_t ]

(上标 CPI 来自"保守策略迭代"Conservative Policy Iteration)。

新手讲解:这是"无约束"版本。意思是:如果一个动作有正优势(Â_t > 0),就让新策略更倾向于它(r_t > 1);反之亦然。但没有限制,r_t 可以变得任意大,导致策略大幅变化。

Without a constraint, maximization of L^CPI would lead to an excessively large policy update; hence, we now consider how to modify the objective, to penalize changes to the policy that move r_t(θ) away from 1.

译文:若没有约束,对 L^CPI 求最大化会导致策略更新幅度过大;因此,我们现在考虑如何修改目标函数,以惩罚让 r_t(θ) 偏离 1 的策略变化。


PPO 的核心公式:裁剪替代目标

原文(最关键的公式)

The main objective we propose is the following:

L^CLIP(θ) = Ê_t [ min( r_t(θ) Â_t, clip(r_t(θ), 1−ε, 1+ε) Â_t ) ] (公式 7)

where epsilon is a hyperparameter, say, ε = 0.2. The motivation for this objective is as follows. The first term inside the min is L^CPI. The second term, clip(r_t(θ), 1−ε, 1+ε) Â_t, modifies the surrogate objective by clipping the probability ratio, which removes the incentive for moving r_t outside of the interval [1−ε, 1+ε]. Finally, we take the minimum of the clipped and unclipped objective, so the final objective is a lower bound (i.e., a pessimistic bound) on the unclipped objective. With this scheme, we only ignore the change in probability ratio when it would make the objective improve, and we include it when it makes the objective worse.

译文:我们提出的主要目标函数如下:

L^CLIP(θ) = Ê_t [ min( r_t(θ)·Â_t, clip(r_t(θ), 1−ε, 1+ε)·Â_t ) ]

其中 ε 是超参数,例如 ε = 0.2。该目标的动机如下:min 内的第一项就是 L^CPI。第二项 clip(r_t(θ), 1−ε, 1+ε)·Â_t 通过裁剪概率比来修改替代目标,从而消除了将 r_t 移动到区间 [1−ε, 1+ε] 之外的动机。最后,我们取裁剪和未裁剪目标的最小值,因此最终目标是未裁剪目标的下界(即悲观界)。这种方案中,当概率比变化会使目标改善时,我们忽略这种变化;当它会使目标变差时,我们则保留这种变化。


深度讲解:裁剪替代目标到底在做什么?

让我们把公式拆开来,逐步理解。

clip(r_t(θ), 1−ε, 1+ε) 是什么?

clip(x, a, b) 函数的意思是:把 x 强制限制在 [a, b] 区间内。
- 如果 x < a,返回 a
- 如果 x > b,返回 b
- 如果 a ≤ x ≤ b,返回 x(不变)

所以 clip(r_t(θ), 1−ε, 1+ε) 就是把概率比 r_t 限制在 [1−ε, 1+ε] 里,不让它超出这个范围。

取 ε = 0.2,这个范围就是 [0.8, 1.2]——新策略和旧策略的概率比只能在 0.8 到 1.2 之间。


为什么取 min(最小值)?

公式是 min(未裁剪项, 裁剪项),取两者中更小的那个。

这是一个非常巧妙的设计,我们分两种情况来看:

情况一:动作是好的(Â_t > 0,想要增加这个动作的概率)

情况二:动作是坏的(Â_t < 0,想要减少这个动作的概率)


一句话总结裁剪机制

PPO 说:如果这次更新让新旧策略差距过大,就把超出部分的梯度"掐断",不再给额外激励——稳扎稳打,小步前进。


类比:学车时的方向盘原则

想象你在学开车,教练设定了规则:
- 允许区间 [0.8, 1.2]:方向盘可以往左或右转一点,没问题
- 超出 1.2(猛打右舵):如果路况好(优势为正),你本来想继续右转;但教练抓住你的手不让你再转了——"够了,别猛打"
- 低于 0.8(猛打左舵而路况坏):如果路况不好(优势为负),你想把方向盘使劲往左转以避开危险;但教练说"你已经偏太多了,停!"

每次都只微调,不猛打方向盘,车就不会失控。


原文(悲观下界的直觉)

Note that L^CLIP(θ) = L^CPI(θ) to first order around θ_old (i.e., where r = 1), however, they become different as θ moves away from θ_old.

译文:注意,在 θ_old 附近(即 r = 1 处)到一阶近似,L^CLIP(θ) = L^CPI(θ),但随着 θ 远离 θ_old,两者开始出现差异。

新手讲解:在更新刚开始时(r = 1),裁剪没有生效,两个目标一样。但随着训练进行,r 偏离 1,裁剪开始起作用,两者就不同了。这说明 PPO 不会妨碍小步的正常更新,只限制大步的危险更新。


论文图1的含义(Figure 1):

论文 Figure 1 展示了单个时间步的目标函数 L^CLIP 关于概率比 r 的变化:

图中的红点(r = 1)是初始状态。整个曲线的"平坦部分"就是裁剪生效的区域——那里梯度为 0,更新停止。


论文图2的含义(Figure 2):

Figure 2 展示了在策略更新方向上插值时,各目标函数的变化。可以看到:
- L^CLIP 始终是 L^CPI 的下界(L^CLIP ≤ L^CPI)
- L^CLIP 在 KL 散度约为 0.02 时达到最大值
- 这证明了 PPO 的裁剪机制确实起到了限制更新幅度的作用


第五部分:自适应 KL 惩罚变体(Section 4)

原文

Another approach, which can be used as an alternative to the clipped surrogate objective, or in addition to it, is to use a penalty on KL divergence, and to adapt the penalty coefficient so that we achieve some target value of the KL divergence d_targ each policy update. In our experiments, we found that the KL penalty performed worse than the clipped surrogate objective, however, we've included it here because it's an important baseline.

In the simplest instantiation of this algorithm, we perform the following steps in each policy update:
- Using several epochs of minibatch SGD, optimize the KL-penalized objective
L^KLPEN(θ) = Ê_t [ r_t(θ) Â_t − β · KL[π_θ_old(· | s_t), π_θ(· | s_t)] ] (公式 8)
- Compute d = Ê_t [KL[π_θ_old(· | s_t), π_θ(· | s_t)]]
- If d < d_targ/1.5, β ← β/2
- If d > d_targ × 1.5, β ← β × 2

译文:另一种方案(可作为裁剪替代目标的替代或补充)是使用 KL 散度惩罚,并自适应地调整惩罚系数,使每次策略更新达到某目标 KL 值 d_targ。我们的实验发现,KL 惩罚的表现不如裁剪替代目标,但作为重要基准我们仍将其列出。

每次策略更新执行以下步骤:
- 用多轮小批量 SGD 优化 KL 惩罚目标(公式 8)
- 计算当前 KL 散度 d
- 如果 d < d_targ/1.5,将 β 减半(惩罚过重,放宽)
- 如果 d > d_targ × 1.5,将 β 翻倍(惩罚过轻,加强)

新手讲解

这是 PPO 的第二种变体,叫 PPO-KL(对应的主版本叫 PPO-Clip)。它动态调整 KL 惩罚系数 β:

这是一种自动调节的反馈机制。但实验表明,PPO-Clip(裁剪版本)效果更好,更简洁,因此 PPO-Clip 成为了实践中的标准选择。


第六部分:PPO 算法(Section 5)

完整目标函数

原文

Combining these terms, we obtain the following objective, which is (approximately) maximized each iteration:

L^{CLIP+VF+S}_t(θ) = Ê_t [ L^CLIP_t(θ) − c_1 L^VF_t(θ) + c_2 Sπ_θ ] (公式 9)

where c_1, c_2 are coefficients, and S denotes an entropy bonus, and L^VF_t is a squared-error loss (V_θ(s_t) − V^targ_t)².

译文:综合这些项,我们得到每次迭代(近似)最大化的目标函数:

L^{CLIP+VF+S}(θ) = Ê_t [ L^CLIP(θ) − c_1 · L^VF(θ) + c_2 · Sπ_θ ]

其中 c_1, c_2 是系数,S 表示熵奖励,L^VF 是价值函数的均方误差损失 (V_θ(s_t) − V^targ_t)²。

新手讲解:三项的含义

项目 含义 作用
L^CLIP(θ) 裁剪策略目标 提升策略性能,同时限制更新幅度
−c_1 · L^VF(θ) 负的价值函数损失 让价值函数(V网络)更准确,负号是因为我们在"最大化"但 L^VF 是损失
c_2 · S[π_θ] 熵奖励 鼓励探索:如果策略太确定(熵低),就给额外奖励,防止过早"固化"在一个次优策略上

什么是价值函数(V函数)?

V_θ(s_t) 是对"从状态 s_t 开始,后续所有奖励的期望总和"的预测。它告诉我们"这个状态有多好"。优势函数 A = 实际得到的奖励 - V 函数的预测值。所以 V 函数需要尽量准确,才能让优势函数估计准确。

什么是熵奖励(entropy bonus)?

熵(entropy)是衡量概率分布"不确定性"的指标。熵高 = 策略在各个动作上更均匀(更随机),熵低 = 策略非常确定地选某个动作。

加入熵奖励,是为了防止智能体过早"认死理",保持探索新的可能性。


PPO 算法伪代码

原文(Algorithm 1)

Algorithm 1 PPO, Actor-Critic Style

for iteration=1, 2, ... do
for actor=1, 2, ..., N do
Run policy π_θ_old in environment for T timesteps
Compute advantage estimates Â_1, ..., Â_T
end for
Optimize surrogate L wrt θ, with K epochs and minibatch size M ≤ NT
θ_old ← θ
end for

译文(算法 1:Actor-Critic 风格的 PPO)

循环 iteration = 1, 2, ... :
    循环 actor = 1, 2, ..., N :
        用当前策略 π_θ_old 在环境中运行 T 步
        计算优势估计 Â_1, ..., Â_T
    结束循环
    用 K 轮(epoch)、小批量大小 M ≤ NT,对替代目标 L 关于 θ 进行优化
    更新 θ_old ← θ
结束循环

新手讲解:

用大白话翻译这个算法:

  1. 收集数据:用当前策略(旧参数)让 N 个并行的智能体各自跑 T 步,收集经历数据
  2. 计算优势:对每个时间步,计算它的优势函数值 Â_t(这个动作比平均好/差多少)
  3. 多轮优化:用收集到的 N×T 条数据,做 K 轮(epoch)的小批量梯度更新,每次从数据中随机取 M 条数据,用 PPO 的裁剪目标函数更新参数
  4. 更新旧策略:把优化后的参数赋给"旧策略",进入下一轮迭代

关键:步骤 3 中,同一批数据用了 K 轮(论文中 MuJoCo 用 10 轮,Atari 用 3 轮),这正是 PPO 提高数据利用率的地方。裁剪机制确保了多轮更新时不会过头。


第七部分:实验结果(Section 6)

6.1 替代目标变体比较

原文(结果表格描述)

Each algorithm was run on all 7 environments, with 3 random seeds on each. We scored each run of the algorithm by computing the average total reward of the last 100 episodes. We shifted and scaled the scores for each environment so that the random policy gave a score of 0 and the best result was set to 1, and averaged over 21 runs to produce a single scalar for each algorithm setting.

译文:每个算法在所有 7 个环境上各运行 3 个随机种子。通过计算最后 100 个 episode 的平均总奖励来为每次运行打分。对每个环境进行分数归一化,使随机策略的分数为 0,最佳结果为 1,然后对 21 次运行取平均,得到每种算法设置的单一标量。

实验结果(Table 1,原文真实数据)

算法 平均归一化分数
No clipping or penalty(无裁剪或惩罚) -0.39
Clipping, ε = 0.1 0.76
Clipping, ε = 0.2(PPO 默认) 0.82(最佳)
Clipping, ε = 0.3 0.70
Adaptive KL, d_targ = 0.003 0.68
Adaptive KL, d_targ = 0.01 0.74
Adaptive KL, d_targ = 0.03 0.71
Fixed KL, β = 0.3 0.62
Fixed KL, β = 1 0.71
Fixed KL, β = 3 0.72
Fixed KL, β = 10 0.69

新手讲解

关键发现:

  1. "无裁剪或惩罚"得了 -0.39(负分!):这印证了论文的出发点——不加任何限制,直接多次更新同一批数据,策略会学崩,比随机策略还差。

  2. ε = 0.2 的裁剪目标得分最高(0.82):这就是 PPO 论文推荐的默认超参数,此后成为业界标准。

  3. 裁剪版本(PPO-Clip)普遍优于 KL 惩罚版本:最好的 KL 惩罚版本只有 0.74,而 PPO-Clip 达到 0.82。裁剪机制更直接有效。

  4. ε 的影响:0.1 和 0.3 都比 0.2 差一点。0.1 太保守(步子迈太小),0.3 太激进(步子还是有点大)。0.2 是"金发女孩"选择——刚刚好。


6.2 与其他算法对比(连续控制)

原文

We see that PPO outperforms the previous methods on almost all the continuous control environments.

译文:我们可以看到,PPO 在几乎所有连续控制环境上都优于之前的方法。

对比算法(Figure 3 中的六种方法,全部是真实数字来自原文图表):
- A2C(优势 Actor-Critic)
- A2C + Trust Region(带信任域的 A2C)
- CEM(交叉熵方法)
- PPO-Clip(ε = 0.2)
- Vanilla PG with Adaptive Stepsize(自适应步长原版策略梯度)
- TRPO(信任域策略优化)

新手讲解

7 个 MuJoCo 环境(HalfCheetah、Hopper、InvertedDoublePendulum、InvertedPendulum、Reacher、Swimmer、Walker2d),各训练 100 万步。PPO 在绝大多数环境上达到最好或接近最好的成绩,特别是 Hopper 和 Walker2d 这类需要稳定步态控制的任务。

意义:PPO 打败了包括 TRPO 在内的所有对手,而实现复杂度却只是 TRPO 的一小部分。这证明了"简单方法"的力量。


6.3 3D 人形机器人任务

原文

To showcase the performance of PPO on high-dimensional continuous control problems, we train on a set of problems involving a 3D humanoid, where the robot must run, steer, and get up off the ground, possibly while being pelted by cubes.

译文:为展示 PPO 在高维连续控制问题上的性能,我们在一组涉及 3D 人形机器人的任务上进行训练,机器人需要奔跑、转向、从地面站起来,还可能在被立方体击打时完成这些动作。

新手讲解:这部分是"展示性"实验,用来证明 PPO 能处理真正复杂的高维任务。3D 人形机器人有数十个关节自由度,是连续控制的难题。PPO 能在这些任务上学出有效策略,充分展示了其扩展性。


6.4 Atari 游戏对比

原文

We also ran PPO on the Arcade Learning Environment benchmark and compared against well-tuned implementations of A2C and ACER.

Table 2 shows the number of games "won" by each algorithm, where we compute the victor by averaging the scoring metric across three trials.

实验结果(Table 2,原文数据)

A2C ACER PPO Tie
指标1:整个训练期平均奖励(利于快速学习) 1 18 30 0
指标2:最后100 episode 平均奖励(利于最终性能) 1 28 19 1

部分游戏具体分数(Table 6,末后100 episode,真实数字)

游戏 A2C ACER PPO
Breakout 303.0 456.4 274.8
Pong 19.7 20.7 20.7
BeamRider 3031.7 3863.3 1590.0
BattleZone 3080.0 8983.3 17366.7
Enduro 0.0 0.0 758.3
Freeway 0.0 0.0 32.5
Kangaroo 45.3 50.0 9928.7
Gravitar 194.0 225.3 737.2

(注:粗体为三者中最高分)

新手讲解


第八部分:结论(Section 7)

原文

We have introduced proximal policy optimization, a family of policy optimization methods that use multiple epochs of stochastic gradient ascent to perform each policy update. These methods have the stability and reliability of trust-region methods but are much simpler to implement, requiring only few lines of code change to a vanilla policy gradient implementation, applicable in more general settings (for example, when using a joint architecture for the policy and value function), and have better overall performance.

翻译

我们介绍了近端策略优化——一类使用多轮随机梯度上升来执行每次策略更新的策略优化方法。这些方法具备信任域方法的稳定性和可靠性,但实现简单得多——只需对原版策略梯度实现做少量代码改动,适用于更广泛的场景(例如策略和价值函数共享参数的联合架构),且总体性能更优。

新手讲解

这段总结了 PPO 的三大优势:
1. 稳定:像 TRPO 一样稳定,不容易学崩
2. 简单:只需在原版策略梯度代码上改几行,无需复杂的约束优化
3. 通用:不挑网络架构,参数共享、dropout 都没问题

"few lines of code change"(几行代码改动):这句话流传很广,是 PPO 最著名的特点之一。相比 TRPO 需要数百行复杂的共轭梯度代码,PPO 的裁剪机制只需几行就能实现。


第九部分:关键超参数(Appendix A)

论文附录给出了具体超参数,这里整理如下(全部来自原文 Table 3、4、5):

MuJoCo 连续控制实验(Table 3)

超参数
时间步长 T(每轮收集步数) 2048
Adam 步长 3 × 10⁻⁴
训练轮数 K(epoch 数) 10
小批量大小 M 64
折扣因子 γ 0.99
GAE 参数 λ 0.95

Atari 游戏实验(Table 5)

超参数
时间步长 T 128
Adam 步长 2.5 × 10⁻⁴(线性退火到 0)
训练轮数 K 3
小批量大小 32 × 8 = 256
折扣因子 γ 0.99
GAE 参数 λ 0.95
并行 Actor 数量 8
裁剪参数 ε 0.1(线性退火到 0)
价值函数系数 c₁ 1
熵系数 c₂ 0.01

:MuJoCo 不用熵奖励(c₂=0),Atari 用 0.01 的熵奖励,这反映了两类任务的不同特性(连续控制探索充分,游戏需要更多探索)。


总结:为什么 PPO 成为 RLHF 的默认算法?

PPO 在 2017 年发布后迅速成为深度强化学习的标准方法,原因可以概括为四个字:简单好用

特性 说明
实现简单 只需裁剪一行代码,无需共轭梯度
训练稳定 裁剪机制防止学崩,可重现性强
数据高效 同一批数据可用多轮,不浪费
通用性强 兼容任何网络架构,支持 dropout、参数共享
性能优异 在连续控制和游戏任务上均有竞争力

在 RLHF 场景中,PPO 的角色是:
- 输入:来自奖励模型的打分 r(告诉语言模型这次回答好不好)
- 目标:最大化奖励分数,同时通过 KL 散度惩罚保持与参考策略(SFT 模型)不要偏离太远
- 输出:一个更"有帮助、无害、诚实"的语言模型

PPO 的裁剪机制在这里至关重要:语言模型的参数空间巨大,一次更新如果步子迈太大,模型可能失去流畅性或产生胡言乱语。PPO 的稳扎稳打策略确保了 RLHF 训练的稳定进行。

这就是为什么从 InstructGPT 到 ChatGPT,再到 Claude、Gemini,RLHF 流水线中几乎都有 PPO 的身影。


术语速查表

英文术语 中文 一句话定义
Policy (π) 策略 在每个状态下选择动作的概率分布
Reward (r) 奖励 智能体在某时刻获得的即时反馈信号
Policy Gradient 策略梯度 通过梯度上升直接优化策略参数的方法
Advantage Function (Â) 优势函数 某动作相对平均水平的"额外好处"
Surrogate Objective 替代目标函数 用来近似真实策略性能的可优化目标
Importance Sampling Ratio (r_t) 重要性采样比 新策略概率 / 旧策略概率
Clip 裁剪 将数值强制限制在某范围内的操作
KL Divergence KL 散度 两个概率分布之间差异的度量
Trust Region 信任域 安全的策略更新范围
TRPO 信任域策略优化 PPO 的前辈,用约束保证安全更新
PPO 近端策略优化 本文算法,用裁剪替代约束
Actor-Critic 演员-评论家 同时学习策略(演员)和价值函数(评论家)的框架
GAE (λ) 广义优势估计 一种平衡偏差-方差的优势函数估计方法
Entropy Bonus 熵奖励 鼓励策略保持多样性(探索性)的额外奖励项
RLHF 基于人类反馈的强化学习 用人类偏好数据训练奖励模型,再用 PPO 优化语言模型

精读笔记作者注:本文所有原文引用均来自 Schulman et al.「Proximal Policy Optimization Algorithms」(arXiv:1707.06347),实验数据均取自论文原始表格,未经加工。数学公式采用近似 LaTeX 表达式表示,以确保在 Markdown 环境中可读。