Files
2026-05-16 17:16:51 +08:00

188 lines
7.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 04-PPO-近端策略优化
draft: false
tags:
- PPO
- 近端策略优化
- 强化学习
- 深度强化学习
---
## 1. 核心动机:为什么需要 PPO
在 A2C 等算法中,我们面临一个核心矛盾:
- **步长太大:** 策略更新过猛,导致 $\pi_\theta$ 发生剧烈坍缩,模型直接“练废”,且由于是 On-policy数据无法重复利用崩溃后很难恢复。
- **步长太小:** 训练效率极其低下。
PPO 的目标是:**在允许进行多次梯度下降更新的同时,确保新策略不会偏离旧策略太远。**
---
## 2. 数学基石:重要性采样 (Importance Sampling)
要理解 PPO必须先理解如何利用“旧数据”更新“新策略”。
### 2.1 目标函数的重写
传统的策略梯度目标函数为:
$J(\theta) = \mathbb{E}_{a \sim \pi_\theta} [A^{\pi_{old}}(s, a)]$
如果我们想用旧策略 $\pi_{\theta_{old}}$ 采集的数据来更新当前策略 $\pi_\theta$,根据重要性采样公式 $\mathbb{E}_{x \sim p}[f(x)] = \mathbb{E}_{x \sim q}[\frac{p(x)}{q(x)}f(x)]$,我们可以将目标函数改写为:
$$J(\theta) = \mathbb{E}_{s, a \sim \pi_{\theta_{old}}} \left[ \frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)} A^{\pi_{old}}(s, a) \right]$$
我们令 **概率比值 (Probability Ratio)** 为:
$$r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$$
- 若 $r_t(\theta) > 1$,说明该动作在新策略中概率增加了。
- 若 $r_t(\theta) = 1$,说明新旧策略一致。
---
## 3. PPO 的两种变体
PPO 主要有两种实现方式:**PPO-Penalty** 和 **PPO-Clip**。工业界几乎统一使用后者。
### 3.1 PPO-Clip (截断式)
这是 PPO 的精髓。为了限制 $r_t(\theta)$ 的变化范围,我们定义如下目标函数:
$$L^{CLIP}(\theta) = \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)$$
**数学逻辑拆解:**
1. **第一项 $r_t(\theta) \hat{A}_t$** 标准的重要性采样目标。
2. **第二项 $\text{clip}(\dots)\hat{A}_t$** 将 $r_t(\theta)$ 强制限制在 $[1-\epsilon, 1+\epsilon]$ 之间(通常 $\epsilon=0.2$)。
3. **$\min$ 操作:** 这是一个非常保守的策略。
- **当 $A > 0$(好动作):** 我们希望增加该动作概率,但 $r_t(\theta)$ 最大不能超过 $1+\epsilon$。梯度为 0不再鼓励进一步增加。
- **当 $\hat{A}_t < 0$(坏动作):** 若 $r_t(\theta) < 1-\epsilon$clip 将比值拉回 $1-\epsilon$,此时 $\min = r_t(\theta) \hat{A}_t$(两者皆为负,但 $r_t$ 更接近 1同样限制对坏动作的过度惩罚。
**核心意义:** 无论优势多大或多小,单次更新对策略的改变都被限制在一个“信任区域”内,极大地保证了稳定性。
---
## 4. 完整的 PPO 损失函数
在实际代码实现中PPO 通常采用 Actor-Critic 架构,总损失函数包含三部分:
$$L_{t}^{PPO}(\theta, \phi) = \mathbb{E}_t [ L_t^{CLIP}(\theta) - c_1 L_t^{VF}(\phi) + c_2 S[\pi_\theta](s_t) ]$$
1. **$L^{CLIP}(\theta)$** 上文提到的 Actor 裁剪损失。
2. **$L_t^{VF}(\phi)$** Critic 的价值损失(均方误差),$L_t^{VF} = (V_\phi(s_t) - V_t^{target})^2$。
3. **$S[\pi_\theta]$** 策略熵Entropy鼓励探索防止过早收敛到局部最优。
---
## 5. 训练过程 (Algorithmic Flow)
1. 初始化 Actor 参数 $\theta$ 和 Critic 参数 $\phi$。
2. **对于每一次迭代 (Iteration)**
- **采样:** 使用当前策略 $\pi_\theta$ 在环境中运行 $T$ 个步长,收集集合 $\{s_t, a_t, r_t, \pi_\theta(a_t|s_t)\}$。
- **优势估计:** 计算每个时刻的优势 $\hat{A}_t$。通常使用 **GAE (Generalized Advantage Estimation)**
- **更新旧策略:** 令 $\theta_{old} \leftarrow \theta$。
- **内部优化循环 (K 个 Epoch)**
- 从采样的数据中随机抽取 Mini-batch。
- 计算当前新策略与旧策略的比值 $r_t(\theta)$。
- 计算 $L^{CLIP}$、价值损失和熵。
- 通过 Adam 等优化器同时更新 $\theta$ 和 $\phi$。
- 重复上述循环,直到满足停止条件。
---
## 6. GAE (广义优势估计) —— PPO 的黄金搭档
PPO 几乎总是配合 GAE 使用,其公式如下:
$$\hat{A}_t^{GAE}(\gamma, \lambda) = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l} = \delta_t + \gamma \lambda \delta_{t+1} + (\gamma \lambda)^2 \delta_{t+2} + \cdots$$
其中 $\delta_i = r_i + \gamma V_\phi(s_{i+1}) - V_\phi(s_i)$ 是 TD 误差。
### 6.1 推导与截断理解
注意这是一个无穷级数,但实际实现时会在 horizons $T$ 处截断:
$$\hat{A}_t^{GAE} = \delta_t + \gamma \lambda \delta_{t+1} + \cdots + (\gamma \lambda)^{T-t-1} \delta_{T-1}$$
或者等价地使用递归形式(更常见于代码实现):
$$\hat{A}_t^{GAE} = \delta_t + \gamma \lambda \hat{A}_{t+1}^{GAE}$$
### 6.2 $\lambda$ 参数的物理意义
| $\lambda$ 值 | 等价于 | 偏差-方差权衡 |
|--------------|--------|--------------|
| $\lambda = 0$ | 1-step TD 误差:$\hat{A}_t = \delta_t$ | 高偏差,低方差(估计最保守) |
| $\lambda = 1$ | Monte Carlo$\hat{A}_t = \sum_{l=0}^{T-t} \gamma^l r_{t+l} - V(s_t)$ | 零偏差,高方差(无偏但震荡大) |
| $\lambda \in (0,1)$ | 有限步 bootstrapping | 平衡偏差与方差 |
**直觉:** $\lambda$ 就像是"看多远"的调节器。$\lambda = 0.99$ 意味着你愿意综合很多步的 TD 误差(看得远),但每一步都有 $\gamma \lambda \approx 0.99 \times 0.99 \approx 0.98$ 的折扣,防止远处噪声主导。
**实践中:** $\lambda \in [0.9, 0.99]$ 是最常用范围,配合 $\gamma \in [0.95, 0.99]$ 使用。
---
## 7. 可能出现的问题与调试建议
### 7.1 KL 散度爆炸
尽管有 Clip 机制,如果学习率过高,新旧策略的 KL 散度依然可能激增。
- **现象:** 平均奖励突然掉零Entropy 迅速下降。
- **对策:** 减小学习率PPO 对 LR 依然敏感,通常在 $3 \times 10^{-4}$ 左右);增加 $\epsilon$ 的限制。
### 7.2 价值函数无法收敛
Critic 无法准确预估 $V(s)$。
- **现象:** 价值损失Value Loss居高不下。
- **对策:** 对奖励进行缩放Reward Scaling或者对 Observation 进行归一化Normalization
### 7.3 过早失去探索欲望
- **现象:** 智能体总是执行同一个动作,不再尝试新可能。
- **对策:** 增加熵系数 $c_2$。
---
## 8. 总结:从 DQN 到 PPO 的进化
|**算法**|**核心思想**|**解决的问题**|
|---|---|---|
|**DQN**|神经网络拟合 Q 表|处理高维连续状态空间|
|**A2C**|引入优势函数 A = Q - V|降低策略梯度的方差|
|**A3C**|异步并行采样|加快训练速度,打破样本相关性|
|**PPO**|**近端截断 (Clip)**|**解决训练稳定性与步长敏感问题**|
PPO 成功地将强化学习从一种“黑艺术”变成了一项可靠的工程技术。理解了 PPO你就掌握了通往大模型对齐Alignment和复杂机器人控制的大门密钥。