第29篇:深度强化学习进阶:从DQN到PPO
·
摘要:
本文系统讲解深度强化学习的进阶算法:深入解析策略梯度(Policy Gradient)方法(REINFORCE);详解Actor-Critic 框架的结构与优势;剖析Advantage函数与Generalized Advantage Estimation(GAE)的方差-偏差权衡;重点讲解近端策略优化(PPO)算法的Clip版本原理与实现。结合Stable Baselines3库,实战PPO在Pong等Atari游戏上的应用。帮助学习者掌握现代深度强化学习的核心算法,理解从价值函数到策略优化的演进路径。
一、从价值函数到策略优化
- DQN:基于价值(Value-Based),学习
Q(s,a),间接得到策略。 - 局限:
- 难处理连续动作空间。
- 策略是确定性的(
argmax),缺乏随机性。
- 策略梯度(Policy Gradient):直接优化策略
π(a|s; θ),适用于连续动作与随机策略。
二、策略梯度基础:REINFORCE算法
2.1 目标函数
最大化期望累积奖励:
J(θ) = E_π [ Σ_t r_t ]
2.2 策略梯度定理
∇_θ J(θ) = E_π [ Σ_t ∇_θ log π(a_t|s_t; θ) * G_t ]
G_t:从时间t开始的累积奖励。∇_θ log π(a_t|s_t; θ):策略的得分函数(Score Function)。
✅ 梯度方向:增加高回报轨迹的概率。
2.3 REINFORCE 算法流程
for episode in episodes:
s = env.reset()
trajectory = []
# 生成完整轨迹
while not done:
a = sample_action(π(s; θ)) # 随机策略
s', r, done, _ = env.step(a)
trajectory.append((s, a, r))
s = s'
# 计算G_t并更新
for t, (s_t, a_t, _) in enumerate(trajectory):
G_t = compute_return(t, trajectory)
∇ = log_prob(a_t|s_t; θ) * G_t
θ ← θ + α ∇
2.4 REINFORCE 的问题
- ❌ 高方差:
G_t估计不稳定,训练波动大。 - ❌ 低效率:需完整轨迹,延迟更新。
- ❌ 收敛慢。
三、Actor-Critic:结合价值与策略
3.1 核心思想
- Actor:策略网络
π(a|s; θ),负责决策。 - Critic:价值网络
V(s; w),评估状态价值,提供基线(Baseline)。
✅ 用
V(s_t)代替G_t,降低方差。
3.2 Advantage 函数
- 定义:
A(s,a) = Q(s,a) - V(s) - 意义:动作
a相对于平均表现的“优势”。 - 更新:
∇_θ J(θ) ≈ E_π [ Σ_t ∇_θ log π(a_t|s_t; θ) * A(s_t, a_t) ]
✅ 只有优于平均的动作才被鼓励。
3.3 算法流程(简版)
初始化 Actor θ, Critic w
for episode:
s = env.reset()
while not done:
a = π(s; θ) # 或采样
s', r, done, _ = env.step(a)
# Critic 更新:最小化 TD 误差
target = r + γ V(s'; w)
loss_v = (V(s; w) - target)^2
w ← w - β ∇_w loss_v
# Actor 更新:使用 Advantage
A = target - V(s; w) # TD Advantage
∇_θ = ∇_θ log π(a|s; θ) * A
θ ← θ + α ∇_θ
s = s'
四、Generalized Advantage Estimation(GAE)
4.1 问题:TD Advantage vs. MC Return
- TD Advantage (
r + γV(s') - V(s)):低方差,高偏差。 - MC Advantage (
G_t - V(s)):低偏差,高方差。
4.2 GAE:加权平均
A^{GAE}(s_t) = Σ_k (γλ)^k δ_{t+k}
δ_t = r_t + γV(s_{t+1}) - V(s_t):TD误差。λ ∈ [0,1]:权衡参数。λ=0:等价于TD(0)。λ=1:等价于MC。
✅ 平衡方差与偏差,稳定训练。
五、近端策略优化(PPO):当前主流算法
PPO(2017)由OpenAI提出,是目前最稳定、高效的策略梯度算法之一。
5.1 核心思想
- 目标:在保证性能提升的同时,限制策略更新的幅度。
- 方法:使用裁剪(Clipping)或KL散度惩罚。
5.2 PPO-Clip 算法详解
5.2.1 比率(Ratio)
定义新旧策略的概率比:
r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)
5.2.2 裁剪目标函数
L^{CLIP}(θ) = E_t [ min( r_t(θ) A_t, clip(r_t(θ), 1-ε, 1+ε) A_t ) ]
ε:裁剪范围(如0.2)。A_t:Advantage(通常用GAE计算)。
✅ 如果
r_t(θ)在[1-ε, 1+ε]内,使用裁剪后的值,防止大更新。
5.3 算法流程
- 用当前策略
π_θ收集一批数据。 - 计算Advantage
A_t(如GAE)。 - 多次更新策略网络:
- 计算比率
r_t(θ)。 - 计算裁剪目标
L^{CLIP}。 - 梯度上升优化
L^{CLIP}。
- 计算比率
- 更新
π_θ_old ← π_θ。
✅ “多次小步更新” + “裁剪” = 稳定高效。
六、实战:使用Stable Baselines3实现PPO
6.1 环境准备
pip install stable-baselines3[extra] gymnasium[atari] torch
stable-baselines3 是RL的高效实现库。
6.2 训练PPO玩Pong
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_atari_env
from stable_baselines3.common.vec_env import VecFrameStack
# 创建向量化环境(支持多进程)
env = make_atari_env('PongNoFrameskip-v4', n_envs=4, seed=0)
# 堆叠帧(4帧)以捕捉运动信息
env = VecFrameStack(env, n_stack=4)
# 创建PPO模型
model = PPO(
"CnnPolicy", # 使用CNN处理图像
env,
verbose=1,
tensorboard_log="./ppo_pong_tensorboard/",
device="cuda" if torch.cuda.is_available() else "cpu"
)
# 训练
model.learn(total_timesteps=1_000_000, tb_log_name="PPO_Pong")
# 保存模型
model.save("ppo_pong")
6.3 模型推理
# 加载模型
model = PPO.load("ppo_pong")
# 测试
obs = env.reset()
for _ in range(1000):
action, _states = model.predict(obs)
obs, rewards, dones, info = env.step(action)
env.render() # 显示
✅ 经过训练,智能体能击败简单AI。
6.4 关键参数说明
| 参数 | 说明 |
|---|---|
n_steps |
每次收集的步数 |
batch_size |
更新时的批量大小 |
n_epochs |
每批数据的更新轮数 |
gamma |
折扣因子 |
gae_lambda |
GAE的λ参数 |
clip_range |
PPO裁剪范围 |
ent_coef |
熵正则化系数,鼓励探索 |
七、PPO vs DQN:核心差异
| 特性 | DQN | PPO |
|---|---|---|
| 方法 | 基于价值 | 基于策略 |
| 策略 | 确定性 | 随机性 |
| 动作空间 | 离散 | 离散 & 连续 |
| 更新方式 | 经验回放 + 目标网络 | 多步小批量更新 |
| 稳定性 | 中等 | 高 |
| 样本效率 | 高 | 中等 |
✅ PPO更适合复杂、高维、连续控制任务。
八、总结与学习建议
本文我们:
- 理解了策略梯度(REINFORCE)的原理与局限;
- 掌握了Actor-Critic框架与Advantage函数;
- 学习了GAE的方差-偏差权衡;
- 深入剖析了PPO-Clip的裁剪机制;
- 实战了Stable Baselines3的PPO训练。
📌 学习建议:
- 理解核心思想:PPO的“裁剪”是稳定性的关键。
- 掌握GAE:它是高效Advantage估计的标配。
- 使用SB3:它是RL研究与应用的利器。
- 调参实践:
clip_range,ent_coef,gae_lambda对性能影响大。- 扩展学习:A2C, ACKTR, SAC(用于连续控制)。
九、下一篇文章预告
第30篇:机器人学习:从仿真到真实(Sim2Real)
我们将深入讲解:
- 机器人学习的挑战(安全、成本、样本效率)
- 仿真环境(PyBullet, MuJoCo, Isaac Gym)
- 域随机化(Domain Randomization)提升泛化
- 模仿学习(Imitation Learning)与行为克隆(Behavior Cloning)
- 强化学习在机器人控制中的应用
- Sim2Real 的迁移方法与案例(如机械臂抓取)
进入“物理世界”的AI挑战!
参考文献
- Schulman, J. et al. (2017). Proximal Policy Optimization Algorithms. arXiv (PPO).
- Schulman, J. et al. (2015). High-Dimensional Continuous Control Using Generalized Advantage Estimation. ICLR (GAE).
- Williams, R.J. (1992). Simple statistical gradient-following algorithms for connectionist reinforcement learning. ML (REINFORCE).
- Stable Baselines3: https://stable-baselines3.readthedocs.io/
- OpenAI Spinning Up: https://spinningup.openai.com/
更多推荐
所有评论(0)