PPO(Proximal Policy Optimization,近端策略优化) 是目前深度强化学习(Deep RL)领域中最流行、最核心的算法之一。它由 OpenAI 在 2017 年提出,因为其稳定性高、实现简单、调参相对容易,成为了许多任务(从机器人控制到 ChatGPT 的 RLHF 阶段)的首选算法。
以下是对 PPO 技术的详细解析,从背景动机到核心数学原理,再到优缺点分析。
1. 背景与动机:为什么要发明 PPO?
在 PPO 出现之前,策略梯度(Policy Gradient)类算法面临两个极端的问题:
- Vanilla Policy Gradient (REINFORCE 等): 极其不稳定。如果学习率(Step Size)太大,策略更新幅度过大,可能导致策略"掉下悬崖"(性能骤降),并且很难恢复;如果学习率太小,训练又慢如蜗牛。
- TRPO (Trust Region Policy Optimization): 为了解决步长问题,TRPO 引入了"信任区域"概念,强制策略更新的幅度在一定范围内(通过 KL 散度约束)。虽然效果好且稳定,但它需要计算二阶导数(黑塞矩阵),计算量巨大且实现非常复杂。
PPO 的目标: 也就是要拥有 TRPO 的稳定性(限制更新幅度),同时拥有类似普通梯度下降(SGD/Adam)的简单性和计算效率(只用一阶导数)。
2. PPO 的核心思想:Clip(裁剪)
PPO 属于 Actor-Critic 架构的 On-Policy (在线策略)算法。它的核心创新在于它的目标函数(Loss Function)。
2.1 策略比率 (Policy Ratio)
假设旧的策略是 π θ o l d \pi_{\theta_{old}} πθold,新的策略是 π θ \pi_{\theta} πθ。我们定义一个比率 r t ( θ ) r_t(\theta) rt(θ):
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 > 1 rt>1,说明新策略比旧策略更倾向于采取该动作。
- 如果 r t < 1 r_t < 1 rt<1,说明新策略减少了采取该动作的概率。
2.2 PPO-Clip 的目标函数 (最重要的公式)
PPO 不希望 r t r_t rt 偏离 1 太远(即不希望新旧策略差异过大)。其策略损失函数 L C L I P L^{CLIP} LCLIP 如下:
L C L I P ( θ ) = E ^ t [ min ( r t ( θ ) A ^ t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ t ) ] L^{CLIP}(\theta) = \hat{\mathbb{E}}_t \left[ \min \left( r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t \right) \right] LCLIP(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]
这里包含几个关键部分:
- A ^ t \hat{A}_t A^t (优势函数 Advantage): 衡量在状态 s t s_t st 下采取动作 a t a_t at 比"平均表现"好多少。
- A ^ t > 0 \hat{A}_t > 0 A^t>0: 动作是好的,应增加概率。
- A ^ t < 0 \hat{A}_t < 0 A^t<0: 动作是坏的,应减少概率。
- clip ( r , 1 − ϵ , 1 + ϵ ) \text{clip}(r, 1-\epsilon, 1+\epsilon) clip(r,1−ϵ,1+ϵ): 强制将比率 r r r 限制在 [ 1 − ϵ , 1 + ϵ ] [1-\epsilon, 1+\epsilon] [1−ϵ,1+ϵ] 之间。通常 ϵ \epsilon ϵ 取 0.1 或 0.2。
- min \min min 操作: 这是 PPO 的精髓,被称为悲观下界(Pessimistic Bound)。
直观解释:
- 当动作是好的 ( A ^ t > 0 \hat{A}_t > 0 A^t>0): 我们希望 r t r_t rt 变大(增加概率)。但如果 r t r_t rt 超过了 1 + ϵ 1+\epsilon 1+ϵ(比如增加了 20% 以上),Clip 就会生效,损失函数就不再奖励这种大幅度的更新。这防止了过度自信。
- 当动作是坏的 ( A ^ t < 0 \hat{A}_t < 0 A^t<0): 我们希望 r t r_t rt 变小。但如果 r t r_t rt 低于 1 − ϵ 1-\epsilon 1−ϵ,Clip 生效,防止概率降得太猛导致无法探索。
通过这种方式,PPO 形成了一个"虚拟的信任区域",确保每次更新都在安全范围内。
3. PPO 的两种变体
虽然上面提到的是最常用的 PPO-Clip,但最初论文提出了两种形式:
- PPO-Clip: 利用
clip函数直接截断修剪梯度。这是目前的主流,因为它实现最简单,效果也最好。 - PPO-Penalty (Adaptive KL Penalty): 将 KL 散度(衡量两个分布的距离)作为一个惩罚项放入 Loss 中:
L = E [ r t A ^ t − β ⋅ KL ( π θ o l d , π θ ) ] L = \mathbb{E}[ r_t \hat{A}t - \beta \cdot \text{KL}(\pi{\theta_{old}}, \pi_\theta) ] L=E[rtA^t−β⋅KL(πθold,πθ)]
如果在训练中 KL 散度太大,就增大系数 β \beta β(加大惩罚);如果 KL 太小,就减小 β \beta β。这个方法比较像 TRPO,但因为还要动态调整系数,不如 PPO-Clip 方便。
4. 完整的 PPO 算法流程
PPO 通常结合 GAE (Generalized Advantage Estimation) 使用,并在 Actor-Critic 框架下运行。
总损失函数:
L t t o t a l = L t C L I P ( θ ) − c 1 L t V F ( θ ) + c 2 S [ π θ ] ( s t ) L_t^{total} = L_t^{CLIP}(\theta) - c_1 L_t^{VF}(\theta) + c_2 S[\pi_\theta](s_t) Lttotal=LtCLIP(θ)−c1LtVF(θ)+c2S[πθ](st)
- 第一项:策略梯度损失(让 Actor 变强)。
- 第二项:价值函数损失(让 Critic 预测更准,通常是 MSE Loss)。
- 第三项:熵(Entropy)奖励(鼓励探索,防止过早收敛)。
执行步骤:
- 采样 (Sampling): 使用当前的 Actor π θ o l d \pi_{\theta_{old}} πθold 在环境中运行 T T T 步,收集数据(状态、动作、奖励)。
- 计算优势 (Advantage): 利用 Critic 网络计算价值 V ( s ) V(s) V(s),并结合奖励计算 GAE 优势 A ^ t \hat{A}_t A^t。
- 优化 (Optimization):
- 将收集到的这批数据打乱,分成多个 Mini-batch。
- 对这些数据进行 K K K 个 Epoch 的训练(重复利用这批数据)。
- 使用 Adam 优化器更新网络参数,最小化总损失。
- 更新旧策略: 训练完成后,令 π θ o l d ← π θ \pi_{\theta_{old}} \leftarrow \pi_{\theta} πθold←πθ。
- 循环: 回到步骤 1。
5. PPO 的关键优缺点
优点:
- 稳定性极佳: Clip 机制保证了更新幅度可控,不像 DQN 或 Vanilla PG 那样容易训练崩溃。
- 通用性强: 既可以处理连续动作空间 (如机器人控制),也可以处理离散动作空间(如打 Atari 游戏,生成文本)。
- 调参相对简单: 相比于 TRPO 复杂的数学约束,PPO 只需要调整学习率、Clip 范围( ϵ \epsilon ϵ)和 Entropy 系数即可,且默认参数通常效果不错。
- 数据利用率比传统 PG 高: 传统的 Policy Gradient 采一次数据只能更一次参数(Off-policy 除外)。PPO 虽然是 On-policy,但它允许在一个 Batch 上进行多次(Epochs)梯度更新,榨干数据的价值。
缺点:
- 样本效率(Sample Efficiency)仍不如 Off-Policy 算法: 相比于 SAC (Soft Actor-Critic) 或 TD3,PPO 需要更多的交互数据才能达到同样的性能,因为它扔掉旧数据的速度很快(On-policy 特性)。
- 容易陷入局部最优: 在某些极其复杂的环境中,限制更新幅度可能导致策略在次优解附近徘徊,无法跳出。
6. PPO 的杀手级应用:RLHF (ChatGPT 背后的功臣)
PPO 之所以现在如此出名,很大程度上归功于它在 LLM(大语言模型) 中的应用。
在训练 ChatGPT / InstructGPT 的 RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习) 阶段:
- Environment (环境): 用户的 Prompt。
- Action (动作): 模型生成的回答(Token 序列)。
- Reward (奖励): 奖励模型(Reward Model)给回答打的分数。
- Algorithm (算法): PPO。
为什么选 PPO 做 RLHF?
因为微调大模型非常昂贵且脆弱。如果更新步长太大,把语言模型"训坏了"(导致它开始胡言乱语,忘记了语法),是灾难性的。PPO 的 Clip 机制 完美地保证了:模型在向人类偏好对齐的同时,不会偏离原始预训练模型太远,从而保持了语言生成的流利度。
总结
PPO 是强化学习领域的"瑞士军刀"。它不是最快(样本效率)的,也不是理论最完美的,但它实现了工程上的完美平衡------既足够简单,又足够强大且稳定。这就是为什么它成为 OpenAI 以及众多 AI 实验室的首选算法。
这是一个非常棒的问题。PPO、DPO 和 GRPO 代表了当前大语言模型(LLM)"对齐(Alignment)"技术发展的三大里程碑。
我们可以把它们看作是为了解决同一个问题(让模型符合人类喜好/逻辑),在不同资源约束和数学推导下产生的不同进化路径。
- PPO: 经典的、标准的、但沉重的"在线"老师。
- DPO: 巧妙的、数学简化的、轻量的"离线"自学。
- GRPO: 针对大规模推理优化的、省钱的"去掉了助教"的 PPO 变体(DeepSeek 的核心武器)。
下面我从 PPO 出发,详细为你拆解 DPO 和 GRPO。
1. 从 PPO 的痛点说起
我们在上一节说到,PPO 是 RLHF 的默认选择。但当你真正去训练一个几百亿参数的模型(如 Llama-70B 或 DeepSeek-V3)时,PPO 有几个巨大的痛点:
-
显存爆炸(Memory Hog):
标准的 PPO-RLHF 需要同时加载 4 个模型:
- Actor (策略模型): 正在训练的模型。
- Ref (参考模型): 原始模型,用来计算 KL 散度,防止跑偏。
- Critic (价值模型): 这里的"助教",用来预估当前状态好不好(Value Function)。
- Reward (奖励模型): 这里"裁判",给结果打分。
- 结果:显存占用极大,训练速度慢。
-
训练不稳定: 需要协调 Actor 和 Critic 的学习进度,超参数极其敏感。
于是,为了解决这些问题,AI 社区分化出了两条路:一条走向了DPO (数学简化),一条走向了GRPO(工程优化)。
2. DPO (Direct Preference Optimization,直接偏好优化)
核心一句话:既然奖励模型(Reward Model)也是根据偏好数据练出来的,为什么不直接用偏好数据来优化策略,把奖励模型"消掉"?
DPO 由斯坦福大学在 2023 年提出,迅速成为了微调 LLM 的主流方法。
2.1 PPO 到 DPO 的数学推导(简化版)
在 PPO 中,我们先训练一个 Reward Model R ( x , y ) R(x, y) R(x,y),然后最大化:
max π E [ R ( x , y ) ] − β E [ log π ( y ∣ x ) π r e f ( y ∣ x ) ] \max_{\pi} \mathbb{E}[R(x, y)] - \beta \mathbb{E}[\log \frac{\pi(y|x)}{\pi_{ref}(y|x)}] πmaxE[R(x,y)]−βE[logπref(y∣x)π(y∣x)]
DPO 的作者发现了一个惊人的数学关系:最优的策略 π ∗ \pi^* π∗ 和奖励函数 R R R 之间存在一一映射关系。
也就是: R ( x , y ) = β log π ∗ ( y ∣ x ) π r e f ( y ∣ x ) + Z ( x ) R(x, y) = \beta \log \frac{\pi^*(y|x)}{\pi_{ref}(y|x)} + Z(x) R(x,y)=βlogπref(y∣x)π∗(y∣x)+Z(x)
既然如此,我们可以把 RL 的目标函数里的 R R R 替换掉,直接推导出一个只包含策略 π \pi π 和参考策略 π r e f \pi_{ref} πref 的损失函数。
2.2 DPO 的做法
不再需要训练 Critic,也不需要显式的 Reward Model。我们只需要人类偏好数据对: ( x , y w i n , y l o s e ) (x, y_{win}, y_{lose}) (x,ywin,ylose)(即对于提示词 x x x,回答 y w i n y_{win} ywin 比 y l o s e y_{lose} ylose 好)。
DPO 的 Loss 函数:
L D P O = − E ( x , y w , y l ) [ log σ ( β log π θ ( y w ∣ x ) π r e f ( y w ∣ x ) − β log π θ ( y l ∣ x ) π r e f ( y l ∣ x ) ) ] L_{DPO} = - \mathbb{E}{(x, y_w, y_l)} \left[ \log \sigma \left( \beta \log \frac{\pi\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)} \right) \right] LDPO=−E(x,yw,yl)[logσ(βlogπref(yw∣x)πθ(yw∣x)−βlogπref(yl∣x)πθ(yl∣x))]
直观解释:
- 计算模型生成"好回答"的概率与"坏回答"的概率之比(相对参考模型)。
- 增加 好回答的相对概率,降低坏回答的相对概率。
- 这就变成了一个简单的分类问题(Binary Cross Entropy),类似传统的监督学习。
2.3 DPO 的优缺点
- 优点:
- 省显存: 不需要 Critic 和 Reward Model,只需要加载 Actor 和 Ref。
- 极简: 训练过程稳定,不需要采样(Off-policy/Offline),不需要复杂的 PPO 循环,就像在做普通的微调。
- 缺点:
- 分布偏移(Distribution Shift): DPO 通常是离线的(用现成数据集),如果数据集里的回答和模型自己能生成的回答差异很大,效果会变差。
- 上限问题: 许多实验表明,对于极高难度的推理任务(如数学、代码),PPO 这种在线采样探索的方法上限可能比 DPO 更高。
3. GRPO (Group Relative Policy Optimization,组相对策略优化)
核心一句话:PPO 里的 Critic 模型太占显存了,能不能不要它?我们可以通过"一组采样"内部比较来算出优势!
GRPO 是 DeepSeek(深度求索)在 DeepSeek-V3 和 DeepSeek-R1 (Zero) 中大力推崇并使用的技术。它是 PPO 的一种高效变体。
3.1 动机:去掉了 Critic
在 PPO 中,我们需要 Critic (Value Function) 来计算优势函数 (Advantage A t A_t At) :
A t = R e w a r d − V ( s t ) A_t = Reward - V(s_t) At=Reward−V(st)
其中 V ( s t ) V(s_t) V(st) 是 Critic 预测的"基线分数"。Critic 模型通常和 Actor 一样大,这意味着显存加倍。
GRPO 的想法:
不需要训练一个神经网络来预测基线。我们可以对于同一个问题 q q q,让 Actor 生成一组(Group)回答 { o 1 , o 2 , . . . , o G } \{o_1, o_2, ..., o_G\} {o1,o2,...,oG}。
然后,用这组回答的平均奖励作为基线!
3.2 GRPO 的流程
- Group Sampling (组采样): 对于一个 Prompt,模型采样生成 G G G 个不同的输出(比如 G=64)。
- Reward Calculation: 有一个奖励模型(或者基于规则的检查器,比如数学题答案是否正确)给这 64 个输出打分。
- Group Normalization (组内归一化):
计算这组分数的平均值(Mean)和标准差(Std)。
A i = R i − Mean ( R g r o u p ) Std ( R g r o u p ) A_i = \frac{R_i - \text{Mean}(R_{group})}{\text{Std}(R_{group})} Ai=Std(Rgroup)Ri−Mean(Rgroup)- 如果你考了 80 分,但组里平均分是 90,你的优势 A i A_i Ai 就是负的(该被惩罚)。
- 如果你考了 80 分,组里平均分是 60,你的优势 A i A_i Ai 就是正的(该被奖励)。
- PPO Update: 使用这个 A i A_i Ai 代替 PPO 公式里的 Advantage,并结合 PPO 的 Clip 机制来更新模型。并且,GRPO 还在 Loss 中加入了一个 KL 散度项来保持稳定性。
3.3 为什么 GRPO 对 DeepSeek-R1 (Reasoning) 这么重要?
DeepSeek-R1 这种推理模型,强调自我探索(Self-Evolution)。
- 省资源: 去掉 Critic 模型,节省了巨量显存,让模型可以把资源用来生成更长的 Chain-of-Thought (CoT)。
- 适合有明确答案的任务: 在数学和代码任务中,Ground Truth(正确答案)是存在的。通过一次生成几十个解法,GRPO 能极其高效地告诉模型:"这 64 个解法里,那 3 个做对的解法才是你应该学的,其他 61 个即使逻辑通顺但答案错了,也是垃圾。"
- 方差控制: 通过组内平均作为基线,能够非常稳健地降低梯度的方差。
4. 总结:PPO vs DPO vs GRPO
| 特性 | PPO (标准版) | DPO (直接偏好) | GRPO (DeepSeek版) |
|---|---|---|---|
| 全称 | Proximal Policy Optimization | Direct Preference Optimization | Group Relative Policy Optimization |
| 核心机制 | Actor-Critic 架构,限制更新步长 | 无 Critic,数学变换将 RL 转为分类损失 | 去掉 Critic,用组内采样均值做基线 |
| 模型数量 | 4个 (Actor, Critic, Ref, Reward) | 2个 (Actor, Ref) | 2个 (Actor, Ref) + 此时通常仅需轻量级 Reward/Verifier |
| 数据方式 | Online (边生成边训练) | Offline (通常使用预构建数据集) | Online (边生成边训练) |
| 资源消耗 | 极大 | 较小 | 中等 (需要采样生成,但省模型显存) |
| 优势 | 理论上限高,探索能力强 | 简单稳定,训练快,适合对话/风格 | 极大节省显存,适合强逻辑/有明确正误的探索任务 |
| 适用场景 | 通用 RLHF | 聊天机器人、风格对齐 (Chat) | 推理模型 (Reasoning)、数学、代码 (DeepSeek-R1) |
一句话总结演变逻辑:
PPO 是基石 ;为了不练那几个麻烦的模型,人们搞出了 DPO ;为了保留 PPO 在线探索的强大能力但又想省钱省显存,DeepSeek 搞出了 GRPO。