强化学习 — PPO策略优化算法

1.PPO 算法概述

1.PPO 的提出背景

我们还是以智能体如何控制飞船落地的小游戏为例,智能体的目标是通过一系列操作(如向左移动或向右移动)实现平稳着陆。在训练初期,智能体并不知道应该如何操作,它需要通过反复的试探操作,从环境中不断获得反馈并调整策略,最终掌握一套“高奖励”操作方式。


虽然游戏过程在视觉上看起来非常快速,但实际上每一步都包含了大量计算与判断,比如,当前所处位置(状态);当前可执行的动作;作执行后的环境反馈;下一步动作的选择。

1.策略优化

这些操作正是强化学习(Reinforcement Learning, RL)中策略优化需要解决的问题,即通过训练不断调整策略参数,使得智能体在与环境交互中获得的长期累积奖励最大化
策略优化的基本流程:

  1. 初始化策略 $πθ$
  2. 与环境交互,收集轨迹(状态-动作-奖励序列)
  3. 评估当前策略的表现(如回报或优势值)
  4. 根据表现更新策略参数 $θ$
  5. 重复步骤 2~4,直到收敛

2.常见的策略优化方法

方法 简介 问题
REINFORCE (Policy Gradient, 1992) 最基本的策略梯度算法,通过采样轨迹直接优化策略期望收益 高方差、收敛慢
Actor-Critic (A2C/A3C) 使用一个 Critic 网络评估当前策略,减少 REINFORCE 的方差 依然可能导致策略不稳定、易陷入局部最优
Trust Region Policy Optimization (TRPO) (2015) 引入信赖域约束,通过限制新旧策略 KL 散度,稳定策略更新 数学推导复杂,实际实现困难,约束不易控制
PPO (2017) 使用剪切目标函数(clip objective)近似信赖域,保持 TRPO 的稳定性优势,同时实现更简单高效的更新


TRPO(Trust Region Policy Optimization) 是第一个明确提出“策略更新不能太大”的强化学习方法。它通过约束策略之间的 KL 散度来控制新旧策略之间的距离,使训练更稳定。但还有如下问题:

  • 需要进行二阶优化(如共轭梯度法)计算 Fisher 信息矩阵,复杂且效率低。
  • 实际应用中,不容易调节 KL 散度阈值,易导致过拟合或崩溃。

PPO(Proximal Policy Optimization) 正是为了解决 TRPO 的工程复杂性和策略优化的稳定性问题而提出的,目标是在保持 TRPO 稳定性的同时简化实现和提高效率。即可以不断试探 —— 收集经验 —— 调整策略,让策略更可能选择“能拿高奖励的动作”。

2.强化学习中的基本要素

1.原始五要素

要理解 PPO 首先还要再熟悉一下强化学习框架中的五个基本要素,这源自经典马尔可夫决策过程(MDP)的定义,它们一起共同组成了基本强化学习交互系统

  1. 智能体(Agent):决策者。负责观察环境状态,基于当前策略选择动作。在 PPO 中,智能体由一个策略网络(通常是神经网络)表示,通过优化它的参数 $θ$ 来提升表现。
  2. 环境(Environment):智能体所处的世界,它接收智能体的动作,并返回新的状态和奖励。在 PPO 中,环境通常由 Gym 或 Unity ML 等平台提供。
    作用
    • 根据动作决定下一状态 $s_{t+1}$
    • 给出即时奖励 $r_t$
    • 判断是否结束一轮游戏(done)
  3. 状态(State, $s_t$):环境在某一时刻的观察值。它反映了当前的环境信息。在 PPO 中,状态作为策略网络的输入,用来决定当前应采取的动作。
    举例
    • 棋盘的当前布局
    • 游戏中小人的位置、速度、血量
    • 自动驾驶中摄像头或雷达的观测数据
  4. 动作(Action, $a_t$):智能体在状态 $s_t$ 下可以选择的行为。在 PPO 中,策略网络输出的是一个概率分布 $\pi_\theta(a|s)$,训练中通过采样 $a_t \sim \pi_\theta(\cdot|s_t)$决定行为,动作影响后续状态与奖励,因此是优化的核心变量。
    两种类型
    • 离散动作:如“向左/右移动”、“跳跃”
    • 连续动作:如“车速 = 0.8”,“关节角度 = 35°”
  5. 奖励(Reward, $r_t$):环境对智能体行为的反馈。奖励的累积值衡量策略的好坏。在 PPO 中,奖励用来估计“优势函数” $A_t$,决定某个动作比平均行为好多少,从而更新策略。
    举例
    • 玩游戏得分 +1
    • 棋局胜利奖励 +10
    • 撞墙或掉入坑中给予负奖励 -1

2.算法增强要素

在实际强化学习算法(如 PPO)中,会引入两个额外要素策略回报与价值函数),用来辅助或实现优化目标,这两个是算法层面引入的学习结构,在现代 RL 中非常关键,尤其是在 PPO、A2C 等基于策略梯度的方法中。

  1. 策略(Policy, $\pi(a|s)$):智能体选择动作的行为准则。可能是确定性的,也可能是概率性的。在 PPO 中,策略是可微的神经网络:$\pi_\theta(a|s)$。PPO 的目标是通过“剪切目标函数”更新策略,使其选择更优动作但又不剧烈偏移
  2. 回报与价值函数(Return,$R_t$; Value Function):回报 $R_t$,从时刻 t 开始未来累计奖励(可折扣),价值函数,某个动作相比平均行为好多少。在 PPO 中,价值函数用于构造优化目标,一般会结合 GAE(Generalized Advantage Estimation)进行平滑估计。

3.交互流程

状态 $s_t$ → 策略 $πθ$ → 采样动作 $a_t$ → 交互环境 → 得到 $r_t$ 和 $s_{t+1}$ → 存储轨迹 → 策略更新

强化学习的核心是一个智能体根据策略与环境互动,在状态下选择动作、获得奖励,并用这些经验不断优化策略。而PPO 等策略优化算法正是这种优化过程中的关键方法。

3.PPO 的核心任务与设计理念

1.核心任务

PPO 属于策略优化类强化学习算法,其核心任务是:在智能体与环境的交互中,通过采样获得的经验轨迹,不断更新策略函数 πθ,使其输出更优的动作选择概率分布,从而最大化长期累积奖励。
这意味着 PPO 的目标是实现:

  • 策略更新要有方向感 → 即优化方向要对
  • 策略更新不能太激进 → 防止训练发散或性能崩塌
  • 策略更新还要高效 → 能在大规模神经网络下快速迭代

2.设计理念

PPO 的提出,是对早期策略梯度方法的一系列关键性改进与简化。它的设计理念可以归结为以下三点:

1.稳定策略更新:不要走太远

在早期策略优化中(如 REINFORCE、A2C),策略每次更新都可能偏离旧策略太远,导致性能不稳定或策略崩溃。
PPO 的理念:学习应该“靠近旧策略附近”,防止策略剧烈变化。这是对 TRPO “信赖域”思想的继承。

  • PPO 不使用复杂的二阶优化和 KL 约束
  • 而是引入 Clip 策略比值函数,控制策略更新的幅度

核心思想:限制策略比值的范围 $r_t = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}$ 不要偏离 1 太多

2.设计剪切目标函数:软约束代替硬约束

PPO 用如下的目标函数来近似信赖域的思想:
$$L^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min\left(r_t(\theta) \hat{A}_t,; \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \cdot \hat{A}_t\right) \right]$$
其中:

  • $r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}$:其中$\pi_\theta(a_t|s_t)$ 表示当前的新策略概率。 其中$\pi_{\theta_{old}}(a_t|s_t)$ 表示旧策略的概率(用来收集数据)。整体表示随着策略参数$\theta$的改变,新策略选这个动作的概率,相比旧策略高了多少,如果 $r_t$ = 1.2,新策略更偏爱这个动作,如果 $r_t$ = 0.7,新策略则不喜欢这个动作
  • $\hat{A}_t$:优势函数(动作好坏的估计),表示这个动作比平均水平好多少;$\hat{A}_t$ > 0:这是一个“好动作”,我们希望新策略更倾向它。$\hat{A}_t$ < 0:这是“坏动作”,我们希望新策略更少选它
  • $\epsilon$:限制更新幅度的一小常数,通常设为 0.1 或 0.2
  • $\text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon)$:如果 $r_t(\theta)$ 落在 $[1 - \epsilon, 1 + \epsilon]$,就不变;如果超过了,就限制到边界上;这就像给更新加了“保险绳”,不要一次跳太远,比如新策略一下把概率提高太多,反而不稳定
  • $\min\left( r_t(\theta)\hat{A}_t,\ \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \cdot \hat{A}_t \right)$ 表达的是一个 保守策略:如果没有超过边界,我们就正常优化;如果超过边界,我们就用“剪切后的版本”替代;哪个小用哪个,从而防止策略过度更新

举个简单例子,假设,优势函数 $\hat{A}_t$ = 5,旧策略选某动作概率是 0.2,新策略更新后变成 0.4,那么$r_t$ = 0.4 / 0.2 = 2.0,设置 $\epsilon$ = 0.2,则 clip 后为 1.2,计算得到:$min(2.05, 1.25)$ = 6。

当策略改变幅度适中时按正常梯度优化;当策略改变太大(超出剪切阈值)时抑制过度优化,截断回报。这就是 PPO 名称中 “Proximal”(邻近)的含义:策略的变化始终控制在邻近区域,防止训练不稳定。

3.简洁实用:适配现代深度学习系统

PPO 在设计上强调“工程上好用”,这也是它能在工业界广泛落地的关键:

对比项 TRPO PPO
使用的优化器 共轭梯度法(二阶优化) 任意一阶优化器(Adam 等)
是否需要 KL 约束 是,显式添加 KL 散度限制 否,使用剪切函数近似控制
代码复杂度 高,难以调参 低,容易调试
样本效率 较高
稳定性 稳定且高效

PPO 被称为“TRPO 的近似简化版”,但其实际表现往往与甚至超过 TRPO。

4.PPO 的整体目标函数

PPO 的实际损失函数通常包括三项:
$$L^{\text{PPO}}(\theta) = \mathbb{E}_t \left[ L^{\text{CLIP}}_t(\theta) - c_1 \cdot \text{VF Loss}_t + c_2 \cdot \text{Entropy Bonus}_t \right]$$

  • $L^{\text{CLIP}}_t(\theta)$:剪切后的策略优化目标(核心)
  • $VF Loss$:值函数损失(用于训练 Critic)
  • $Entropy Bonus$:鼓励策略的探索性(增加随机性)

这体现了 PPO 的三个核心关注点:

  1. 优化策略但别太过火
  2. 训练 Critic 提高估值准确性
  3. 鼓励探索避免陷入局部最优

PPO 的核心任务是稳定高效地优化策略函数,其设计理念是在保持性能提升的同时,通过“剪切目标函数”防止策略剧烈变化,从而实现训练过程中的稳健性、可控性与实用性。

2.PPO 策略网络与环境交互

在 PPO算法中,策略网络的核心任务是通过与环境的持续交互,从状态中提取信息,采样动作,并依据经验数据不断优化策略。下面我们围绕“智能体如何感知、决策与收集经验”这条主线,分三部分:

1.状态、动作与策略网络建模

策略优化的前提是智能体必须能够准确理解当前所处的状态,并基于状态做出合理的动作决策。下面说说在 PPO 中,如何建模状态、动作以及策略网络,构建整个感知——决策链路。

1.状态空间(State Space)

状态是智能体感知环境的输入,是决策的基础。在不同的任务中,状态可以是:

任务类型 状态示例
经典控制 位置、速度、角度等数值数组(如 CartPole 的 4 维向量)
棋类游戏 当前棋盘的二维数组或编码
图像输入 原始像素矩阵(如 RGB 图像)
自定义环境 环境描述符、特征向量、传感器数据等

在 PPO 中,我们通常将状态 $s$ 作为一个固定维度的向量输入策略网络,以便网络进行前向传播和策略输出。

2.动作空间(Action Space)

动作定义了智能体可以对环境采取的行为,其建模方式取决于环境类型:

1. 离散动作空间(Discrete)
  • 例如:飞船落地case中动作只有两个(左或右)
  • PPO 中策略网络最后输出一组 softmax 概率分布,对所有可能动作进行建模
  • 示例输出:$\pi_\theta(a|s)$ = [0.4, 0.6],表示选择动作 1 的概率为 60%
2.连续动作空间(Continuous)
  • 例如:机器人控制中的加速度、关节角度等
  • PPO 中策略网络不直接输出动作,而是输出动作分布的参数
    • 常见方式是:输出一个均值向量 μ 和对数标准差 logσ
    • 动作从该分布中采样:$a \sim \mathcal{N}(\mu, \sigma)$
  • 这种设计允许策略保持随机性,且便于求导

3.策略网络建模(Policy Network)

策略网络是 PPO 的核心部分,它是一个参数化函数 $\pi_\theta(a|s)$,用于对给定状态生成动作概率分布。

PPO 中策略网络常用结构如下:

类型 结构示意 应用场景
MLP(多层感知机) state → Linear → ReLU → Linear → Softmax 状态为向量型任务,如控制类环境
CNN(卷积网络) image → Conv → Pool → Flatten → Linear → Softmax 状态为图像,如 Atari 游戏
Actor-Critic 共用前缀 shared → actor head / critic head 提高参数共享与训练效率

PPO 通常采用 Actor-Critic 框架,即:

  • Actor 网络:策略网络 $\pi_\theta$,主要是根据当前状态 s 生成动作 a 的概率分布
  • Critic 网络:值函数估计器 $V_\phi(s)$,用于估计当前状态的“好坏”,即预期的累计回报

有时两者共享前几层网络,只在最后分出两个输出头(Head),分别输出动作分布参数与状态值。

4.模型建模的关键要点

模块 建模技巧
输入归一化 状态输入需归一化到相似尺度(如 [0, 1] 或 [-1, 1])以稳定训练
输出处理 离散动作需加 softmax,连续动作需生成正态分布参数
初始化 用适当权重初始化策略输出层(如小权重、防止初期策略过于确定)
探索性 PPO 天然支持随机策略,但也可在输出中控制熵(entropy)来增强探索

5.总结

PPO 中策略建模的三大核心:

  1. 状态建模:将环境状态编码为数值向量,作为策略网络输入
  2. 动作建模:依据任务类型,输出动作概率分布或动作分布参数
  3. 策略网络结构:采用深度神经网络建模 $\pi_\theta$,支持高维输入与复杂策略表达

通过这套建模体系,PPO 的智能体才能在环境中感知状态、做出行动,并基于经验不断优化策略,实现强化学习的核心目标。

2.游戏生命周期与轨迹采样

在强化学习中,智能体的学习是建立在与环境反复交互所产生的“经验轨迹”之上的。下面介绍下PPO 中一个 episode(游戏生命周期)的全过程,以及如何通过与环境交互采样轨迹数据用于策略优化的。

1.游戏生命周期(Episode Lifecycle)

在 PPO 中,每一次与环境完整交互的过程称为一个 episode,也可以理解为一局“游戏”。每一局游戏的生命周期如下:

1
2
3
4
5
6
7
8
9
10
11
初始化环境

得到初始状态 s₀

循环:
根据策略 πθ(s_t) 采样动作 a_t
环境执行动作,返回奖励 r_t 和新状态 s_{t+1}
存储 (s_t, a_t, r_t, s_{t+1}, done)
如果 done=True,终止 episode

一轮结束

这一过程体现了 RL 的核心闭环:状态 → 动作 → 奖励 + 新状态 → 再决策

2.轨迹与经验采样

PPO 是一种on-policy 策略梯度算法,它依赖于当前策略下采样的真实轨迹数据进行优化。因此,轨迹采样的质量直接影响训练效果。

1.什么是轨迹(Trajectory)?

轨迹 τ​表示智能体与环境的一次完整交互序列,包含状态、动作、奖励三元组,一条轨迹通常表示为:$\tau = { (s_0, a_0, r_0), (s_1, a_1, r_1), \dots, (s_T, a_T, r_T)}$
如果策略是随机的,轨迹本质上是从策略分布中采样得到的一条路径:$\tau \sim \pi_\theta$
概念:

  • 初始 (s0​,a0​,r0​)​​:由环境初始化,策略选择第一个动作,环境返回第一个奖励
  • 终止 (sT​,aT​,rT​):最后一个有效状态,可能影响最终奖励,之后环境终止

轨迹是强化学习的核心数据单元,其质量直接影响训练效果。PPO 等 on-policy 算法尤其依赖当前策略采样的新鲜轨迹进行优化。

2.PPO 中采样轨迹的目的

采样轨迹(Trajectories)的核心目的是为策略优化提供真实交互数据,确保策略更新的稳定性高效性
采样的轨迹数据用于以下关键计算:

  • 优势函数 $\hat{A}_t$ :动作好坏的估计。动作的惊喜程度(实际分 vs 预期分)
  • 目标值函数 $\hat{V}_t$ 或 $R_t$:$\hat{V}_t$预测当前状态$st$​的未来总得分期望值(预测),$R_t$实际从$st$​开始到结束的真实总得分(真实结果)。预期分 vs 真实分
  • 策略旧概率 $\pi_{\theta_{\text{old}}}(a_t|s_t)$,用于构造剪切比值,记录更新策略前,在$st$​状态下选择$at$​的原始概率。更新策略时的”安全带”,防止AI瞎改
3.轨迹采样中的细节设计

在 PPO 中,为了增强训练稳定性和样本利用效率,轨迹采样有以下几个常见设计点:

  • 多环境并行采样:使用多个环境实例(如 vectorized Gym)同时生成轨迹,提高样本效率
  • 固定步长而非固定局数:PPO 通常采样固定步数(如 2048 步),不管中间 episode 是否终止
  • 状态标准化:对状态输入进行归一化处理,保持数值稳定
  • 记录旧策略概率:每一步记录旧策略下的动作概率,用于后续剪切目标计算
  • 缓存格式:使用 RolloutBuffer 等结构缓存状态、动作、奖励、done、log_prob、value 等信息

智能体通过当前策略网络与环境反复交互,采样轨迹;利用采样数据估计策略梯度与值函数误差;进而优化策略网络,实现强化学习闭环。

3.数据采集流程与交互代码示例

在 PPO 中,数据采集是策略优化的第一步。通过策略网络与环境的交互,采集大量高质量的状态-动作-奖励轨迹,是后续学习曲线收敛的关键。

一个完整的数据采样流程,通常包括以下核心步骤:

  1. 初始化环境与策略网络
  2. 在当前策略下循环交互:
    • 根据状态 $s_t$,用策略网络输出动作 $a_t$
    • 用该动作与环境交互,获得 $r_t$, $s_{t+1}$, done
    • 将交互信息缓存至采样缓冲区
  3. 重复以上过程直到采样足够时间步(如 2048)
  4. 结束本轮采样,开始策略优化阶段

1.采样结构设计:Rollout Buffer

为了高效组织采样的数据,我们通常使用一个数据结构 —— Rollout Buffer,用于存储每一轮采样的经验。
典型缓存字段包括:

  • states:状态序列
  • actions:动作序列
  • rewards:即时奖励
  • dones:是否终止标志
  • log_probs:旧策略的动作概率(用于 Clip 比值)
  • values:值函数预测(用于计算优势)
  • next_states(可选):用于 TD 估计

2.PyTorch + Gym 环境下的数据采样代码示例

以下是一个简化的 PPO 数据采样代码流程,支持离散动作环境(如 CartPole):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class RolloutBuffer:
def __init__(self):
self.clear()

def clear(self):
self.states, self.actions, self.rewards = [], [], []
self.dones, self.log_probs, self.values = [], [], []

def add(self, state, action, reward, done, log_prob, value):
self.states.append(state)
self.actions.append(action)
self.rewards.append(reward)
self.dones.append(done)
self.log_probs.append(log_prob)
self.values.append(value)

策略与环境交互采样过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def collect_trajectories(env, policy, buffer, rollout_steps):
state = env.reset()
for _ in range(rollout_steps):
state_tensor = torch.FloatTensor(state).unsqueeze(0)

# 策略网络输出动作分布
dist, value = policy(state_tensor)
action = dist.sample()
log_prob = dist.log_prob(action)

# 与环境交互
next_state, reward, done, _ = env.step(action.item())

# 存储经验
buffer.add(state, action.item(), reward, done, log_prob.item(), value.item())

# 状态更新
state = next_state if not done else env.reset()

3.一些细节

点位 描述
保持策略随机性 必须使用 sample() 而非 argmax,以保证策略梯度的可导性
记录 log_prob 是 PPO 中 $r_t = π_θ(a_t)$
环境重置 遇到 done=True 时应立即 env.reset(),否则状态将失效
状态归一化(可选) 统一状态维度、缩放数值区间,提高训练稳定性
采样步数设定 PPO 通常使用固定步数采样(如 2048)而非固定局数

3.PPO 的优化目标与策略梯度

在强化学习中,智能体的学习核心是策略优化,而策略优化的本质就是不断提升策略网络参数,使其在与环境的交互中获得更高的长期回报。本章将系统梳理强化学习中的优化目标,以及如何通过策略梯度方法实现对策略的可导性学习

1.强化学习的目标函数定义

在RL中,智能体的目标并不是像监督学习那样最小化某个损失函数,而是最大化从环境中获得的长期累计奖励。下面将从基本原理出发,系统地推导并解释强化学习中策略优化的目标函数形式。

1.策略优化的本质目标

强化学习中的策略由一个参数化的函数 $\pi_\theta(a|s)$ 表示,它给定当前状态 $s$ 时输出动作 $a$ 的概率分布。我们希望学习一组参数 $\theta$,使得该策略在环境中表现得尽可能好。

强化学习的优化目标是 最大化期望回报(Expected Return):
$$J(\theta) = \mathbb{E}{\tau \sim \pi\theta} \left[ \sum_{t=0}^{T} \gamma^t r_t \right]$$
其中:

  • $\theta$:策略网络的参数
  • $\tau = (s_0, a_0, r_0, s_1, \dots)$:表示一条轨迹 trajectory
  • $\gamma \in (0, 1]$:折扣因子,用于权衡长期与短期奖励
  • $r_t$:智能体在第 t 步获得的即时奖励
  • $\mathbb{E}{\tau \sim \pi\theta}[\cdot]$:在当前策略下,对所有可能轨迹取期望

2.目标函数直观理解

这个目标函数代表了智能体在当前策略下,预计可以获得的平均长期奖励。最大化它,就意味着让智能体倾向于采取能长期带来更高奖励的行为策略。
换句话说:

强化学习 ≈ 找到一套动作决策规则,使得智能体在环境中获得的总奖励期望值最大化

3.状态价值函数与动作价值函数

为了更细致地描述不同状态或动作的好坏,我们引入两个关键函数,它们都是目标函数的局部展开:

1.状态价值函数(State Value Function)

$V^\pi(s) = \mathbb{E}\pi \left[ \sum{t=0}^\infty \gamma^t r_t ,\middle|, s_0 = s \right]$
表示在状态 $s$ 下,使用策略 $\pi$ 所能获得的预期总奖励。

2.动作价值函数(Action Value Function)

$Q^\pi(s, a) = \mathbb{E}\pi \left[ \sum{t=0}^\infty \gamma^t r_t ,\middle|, s_0 = s, a_0 = a \right]$
表示在状态 $s$ 下选择动作 $a$,之后按照策略 $\pi$ 行动,能获得的期望回报。

这两个函数会在后续优势函数和策略梯度中反复出现。

4.PPO 中使用的目标函数特点

在 PPO 训练过程中,虽然最终优化的是剪切策略目标(Clip Objective),但仍然是围绕这个“期望回报最大化”的原始目标函数进行近似优化。这个原始目标提供了:

  • 理论基础:PPO 的损失项是从 $J(\theta)$ 推导出来的
  • 导数依据:策略梯度就是对 $J(\theta)$ 求导数
  • 稳定性参考:值函数分支用于估计状态回报 $V(s)$ 以减少方差

5.与监督学习目标的对比

对比项 监督学习 强化学习
目标函数 最小化预测误差(如 MSE) 最大化期望回报 $J(\theta)$
标签 明确给定的 ground truth 奖励由环境反馈,不稳定
样本依赖 样本独立 $i.i.d.$ 样本依赖于策略,非独立
难点 特征建模 时序性、稀疏奖励、探索-利用权衡

2.期望计算与采样估计

在强化学习中,我们的目标是最大化如下策略目标函数:
$J(\theta) = \mathbb{E}{\tau \sim \pi\theta} \left[ \sum_{t=0}^{T} \gamma^t r_t \right]$
但由于轨迹分布$\tau \sim \pi_\theta$涉及环境动态与策略随机性,这个期望在实际中无法精确求解,因此必须通过采样近似来计算。

1.为什么需要采样估计?

强化学习不像监督学习那样拥有固定训练集。环境是一个黑箱,策略在其中不断与环境交互产生样本,因此:

  • 分布不可知:轨迹 $\tau$ 的真实分布 $p(\tau)$ 无法直接获得
  • 动态生成数据:只能通过当前策略与环境互动收集数据
  • 期望不易解析:数学上无法求出对策略参数 $\theta$ 的解析梯度

因此,我们必须依赖经验采样方式,用近似值替代期望与梯度。

2.采样估计策略目标函数

我们用经验平均值(Monte Carlo 估计) 来代替对轨迹的期望:
$J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \left[ \sum_{t=0}^{T_i} \gamma^t r_t^{(i)} \right]$
其中:

  • $N$:采样轨迹的数量
  • $T_i$:第 $i$ 条轨迹的终止时间步
  • $r_t^{(i)}$:第 i 条轨迹第 $t$ 步获得的奖励

通过这种方式,我们可以估计在当前策略 $\pi_\theta$ 下,策略执行的表现。

4.策略更新与训练流程

1.多轮交互 + 多轮策略微调

一次完整的策略训练过程包含两大阶段:

  1. 与环境的交互采样阶段(rollout phase):策略根据当前参数 $\theta$ 与环境互动,生成多个 episode 或 trajectory,每个时间步采集三类数据:状态 $s_t$、动作 $a_t$、回报/优势 $A_t$。
  2. 策略更新阶段(policy optimization phase):使用采集到的样本数据,进行多次 epoch 的策略微调,即训练 PPO 的目标函数。

1.多轮交互的目的

在传统的策略梯度方法(如 REINFORCE)中,通常每轮训练只使用一次采样数据,造成:

  • 样本利用率极低
  • 更新方向受噪声影响大
  • 不利于收敛与稳定性

而 PPO 的改进之一是:一次采样数据可以用来进行多轮策略更新(Multiple Epochs),极大提高训练效率。

2.多轮策略微调

PPO 借助其 clip 剪切机制,可以在 不改变旧策略分布过快的前提下,使用同一批采样数据多次训练:

  • 将采样数据分为若干 minibatch(小批次);
  • 对每个小批次进行 3~10 轮更新(称为 multiple epochs);
  • 每次更新计算目标函数:$L^{\text{CLIP}}(\theta) = \mathbb{E}_{(s,a) \sim \mathcal{D}} \left[ \min \left( r(\theta) A, \text{clip}(r(\theta), 1-\epsilon, 1+\epsilon) A \right) \right]$,其中 $\mathcal{D}$ 是采样的数据集。

PPO 的训练采用 “一次采样 + 多轮更新” 的方式,在保持策略分布稳定的前提下,大大提高了样本利用效率,是其效率与稳定性兼得的核心优势。

2.优势函数与稳定性优化

1.什么是优势函数(Advantage Function)?

优势函数 $A_t$ 是强化学习中用于衡量一个动作相对“平均水平”好坏的重要指标,定义为:
$A_t = Q(s_t, a_t) - V(s_t)$
其中:

  • $Q(s_t, a_t)$:表示在状态 $s_t$ 执行动作 $a_t$ 后的总期望回报
  • $V(s_t)$:表示在状态 $s_t$ 下采取任意策略的平均回报
  • 所以 $A_t$ 表示「当前动作比平均水平好多少」

若 $A_t$ > 0,说明当前动作优于平均水平;反之则劣于平均。

2.为什么 PPO 要使用优势函数?

PPO 的目标是最大化:
$L^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min(r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t) \right]$
可以看出:

  • PPO 的策略梯度方向完全依赖于 $A_t$
  • 准确估计 $A_t$ 是训练稳定性与收敛性的关键

3.如何估计优势函数?

在实践中,我们无法直接得到 $Q(s_t, a_t)$,所以通常用经验回报 $R_t$ 与状态值函数 $V(s_t)$ 的差值近似:
$A_t = R_t - V(s_t)$
但这样会带来高方差问题。于是,提出了一种更平滑的优势估计方法——广义优势估计(GAE)

PPO 中的优势函数不仅决定了策略的更新方向,还通过 GAE、归一化等方法提升了训练的稳定性与收敛速度,是连接策略目标与实际更新之间的“稳定桥梁”。

3.训练中的常见技巧与超参数设置

在强化学习中,尤其是 PPO 这样的 on-policy 策略优化方法,由于每一次更新都依赖新鲜采样数据,因此训练效率和稳定性尤为重要。本节总结了一系列实践中广泛使用的技巧与推荐超参数,帮助你在实现 PPO 时取得更好效果。常见训练技巧有:

1.标准化优势函数(Advantage Normalization)

  • 作用:消除优势值的数值尺度影响,避免策略梯度方向失衡,通常效果显著,建议始终启用。
  • 做法:每个训练批次上,将优势函数 A_t 标准化为:$A_t \leftarrow \frac{A_t - \mu}{\sigma + \epsilon}$

2.熵奖励(Entropy Bonus)

  • 作用:增加策略的随机性,防止策略过早陷入确定性,提升探索能力。
  • 添加到目标函数 中,完整形式为:$L^{\text{PPO}} = L^{\text{CLIP}} - c_1 \cdot \text{VF Loss} + c_2 \cdot \text{Entropy Bonus}$
  • 超参数 $c_2$ 控制熵奖励权重,典型值为:0.001 ~ 0.02

3.梯度裁剪(Gradient Clipping)

  • 作用:防止策略梯度爆炸,保证每步更新平稳
  • 做法:对所有梯度统一做 L2 范数裁剪
1
2
# max_grad_norm 推荐值 0.5
torch.nn.utils.clip_grad_norm_(policy.parameters(), max_grad_norm)

4.Reward Normalization(回报归一化)

  • 特别适用于 reward 数值波动较大或不同任务 reward 分布差异大的情况
  • 可提升学习稳定性,但在 reward 分布已稳定时可略去

5.周期性评估与 early stopping

  • 在训练周期中设定验证环境,用于评估策略性能趋势
  • 若策略在评估环境中长期不提升,可早停或调整学习率策略

6.PPO 中关键超参数推荐

以下为 PPO 中常用的重要超参数及其典型建议范围(可依据任务微调):

超参数 描述 推荐值
γ 折扣因子 0.99
λ GAE 参数,控制 bias-variance 平衡 0.95
ε PPO 剪切阈值 0.1 ~ 0.3
K_epochs 每轮数据的微调轮数 4 ~ 10
mini_batch_size 小批次样本大小 64 ~ 1024
learning_rate 学习率 1e-4 ~ 3e-4
c1 值函数损失权重 0.5
c2 熵正则项权重 0.01
max_grad_norm 梯度裁剪上限 0.5

这些超参数会根据任务复杂度、action space 维度和 reward scale 做适当调整。

5.总结

PPO(Proximal Policy Optimization)是一种高效稳定的策略优化算法,通过剪切目标函数(clip objective)限制策略更新幅度,在保持训练稳定性的同时简化实现。
其核心设计包括:

  1. 用策略比值剪切替代复杂的KL约束,防止策略突变
  2. 采用广义优势估计(GAE)平衡偏差与方差
  3. 支持多轮数据复用提升样本效率

PPO通过Actor-Critic框架交互采样,结合值函数损失和熵奖励项,实现策略的渐进式优化。典型超参数如剪切阈值ε=0.2、折扣因子γ=0.99、GAE参数λ=0.95,配合梯度裁剪和优势归一化等技巧,使其在连续/离散动作任务中均表现优异,成为强化学习领域的基准算法。