摘要
本文系统讲解深度强化学习的进阶算法:深入解析策略梯度(Policy Gradient)方法(REINFORCE);详解Actor-Critic 框架的结构与优势;剖析Advantage函数Generalized Advantage Estimation(GAE)的方差-偏差权衡;重点讲解近端策略优化(PPO)算法的Clip版本原理与实现。结合Stable Baselines3库,实战PPOPong等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 算法流程

  1. 用当前策略 π_θ 收集一批数据。
  2. 计算Advantage A_t(如GAE)。
  3. 多次更新策略网络:
    • 计算比率 r_t(θ)
    • 计算裁剪目标 L^{CLIP}
    • 梯度上升优化 L^{CLIP}
  4. 更新 π_θ_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训练。

📌 学习建议

  1. 理解核心思想:PPO的“裁剪”是稳定性的关键。
  2. 掌握GAE:它是高效Advantage估计的标配。
  3. 使用SB3:它是RL研究与应用的利器。
  4. 调参实践clip_range, ent_coef, gae_lambda 对性能影响大。
  5. 扩展学习:A2C, ACKTR, SAC(用于连续控制)。

九、下一篇文章预告

第30篇:机器人学习:从仿真到真实(Sim2Real)
我们将深入讲解:

  • 机器人学习的挑战(安全、成本、样本效率)
  • 仿真环境(PyBullet, MuJoCo, Isaac Gym)
  • 域随机化(Domain Randomization)提升泛化
  • 模仿学习(Imitation Learning)与行为克隆(Behavior Cloning)
  • 强化学习在机器人控制中的应用
  • Sim2Real 的迁移方法与案例(如机械臂抓取)

进入“物理世界”的AI挑战!


参考文献

  1. Schulman, J. et al. (2017). Proximal Policy Optimization Algorithms. arXiv (PPO).
  2. Schulman, J. et al. (2015). High-Dimensional Continuous Control Using Generalized Advantage Estimation. ICLR (GAE).
  3. Williams, R.J. (1992). Simple statistical gradient-following algorithms for connectionist reinforcement learning. ML (REINFORCE).
  4. Stable Baselines3: https://stable-baselines3.readthedocs.io/
  5. OpenAI Spinning Up: https://spinningup.openai.com/

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐