从前有个年轻厨师小明,想学做一道拿手好汤。他不懂菜谱,唯一的办法是“尝一口,然后凭感觉加料”——觉得淡了加盐,觉得不够酸加醋。这叫策略梯度:根据结果的好坏,调整下一次的配方。但问题很快来了:他经常手一抖加过头,或者因为当天买的番茄格外酸,误判了“加醋”的效果——每次改动幅度太大,汤的味道就忽咸忽淡。后来老师傅教他第一招:“调整前先量一量新旧配方在口味上的距离,太远了不许动。”这就是 TRPO 的信赖域。小明嫌测量麻烦,自己发明了第二招:“任何调料一次最多改两成,超出就按两成算。”这就是 PPO 的裁剪。再后来,一位用仪器的师兄来了,他用一台“口味距离仪”精确校正方向,还巧妙地把大计算拆成小块——这就是 ACKTR。三招殊途同归,都是为了让“凭感觉调汤”这件事不翻车。这篇文章就带你拆解这三招的原理、取舍与工程落地。
对 AI 从业者来说,PPO/TRPO/ACKTR 是深度强化学习从理论走向工程的分水岭。读懂它们,你就拿到了阅读 RLHF、机器人控制、游戏 AI 等主流应用论文的入场券,也握住了面试中绕不开的高频考点。
可视化演示
展示Policy Gradient策略更新过程,以及PPO/TRPO/ACKTR三种算法的约束机制对比。
本节配有交互动效(进入视口后自动加载,约 3KB)。
策略梯度更新流程 策略网络:参数theta沿梯度方向更新 优势函数:A(s,a)加权梯度方向 目标函数:最大化期望回报J(theta) ∇J = E[∇log π(a|s) * A] 策略梯度通过采样估计梯度方向
策略梯度溯源
小厨师第一次学调汤,没有菜谱,唯一的办法是“尝一口,然后凭感觉往一个方向加料”。觉得不够酸就加醋,觉得不够咸就加盐——他是在根据“这口汤好不好喝”来调整下一次的配方。每一次调整的本质,都是让“带来好味道的动作”更容易再次出现。可是整局汤的好坏往往到喝完才知道,他常常已经忘了是哪一勺起了作用,只能把所有步骤都归功或归罪于最后一次加料——这就是“信用分配”难题的雏形。
在强化学习里,这个“凭感觉加料”的过程就是策略梯度。策略网络 π_θ 负责在状态 s 下输出选动作 a 的概率;我们希望调整参数 θ,让整局游戏累积回报的期望 J(θ) 变大。问题的核心变成:J(θ) 关于 θ 的梯度到底怎么算?幸运的是,通过 log 技巧,梯度可以写成一条轨迹上的累加:每一步用 log π_θ(a_t|s_t) 的梯度指明“增大这个动作概率”的方向,再用这一整局的累计回报 R_t 给这个方向打分。期望符号意味着我们不需要解析求积分,只要反复采样轨迹求平均就能估计梯度——这就是强化学习“从经验中学习”的根本原因。
直觉上,这就像小明在厨房里做了很多锅汤,把“加盐后这锅好喝”的样品挑出来,统计一下这些好汤共性是什么,然后往那个共性方向调整。为了降低单锅汤随机性的干扰,他还会先减掉一个“平均口味基线”再判断——对应强化学习里的基线减方差技巧:用状态价值 V(s) 作为基线,把回报换成优势函数 A_t,梯度方差立刻小很多。这个细节听起来平淡,却是后面 TRPO/PPO 全部故事的起点。
小明很快发现,这个笨办法有个致命问题:一次手抖、一次番茄买酸了,“尝到的味道好坏”都混着随机噪声,梯度方向忽左忽右,参数抖得厉害——这就是高方差。于是老师傅开始教他如何把步子迈得稳一些。
- 期望记号遍历由策略 π_θ 产生的整局轨迹 τ,把所有可能的情况取平均。
- 打分函数梯度∇_θ log π_θ(a_t|s_t) 指向“增大这个动作概率”的方向,是策略更新的方向盘。
- 累计回报R_t 是这一步之后直到终局的折扣回报总和,负责给方向打分。
- 逐步累加把每个时间步的“方向 × 回报”加起来,合成最终参数更新的总方向。
TRPO信赖域
老师傅对小明说:“你每次调整配方,不能想加多少就加多少。旧配方约等于你现有的经验,新配方是你打算验证的假设;如果新旧差得太远,你拿旧配方判断'好不好喝'的直觉就完全失效了。所以每次调整必须限定在一个'信赖域'里——只有在这个范围里,你对味道变化的预测才靠得住。”这句话,正是 TRPO(Trust Region Policy Optimization)的全部哲学。
TRPO 把这个直觉数学化了。它有两个组成部分:一个是“代理目标函数”,用旧策略采到的数据估算“如果换成新策略,汤的期望好喝程度会怎么变”;另一个是“硬约束”,要求新旧策略的动作分布之间的 KL 散度不超过一个很小的 δ。注意 KL 散度不是参数坐标上的直线距离,而是两个概率分布之间差异的度量——就好比“十克盐”在不同容量的汤里造成的口味变化完全不同,KL 衡量的是口味层面的真实差异,而不是加了十克还是十五克的数字差。
代理目标里出现了新旧概率的比值 π_θ/π_θ_old,这是重要性采样:小明用旧配方的观测数据,来估计新配方取值下的期望。只要约束住 KL 不超过上限,这个估计就是可信的,这就是论文中“单调改进”理论保障的直觉来源。整个问题是一个带约束的不等式优化,原论文没有直接求 Hessian 逆矩阵,而是用共轭梯度法去解“Fisher 信息矩阵 × 搜索方向 = 梯度”这个线性方程,把每次更新的计算成本压到了实用范围。
老师傅的规矩保证了策略的单调改进:每一步都在信赖域内,策略不会突然崩塌。但代价是计算麻烦——每次更新都要解一个约束优化问题。小明学到了理念,却忍不住盘算:能不能偷个懒?
- 重要性采样比用旧策略采的数据乘上概率比 r_t(θ),就能无偏估计新策略的期望。
- 优势函数A(s,a)=Q(s,a)−V(s),衡量这个动作比平均水平好多少,是“这勺加料到底值不值”的依据。
- KL 散度衡量新旧策略在动作分布上的差距,是信赖域的半径定义。
- 硬约束严格限制 KL 不超过 δ,只在旧策略附近的可信区域里优化。
PPO裁剪艺术
小明灵机一动:“既然核心是'不许走太远',何必每次都量 KL 那么麻烦?干脆直接规定:任何一样调料,一次最多调整两成,超过就按两成算。”这就是“裁剪”——用一把简单粗暴的标尺,替代精密复杂的测量仪。PPO(Proximal Policy Optimization)正是把 TRPO 的硬约束换成了一颗“裁剪胶囊”。
PPO 仍然使用概率比 r_t(θ),但一旦 r_t 超出 [1−ε, 1+ε] 这个区间,它就把对应样本对目标的贡献钉死在裁剪值上。这样做的好处是:不再需要解带约束的优化问题,只需要普通的一阶梯度上升。原本 TRPO 要反复做的共轭梯度迭代,在 PPO 里被一次 min 运算取代。这使得 PPO 在代码量、调试难度和单步计算开销上都比 TRPO 友好一个量级。
公式里 min 的双保险值得细品:当优势 A_t > 0(这步是好动作),就算旧数据高呼“你还能再好一点”,目标也最多算到 (1+ε)·A_t;当优势 A_t < 0(这步是坏动作),即便概率比小得离谱,惩罚也照样按裁剪后的值执行。于是策略永远不敢把步子迈出 "1±ε" 的界限。早期的 PPO-Penalty 变体则保留 KL 项作为惩罚而非硬约束,后来被证明不如裁剪版本稳定,所以工程上默认的 PPO 几乎都是 Clip 版本。ε=0.2 是第一作者给出的默认标尺,大多数任务不需要改动。
有了这把两成标尺,小明终于把“调汤”变成了一套可以稳定复制的流程,靠它把汤越调越顺——正如 PPO 凭借工程简洁性成为如今深度强化学习框架里默认的基本功。
- 概率比新旧策略选中同一动作的概率之比,是重要性采样的核心。
- 裁剪函数把比值强制限制在 [1−ε, 1+ε] 区间内。
- min 保守在“原目标值”和“裁剪目标值”之间取小者,让激进更新自动失效。
- ε 标尺默认取 0.2,相当于“任何一次调料最多改两成”。
ACKTR自然梯度
厨房里来了位用仪器的师兄,一眼看出了小明们的盲区:“你们只知道往哪个方向加料汤会变好,却不知道加多少才算合适。同样的十克盐,放进十升汤和放进一小碗蘸水里,效果天差地别。在参数空间走一步,在分布空间可能走了十步,也可能半步都没走。”这个问题,普通策略梯度从不回答,而自然梯度就是那把“自带刻度的勺子”。
师兄的仪器叫自然梯度:用 Fisher 信息矩阵 F 来衡量参数空间中每个方向对“策略分布”的真实影响,再用 F 的逆把朴素梯度校正成“在分布空间中走最短捷径”的方向。直觉上,相当于在每个参数旁边装一把专属的尺子——尺子会告诉你,这个方向走多远,在口味上才等于那个方向走多远。经过校正后的方向,对参数尺度不敏感,对网络结构也不敏感,因此训练更稳、样本效率更高。
但麻烦随之而来:F 是“参数个数 × 参数个数”的矩阵。百万参数的网络,F 有万亿个元素,求逆几乎不可能。师兄的解法叫 Kronecker 因子分解(Kronecker Factorization):把 F 近似拆成两个尺寸小得多的矩阵 A 和 B 的克罗内克积 F ≈ A ⊗ B,再利用 (A⊗B)⁻¹ = A⁻¹ ⊗ B⁻¹ 的性质,把求逆成本从立方级降下来。这就是 ACKTR(Actor-Critic using Kronecker-Factored Trust Region)的核心加速:它把二阶优化的优雅与可计算性同时握在手里。
仪器虽好,可又重又贵。师兄每次测量都要额外维护一套矩阵,小明偷偷对比了一下,发现大多数时候自己的两成标尺已经够用——于是 ACKTR 成了学术界的优雅利器,而 PPO 依然是工程界的主力军。
- 普通梯度的局限只给出参数坐标下的最陡方向,忽略参数的尺度差异。
- Fisher 信息矩阵对梯度方向做“分布尺度”的校正,是自然梯度的核心。
- 矩阵求逆的代价参数为 n 时求逆约 O(n³),百万参数直接不可行。
- Kronecker 分解把大矩阵拆成两个小矩阵的克罗内克积,大幅降低求逆成本。
三方对比选型
三种招式放在同一张砧板上:TRPO 是精密的规矩,PPO 是省事的标尺,ACKTR 是精密的仪器。它们的共同点是在回答同一个问题——“这一次更新,我到底敢走多远?”——但答案的姿势各不相同。TRPO 用二阶信息构造 KL 硬约束,保证每一步都稳;PPO 用一阶裁剪近似这个约束,牺牲理论严格性换取实用性;ACKTR 用 Fisher 矩阵把更新方向从参数空间搬到分布空间,在那里走出一段更“自然”的步。
从更新公式看,三者的分工一目了然:TRPO 是带约束的优化问题,需要反复求解;PPO 是逐样本的裁剪目标,一句话就能写进损失函数;ACKTR 则是“梯度前面乘一个近似逆矩阵”的更新法则。计算复杂度也由此拉开:普通策略梯度 O(n);PPO 保持一阶的 O(n),只多一次裁剪判断;TRPO 每次更新要跑几十次共轭梯度矩阵向量乘;ACKTR 必须为两层网络各维护一对 Kronecker 因子,单步计算和内存开销都更重。
样本效率恰好反过来:TRPO/ACKTR 对单位样本的信息利用更充分,理论上可以用更少的游戏数据达到同样的效果;PPO 则靠“小步多走”把差距追回来——它牺牲了一些单步信息效率,换来了每秒更多次更新的工程速度。因此选型口诀很直白:数据稀缺、算力充足、追求稳,选 TRPO;数据好采、工程要快,选 PPO;想研究二阶方法、探索样本效率上限,看 ACKTR。大多数商业项目最终落在 PPO 上,这也解释了为什么它是现代强化学习框架的标配。
老汤匠们常说:选锅具要看灶台,选算法要看项目。TRPO 给你安全感,PPO 给你效率,ACKTR 给你视野——真正的高手不是只会一种配方,而是知道什么时候该用哪一招。
- TRPO 硬约束在 KL≤δ 的可行域里优化代理目标,理论漂亮但每步昂贵。
- PPO 裁剪替代用逐样本 clip 把走太远的项钉死,一阶优化即可完成。
- ACKTR 二阶方向用 F⁻¹ 校正梯度,逼近“分布空间中的最速下降”。
- 共同的底线三者殊途同归,都在限制新旧策略的差距,保证旧数据的估计依然有效。
工程实战指南
好菜谱不等于好厨房。小明学会三招后,第一次上正式灶台依然手忙脚乱:要么更新太猛汤全毁了,要么调半天毫无进步。老师傅递给他一张“灶台检查单”:火候、翻勺时机、尝汤方法,每一环都得有章法。强化学习工程也一样——算法只是骨架,监控与调参才是灵魂。
训练中最重要的是盯住“新旧策略差距”这两个仪表盘:一是 KL 散度,二是被裁剪样本的比例。PPO 每轮更新后都打印 KL:如果 KL 突然冲到 0.01~0.03 以上,说明这一步走太远,该减小学习率或提前结束本轮更新;如果被裁剪的样本超过总量的 20%~30%,同样说明步子迈大了。这两个指标比训练曲线更早暴露问题,是判断“翻没翻车”最快的温度计。
另一个高频坑是优势估计不稳定。在奖励尺度飘忽的任务里,先把每个 batch 的优势函数做归一化(减均值、除标准差),再送进裁剪目标;同时配合熵正则项,防止策略过早“固执”在一小片动作上。分布式场景下,用多个环境并行采样喂给同一个 PPO 更新器,能大幅提高数据吞吐,但要注意各 worker 的旧策略必须一致,否则比率 r_t 就失去意义。调参优先级上,ε 一般固定 0.2,优先调学习率和 batch size,比乱动裁剪值安全得多。
师傅最后总结:调汤的秘诀从来不只是“怎么改配方”,还包括你什么时候看锅、怎么尝味道。同样,PPO/TRPO/ACKTR 只是策略更新的骨架,真正决定上线效果的,是你在工程里对 KL、裁剪率、优势信号那些细节的用心。
- 概率比定义r_t 衡量新旧策略选中同一动作的差距,是裁剪目标的输入。
- KL 滚动均值对所有状态的分布差异取平均,超过阈值就触发早停。
- 优势归一化把优势函数标准化,让不同任务、不同奖励尺度可比。
- 熵正则给目标加上策略熵项,鼓励探索,防止过早收敛到次优解。
AI 应用场景
LLM 的 RLHF 对齐
阶段:训练后对齐(Post-training Alignment)
解决的问题:传统 SFT 只是让模型模仿人类回答,无法直接优化“人类更偏好哪条回答”这种不可微的目标。用 PPO 把语言生成看作一个强化学习环境:奖励模型给每句回答打分,PPO 用裁剪目标稳定更新生成策略,防止一次更新把模型“改坏”——这正是厨师小明“每次最多改两成”的数字化身。
具体案例:OpenAI 在 InstructGPT / ChatGPT 的训练管线中,先训练奖励模型,再用 PPO 对 GPT 模型做 RLHF 微调,使回答更符合人类偏好,同时避免模型在优化奖励时产生胡言乱语的“奖励黑客”行为。
机器人运动控制
阶段:策略学习与仿真迁移(Sim-to-Real)
解决的问题:机器人在真实环境里试错成本极高,一步摔倒就可能损坏硬件。工程上先在仿真环境里用 PPO 训练步态策略,把“走得稳不稳、能耗高不高”设计成奖励,裁剪目标保证策略平滑改进,避免仿真里的小误差被放大成真实世界的崩溃。
具体案例:四足机器人(如 MIT Cheetah 系列)用 PPO 类算法训练奔跑、跳跃步态,再通过领域随机化迁移到真机。仿真里“每次只改两成”的保守更新,正是真实世界安全性的来源。
在线推荐排序
阶段:在线策略优化(Online Learning)
解决的问题:推荐系统要以点击率、观看时长等用户反馈为奖励,实时调整排序策略。如果用朴素策略梯度,单日用户行为的随机波动会让排序策略剧烈抖动,直接影响线上收入。PPO 的限制更新让策略每个版本只比上一个版本“前进一小步”,既探索了新排序方式,又把流量波动压到可控范围。
具体案例:视频平台在候选视频重排序阶段用强化学习,以用户时长为奖励,结合 PPO 的 KL 监控与裁剪率告警,在探索与稳定之间取得了工程上可接受的平衡。
Python 演示
import numpy as np # ---------- 玩具环境: 根据状态选最优动作 ----------# 状态 s 均匀分布在 [0,1), 最优动作: s<0.5 选 0, 否则选 1np.random.seed(42)N = 400states = np.random.rand(N, 1)labels = (states[:, 0] < 0.5).astype(int) # ---------- 线性 softmax 策略 ----------def policy_probs(states, w): z = states @ w z -= z.max(axis=1, keepdims=True) # softmax 数值稳定 e = np.exp(z) return e / e.sum(axis=1, keepdims=True) def collect_actions(states, w, rng): p = policy_probs(states, w) return np.array([rng.choice(2, p=pp) for pp in p]) # ---------- PPO 裁剪目标与监控指标 ----------def ppo_loss(w, states, actions, advantages, old_probs, eps=0.2): new_probs = policy_probs(states, w) idx = np.arange(len(actions)) ratio = new_probs[idx, actions] / (old_probs[idx, actions] + 1e-12) clipped = np.clip(ratio, 1 - eps, 1 + eps) return -np.mean(np.minimum(ratio * advantages, clipped * advantages)) def kl_between(old_probs, new_probs): return float(np.mean(np.sum( old_probs * (np.log(old_probs + 1e-12) - np.log(new_probs + 1e-12)), axis=1))) # ---------- 数值梯度 (参数只有 2 个, 教学演示足够便宜) ----------def numeric_grad(w, states, actions, advantages, old_probs): h = 1e-6 grad = np.zeros_like(w) for i in range(w.shape[0]): for j in range(w.shape[1]): wp = w.copy() wp[i, j] += h wm = w.copy() wm[i, j] -= h grad[i, j] = (ppo_loss(wp, states, actions, advantages, old_probs) - ppo_loss(wm, states, actions, advantages, old_probs)) / (2 * h) return grad # ---------- 主训练循环: PPO 风格 ----------def main(): rng = np.random.default_rng(0) w = np.zeros((1, 2)) for epoch in range(30): actions = collect_actions(states, w, rng) advantages = np.where(actions == labels, 0.5, -0.5).astype(float) old_probs = policy_probs(states, w).copy() for _ in range(3): g = numeric_grad(w, states, actions, advantages, old_probs) w -= 0.5 * g kl = kl_between(old_probs, policy_probs(states, w)) acc = np.mean(collect_actions(states, w, rng) == labels) print('epoch %2d KL=%7.4f acc=%.2f' % (epoch, kl, acc)) if __name__ == '__main__': main()
ratio = new_probs[idx, actions] / (old_probs[idx, actions] + 1e-12)PPO 的核心:新旧策略概率比 r_t,用旧数据估计新策略。clipped = np.clip(ratio, 1 - eps, 1 + eps)两成标尺:任何比值超出 [0.8, 1.2] 一律按边界算。return -np.mean(np.minimum(ratio * advantages, clipped * advantages))负号把“最大化代理目标”变成“最小化损失”,min 保证激进更新自动失效。advantages = np.where(actions == labels, 0.5, -0.5).astype(float)玩具环境的优势函数:做对 +0.5,做错 −0.5。w -= 0.5 * g对裁剪损失做梯度下降,等价于对代理目标做梯度上升。kl = kl_between(old_probs, policy_probs(states, w))工程实战里那支“温度计”:每轮报告新旧策略差异。
常见误区
误区我一直觉得 PPO 的 clip 是把参数更新的步长直接截断,比如学习率乘以 0.2,防止梯度爆炸。
正解裁剪针对的是“新旧策略概率比 r_t(θ)”,不是参数向量,也不是梯度。它构造的是一个保守的代理目标:当比值超出 1±ε 时,把该样本对目标的贡献钉在裁剪值上,从而防止“单个样本把策略推太远”。相比之下,学习率调度是全局的、均匀的,而裁剪是逐样本的、自适应的——这正是 PPO 的精细之处。
为何常见:方法名叫“裁剪”,人很容易按字面意思理解成“把更新剪短”,忽略了它作用在概率比上这一关键细节。
误区TRPO 用 KL 约束,应该就是规定新旧参数向量的欧氏距离不超过 δ 吧?那跟设一个小学习率有什么区别?
正解KL 散度约束的是新旧策略的“动作分布”之间的差异,而非参数的欧氏距离。同样的参数变化,在有些状态下可能让动作分布天翻地覆,在另一些状态下却几乎无感。TRPO 正是因为有这层“分布视角”,才能做到“在参数空间走一大步、在分布空间只走一小步”的信任更新,这远比调学习率精细。
为何常见:我们习惯用坐标理解“距离”,容易把参数空间的几何和分布空间的几何混为一谈。
误区PPO 是 TRPO 的升级版,所以用 PPO 一定能得到比 TRPO 更好的训练效果和更高的最终奖励。
正解PPO 不是“更强”,而是“更省事”。它在大多基准上表现与 TRPO 相当,但 TRPO 的硬约束在部分高精度任务上更稳,崩溃风险更低。PPO 的优势在于只用一阶优化、实现简单、单步计算快,所以工程上更普及——“应用最广”不等于“性能最优”。
为何常见:看到 PPO 论文引用量高、库默认支持,就默认它是 TRPO 的严格改进,忽略了两者其实是“约束实现方式”的不同选择。
误区ACKTR 用自然梯度,每一步信息利用都更充分,所以训练总时间一定比 PPO 短。
正解单步“质量”高不等于单步“成本”低。ACKTR 要维护并分解 Fisher 信息矩阵,单步开销远高于 PPO 的一次前向反向传播;在小规模任务上,它的样本效率优势不足以弥补计算开销,总训练时间甚至更慢。所谓“效率”要分清楚:样本效率(少用数据)和计算效率(少用算力)是两回事。
为何常见:把二阶方法“信息利用充分”的学术直觉直接迁移到工程时间上,忽略了矩阵分解和求逆的真实成本。
面试题
Q1. PPO 中裁剪目标里的比率 r_t(θ) 表示
- A.新旧策略的概率比值得分← 正确答案
- B.新旧状态价值函数的比值
- C.新旧 Q 函数的差值之比
- D.新旧奖励信号的差值比例
答案:A。r_t = π_θ(a_t|s_t) / π_θ_old(a_t|s_t) 是重要性采样修正,让旧策略采的样本能估算新策略的表现。B、D 描述的都不是策略概率;C 中的 Q 函数是价值函数,与概率比无关。
Q2. TRPO 限制策略更新幅度的核心手段是
- A.限制策略更新的学习率
- B.限制新旧策略的 KL 散度← 正确答案
- C.限制策略网络的隐藏层数
- D.限制奖励信号的数值范围
答案:B。TRPO 的“信赖域”由 KL 散度硬约束刻画:新旧策略的动作分布差距不允许超过 δ。A 是一阶方法常用的近似手段,不是 TRPO 的核心创新;C、D 与策略更新幅度无关。
Q3. 当某样本优势 A>0 且 r_t>1+ε 时,PPO 裁剪目标取值为
- A.r_t 与 A 的乘积,因为优势为正
- B.(1+ε)×A,防止过度信任旧数据← 正确答案
- C.(1−ε)×A,惩罚过大的改动
- D.0,直接丢弃有风险的样本
答案:B。min(r_t·A, clip(r_t)·A) 中,r_t>1+ε 时 clip 值等于 1+ε;A>0 时取两者较小者即 (1+ε)A。用调汤的比喻:这勺盐最多按两成算,不能因为旧数据说“还能更好”就无限加料。
Q4. TRPO 求解带 KL 约束的优化问题时,常用的高效方法是
- A.随机梯度下降
- B.共轭梯度法← 正确答案
- C.模拟退火
- D.遗传算法
答案:B。TRPO 将约束优化转化为“Fisher 信息矩阵 × 方向 = 梯度”的线性方程,用共轭梯度法迭代求解,避免显式构造和求逆大矩阵。A 是一阶更新,C、D 是启发式方法,都无法高效处理 TRPO 的约束结构。
Q5. ACKTR 用 Kronecker 因子分解 Fisher 矩阵,主要目的是
- A.降低矩阵求逆的计算成本← 正确答案
- B.缩小动作空间的采样范围
- C.减少每一局的奖励噪声
- D.增加策略网络的表达能力
答案:A。Kronecker 分解把大 Fisher 矩阵近似拆成两个小矩阵的积,利用 (A⊗B)⁻¹ = A⁻¹⊗B⁻¹ 把求逆成本从 O(n³) 降到两个小矩阵求逆的开销。B、C、D 与矩阵分解无关。
Q6. 策略梯度方法高方差问题的主要来源是
- A.网络参数初始化的随机性
- B.单条采样轨迹的波动较大← 正确答案
- C.学习率被设置得过大
- D.奖励函数存在不连续点
答案:B。策略梯度用蒙特卡洛采样估计期望,单条轨迹里动作选择的随机性直接进入梯度估计,方差自然大。这与初始化、学习率没有本质关系;不连续奖励虽然存在,但并非“高方差”这一经典问题的根源。
Q7. 关于 PPO 与 TRPO 的关系,下列说法正确的是
- A.PPO 是 TRPO 的严格理论加强版
- B.PPO 用裁剪近似实现 KL 约束← 正确答案
- C.TRPO 不需要任何策略约束
- D.PPO 必须使用二阶求导
答案:B。PPO 用逐样本的 clip 替代 TRPO 的 KL 硬约束,是一种工程化的近似,而非理论加强。A 与事实相反;C 与 TRPO 的定义矛盾;D 说反了,PPO 刻意只用一阶优化。
Q8. 下列属于策略梯度家族的方法有
- A.REINFORCE 算法← 正确答案
- B.TRPO 算法← 正确答案
- C.PPO 算法← 正确答案
- D.DQN 算法
答案:ABC。REINFORCE 是最经典的策略梯度算法,TRPO 和 PPO 都在直接优化策略的代理目标,同属策略梯度家族。DQN 是价值迭代方法,通过 Q 函数间接得到策略,不属于策略梯度。
Q9. 关于 ACKTR 自然梯度的特点,正确的有
- A.使用 Fisher 矩阵校正梯度方向← 正确答案
- B.在参数空间里走欧氏捷径
- C.比一阶梯度计算开销更小
- D.用克罗内克分解近似 Fisher 矩阵← 正确答案
答案:AD。自然梯度用 Fisher 矩阵把梯度转到分布空间的度量下校正方向,ACKTR 的工程关键是 Kronecker 分解近似这个大矩阵。B 说反了——自然梯度恰恰是放弃参数空间的欧氏度量;C 也反了,二阶方法单步开销通常更大。
Q10. 训练 PPO 时,若要尽早发现策略更新过猛,可以监控
- A.监控新旧策略的 KL 散度← 正确答案
- B.统计被裁剪样本的占比← 正确答案
- C.查看网络权重是否对称
- D.观察优势分布的均值方差← 正确答案
答案:ABD。KL 散度和裁剪样本占比是“步子迈太大”最直接的两个指标;优势分布异常说明价值估计可能不稳,同样值得警惕。网络权重是否对称与更新幅度无关,属于无意义的监控项。