在推导出策略梯度定理之后,我们得到了梯度的理论表达形式。然而,这一期望值在实际中仍然无法直接计算。其根本原因在于:轨迹空间具有极高的维度,甚至可能是连续且无限的,因此不可能穷举所有可能的状态-动作序列组合。
策略优化的核心实践方法是通过有限采样来近似该期望。具体而言,我们与环境进行交互,采集若干条完整的轨迹数据,并利用这些样本的经验平均值来估计梯度。这种方法构成了 REINFORCE 算法(Williams, 1992)的基本思想。
REINFORCE 的训练流程如下:
- 使用当前策略参数采样 N 条完整轨迹;
- 对每条轨迹,从起始时刻到终止时刻计算累积回报;
- 可选地引入一个固定的基线(baseline),例如所有轨迹回报的均值,以进一步降低方差;
- 基于上述信息计算梯度,并更新策略参数。
这种基于采样的方法带来了一个关键挑战——方差问题。
我们的目标是优化策略的期望性能,但由于只能依赖有限样本进行估计,必须满足两个基本要求:
- 无偏性(unbiased):所采样梯度的数学期望应等于真实的策略梯度;
- 低方差(low variance):不同批次采样所得的梯度应尽可能接近,以保证学习过程稳定。
REINFORCE 满足无偏性,但存在显著的高方差问题。考虑以下示例说明:
示例:训练语言模型回答医疗相关问题。
Prompt: "如何缓解头痛?"
Response 1(轨迹1): "多喝水,适当休息,必要时服用布洛芬。" → 获得奖励 r
Response 2(轨迹2): "头痛可能由多种原因引起..."(啰嗦但正确)→ 获得奖励 r
Response 3(轨迹3): "建议立即手术治疗。"(错误建议)→ 获得奖励 r
尽管这三条响应来自同一策略,它们的回报差异极大(r ≈ 正,r ≈ 中等,r ≈ 负)。由此计算出的梯度将剧烈波动,导致:
- 需要大量轨迹(如数千条)才能获得较稳定的梯度估计;
- 训练速度缓慢,收敛不稳定;
- 对于长对话序列(如超过数十轮交互),方差随长度呈指数增长。
一个常见疑问是:每次参数更新后策略都会变化,是否只需用一条轨迹就进行一次更新?
答案是否定的。标准的 REINFORCE 方法通常采用如下方式:
- 使用当前策略 π_θ 采样一批轨迹(例如 N=64 条);
- 基于这批轨迹计算平均梯度,并执行一次参数更新;
- 更新完成后,策略变为 π_θ',此时旧的 N 条轨迹不再适用,必须舍弃;
- 下一轮重新使用新策略采样新的 N 条轨迹,重复上述流程。
这种机制被称为 On-Policy 学习:所有训练数据必须来源于当前策略。一旦策略更新,历史数据即失效,从而导致样本利用率非常低。
3.3 Actor-Critic 方法
REINFORCE 的高方差主要源于使用 Monte Carlo 方法估计回报,即必须等到整条轨迹结束才能计算累积奖励。如果能够引入一个可学习的价值函数来预测未来的回报,则可以:
- 有效降低估计方差(函数拟合比单次采样更稳定);
- 支持单步更新(无需等待轨迹终结)。
这正是 Actor-Critic 框架的核心理念:引入一个 Critic 网络来估计状态价值,并以此构建优势函数,指导 Actor 策略的更新。
双网络架构设计
系统维护两个神经网络:
- Actor:策略网络,负责根据当前状态选择动作;
- Critic:价值网络,用于评估某一状态的长期价值。
训练目标分解
Critic 的学习目标是逼近真实累积回报:
通过最小化预测值与实际观测到的回报之间的误差(如 MSE),实现对状态价值函数的监督学习。
Actor 的更新则依赖于优势函数 A(s,a),其定义为:
优势函数衡量某个动作相对于当前状态下平均表现的好坏程度,从而引导策略向更优方向调整。
关键实现细节:梯度阻断
在计算优势时,必须防止梯度反传至 Critic 网络,以免干扰其独立训练。例如,在代码中常写作:
advantage = reward + gamma * next_value - value.detach()
其中 detach() 操作切断了 value 的梯度流,确保 Actor 更新不影响 Critic 的目标一致性。
单步更新进阶:TD 误差的应用
在 Actor-Critic 框架中,我们可以使用 TD(Temporal Difference)误差替代传统的 Monte Carlo 回报,实现更高效的单步更新。
TD 优势的定义如下:
A^TD(s_t, a_t) = r_t + γV(s_{t+1}) - V(s_t)
与传统方法对比:
Monte Carlo 优势(A^MC):
公式:A^MC = G_t - V(s_t),其中 G_t 是从 t 开始的完整轨迹累积回报。
特点:需运行完整个轨迹才能计算,属于无偏估计,但方差较高。
TD 优势(A^TD):
公式:A^TD = r_t + γV(s_{t+1}) - V(s_t)
特点:仅需一步转移即可计算,方差较低,但为有偏估计,其准确性依赖于价值函数 V 的逼近质量。
3.4 GAE(Generalized Advantage Estimation)的推导
1. 真实优势函数的定义
首先定义理论上“真实”的优势函数,它基于实际未来回报与状态价值之差:
A(s_t) = G_t - V(s_t)
我们的目标是构造一个既能保持低方差又能控制偏差的优势估计器,而 GAE 正是为此提出的一种加权组合方法。
2. 基于 Bellman 方程的递归展开
根据 Bellman 递推关系,任意时刻的总回报可展开为:
G_t = r_t + γr_{t+1} + γr_{t+2} + ...
将其代入优势函数表达式,并加入价值函数项进行重构:
A(s_t) = [r_t + γV(s_{t+1}) - V(s_t)] + γ[G_{t+1} - V(s_{t+1})]
注意到第一部分正是 TD 误差 δ_t,第二部分是下一时刻的真实优势。于是得到递归关系:
A(s_t) = δ_t + γA(s_{t+1})
3. 多步递归展开与核心结论
不断展开上述递归式,可得:
A(s_t) = δ_t + γδ_{t+1} + γδ_{t+2} + γδ_{t+3} + ...
关键结论:真实优势函数等于所有未来 TD 误差的折扣加权和。
这一结果直观合理:
- 每一项 TD 误差 δ_k 反映了在第 k 步的“预测偏差”或“意外程度”;
- 越远的未来步骤,其影响被 γ^k 逐渐衰减;
- 因此,当前动作的优势本质上是由其引发的一系列后续估计误差的累积效应。
GAE 的核心思想:偏差与方差的权衡
虽然上述无穷展开在理论上精确,但在实践中面临两个问题:
- 依赖完整的未来轨迹信息,难以在线应用;
- 若完全使用 MC 回报,则方差大;若只用一步 TD,则偏差高。
GAE 引入了一个平滑参数 λ ∈ [0,1],构造如下加权估计:
^GAE(λ) = Σ_{l=0}^{∞} (γλ)^l δ_{t+l}
当 λ 接近 1 时,估计更接近无偏但方差较高;当 λ 接近 0 时,偏向低方差但增加偏差。通过调节 λ,可在两者之间灵活折衷,提升算法稳定性与效率。
在强化学习中,优势函数的估计面临一个核心挑战:如何在偏差与方差之间取得合理平衡。直接使用完整的回合回报进行估计(即Monte Carlo方法)虽然无偏,但因其依赖整个episode的完成而导致高方差;而仅依赖单步信息的TD(0)方法虽方差小,却引入了较大偏差。
为解决这一问题,广义优势估计(GAE)被提出,其通过引入一个可调参数来实现对偏差-方差的平滑权衡。该参数作为未来TD误差的衰减因子,控制着算法“看多远”的程度。
GAE的核心构成:
- γ(gamma):环境奖励的折扣因子,反映任务本身对未来回报的关注程度。
- λ(lambda):优势函数的折扣因子,是人为设定的超参数,用于调节偏差与方差之间的平衡。
- δt:每一步的TD误差,定义为 δt = rt + γV(st+1) - V(st)。
理解 λ 的作用:
当 λ = 0 时,GAE退化为标准的TD(0)误差,仅利用一步反馈,偏差最大但方差最小;
当 λ = 1 时,GAE等价于Monte Carlo风格的优势估计,无偏但方差最高;
当 0 < λ < 1 时,GAE在TD和MC之间进行指数加权插值,未来的TD误差以 γλ 的形式逐级衰减,从而实现对长期信息的有效利用同时抑制噪声累积。
GAE的高效计算方式 —— 反向递推公式:
由于GAE涉及对无限步TD误差的加权求和,直接计算效率低下。为此,可通过如下递推方式高效实现:
advantages = torch.zeros_like(rewards)
gae = 0
for t in reversed(range(T)):
delta = rewards[t] + gamma * values[t+1] - values[t]
gae = delta + gamma * lam * gae
advantages[t] = gae
该过程从轨迹末端反向遍历,利用上一时刻的GAE值更新当前值,类似于RNN中的时间反向传播机制。其中 values[t+1] 是Critic网络对下一状态的价值预测。
这种递推结构已被广泛应用于PPO、A2C、A3C等主流策略优化算法中,成为现代强化学习训练流程的标准组件。
GAE与n-step TD估计的关系:
GAE可被视为所有n-step TD优势估计的指数加权平均:
其中,n-step优势定义为从当前时刻起累计n步奖励并加上末尾状态估值的差值。
λ 决定了不同长度的n-step估计被融合的程度:
- 较小的 λ 更加偏好短视的、偏差较高但稳定的估计;
- 较大的 λ 则更倾向于整合长程信息,带来更高方差但更低偏差的结果。
实践中,λ 取值通常设为 0.95 或 0.99,是一个性能良好的经验默认值。
On-Policy 方法的数据效率瓶颈:
REINFORCE、Actor-Critic、A2C/A3C 等方法均属于 On-Policy 范畴,意味着策略梯度的计算必须基于当前策略生成的数据。一旦策略更新,旧数据即失效,导致极低的样本利用率。
以大语言模型(如Qwen-7B)为例,生成一次响应耗时约3秒,若每次只能使用一次,则训练1000步需耗时3000秒。相比之下,支持数据复用的Off-Policy方法(如PPO)可在相同时间内复用数据达4次,总耗时降至750秒,显著提升效率。
| 方法 | 单次采样耗时 | 数据复用次数 | 训练1000步总耗时 |
|---|---|---|---|
| On-Policy | 3秒 | 1次 | 3000秒 |
| Off-Policy (PPO) | 3秒 | 4次 | 750秒 |
重要性采样的数学基础:
为了实现跨策略的数据复用,关键工具是“重要性采样”。其基本原理如下:
对于任意函数 f(x),若 x ~ q(x),但我们希望估计 Ep(x)[f(x)],则有:
Ep[f] ≈ Σ f(x_i) (p(x_i)/q(x_i))
将其应用于策略梯度中,原目标为基于新策略 π 的期望梯度,但数据来自旧策略 π_old,因此需引入概率比进行修正:
J(π) ∝ Eπ_old[ (π(a|s)/π_old(a|s)) A(s,a) ]
医疗问答场景示例:
假设旧策略生成回答“多喝水,休息”的概率为 0.6,而新策略对该动作赋予更高概率 0.9,对应优势值为正(说明表现良好),则其梯度贡献将被放大。
修正后的梯度权重为:(0.9 / 0.6) × A = 1.5 × A
主要风险:
若新旧策略差异过大,导致比率 π/π_old 过高(例如超过10),则重要性采样会产生极大方差,使梯度估计不稳定。因此,必须限制策略更新的幅度。
TRPO:信赖域下的策略优化框架:
Trust Region Policy Optimization (TRPO, Schulman et al., 2015) 提出在KL散度约束下最大化性能提升,确保每次更新不会偏离原始策略过远。
优化问题形式化为:
maximizeθ E[ (π_θ(a|s)/π_old(a|s)) A(s,a) ]
subject to: DKL(π_old || π_θ) ≤ δ
其中 KL 散度用于衡量两个策略分布之间的差异,δ 是预设阈值(如0.01),防止更新步长过大。
实例说明:
旧策略分布:P("多喝水")=0.3, P("休息")=0.4, P("吃药")=0.3
新策略分布:P("多喝水")=0.5, P("休息")=0.35, P("吃药")=0.15
计算得KL散度若超过约束阈值,则需缩小更新步长或回退更新。
TRPO采用共轭梯度法求解该带约束优化问题,需计算Fisher信息矩阵或Hessian近似,理论保证强(单调非降),但实现复杂、计算开销大、对参数敏感。
PPO:实用化的策略优化方案:
Proximal Policy Optimization (PPO) 在TRPO基础上进行了简化,通过裁剪机制或惩罚项替代严格的KL约束,实现更稳定且易于实现的策略更新,在保持性能的同时大幅降低工程难度。
PPO(Proximal Policy Optimization,近端策略优化)由Schulman等人于2017年提出,通过一阶优化方法结合精心设计的目标函数,实现了与TRPO相当的性能表现,同时具备更高的实现便利性和训练稳定性。因此,PPO已成为深度强化学习(RL)以及基于人类反馈的强化学习(RLHF)中的主流算法之一。
3.7.1 PPO-Clip:以裁剪机制替代KL约束
核心思想:不显式地在目标函数中引入KL散度作为硬性约束,而是通过对策略更新中概率比率的范围进行裁剪,间接限制策略变化幅度。
目标函数形式:
采用如下损失函数:
loss = -min(ratio × A, clip(ratio, 1ε, 1+ε) × A)
其中 ratio 表示新旧策略的概率比值,即 exp(new_log_prob old_log_prob),A 为对应动作的优势值,ε 为裁剪系数(通常取0.1~0.2),用于限定ratio的变化区间为 [1ε, 1+ε]。
逐项分析:
- 情况1:优势 A > 0(当前动作为“好动作”,期望提升其被选择的概率)
- 若 ratio ≤ 1+ε:使用原始梯度更新,允许概率适度上升;
- 若 ratio > 1+ε:此时 ratio 被裁剪至 1+ε,对应的梯度不再增长,防止过度优化导致策略突变。
- 情况2:优势 A < 0(当前动作为“坏动作”,期望降低其出现概率)
- 若 ratio ≥ 1ε:正常梯度回传,持续削弱该动作概率;
- 若 ratio < 1ε:ratio 被裁剪为 1ε,停止进一步惩罚,避免策略崩溃或过度抑制。
医疗问答场景示例(具体数值计算):
Prompt:"如何缓解头痛?"
Response:"多喝水,适当休息"
旧策略下生成此回答的对数概率:log prob = -4.6
新策略下对数概率:log prob = -3.5
优势值 A = 0.8(表明该响应质量较高)
计算概率比率:
ratio = exp(3.5 + 4.6) = exp(1.1) ≈ 3.0
设定 ε = 0.2,则裁剪区间为 [0.8, 1.2]
- 原始项:ratio × A = 3.0 × 0.8 = 2.4
- 裁剪项:clip(3.0, 0.8, 1.2) × A = 1.2 × 0.8 = 0.96
- 最终损失输入:min(2.4, 0.96) = 0.96 ← 发生裁剪!
解读:尽管新策略使该回答的概率提升了约3倍,但PPO-Clip机制将其影响上限控制在1.2倍以内,有效防止策略发生剧烈变动,保障训练过程平稳收敛。
3.7.2 PPO-KL:基于KL散度的自适应惩罚机制
另一种PPO变体直接在目标函数中加入KL散度作为惩罚项,形式如下:
loss = advantage × ratio β × KL(π_new || π_old)
其中 β 为可调节的惩罚系数。
关键改进在于 β 的自适应调整策略:
- 若平均KL散度大于目标阈值 → 增大 β,加强约束力度;
- 若平均KL散度小于目标值 → 减小 β,放松限制以促进探索。
尽管该方法理论上更精细,但在实际应用中,PPO-Clip 更受青睐,主要原因在于其无需手动调参β,且稳定性更强、实现更简洁。
3.7.3 PPO-Clip 完整训练流程
该算法的一个显著优势是支持多次数据复用(通常K=3~4轮),从而提高样本利用率并增强训练效率。
完整训练步骤如下:
- 采样阶段(每轮迭代仅执行一次)
- 使用当前策略 π_θ 收集 N 条完整轨迹(trajectory);
- 记录每个状态-动作对的 old_log_probs = log π_θ(a|s),并在后续更新中保持不变。
- 优势估计(借助GAE)
- 利用Critic网络预测各状态的价值 V(s);
- 结合实际回报序列,通过广义优势估计(GAE)计算 advantages。
- 多轮Mini-batch策略更新(重复K次)
- 对采集到的数据进行分批处理,进入K轮epoch循环(如K=4);
- 每批次中:
- 重新计算当前策略下的 new_log_probs;
- 计算 ratio = exp(new_log_probs old_log_probs);
- 构建PPO-Clip损失项:
loss_clip = min(ratio × A, clip(ratio, 1ε, 1+ε) × A)
- 价值网络损失(均方误差):
loss_vf = (V(s) returns)
- 总损失:
loss = loss_clip + c_vf × loss_vf
(c_vf为价值损失权重系数) - 执行梯度反向传播和参数更新。
这种“一次采样、多次更新”的机制显著提升了样本效率,是PPO在实践中高效稳定的重要原因。


雷达卡


京公网安备 11010802022788号







