188 lines
7.2 KiB
Markdown
188 lines
7.2 KiB
Markdown
---
|
||
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)和复杂机器人控制的大门密钥。 |