- on-policy,需大量并行环境
- 稳定性好,调参简单
- 探索靠策略随机性
- 适合大规模仿真训练
- 具身智能首选基线
外观
上篇我们搞定了 MDP 建模、贝尔曼方程、动态规划、MC/TD 和 DQN,这部分的核心问题其实就一个:「怎么评价一个状态或动作的好坏」。一旦我们算出了价值函数,决策逻辑就很简单粗暴了:无论是去查传统的 Q 表,还是通过神经网络(DQN)来预测,策略就是直接选出 Q 值最大(贪心)的那个动作执行。
但到了具身智能的真实场景,这套 Value-based 逻辑就有点使不上劲了。一个 30+ 自由度的人形机器人,每个关节的控制都是连续变量。在这样呈指数级爆炸的动作空间里,寻找全局最优的 argmax 计算成本是灾难性的。你没法建一张 Q 表把所有动作的价值都存下来,也没法在每个时间步都跑一遍 argmax。
所以这一篇换一个思路:不间接地通过值函数推导策略,而是直接学一个端到端的策略网络(Policy Network),这个网络输入状态输出动作。这就是策略梯度(Policy Gradient)方法的核心思想,也是后续 PPO、SAC 这些具身智能主力算法的共同起点。
策略梯度最朴素的想法是:把策略参数化成一个神经网络 πθ(a∣s),然后沿着让好轨迹更可能发生的方向更新参数。
我们采用轨迹的总回报 R(τ) 来定义「好轨迹」。目标函数就是轨迹回报的期望:
J(πθ)=Eτ∼pθ(τ)[R(τ)]
要优化它,就得求梯度 ∇θJ(πθ)。问题来了:轨迹概率 pθ(τ) 是环境转移概率和策略的连乘积,直接求导很麻烦。这时候用到一个经典的 trick 就是对数导数技巧:
∇θpθ(τ)=pθ(τ)∇θlogpθ(τ)
把求导从概率密度本身转移到对数概率密度上。代入之后,环境的状态转移概率 P(s′∣s,a) 因为跟参数 θ 无关,在求导时直接消失。最终得到:
∇θJ(πθ)=Eτ∼pθ(τ)[t=0∑T−1∇θlogπθ(at∣st)R(τ)]
这个结果有一个很重要的推论是:策略梯度不依赖环境模型。你不需要知道状态转移概率,只需要能采样轨迹就行,这就是无模型(model-free)方法的好处。
算法的流程可以描述为:
初始化策略网络
初始化策略网络 πθ(a∣s),随机设置参数 θ。
采样轨迹
使用当前策略与环境交互,采样若干条完整轨迹
τ=(s0,a0,r1,…,sT).
计算回报
对每条轨迹计算累计回报
R(τ)=t=0∑T−1γtrt+1,
或计算每个时刻的回报
Gt=k=t∑T−1γk−trk+1.
估计策略梯度
根据
∇θJ(θ)≈N1i=1∑Nt∑∇θlogπθ(at(i)∣st(i))R(τ(i))
(或使用 Gt 替代 R(τ))计算梯度估计。
更新策略网络
采用梯度上升更新参数:
θ←θ+α∇θJ(θ),
提高高回报动作的概率,降低低回报动作的概率。
重复迭代
使用更新后的策略重新采样轨迹,重复上述过程,直到策略收敛。
机器人控制
机器人控制涉及高维连续动作空间(关节力矩、末端速度等),策略梯度可以直接输出连续值,无需对动作离散化。离散动作空间用 Categorical 分布(Softmax),连续动作空间用高斯分布,均值 μθ(s) 由网络输出,标准差 σ 可固定也可学习。
最基础的 REINFORCE 算法直接用蒙特卡洛采样的回报 Gt 替代 R(τ),简单直观但方差巨大。因为每条轨迹的回报波动很大,同一个动作在一条「运气好」的轨迹里得了高分,在另一条「运气差」的轨迹里得了低分,梯度信号就会非常嘈杂。这就是后续 Actor-Critic 要解决的核心问题。

纯策略梯度的高方差来自一个根本矛盾:用一个轨迹的总回报去评价轨迹中每一个动作。轨迹后期的奖励跟早期的动作可能没什么关系,但 REINFORCE 不分青红皂白地给所有动作都乘上了同样的 Gt。
提示
以老师教育学生为例,学生期末考了 95 分,老师却把这 95 分归功于整个学期的每一个行为:认真听课、回家打游戏、按时写作业都得到相同的评价。实际上,高分未必是所有行为共同造成的,像打游戏这种可能是负面的,但老师无法区分每个行为的真实贡献,只能统一打分。
那么解决思路很自然,别用一条轨迹的总回报,改用每个状态-动作对本身的价值。这就是 Actor-Critic 的分工:

通用的策略梯度形式可以写成:
∇θJ(θ)∝Eπθ[Ψt∇θlogπθ(at∣st)]
其中 Ψt 的不同选择对应不同算法。用轨迹回报 Gt 就是 REINFORCE(高方差),用状态价值 V(st) 就是 Value Actor-Critic(有偏但方差低),用优势函数A(st,at)=Q(st,at)−V(st) 就是 A2C(Advantage Actor Critic)。
优势函数的设计很巧妙:V(st) 是当前状态的「平均表现」,A(st,at) 衡量的是选了 at 之后比平均水平好多少。减去这个基线,梯度的方差就大幅降低了,因为不再把状态本身就很好的功劳错误地归给动作。
优势函数怎么估计将直接影响训练效果,单步 TD 估计方差小但偏差大,MC 估计无偏但方差大。
广义优势估计(GAE) 用一个参数 λ∈[0,1] 在两者之间插值:
AtGAE(γ,λ)=l=0∑∞(γλ)lδt+l
把前几项展开就很容易理解:
AtGAE(γ,λ)=δt+γλδt+1+(γλ)2δt+2+(γλ)3δt+3+⋯
可以看到,它不是只看当前一步的 TD 误差,而是把未来所有 TD 误差都考虑进去。
其中:
也就是说,越靠近当前时刻的信息越可信,越远的未来影响越小。
最后再理解 (\lambda) 的作用。
(λ=0) 只保留单步 TD,退化为 TD(0),方差最小,但依赖 Critic 的估计,因此偏差较大。
(λ=1) 等价于不断累加未来信息,最终退化为 MC。偏差最小,但方差最大。
GAE 的本质
GAE 是所有 n步TD 的指数加权平均。
即:把多个不同步长的 TD 估计按指数衰减加权平均,用参数 (λ) 在单步 TD(低方差、高偏差)和 MC(低偏差、高方差)之间进行平滑插值。
实践中通常取 (λ=0.95),既利用了未来信息,又不会让远期奖励带来过大的方差,因此成为 PPO、A2C 等算法中的默认选择。
| 对比项 | n 步 TD | GAE(Generalized Advantage Estimation) |
|---|---|---|
| 核心思想 | 固定选择一个 n 步 Return 作为学习目标 | 将所有 n 步 TD 的优势估计按权重加权平均 |
| 使用方式 | 训练前需要指定固定的 n(如 3-step、5-step) | 不固定 n,自动融合 1-step 到 MC 的信息 |
| 偏差-方差权衡 | 通过调整 n 实现 | 通过调整 λ 实现 |
| 极端情况 | n=1 为 TD(0),n=∞ 为 MC | λ=0 退化为 TD(0),λ→1 趋近于 MC |
| 本质关系 | 提供不同步长的 TD 估计 | 对所有 n 步 TD进行指数加权融合 |

写到这里我又不由的感叹,发明新算法的思路belike:用一个参数在两种极端之间平滑过渡。n步TD也好,截断策略迭代也好,这种类似设计在强化学习中几乎成了一种通用范式。
GAE 有一个非常适合工程实现的递推形式:
AtGAE=δt+γλAt+1GAE
从轨迹末尾往前算,一次遍历搞定。代码实现如下:

import numpy as np
def compute_gae(rewards, values, dones, gamma=0.99, lam=0.95):
T = len(rewards)
advantages = np.zeros(T, dtype=np.float32)
gae = 0.0
for t in reversed(range(T)):
if t == T - 1:
next_value = 0.0
else:
next_value = values[t + 1]
non_terminal_mask = 1.0 - dones[t]
delta = rewards[t] + gamma * next_value * non_terminal_mask - values[t]
gae = delta + gamma * lam * non_terminal_mask * gae
advantages[t] = gae
returns = advantages + values
return advantages, returnsActor-Critic 是现代 RL 的基础框架。PPO 在它上面加了重要性采样和 Clip 约束,SAC 在它上面加了最大熵和自动温度调节。
如果说 Actor-Critic 确立了强化学习的经典架构,那 PPO(Proximal Policy Optimization)就是这个框架下最成功的六边形战士(已吓哭)。很少有一个算法能在发布多年后,依然稳坐工业界和学术界的王座。OpenAI 2017 年提出后,迅速成为具身智能的首选baseline,从主流大语言模型的RLHF强化训练到最前沿的端到端机器人控制。圈子里甚至有句半开玩笑的话:「遇事不决 PPO」。现在的很多具身相关的岗位也会要求熟悉/了解PPO算法。
PPO 要解决的核心问题是:如何在利用旧策略采样的数据更新当前策略时,不让策略一步迈得太大导致训练崩溃。
PPO 的前身 TRPO 用了一个复杂的约束优化来限制策略更新幅度。PPO 换了一个更工程化的思路:用重要性采样来修正「采样分布」和「优化分布」不一致的问题。
假设你有一批数据是用旧策略 πθold 采的,但你想更新当前策略 πθ。重要性采样告诉你,用旧分布采样的样本去估计新分布下的期望,只要乘上一个权重:
Ep(x)[f(x)]=Eq(x)[f(x)q(x)p(x)]
在 PPO 里,这个权重就是新旧策略的概率比:
rt(θ)=πθold(at∣st)πθ(at∣st)
rt(θ)>1 说明当前策略比旧策略更偏好这个动作,rt(θ)<1 则相反。理想情况下 rt(θ) 应该接近 1,策略更新不要太大。
提示
以老师教育学生举例,隔壁桌小明考试被批评,你受影响,参考这个经验来修正自己的策略。你和小明本质不是一个人,那么你就要用一个权重来修正自己和小明的差异,小明水平越接近你越有参考价值,这就是重要性采样。

PPO 的核心创新是 clip 操作,直接而有效:
Jclip(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]
ϵ 一般取 0.1∼0.2。这个公式的精妙之处在于 min 操作构造了一个保守下界:
提示
还是以老师教育学生为例,总不能每次其他同学考试被批评你都要参考,只有水平和你接近的才有参考价值。假设一个成绩很差的同学老师叫他不要交白卷、考试不要作弊,很明显这对于你来说,没必要参考,也不可能继续用权重去修正你们之间的差距,需要有个修正幅度限制,这个就是Clip机制。

工程上,PPO 的完整损失通常还包含 Critic 的价值损失和鼓励探索的熵正则项:
Ltotal=Lclip−cvLvalue+ceLentropy
| 要点 | 说明 |
|---|---|
| 大规模并行采样 | PPO 样本效率不算高,但 Isaac Gym 等并行仿真环境可以用环境数换稳定性,数千个环境同时采样 |
| GAE 与优势归一化 | 常用 γ=0.99、λ=0.95,每轮更新前对 advantage 做标准化 |
| 观测与奖励归一化 | 机器人任务的状态量纲差异大,归一化能显著减轻 Critic 拟合难度 |
| 监控 KL 与 clip fraction | KL 激增或 clip fraction 长期偏高,通常说明学习率过大或 clip range 太宽 |
| 连续动作的方差控制 | 高斯策略的动作标准差过大容易发散,过小会过早收敛,通常配合 entropy bonus |
| Critic 不能太弱 | 很多 PPO 训练失败不是 Actor学坏了,而是 Critic 估值不准,advantage 噪声太大 |
PPO 是 on-policy 的
一个常见误区:PPO 用了旧策略的样本,所以是 off-policy。实际上 PPO 虽然在一轮更新中反复利用旧策略采样的数据,但更新围绕同一个 behavior policy 快照展开,一旦这轮结束数据就丢弃。它允许的是短时间、受约束的复用,而不是像 SAC/DQN 那样长期放进 replay buffer。因此 PPO 仍然是 on-policy 算法。
PPO 走的是「稳定可控」路线,SAC(Soft Actor-Critic)走的是「高效探索」路线。它是 off-policy 的,可以重用历史数据,在真实机器人(采样成本高)场景中优势明显。
SAC 最大的特色是 最大熵强化学习。标准 RL 只最大化累积奖励,SAC 在目标里加了策略的熵:
πMaxEnt∗=argπmaxt∑E[γt(r(st,at)+αH(π(⋅∣st)))]
其中 H(π)=−∑πlogπ 是策略的信息熵。策略越随机,熵越大。加这一项的原因是因为在不确定哪个动作最优时,保留多种可能性比把所有概率押在一个动作上更鲁棒。万一环境稍有变化 (这在 sim-to-real 中几乎是必然的) ,随机策略还有备选方案。
SAC v1(2018 年)的温度因子 α 是手工调的,对效果影响很大。SAC v2(2019 年)把它变成了自动调节——设定一个目标熵 H0,让算法自己学出合适的 α。这使得 SAC v2 几乎不需要手动调参,实用性大幅提升。
提示
依旧以老师教育学生为例:
当你面对完全陌生的压轴题时(探索初期),老师发现你连及格分都拿不到,此时系统会自动调高 α。老师鼓励你大胆发散思维,什么公式都试试(增强探索)。
当你已经熟练掌握这道题时(收敛期): 老师发现你的解法已经非常完美了,此时如果再瞎尝试反而会扣分,系统会自动调低 α。老师提醒你收心把答案写规范,稳稳拿高分就好。(偏向利用)。

选择建议:有 Isaac Gym 等大规模并行仿真环境,优先 PPO;真实机器人或仿真采样成本高,优先 SAC。
前面讲的 PPO 和 SAC 都属于随机策略(Stochastic Policy):给定状态 s 后,策略网络输出一个动作概率分布。
而 DDPG(Deep Deterministic Policy Gradient)和 TD3(Twin Delayed DDPG)采用的是另一条路线:确定性策略(Deterministic Policy)。
策略网络不输出概率分布,而是直接输出动作,同一个状态下,策略始终给出同一个动作。
这种设计特别适合连续控制任务,例如:
因为这些任务中的动作空间通常不是“左/右/前进”这样的离散动作,而是连续数值,这时候直接预测动作值比预测整个概率分布更加高效。
DDPG 可以理解为:
DDPG=DPG+Actor Critic+Experience Replay+Target Network
其中:
a=μθ(s)
Qϕ(s,a)
Actor 根据 Critic 的评价不断调整:
∇θJ≈∇aQ(s,a)∇θμθ(s)
DDPG 的 Critic 更新目标为:
y=r+γQϕ−(s′,μθ−(s′))
如果 Critic 对某些动作的价值预测偏高为 Q(s,a)=10 ,但真实价值只有 Q∗(s,a)=7 ,Actor 会相信 Critic:
“这个动作很好!”
于是不断选择这个动作。最终形成:
高估→Actor偏向错误动作→继续高估
形成恶性循环。
TD3(Twin Delayed DDPG)提出三个改进:
双 Q 网络(Clipped Double Q-learning)
使用两个独立的 Critic:
Q1(s,a),Q2(s,a)
计算目标值时取较小值:
y=r+γmin(Q1′(s′,a′),Q2′(s′,a′))
如果其中一个 Critic 产生过高估计,另一个较低的估计会限制它,从而减少 Q 值膨胀。
延迟策略更新(Delayed Policy Update)
DDPG 中 Actor 和 Critic 通常同步更新。
但早期 Critic 还不准确,如果 Actor 过早根据错误价值更新,会导致策略偏移。
TD3 让:
Critic更新次数>Actor更新次数
让 Actor 建立在更可靠的价值估计基础上。
目标策略平滑(Target Policy Smoothing) DDPG 的 Actor 输出确定动作:
a=μ(s)
容易让 Critic 钻入某些尖锐的错误高价值区域。
TD3 在计算目标动作时加入小噪声:
a′=μ′(s′)+ϵ
并限制噪声范围:
ϵ∈[−c,c]
使 Critic 学习更加平滑的价值函数。

忘记大前提了,前面所有方法都假设能拿到奖励信号。但现实真的如此吗?实际上很多机器人任务的奖励函数极难定义:什么叫「优雅的倒水」?什么又叫「优雅的敲鸡蛋」?又或者是叠好一件衣服才给奖励,中间过程完全没有信号。
模仿学习从专家示教中直接学策略,绕开奖励设计。在具身智能中,它的热度甚至超过了传统 RL,遥操作采集数据 + 模仿学习训练,已成为机器人技能学习的主流流程。包括现在很多企业需要大量人做高质量数据采集。毕竟 LLM 在怼了一大波数据之后的成果大家都有目共睹,要是也有海量的数据,具身智能岂不是也可以迎来一次Aha Moment。
最朴素的做法是行为克隆(BC):把专家数据 {(si,ai)} 当监督学习来做,连续动作用 MSE 损失,离散动作用交叉熵。
BC 的最大问题是协变量偏移:训练时看到的状态来自专家,但执行时策略的微小误差会把它带到专家从未到过的状态。误差随步长二次增长,在长时任务上迅速崩溃。
DAgger 通过迭代地让专家给策略自己产生的状态标注动作来缓解这个问题,但需要专家在线标注,成本较高。
近年有些重要的突破:ACT(Action Chunking with Transformers)、Diffusion Policy以及更多的具身智能算法,敬请期待我后续文章的拆解。
回顾整篇文章,一条线是方差和偏差的权衡,另一条线是稳定性和样本效率的取舍。从 REINFORCE 到 Actor-Critic 是在削减方差,从 A2C 到 GAE 是在系统化地管理偏差-方差,从 TRPO 到 PPO 是用更简单的方式实现稳定更新,SAC 则在 off-policy 框架下通过最大熵获得了更系统的探索。
理解了这些演进脉络,在实际工程中的算法选型也就非常清晰了:
有大规模并行仿真条件:首选 PPO。它的鲁棒性极强,调参省心,在算力充足的情况下能提供最稳定的收敛过程。
部署在真实机器人,试错成本高:首选 SAC。真实物理环境中的样本获取极其昂贵,SAC 的 off-policy 机制能最大化数据的重复利用率。
针对机械臂等确定性控制任务:推荐 TD3。其双 Q 网络和延迟更新机制,能有效缓解连续动作空间中的 Q 值过高估计问题。
任务过于复杂,奖励函数难以定义:放弃纯强化学习,转向模仿学习。用行为克隆(BC)冷启动引入人类先验,再结合 RL 进行微调。
版权归属:SAKE