资讯动态

从REINFORCE到PPO:策略梯度算法的演进与工程实战

发布时间:2026/10/13 6:49:41 来源:尧图企业网站定制
第一次完整读完 PPO 原论文的时候我脑子里冒出来一句话就这一个名字叫“近端策略优化”的算法核心改动居然只是把新旧策略的比值压进一个 clip 区间。对比它前面的 TRPO那些自然梯度、共轭梯度、线搜索、KL 散度约束差不多全都不见了。当时我以为这只是论文作者为了把复杂问题包装得更工程化才硬换了一个更省事的近似处理。没想到几年之后几乎所有主流强化学习库都把 PPO 当成默认基线大模型对齐里最热门的强化学习阶段核心更新规则用的还是它。这篇文章我不想复述论文而是想按一条技术思想史的主线把从 REINFORCE 到自然梯度、保守策略迭代、TRPO再到 PPO 的每一步为什么会出现讲清楚。尤其想解释那个反直觉的结果为什么一堆理论上更严谨的约束优化方案最后在工程上输给了一个朴实无华的 clip如果你刚进强化学习坑这里面有基础推导如果你已经在跑 PPO 代码后面实操部分可能更对胃口。1. 起点REINFORCE 与策略梯度的朴素直觉1.1 REINFORCE 到底在更新什么强化学习的核心问题是找到一个策略 πθ(a|s)使得智能体在环境里累积回报的期望最大化。策略梯度方法最朴素的一支就是 REINFORCE。它的思想特别直白把期望回报 J(θ)E[Σ γᵗ Rₜ] 对参数 θ 求梯度把梯度搬进期望号里用一次对数求导技巧把未知的分布梯度变成可以采样的形式。于是就有了这个著名的更新方向∇θ J(θ) E[ Σₜ ∇θ log πθ(aₜ|sₜ) · R(τ) ]其中 R(τ) 是整条轨迹的回报。实际做的时候智能体跑完一条轨迹算一下这条轨迹的累积回报然后沿着“提高这条轨迹里出现过动作的概率”的方向更新参数。回报高轨迹里的动作概率整体上升回报低整体下降。用大白话说REINFORCE 就像一个只看总分的教练你踢完一整场球教练告诉你赢了还是输了然后让你把这场所有动作都猛练一遍。赢了就全练输了就全不练。这个算法最难得的地方在于概念极其简单强化学习里很多入门教程会拿它当起点因为它把“通过采样估计梯度”这件事讲透了。但它的软肋也正好藏在里面。1.2 REINFORCE 的第一个敌人方差REINFORCE 的梯度估计是无偏的但方差大得离谱。原因是轨迹回报 R(τ) 是一长串随机动作和环境随机性的共同结果就算同一个策略、同一个初始状态跑几条轨迹出来回报可以差出好几个数量级。问题在于一条轨迹里的几十个动作是共同导演了这场回报的你没法知道到底是哪个动作起到决定性作用。用整条轨迹的回报作为所有动作的“功劳”本质上是在用噪声极大的信号去指导更新。这个毛病在连续控制任务里尤其致命。动作空间大、轨迹长、奖励稀疏REINFORCE 经常更新几步以后策略就开始原地打转。你试过几十个随机种子都收不敛时间全耗在等待仿真器跑完轨迹上最后只会得到一个结论朴素策略梯度无法作为通用算法使用方差问题不解决后面都白搭。为了降方差后来的改进路线其实就两板斧。第一板斧是引入基线把 R(τ) 换成 Aₜ R(τ) − b这个 b 通常取状态价值或者一个常数目的是减少无关波动同时保持期望不变第二板斧是把整条轨迹回报换成局部估计用 critic 网络估计状态价值构造出优势函数也就是 Actor-Critic 架构的雏形。这些技巧把方差压低了不少但并没有解决另一个更隐蔽的问题参数更新步长怎么定。1.3 步长问题一个不被重视的隐患把 REINFORCE 换成 Actor-Critic 之后更新公式变成了∇θ J(θ) E[ ∇θ log πθ(aₜ|sₜ) · Aₜ ]这里 Aₜ 是优势估计含义是“这个动作比平均水平好多少”。理论上比原始 REINFORCE 干净很多但实践中仍然有一个让人头疼的点梯度大小在不同样本、不同参数状态下的差异很大你没法用一个固定的学习率稳定走完全程。学习率如果设得大一点策略可能在某个 batch 里剧烈变化动作分布直接变形下一轮采样质量跟着崩学习率设小一点训练又慢得让人怀疑人生。更麻烦的是即使你在参数空间里只走了“同样长度”的欧氏距离策略分布的剧烈程度也可能完全不一样。因为这个原因强化学习界开始意识到更新策略这件事不能只看参数步长得看策略分布本身变化了多少。这就是自然梯度和信任域思想登场的契机。2. 两个关键跃迁自然梯度与信任域思想2.1 为什么“参数变化大”不等于“策略变化大”先想一个问题如果我们把策略参数移动了 0.01策略的行为会变化多少你可能会觉得参数都移动了固定大小策略变化也应该差不多固定。但实际情况不是这样。考虑一个 softmax 策略参数 θ 决定了每个动作的 logit。如果当前 logit 本身就非常确定对某个动作的概率接近 1那么参数稍微变化可能根本不影响输出反过来如果多个动作概率都很接近处于“暧昧”状态参数稍微一动分布可能彻底反转。换句话说参数空间里的欧氏距离根本没有反映出策略分布的真实差异。这个观察指向了一个新的度量方式我们需要在参数更新时考虑新旧策略之间的“信息距离”而信息论里最自然的度量就是 KL 散度。KL 散度不像欧氏距离那样只看参数差它直接计算两个概率分布之间的差异。你更新参数之前可以先算一下新旧策略的 KL 散度如果这个值太大就说明策略改得太激进了。2.2 自然梯度用 Fisher 信息矩阵重定义步长有了 KL 散度这个度量自然梯度的思路就顺理成章了。传统梯度下降是在欧氏空间里走最速下降方向如果我们想知道在“分布空间”里走最速下降方向就需要在更新方向上做修正修正工具就是 Fisher 信息矩阵 F。Fisher 信息矩阵的本质是 KL 散度的局部二阶近似。用数学语言说当新旧策略参数差距很小的时候KL(πθ || πθδ) ≈ (1/2) δᵀ F δ自然梯度方向就是 F⁻¹ ∇L。注意这里不是直接用梯度而是用 Fisher 矩阵的逆去重新标定方向。直观理解是如果某个参数方向对策略分布特别敏感Fisher 矩阵在那个方向的值比较大逆矩阵就会把那个方向的更新分量压小反过来不敏感的方向更新会被放大。这样一来参数空间里的“各向同性”被打破更新方向更贴近策略分布空间的真实几何。自然梯度在理论上很漂亮但实现上需要估计 F而且在参数规模大的时候计算 F 的逆是个噩梦。更重要的是它只保证了局部小步下的 KL 可控更新距离一旦拉大二阶近似就失效了。于是研究者们开始思考能不能直接把 KL 散度作为约束放进优化问题里而不是只依赖局部近似。2.3 信任域给策略更新画一个安全区域信任域的思想听起来有点像“在旧策略附近圈一块地每次只在这块地里找更好的策略”。这里的关键是“信任”两个字我们信任旧策略附近的区域因为当前策略的采样数据在这里是有效的离得太远那些样本估计出来的优势就不再可靠了。把这种思想形式化就得到一类带约束的优化问题最大化 E[ Aₜ ] 约束KL(πθ_old || πθ) ≤ δ这种形式避免了固定学习率的毛病它允许不同阶段采用不同大小的实际步长。如果当前策略分布变化潜力大就在约束允许范围内多走一点如果附近已经没什么提升空间就走小一点。相比按参数范数限制步长的方案这种约束显然更贴近问题的本质。不过引入 KL 约束也带来了新的负担。每次更新都需要检查约束是否满足而真实 KL 散度又没法在每一组参数下都精确解析求解。这里就产出了一系列实现层面的折中方案其中最重要的一个就是 TRPO。3. 保守策略迭代与 TRPO数学上优雅、工程上痛苦的“重武器”3.1 保守策略迭代理论保证的起点在策略梯度方法还靠直觉调参的时代有一类算法试图给“策略更新不会变差”这件事提供理论保证。保守策略迭代的大致思路是不要直接用新策略替换旧策略而是把新旧策略做混合每次只向新策略方向移动一小部分这样即使新策略在某些状态下估计不准混合后的策略也不会比旧策略差太多。为什么这种“保守”是必要的因为策略梯度的目标函数用的是当前策略采样到的优势估计但一旦更新到新策略这些优势估计对应的分布就变了目标函数本身也变了。这有点像你根据别人的推荐去了一家新餐厅但推荐榜单是用老食客的口味做出来的新餐厅是何水平榜单并不能完全算数。所以保守策略迭代选择“小步试探”每一次更新都控制在能证明性能不下降的范围内。这个思路后来启发出一个非常重要的理论工具如果你能在旧策略附近构造一个代理目标函数并且限制新旧策略的 KL 散度那么真实的目标函数提升量就有下界保证。这不再是碰运气而是把“安全更新”变成了一个可证明的、有约束条件的优化问题。TRPO 正是沿着这条路径走出来的。3.2 TRPO 把“约束”摆上桌面TRPO 的目标函数长这样最大化 L(θ) E[ (πθ(aₜ|sₜ) / πθ_old(aₜ|sₜ)) · Aₜ ] 约束E[ KL(πθ_old(·|sₜ) || πθ(·|sₜ)) ] ≤ δ这里核心技巧是把概率比值 rₜ(θ)πθ(aₜ|sₜ)/πθ_old(aₜ|sₜ) 乘上优势 Aₜ构造一个代理目标。当 θ 和 θ_old 差距很小时这个代理目标是真实目标的良好近似当差距增大时误差会变大所以必须用 KL 约束把它关在笼子里。理论上TRPO 的保证比 REINFORCE 和普通 Actor-Critic 强得多。它告诉你可以放心更新只要不越过信任域边界性能大概率不会崩。这个“大概率不会崩”的特性是很多连续控制任务里 TRPO 能稳定工作的核心原因。3.3 TRPO 落地有多痛共轭梯度、线搜索和无数实现细节TRPO 理论很圆满实现起来却是一身冷汗。首先你需要求解带约束优化问题用拉格朗日乘子或者直接投影都行但每一步更新都需要估计 Fisher 信息矩阵。这个矩阵的维度是参数数目乘参数数目随便一个小网络就是几万乘几万直接求逆根本不可能。常见做法是用共轭梯度法求解 F⁻¹g避免显式求逆但共轭梯度本身的迭代次数、停止条件、数值稳定性全是麻烦。其次KL 约束里那个 δ 怎么选选大了约束形同虚设选小了策略每步只能挪一点点训练慢如蜗牛。更麻烦的是同一个 δ 在不同任务上表现差别巨大连续控制要试游戏任务要试换个环境可能又要重新调。最后还有一步线搜索解出的方向要先走一小步如果 KL 超了约束就缩小步长这个过程中需要反复在新旧策略下计算 KL计算开销非常大。我印象里第一次手动实现 TRPO 时踩得最深的坑是 Fisher 矩阵的数值不稳定。不同层梯度量级差很大不做梯度裁剪或者归一化共轭梯度直接发散。后来用上了大量正则化技巧才勉强跑通。这不是 TRPO 本身不行而是它在通用框架下太昂贵了。于是整个领域的注意力逐渐转移到一个问题能不能用更便宜、更简单的方式近似达到信任域的效果4. PPO把整套复杂方案浓缩成一个 Clip4.1 设计动机TRPO 的门槛太高但“约束”这个思想不能丢PPO 的论文标题叫“近端策略优化”听起来像是对 TRPO 的另一次理论升级但实际的核心改动非常朴素。它想保留 TRPO 的最关键直觉——不要让策略在一次更新中偏离太多——但不打算再维护一个严格的 KL 约束也不打算计算 Fisher 矩阵而是直接在代理目标函数上做手脚。设计者盯上了概率比值 rₜ(θ)πθ(aₜ|sₜ)/πθ_old(aₜ|sₜ)。这个比值等于 1 的时候新旧策略在给定状态动作上完全一致大于 1 说明新策略更倾向于采取这个动作小于 1 则相反。TRPO 的风险来自于 rₜ 无限制变大或变小PPO 的做法是把 rₜ 限制在一个区间 [1−ε, 1ε] 内但又不完全砍掉超出部分而是用一个 min 操作把目标函数里的优势方向保护好。这个设计是在告诉你如果某个方向让代理目标变差那我不让你走如果某个方向让代理目标变好我也只让你走到边界为止。对这就是“近端”两个字的含义——我把更新限制在旧策略附近但不通过全局约束而是通过逐样本的 clip 操作实现。4.2 Clip 损失的数学形式和行为拆解PPO-Clip 的目标函数通常写成Lᴸᴵᴾ(θ) E[ min( rₜ(θ)·Aₜ, clip(rₜ(θ), 1−ε, 1ε)·Aₜ ) ]把这个公式拆开看特别有意思。当优势 Aₜ 0 时说明这个动作比平均好我们希望提高它的概率让 rₜ 往大于 1 的方向走。但是 min 操作在这里扮演了刹车角色如果 rₜ 涨到超过 1εclip 项就变成常数 (1ε)·Aₜ而另一项 rₜ·Aₜ 还在继续增长min 会选择较小的 clip 项于是梯度不再鼓励继续涨。换句话说好动作最多提到比值 1ε不许贪心。当优势 Aₜ 0 时我们希望降低这个动作的概率让 rₜ 往小于 1 的方向走。同理min 操作会把 rₜ 限制在 1−ε 以下继续下降的空间因为一旦跌破 1−εclip 项变成常数 (1−ε)·Aₜ这时候两个候选值里较小的反而是未 clip 的 rₜ·Aₜ因为 Aₜ 是负数r 继续变小会让 r·A 变大min 会取它但这种情况下优化器本来的目标就是降低 r而 clip 项的常数性保证了超过边界后额外收益消失。最终效果就是坏动作最多压到比值 1−ε不许过度惩罚。这里有一个细节很多人第一次理解时会绕晕为什么用 min而不是直接 clamp 整个目标答案是如果直接用 clamp动作概率无论朝哪个方向都不能越过边界好消息和坏消息都被卡死这会过度限制策略的更新自由度。而 min 操作允许了“单边限制”——只限制那些优化器正在追求的方向反方向如果让目标变小优化器本来就不会去走所以不需要另外限制。这个不对称设计比简单的 clamp 聪明得多。4.3 一个可以直接跑起来的 PyTorch 实现片段我在项目里写过的 PPO-Clip 核心就那么几行去掉各种调度和日志最终拿得出手的优化器代码大概是这种感觉import torch def ppo_clip_loss( log_probs, # 新策略log πθ(a|s) old_log_probs, # 旧策略采样时保存的 log πθ_old(a|s) advantages, # 归一化后的优势估计 clip_epsilon0.2, ): # 概率比值 ratios torch.exp(log_probs - old_log_probs) # 未 clip 的目标 surr1 ratios * advantages # clip 后的目标 surr2 torch.clamp(ratios, 1.0 - clip_epsilon, 1.0 clip_epsilon) * advantages # 取 min再取负号做梯度下降 loss -torch.min(surr1, surr2).mean() return loss每次更新前你需要保存采样时策略的 log_probs也就是 old_log_probs。这个保存动作等同于 TRPO 里“旧策略”的概念。更新时把当前策略的 log_probs 重新算一遍两者相减取指数得到每个样本的比值。然后按照上面说的规则组合成最终 loss。整套流程没有任何 Fisher 矩阵、没有共轭梯度、没有线搜索、没有 KL 约束求解器。你只需要一个普通的 Adam 优化器对 loss 做常规反向传播。这也是 PPO 能在几十行代码内跑通、能轻松塞进并行框架里的根本原因。4.4 为什么 Clip 在经验上经常反超 TRPO从理论上讲TRPO 带一个严格 KL 约束听起来应该比 PPO 的近似约束更可靠为什么实际效果反而不如我个人的理解是理论极值带不来工程鲁棒性ERPO 的约束依赖高阶近似一旦 Fisher 矩阵估计偏了线搜索和共轭梯度的误差累积起来反而让策略更新变得不可预测。PPO 的 clip 则恰好相反它不追求全局 KL 约束的精确满足而是用一个局部、逐样本的硬边界约束概率比值。这个边界虽然不能精确控制 KL 散度但它在绝大多数时候能防止策略分布出现极端突变。更重要的是PPO 的每一步更新都很便宜你可以在每个 batch 里多做几次迭代相当于用“更多小额更新”换取了“无法精确约束”的代价。实践里这种探索方式往往更稳。还有一个一直被低估的点PPO 对超参数的鲁棒性比 TRPO 好。TRPO 对约束阈值 δ 和线搜索参数非常敏感换个任务就要重新调而 PPO 里默认 clip_epsilon0.2 几乎通吃配合 Adam 的学习率默认值在很多任务上都能直接跑出还可以的效果。这个“省心”特性是它成为各种强化学习库默认选项的关键。4.5 PPO 的进阶GAE 优势估计、KL-Penalty 变体与超参数PPO 论文实际提出了两个变体一个是我们常说的 PPO-Clip另一个是 PPO-Penalty。后者保留了一个自适应权重的 KL 惩罚项目标函数长这样L E[ rₜ·Aₜ ] − β·KL(πθ_old || πθ)β 会根据当前 KL 是否超出目标范围自动调整。它的思想更接近 TRPO但实现上也避开了 Fisher 矩阵。只是实践中 PPO-Clip 更简单也更常用所以绝大多数库默认实现都选它。另一个关键的配套组件是 GAE广义优势估计。PPO 通常不直接用单步 TD 误差而是使用带 λ 参数的优势估计Aₜ δₜ (γλ)δₜ₊₁ (γλ)²δₜ₊₂ ...GAE 的作用是在偏差和方差之间做一个滑动权衡λ 越小优势估计越偏近单步估计方差小但偏差大λ 越大越接近蒙特卡洛回报偏差小但方差大。连续控制任务里 λ 一般在 0.95 附近游戏类任务我会偏向 0.97 左右。PPO 本身负责“别让策略跑飞”GAE 负责“给出相对稳定的优势信号”两者组合起来才是完整的算法。超参数方面我常用的默认设置是Actor 和 Critic 共享一个网络时学习率 3e-4每轮采集一定 batch 的数据后进行 3-4 个 epoch 的 mini-batch 更新clip_epsilon 初始 0.2如果训练后期想精细调整可以线性衰减到 0.05 甚至更低。不过设置永远是起点真正的工作要留到调试阶段。5. PPO 在大模型强化学习中的特殊地位5.1 大模型对齐为什么绕不开 PPO大模型聊强化学习最常被提到的场景是“人类反馈的强化学习”RLHF。这个流程的基本结构是先有一个预训练模型再收集人类偏好数据训练奖励模型最后用强化学习算法微调策略模型让它在给定 prompt 下生成能获得高奖励的文本。你去看现在各类大模型对齐代码会发现很多库的 RL 核心部分依然是 PPO而不是 TRPO。原因和传统 RL 领域一致甚至更明显。大模型参数量动辄几十亿上百亿TRPO 需要构造 Fisher 矩阵对应的巨大计算量基本上是白日做梦PPO 只需要额外保存一份旧策略的 log_probs计算开销和普通策略梯度更新相当这一点在超大模型场景下是决定性的。另外大模型生成的文本是离散 token 序列每个 token 的选择就是一个动作整句生成是典型的长序列决策问题。PPO 的 clip 机制能在每个 token 级别上限制策略变化不会因为某个 token 的奖励异常就把整个模型生成分布带偏。这种“逐 token 的稳定约束”在处理长序列时远比全局 KL 约束来得友好。5.2 大模型版 PPO 的独特工程结构大模型场景下的 PPO和我上面写的连续控制版本长得不太一样。最核心的是增加了几个辅助模型。第一个是参考模型Reference Model它不参与更新只用来计算当前策略和初始策略之间的 KL 散度第二个是奖励模型Reward Model它对每个 prompt 的最终回答给一个标量分第三个就是当前正在训练的 Actor/Policy 模型。更新时PPO 的目标函数除了 clip 项之外通常还要加上一个基于参考模型的 KL 惩罚项。这个 KL 惩罚的目的不是限制更新步长而是保持模型输出和原始分布不要偏离太远防止奖励模型上的过度优化导致生成文本退化。所以在实际大模型代码里你会看到两种“KL”同时存在一种来自 PPO 理论中的信任域传统但被 clip 替代了另一种是作为一个正则项直接加在 loss 里专门控制模型输出多样性。工程实现上大模型 PPO 还会遇到几个特有现象训练时需要同时加载策略模型、参考模型、奖励模型显存开销很大于是出现了参数冻结、LoRA 微调这些轻量化实践rollout 阶段由策略模型生成序列这个过程和更新阶段往往需要异步流水线来处理奖励和优势估计是在整个序列层面计算然后再分配到每个 token。这些细节让大模型 PPO 变成一个复杂的分布式系统但核心更新规则仍然是那个简单的 clip loss。5.3 当 DPO 出现后PPO 还香吗兴起了一批称为 DPO 的替代方案。DPO 的思路是绕开显式的奖励模型和策略梯度直接把偏好数据转成一个带隐式奖励的损失函数用类似监督学习的方式微调模型。从工程角度看DPO 显著简化了训练流程因为它不需要在线采样也不需要在训练时维护参考模型和奖励模型的多模型结构训练稳定性和资源消耗都要友好很多。那 PPO 是不是该被淘汰了我个人不这么看。DPO 省掉了在线采样但也放弃了在线探索的能力。当模型遇到分布外 prompt或者当偏好信息需要动态更新时基于高线数据的 DPO 很难主动收集新的反馈信号。PPO 仍然可以在线生成新的响应、和奖励模型交互、根据反馈持续优化这种闭环能力是 DPO 这类基于固定偏好数据的方法无法替代的。实际上不少团队在流程中仍然是先用 DPO 做一轮高效微调再用 PPO 做精细化在线优化。PPO 没有成为过去式只是不再独占整个舞台。6. 实战视角训练 PPO 时最容易踩的坑与排查清单6.1 症状NaN、熵坍塌、性能突然崩盘我训练 PPO 踩过的坑按出现频率排个序最先要提的是 NaN。强化学习训练到一半 loss 变成 NaN大多数情况不是模型断崖爆炸而是优势值或概率比值溢出。常见原因包括 reward 归一化没做好、回报方差太大、log_probs 数值不稳定。解决思路是先检查 advantage 统计量再做 clip 而不是直接让极端值混入梯度。第二个高频问题是熵坍塌。策略网络在训练几十万步之后动作分布变得非常尖锐熵趋近于零意味着模型几乎不再探索。这种情况通常和 PPO 的 KL 约束失效或者学习率偏大有关。解决办法包括加熵正则项、降低学习率、减小 clip_epsilon或者回到 GAE 的 λ 参数调整上寻找更稳定的优势估计。第三种现象是性能突然崩盘明明曲线一直在涨某一次更新后 reward 直接跌穿地板。我之前排查过一个案例最后发现是 mini-batch 里优势估计没有做标准化个别极端大优势样本主导了更新方向。把 advantage 做 mean-std 归一化之后问题就消失了。这在很多高性能实现里是默认操作但自己写代码时非常容易漏。6.2 一个按症状排查的速查表症状可能原因排查方向loss 出现 NaNadvantage 值爆炸 / 概率比值溢出检查 reward 绝对值、做 advantage 归一化、加梯度裁剪熵快速降到接近 0学习率过大 / clip 约束过弱 / 强化项缺失降低学习率、减小 clip_epsilon、加熵正则性能先涨后崩单 batch 优势方差过大做 advantage 标准化、调整 GAE λ、增大 batch新旧策略 KL 散度过大clip 没起到应有作用 / 更新轮数太多缩小 clip_epsilon、减少每 batch 的 epoch 数收敛极慢优势估计噪声大 / reward 稀疏调整 λ 靠近 1、优化 reward shaping训练曲线抖动剧烈学习率过高 / 样本效率低降低学习率、增大采样 batch、检查随机种子这张表是我在实际项目里慢慢攒出来的具体参数还需要你在自己任务上重新试但排查顺序通常是从数值稳定性开始再看策略多样性最后才考虑超参数微调。6.3 超参数选择与调试心得如果让我给一个刚接触 PPO 的团队提建议我最想说的是先把 GAE 和 advantage 归一化写对再动 clip。很多人一开始盯着 clip_epsilon 调但大部分问题出在优势估计上。优势估计不准clip 再严格也只是在错误的信号上划边界。另一个心得是训练过程中要盯三个量新旧策略 KL 散度、clip 比例被 clip 的样本占比、熵值。clip 比例太高说明大多数样本都被边界卡住策略更新效率低比例接近 0 说明 clip 没起作用策略可能已经跑飞。合理的区间一般在 10% 到 30% 之间。但注意这个数值受任务和优化器影响不能机械套用它是一个重要的观察窗口不是硬性指标。最后是学习率和 clip_epsilon 的联动关系。如果你把学习率调大clip_epsilon 最好也相应调大一点否则策略很难跨出信任域如果你把学习率调小clip_epsilon 太宽就会导致很多样本更新方向被极端值主导。我常用的做法是先用保守的 lr3e-4、clip0.2、λ0.95 跑通基线再根据 KL 散度和 clip 比例做单变量调整。每改动一个超参数至少看三次独立随机种子的平均曲线强化学习本身随机性很大单次实验的结论非常容易误导人。我个人的体会是PPO 能赢下这场思想竞争不是因为它的数学最优雅而是因为它提供了一个极其合理的工程折中方案。TRPO 把问题定义得很严格但在真实环境中处处需要近似PPO 干脆放弃了对精确约束的执念转而设计了一个廉价的代理目标反而把算法变成了一个稳定、可复现、容易嵌入大规模系统的工具箱。后来大模型对齐重新让 PPO 站上舞台中央本质上也是同样的原因在几十亿参数面前一个不需要求逆矩阵、不需要精确估计 KL、只需要保存旧动作概率的更新方式天然就是那个能搬到工程流水线里的答案。从那以后我在设计自己的算法时也有了一个习惯如果一个复杂方案里某个环节需要精确计算才能保证效果我会先问自己能不能在效果损失不大的前提下把这个环节替换成一个便宜、稳定的近似答案经常是能且训练时间省一大截。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑