想象你是一个小镇上的“盲品美食家”,你的工作是帮夜市摊主找到最受欢迎的招牌小吃。你手里有一本笔记本,记录着每位摊主每种小吃的“受欢迎指数”(期望回报)。然而,小镇上摊位越来越多、小吃种类无穷无尽,你不可能把每种搭配都试一遍。更麻烦的是,有些夜市在深山老林里,你只能派“试吃员”去随机尝几口,拿回一份带着“运气成分”的报告。 这时,一位老摊主教会你一个祖传秘诀:与其费尽心思去估计每一道小吃的绝对评分(价值函数),不如直接观察——当试吃员对某道菜竖起大拇指(高回报)时,就让摊主更频繁地做这道菜;当试吃员皱眉(低回报)时,就让摊主少做这道菜。这个“直接根据反馈好坏调整做菜概率”的秘诀,就是策略梯度定理(Policy Gradient Theorem)。它让AI智能体在连续动作空间(比如机械臂的关节角度)中也能高效学习,是现代深度强化学习(如 PPO、TRPO)的基石。

岗位关联

策略梯度定理是理解现代强化学习算法(如 PPO、TRPO)的钥匙,掌握它能让你在机器人控制、游戏 AI 等前沿领域拥有直接优化策略的核心能力,是通往高级 AI 工程师的必修课。

目录
  1. 可视化演示
  2. 问题导入
  3. 数学建模
  4. 采样估计
  5. 方差分析
  6. 算法应用
  7. 价值升华
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示策略梯度定理的数学推导过程、策略网络参数优化流程与REINFORCE/Actor-Critic/PPO算法家族对比,理解直接优化策略的核心原理。

本节配有交互动效(进入视口后自动加载,约 3KB)。

策略梯度定理推导 目标函数J(θ)=E[Σγᵗrᵗ],对θ直接求梯度 log-导数技巧将积分转为期望,无需环境模型 ∇J(θ)=E[Σ∇log π(a|s)·G] 策略梯度=回报×对数概率梯度之期望

问题导入

“盲品美食家”老周遇到了新麻烦。以前,他用一本“评分手册”(值函数 Q 表)来记录每一种小吃组合的美味程度。但夜市越开越大,摊主们开始推出“任意搭配”的创意小吃——比如“辣度连续可调”的烤串,辣度可以是 0 到 100 之间的任意数值。如果继续用“评分手册”,他得记录无穷多个辣度对应的评分,这显然是不可能的。

这就是传统值函数方法的致命伤:面对连续动作空间(比如机械臂关节的连续角度、自动驾驶的方向盘转角),Q 表根本存不下。更麻烦的是,值函数方法只能给每个状态选一个“最优动作”,但现实中的最优策略往往是随机的——比如猜拳时,你绝不能每次都出石头,而要按某种概率随机出拳,让对手无法预测。

于是老周换了一个思路:干脆不记录“每种小吃多少分”,而是直接给每个摊主一本“做菜策略手册”。手册上写着“看到顾客皱眉(状态)时,有 70% 概率做加辣、30% 概率做微辣”。这个手册就是 策略参数,它是一组可以调节的数字(即参数 θ)。老周的目标变成:怎么调整这些数字,让夜市的总营业额(期望回报)变得最高?

老周很快发现,这个“策略手册”思路好处多多:它天然支持连续动作(比如辣度 73.5 度)、天然产生随机策略(按概率出拳),而且手册里的数字可以交给计算机自动调节。但问题是——怎么知道往哪个方向调呢?这就要用到策略梯度定理了。

πθ(a∣s)=eza/τ∑bezb/τ\pi_{\theta}(a|s) = \frac{e^{z_a/\tau}}{\sum_{b} e^{z_b/\tau}}
策略参数化:用一组参数 θ 来描述“在某个状态 s 下选择动作 a 的概率”,而不是给每个动作一个独立的评分值。上面公式是 Softmax 策略的示例,其中 z 是动作偏好分数,τ 是温度参数。
  1. 动作偏好分数先给每个动作设定一个“偏好分数” z,它表示这个动作“看起来多有吸引力”。
    za=ϕ(s,a)⊤θz_a = \phi(s, a)^\top \theta
  2. 温度参数τ 控制“探索与利用”的平衡,τ 越大,各动作概率越接近均匀分布(更像随机尝试)。
    τ→∞⇒πθ(a∣s)→均匀分布\tau \rightarrow \infty \Rightarrow \pi_{\theta}(a|s) \rightarrow \text{均匀分布}
  3. Softmax 归一化将所有动作的偏好分数取指数后归一化,确保所有动作的概率之和为 1。
    πθ(a∣s)=eza/τ∑bezb/τ\pi_{\theta}(a|s) = \frac{e^{z_a/\tau}}{\sum_{b} e^{z_b/\tau}}

数学建模

老周现在有了“做菜策略手册”,但他需要一把“指南针”来告诉他:手册里的每个数字(参数)该往哪个方向拧,夜市营业额才能涨。设夜市的一个完整营业日为一个“轨迹”(从开门到关门的所有状态、动作、回报序列),那么一天的营业额就是所有回报的总和。策略梯度定理关心的是:当参数 θ 发生微小变化时,期望营业额会朝哪个方向变化?

把轨迹的概率分解开来看:一天营业过程发生的概率,等于最开始处于某个状态的概率,乘以每一步“在状态下选择某道菜的概率”乘以“顾客反馈出下一个状态的概率”的连乘。这个连乘式子中,只有“选择某道菜的概率”(即策略 πθ)直接依赖于我们要调的参数 θ。所以求导时,其他项的导数都为 0,只剩下策略项的导数,这就大大简化了问题。

一个关键的数学技巧出现了:当我们要计算目标函数关于参数的梯度时,可以利用“对数导数”技巧——把概率的梯度变成“概率 × 对数概率的梯度”。这就像老周不需要知道每道菜的具体利润,只需要知道“这道菜涨价 1 元时,被点概率的百分比变化”,就能判断该不该涨价。于是,策略梯度定理的核心公式呼之欲出。

这个公式就是老周梦寐以求的“指南针”:它告诉老周,如果某天夜市生意爆好(回报为正),说明今天做的菜(动作序列)值得推广,应该把做这些菜的概率调高;如果生意惨淡(回报为负),就要把做这些菜的概率调低。

J(θ)=Eτ∼πθ[∑t=0Trt]=∫P(τ∣θ)R(τ)dτJ(\theta) = \mathbb{E}_{\tau \sim \pi_{\theta}} \left[ \sum_{t=0}^{T} r_{t} \right] = \int \mathbb{P}(\tau|\theta) R(\tau) d\tau
策略梯度定理:期望回报对参数 θ 的梯度,等于“轨迹总回报”乘以“每一步对数策略梯度”的期望。通俗说:整条路走下来的总收益 × 每一步对策略参数的敏感度,就是策略参数的调整方向。
  1. 对数策略梯度衡量“动作 a 被选择的概率”对参数 θ 的敏感度——参数微调后,这个动作的被选概率会变多少倍。
    ∇θlog⁡πθ(at∣st)\nabla_\theta \log \pi_{\theta}(a_t|s_t)
  2. 轨迹总回报整场互动从开始到结束累积的总奖励 R(τ),它像一个“法官”,给整条轨迹的行为表现打分。
    R(τ)=∑t=0TrtR(\tau) = \sum_{t=0}^{T} r_t
  3. 期望的线性性对多个采样轨迹的结果取平均,作为真实梯度的估计,样本越多越接近真实方向。
    ∇θJ(θ)≈1N∑i=1N∑t=0T∇θlog⁡πθ(ati∣sti)⋅R(τi)\nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=0}^{T} \nabla_\theta \log \pi_{\theta}(a_t^i|s_t^i) \cdot R(\tau^i)
  4. 直觉解读如果一条轨迹总回报高,就“放大”这条轨迹上所有动作的概率;如果总回报低,就“缩小”它们的概率。
    θ←θ+α∇θJ(θ)\theta \leftarrow \theta + \alpha \nabla_\theta J(\theta)

采样估计

老周拿着“指南针”公式信心满满地出发了,可他立刻发现一个现实问题:公式里有个“期望”符号,这意味着要遍历所有可能的营业日轨迹来求平均——这在现实中根本做不到。夜市每天只开一次门,他不可能让时间倒流重来一万遍。

解决办法是采样估计(蒙特卡洛方法):多派几个“试吃员”(智能体副本)同时去夜市体验,每人记录一条轨迹和对应的总回报,最后把所有轨迹的“总回报 × 对数策略梯度”取平均,就得到一个梯度的近似值。虽然每一条轨迹都带着运气成分(采样噪声),但只要样本量足够大,平均结果就会收敛到真实梯度方向——就像抛硬币,抛 10 次正面率可能偏差很大,但抛 10000 次就非常接近 50%。

不过老周很快注意到一个问题:如果某天夜市整体很火爆(所有摊位营业额都高),那么所有摊位都会觉得自己做菜很棒,导致策略朝“无脑复制”的方向走——这不是最优的。这个问题的根源在于梯度的方差太大。下一节我们看看老周怎么解决。

∇θJ(θ)≈g^=1N∑i=1N∑t=0Ti∇θlog⁡πθ(at(i)∣st(i))R(τ(i))\nabla_\theta J(\theta) \approx \hat{g} = \frac{1}{N} \sum_{i=1}^{N} \sum_{t=0}^{T_i} \nabla_\theta \log \pi_{\theta}(a_t^{(i)} | s_t^{(i)}) R(\tau^{(i)})
这就是 REINFORCE 算法的核心公式——用 N 条采样轨迹的平均值来估计策略梯度,再沿这个估计方向更新参数。注意它不使用环境的动态模型,所以是“无模型”方法。
  1. 收集轨迹让智能体用当前策略 πθ 与环境互动 N 次,得到 N 条轨迹(每条包含一系列状态、动作、奖励)。
    τ(i)=(s0(i),a0(i),r0(i),s1(i),… )\tau^{(i)} = (s_0^{(i)}, a_0^{(i)}, r_0^{(i)}, s_1^{(i)}, \dots)
  2. 计算梯度贡献对每条轨迹的每个时间步,计算“对数策略梯度 × 总回报”。
    g^(i)=∑t=0Ti∇θlog⁡πθ(at(i)∣st(i))⋅R(τ(i))\hat{g}^{(i)} = \sum_{t=0}^{T_i} \nabla_\theta \log \pi_{\theta}(a_t^{(i)}|s_t^{(i)}) \cdot R(\tau^{(i)})
  3. 取平均把所有轨迹的梯度贡献加起来除以轨迹数 N,得到梯度估计值。
    g^=1N∑i=1Ng^(i)\hat{g} = \frac{1}{N} \sum_{i=1}^{N} \hat{g}^{(i)}
  4. 沿梯度更新把估计到的梯度方向乘以学习率 α,加到原参数上,完成一步“策略改进”。
    θ←θ+αg^\theta \leftarrow \theta + \alpha \hat{g}

方差分析

老周发现,用采样估计的梯度方向“抖动”得很厉害。有时明明是好策略,却因为一次运气差的采样(试吃员那天心情不好,给所有菜差评)而让策略往坏的方向调。这个“抖动”就是统计学中的方差。

为什么方差这么大?回顾公式,梯度里乘了一个“轨迹总回报 R(τ)”。但轨迹回报受很多因素影响:初始状态随机、环境转移随机、策略本身随机,这些随机性全都叠加在 R(τ) 上,导致单个轨迹的回报可能非常高或非常低。就像老周让一个试吃员去评价所有小吃,如果试吃员那天牙疼,所有小吃评分都偏低——这会让策略误判“所有菜都不该做”。

聪明的做法是引入一个“基准线”(baseline)。老周想:与其看这个月的绝对营业额,不如看“这个月比平时好多少”。如果平时月均营业额是 10 万,这个月做了 12 万,说明最近的新菜品确实不错,值得推广;如果只做了 9 万,说明新策略还不如旧策略。这个“平时水平”就是基准线 b(s)。

这就是优势函数的由来。老周不再问“这道菜赚了多少钱”,而是问“这道菜比摊主平时的平均水平多赚了多少”。如果一个动作的优势为正,就增强它;为负,就削弱它。这样即使某个试吃员整体心情不好(环境随机性大),也不影响策略调整的方向,方差大大降低,学习变得稳定高效。

∇θJ(θ)=Eτ∼πθ[∑t=0T∇θlog⁡πθ(at∣st)⋅(Qπ(st,at)−b(st))]\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot \left( Q^\pi(s_t,a_t) - b(s_t) \right) \right]
引入基准线 b(s) 不会改变梯度的期望值(数学上可以证明),但能显著降低方差。最常见的选择是状态价值函数 V(s)——“平时水平”。
  1. 原始形式不引入基准线时,回报直接乘以梯度,方差很大。
    ∇θJ(θ)=E[∇θlog⁡πθ⋅Qπ]\nabla_\theta J(\theta) = \mathbb{E}[\nabla_\theta \log \pi_\theta \cdot Q^\pi]
  2. 减去基准线在梯度的权重中加入状态价值函数 V(s_t) 作为基准线。
    ∇θJ(θ)=E[∇θlog⁡πθ⋅(Qπ(s,a)−V(s))]\nabla_\theta J(\theta) = \mathbb{E}[\nabla_\theta \log \pi_\theta \cdot (Q^\pi(s,a) - V(s))]
  3. 零均值性质因为策略梯度对动作的期望为零,减去只依赖状态的基准线不改变总期望。
    Ea∼πθ[∇θlog⁡πθ(a∣s)⋅V(s)]=0\mathbb{E}_{a \sim \pi_\theta}[\nabla_\theta \log \pi_\theta(a|s) \cdot V(s)] = 0
  4. 优势函数Qπ - V 被定义为优势函数 A(s,a),表示“这个动作比平均水平好多少”。
    Aπ(s,a)=Qπ(s,a)−Vπ(s)A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)

算法应用

掌握了策略梯度定理这把“尚方宝剑”,老周开始在不同夜市大展身手,还发展出了多种招式。第一招是最基础的 REINFORCE 算法:让试吃员完整地体验一个营业日(完整轨迹),然后根据整天的总回报调整策略。优点是简单直接、无偏,缺点是方差大、学习慢(要等一整天结束才能调参)。

第二招是 Actor-Critic(演员-评论家)架构:老周不再只派试吃员(Actor,演员),还配了一个“账房先生”(Critic,评论家)。账房先生实时预估“现场这个局面的平均利润水平”(即状态价值 V(s)),试吃员每尝一口,账房先生就告诉它“这道菜比平时好还是差”(优势估计),试吃员立刻调整做菜概率,不需要等到收摊。这样方差更小、学习更快,但代价是引入了价值估计的偏差。

第三招是当代工业界最流行的 PPO(近端策略优化) 和 TRPO(信任区域策略优化):它们像给老周配了一副“保险绳”——每次参数更新时,不允许“策略手册”变化过大,防止一次坏采样导致策略彻底崩坏。PPO 通过裁剪(clip)目标函数来控制更新幅度,让学习过程既快又稳。

如今,老周已经把这套“策略梯度秘籍”传遍了整个夜市行业。从最初的 REINFORCE 到 Actor-Critic,再到 PPO/TRPO,一步一个脚印,策略优化的效率不断提高。这套方法已经成为现代强化学习的标准范式,支撑着无数人工智能应用。

LCLIP(θ)=Et[min⁡(rt(θ)A^t,clip⁡(rt(θ),1−ϵ,1+ϵ)A^t)]L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min\left( r_t(\theta) \hat{A}_t, \operatorname{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t \right) \right]
PPO 的核心:新旧策略的概率比 r(θ) 乘以优势函数,如果概率比超出范围 [1-ε, 1+ε] 就裁剪,防止参数更新步子太大。
  1. 概率比定义r(θ) 是新旧策略在状态 s 下选择动作 a 的概率比值,表示“新策略比旧策略更敢做这个动作多少倍”。
    rt(θ)=πθ(at∣st)πθold(at∣st)r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}
  2. 裁剪操作将概率比限制在 [1-ε, 1+ε] 内,超出部分被截断,防止更新过头。
    clip⁡(rt(θ),1−ϵ,1+ϵ)\operatorname{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)
  3. 取最小值原始目标与裁剪目标之间取较小者,保证目标函数是“保守的”——在策略改进时不含糊,在策略恶化时手脚放慢。
    min⁡(rt(θ)A^t,clip⁡(rt(θ),1−ϵ,1+ϵ)A^t)\min(r_t(\theta) \hat{A}_t, \operatorname{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t)

价值升华

回到小镇夜市,老周的“策略梯度”秘籍不仅解决了自家夜市的难题,还传遍了全国,甚至改变了整个美食行业。故事背后的数学原理——策略梯度定理,其价值远远超越夜市经营。它是现代深度强化学习的理论基石,深刻影响了人工智能的多个前沿领域。

当我们把视野从夜市放到整个 AI 世界:策略梯度定理是深度强化学习中最核心、最活跃的分支之一。它的魔力在于——绕开对“世界模型”的精确建模,直接从交互数据中优化策略本身。这种“端到端”的学习方式(从原始输入到动作输出),克服了传统方法在高维连续空间中的维数灾难,使得 AI 能够完成人形机器人行走、无人机编队飞行、AlphaGo 击败人类棋手等壮举。

近年来,策略梯度定理的应用进一步外溢到大型语言模型的对齐中。ChatGPT 等大模型用的“基于人类反馈的强化学习”(RLHF)技术,其核心优化器正是 PPO 算法——策略梯度定理家族的一员。换句话说,让 AI 说人话、不说有害内容的背后,就有策略梯度定理在无声地“拧参数”。这就像老周当年根据试吃员的反馈,不断调整“哪个方向做菜概率更高”,只不过现在轮到 AI 根据人类的赋值反馈来调整自己的行为概率。

策略梯度定理的另一个深刻洞察是“概率的世界没有最优解,只有持续改进的解”。老周的策略手册永远在更新,因为夜市的人流、口味、季节都在变。同样,AI 的策略也永远在更新——它不追求“一次定胜负”的完美策略,而是在与环境的持续交互中不断调整、学习和进化。这个思想,正是强化学习区别于监督学习的灵魂所在,也是策略梯度定理留给 AI 从业者最宝贵的精神财富。

AI 应用场景

人形机器人关节控制

阶段:策略优化

解决的问题:人形机器人的关节角度是连续变量(如膝关节弯曲 37.5 度),传统 Q 表方法无法枚举无穷多个角度组合。策略梯度定理通过参数化策略直接输出“每个关节角度的概率分布”,让机器人能在连续动作空间中学习走路、奔跑等复杂运动技能。

具体案例:波士顿动力公司的 Atlas 机器人在后空翻、跑酷等场景中,其运动控制器经过强化学习预训练,策略网络直接输出各关节的目标角度或力矩值,利用 PPO 算法在仿真环境中进行数百万次试错训练,最终迁移到真实机器人。

大型语言模型的 RLHF 对齐

阶段:模型微调(对齐)

解决的问题:预训练语言模型(如 GPT)生成的文本可能包含有害内容。通过人类反馈训练一个“奖励模型”,再用 PPO 算法优化语言模型的生成策略,使模型倾向于生成符合人类偏好的回答。策略梯度定理让模型能够处理“整段文本生成”这种高维序列决策问题。

具体案例:ChatGPT 的训练管线中,RLHF 阶段使用 PPO 算法微调 GPT 模型。策略模型每生成一段回答,奖励模型给出一个打分,PPO 利用策略梯度定理更新模型参数,使高分回答(符合人类偏好)的生成概率上升。这个“根据反馈调整生成概率”的过程,正是策略梯度定理的直接应用。

Python 演示

python72 行
import numpy as npimport gym # 简单的策略网络def policy_forward(x, theta):    h = np.dot(x, theta)              # 线性得分    prob = 1.0 / (1.0 + np.exp(-h))   # sigmoid -> 动作1的概率    return prob def policy_backward(prob, x, action, advantage):    # 对数策略梯度: d/dtheta log pi(a|s) * A    dlog = x * (action - prob)        # 伯努利分布的导数    return dlog * advantage def run_episode(env, theta, render=False):    obs = env.reset()    xs, actions, rewards = [], [], []    total_reward = 0.0    done = False    while not done:        if render:            env.render()        prob = policy_forward(obs, theta)        action = 1 if np.random.uniform() < prob else 0        x = np.append(obs, 1.0)       # 添加偏置项        xs.append(x)        actions.append(action)        obs, reward, done, _ = env.step(action)        rewards.append(reward)        total_reward += reward    return xs, actions, rewards, total_reward def train():    env = gym.make("CartPole-v1")    theta = np.random.randn(5) * 0.1    alpha = 0.01    gamma = 0.99    batch_size = 10    running_reward = 0.0     for episode in range(500):        xs, actions, rewards, total_reward = run_episode(env, theta)        running_reward = 0.05 * total_reward + 0.95 * running_reward         # 计算折扣回报 G_t        G = 0.0        discounted = []        for r in reversed(rewards):            G = r + gamma * G            discounted.insert(0, G)        discounted = np.array(discounted)         # 标准化优势(降方差)        advantages = discounted - np.mean(discounted)        if np.std(discounted) > 1e-8:            advantages /= np.std(discounted)         # 累积梯度        grad = np.zeros_like(theta)        for x, a, adv in zip(xs, actions, advantages):            grad += policy_backward(prob=policy_forward(x, theta),                                    x=x, action=a, advantage=adv)         # 每 batch_size 回合更新一次参数        if episode % batch_size == 0:            theta += alpha * grad / batch_size            print("Episode:", episode, "Reward:", total_reward,                  "Running:", round(running_reward, 2))    env.close() if __name__ == "__main__":    train()
目的:用 REINFORCE 算法训练 CartPole 平衡小车,展示策略梯度定理的完整落地流程——采样轨迹、计算折扣回报、标准化优势、更新策略参数。
  1. prob = 1.0 / (1.0 + np.exp(-h))用 sigmoid 函数把线性得分转换成“向左/向右”的概率
  2. dlog = x * (action - prob)这是伯努利分布对数策略梯度的解析形式,直接对应定理中的 ∇log π
  3. G = r + gamma * G从后往前算折扣回报,越远的奖励折扣越大(gamma=0.99)
  4. advantages = discounted - np.mean(discounted)减去均值作为基准线,降低策略梯度方差
  5. theta += alpha * grad / batch_size沿策略梯度方向更新参数,每 10 个回合取平均更稳定

常见误区

误区“策略梯度定理就是告诉 AI 每个状态下应该选哪个最优动作,就像分类器输出一个最佳标签。”

正解策略梯度定理实际上是在调整“每个动作被选中的概率”,而不是直接选最优动作。它让高回报动作的概率上升、低回报动作的概率下降,但始终保持概率分布的随机性。就像老周调策略手册时,不是把某道菜的概率直接改成 100%,而是从 30% 调到 70%——保持探索的空间。

为何常见:人们容易把强化学习和监督学习混淆,以为策略就是“输入状态、输出唯一动作”的映射。实际上策略是“输入状态、输出动作概率分布”,随机策略在博弈和探索中至关重要。

误区“既然整条轨迹的回报很高,说明轨迹上所有动作都是好动作,都应该增加概率。”

正解策略梯度公式确实会给轨迹上的每个动作乘以同一个总回报,但这只是“粗粒度”的调整方向。REINFORCE 算法确实存在“信用分配”(credit assignment)问题——轨迹中某个动作可能是坏的,但被其他好动作的高回报掩盖了。这也是为什么要引入 Actor-Critic 和优势函数:更精细地判断“每个动作单独贡献了多少”。

为何常见:初学者理解公式时,容易把“乘法”理解为“每个动作独立获得总回报”,而忽略了这是“整条轨迹”的联合调整。

误区“策略梯度定理是更先进的方法,所以策略梯度方法一定比 Q-learning 等值函数方法更强大、更高效。”

正解策略梯度方法擅长连续动作空间和随机策略,但数据效率往往更低(因为只用采样估计,方差大)。值函数方法(如 DQN)在离散动作空间、样本效率方面仍然有优势。工程实践中常用 Actor-Critic 将两者结合——用值函数(评论家)降低策略梯度(演员)的方差,取长补短。

为何常见:人们喜欢比较“谁更好”,但实际上两者是互补的。策略梯度定理的提出不是取代值函数方法,而是填补了值函数方法在连续空间中的空白。

误区“从回报中减去一个基准线 V(s),这会不会让梯度的方向发生变化?那结果不就不准了?”

正解数学上可以严格证明,当基准线只依赖状态 s 而不依赖动作 a 时,减去基准线不会改变梯度的期望值。因为策略梯度对动作的期望值为零:Σ π(a|s)∇log π(a|s)·b(s) = 0。基准线只是改变了梯度的“方差”,让每次采样的结果更稳定,但没有改变“平均方向”。这就像老周改看“超额利润”而不是“绝对利润”——涨跌的方向判断没变,但判断更准了。

为何常见:直觉上“减掉一个数确实会改变结果”,但期望值的线性性和零均值性质使得这个操作在期望层面无影响。需要一定的数学功底才能理解。

误区“PPO 是完全不同的强化学习算法,和策略梯度定理没多大关系。”

正解PPO 是策略梯度定理家族的直接继承者。它的核心目标函数仍然基于策略梯度定理的公式框架,只是在此基础上加入“裁剪机制”来控制每次更新的步长,防止策略变化过大。TRPO 用 KL 散度约束更新步长,PPO 用裁剪替代,两者都是“策略梯度 + 安全更新”的组合。

为何常见:PPO 在实践中表现得非常好,人们容易把它当作一个独立的“神奇算法”,而忽略了它只是策略梯度思想的一套工程化改进方案。

面试题

Q1. 策略梯度定理的核心思想是?

单选题 · mid

  • A.精确计算每个动作的价值函数
  • B.直接对策略参数求梯度来优化期望回报← 正确答案
  • C.枚举所有可能的状态动作对
  • D.用监督学习训练动作分类器

答案:B。策略梯度定理的核心是直接在策略参数空间中优化期望回报,通过采样估计梯度方向来更新策略参数,而不是像值函数方法那样先精确估计 Q 值(排除 A、C),也不是将问题转化为监督学习(排除 D)。它让高回报轨迹上的动作概率升高、低回报的概率降低,这正是定理的价值所在。

Q2. 相比值函数方法,策略梯度方法的主要优势是?

单选题 · easy

  • A.训练速度一定更快
  • B.不需要奖励信号
  • C.天然支持连续动作空间和随机策略← 正确答案
  • D.不需要与环境交互

答案:C。策略梯度方法直接参数化策略分布,能够输出连续值上的概率分布(如关节角度 37.5°),同时天然支持随机策略(如猜拳时按概率出拳),这两种能力是 Q 表格或 DQN 难以处理的。选项 A 不一定成立(数据效率通常更低),B 和 D 与强化学习的基本设定相悖。

Q3. 在策略梯度定理的推导中,对数导数技巧的作用是?

单选题 · mid

  • A.将连乘变成连加,方便求导← 正确答案
  • B.让梯度值变得更大
  • C.消除所有随机性
  • D.避免使用期望运算

答案:A。轨迹概率是许多项连乘,直接求导非常困难。取对数后,连乘变成连加,∇log P(τ|θ) = Σ∇log π(a_t|s_t),这样每一项只依赖于自己的策略项,便于计算和分析。对数技巧既不是为了放大梯度(B)也不是为了消除随机性(C),期望运算仍然保留(D 错误)。

Q4. 以下哪些方法属于降低策略梯度方差的手段?

多选题 · hard

  • A.引入状态价值函数作为基准线← 正确答案
  • B.使用优势函数替代原始回报← 正确答案
  • C.增大学习率
  • D.增大批次大小(更多采样轨迹)← 正确答案

答案:ABD。基准线 b(s) 利用零均值性质在期望不变的前提下减小方差(A 正确);优势函数 A = Q − V 实际上就是“回报减去基准线”的形式(B 正确);增大批次大小相当于让更多样本参与平均,随机噪声相互抵消(D 正确)。增大学习率是加快更新步伐,与方差无关,反而可能导致震荡(C 错误)。

Q5. REINFORCE 算法更新参数时,需要等到什么时候?

单选题 · mid

  • A.每个时间步结束后立即更新
  • B.完成一整条轨迹(回合)后更新← 正确答案
  • C.收集到足够多的随机种子后更新
  • D.环境模型训练完成后更新

答案:B。REINFORCE 是蒙特卡洛策略梯度方法,它必须等一条完整轨迹结束,才能计算出整条轨迹的总回报 R(τ),然后用这个总回报乘以对数策略梯度来更新参数。因此 A“每个时间步立即更新”错,C 和 D 混淆了其他概念。Actor-Critic 方法才能实现单步更新。

Q6. 引入基准线 b(s) 之后,策略梯度的期望值会?

单选题 · easy

  • A.变大
  • B.变小
  • C.保持不变← 正确答案
  • D.无法确定

答案:C。因为策略梯度的动作期望为零:Σ π(a|s)∇log π(a|s) = 0,所以任何只依赖状态 s 的函数 b(s) 乘以这个梯度后取期望都为零。因此减去基准线在期望层面完全不影响梯度方向,它只改变方差。这是策略梯度定理中一个漂亮而重要的数学性质。

Q7. 关于 PPO 算法的裁剪目标函数,以下说法正确的是?

多选题 · hard

  • A.裁剪操作限制新旧策略的概率比在一定范围内← 正确答案
  • B.裁剪可以完全消除策略梯度的偏差
  • C.裁剪防止单次更新使策略变化过大← 正确答案
  • D.PPO 完全不使用优势函数

答案:AC。PPO 将新旧策略概率比 r(θ) 裁剪到 [1−ε, 1+ε] 区间内(A 正确),目的是防止一次参数更新导致策略“突变”,保证训练稳定性(C 正确)。裁剪控制的是方差和更新幅度,并不能消除偏差(B 错误);PPO 的目标函数依然使用优势函数 Â_t(D 错误)。

Q8. 策略梯度定理中,轨迹的概率分解式不包含以下哪一项?

单选题 · mid

  • A.初始状态分布
  • B.策略概率
  • C.状态转移概率
  • D.学习率大小← 正确答案

答案:D。轨迹概率 P(τ|θ) = d(s₀) × Ππ(a_t|s_t) × ΠP(s_{t+1}|s_t,a_t),由初始状态分布(A)、策略概率(B)和状态转移概率(C)三部分组成。学习率 α 是参数更新时的步长超参数,不属于轨迹概率模型,故选 D。

Q9. “优势函数”A(s,a) 的定义是?

单选题 · easy

  • A.动作值函数减去状态值函数← 正确答案
  • B.状态值函数减去动作值函数
  • C.动作值函数乘以状态值函数
  • D.动作值函数加上状态值函数

答案:A。优势函数 A(s,a) = Q(s,a) − V(s),表示“在状态 s 下选择动作 a 比平均情况好多少”。如果 A > 0,说明这个动作优于平均水平,应该增加其概率;如果 A < 0,说明差于平均水平,应该减少其概率。其他选项的加减乘运算都不符合定义。

Q10. 策略梯度定理对现代大型语言模型(如 ChatGPT)的最重要贡献是?

单选题 · hard

  • A.加速了预训练阶段的数据处理
  • B.支持 RLHF 中对生成策略的优化← 正确答案
  • C.完全替代了监督微调
  • D.降低了推理阶段的算力需求

答案:B。ChatGPT 训练管线中的 RLHF(基于人类反馈的强化学习)微调阶段,常使用 PPO 算法(策略梯度定理家族)来优化语言模型的生成策略——让模型倾向于产生人类评分高的完整回答。预习练仍是监督学习(C 错),策略梯度不用于数据处理和推理加速(A、D 错)。