Actor-Critic:PPO 与 SAC
策略梯度会告诉策略往哪里改,但它用整段回报来打分,噪声大得惊人。Actor-Critic 方法再训练一个"评论家"(critic)网络来估计价值,用它给每一步打分,噪声就小多了。本节先看评论家怎样用 GAE 在偏差和方差之间折中,再看今天机器人学习里最常用的两个算法:PPO 用截断的概率比限制每次更新的步子,靠成百上千个并行仿真环境吃饱数据;SAC 最大化"奖励 + 熵",用重放缓冲区反复利用旧数据,再用双评论家压住高估。两个算法都在你的浏览器里实时训练同一个关节到达任务,最后讨论什么时候用哪一个。
1为什么机器人需要它
20.3 节的 REINFORCE 已经能训练一个连续动作的高斯策略:采一整段轨迹,用回报 \(G_t\) 乘以 \(\nabla_\theta\log\pi_\theta(a_t|s_t)\) 求平均。它是无偏的,但在机器人任务上几乎用不起来,原因有三个:
- 方差太大。一条腿式机器人的轨迹有上千步,\(G_t\) 混进了之后每一步的随机性:脚下一滑、一次碰撞,都会让同一个动作得到完全不同的分数。要把噪声平均掉,需要海量轨迹。
- 步长难定。梯度只在当前策略附近有意义。步子小了学得慢,步子大了策略一下子变坏,而变坏的策略又采回更坏的数据,可能再也爬不回来。
- 数据只用一次。策略梯度要求数据来自当前策略,策略一更新,旧数据就作废了。在仿真里还能忍;在真机上,每一个样本都是电机磨损和实验员的时间。
Actor-Critic 的思路是再训练一个评论家:一个估计价值 \(V_\phi(s)\) 或 \(Q_\phi(s,a)\) 的网络(20.1–20.2 节的价值函数,换成神经网络并在线学习)。演员(actor,也就是策略 \(\pi_\theta\))用评论家给出的"这一步比平均好多少"(优势)来更新,而不是用整段回报。在这个框架上,两个算法分别解决了后两个问题:
- PPO(Proximal Policy Optimization,Schulman 等,2017):同策略(on-policy),用"截断的概率比"把每次更新限制在旧策略附近,可以放心地在同一批数据上做多轮梯度;数据多就用并行环境去采。这是 Isaac Gym / Isaac Lab 里训练腿式机器人的主力。
- SAC(Soft Actor-Critic,Haarnoja 等,2018):异策略(off-policy),把所有经验存进重放缓冲区反复使用;目标里加上策略的熵,让探索自动发生;用两个评论家取较小值,压住 Q 值的高估。它的样本效率高,适合直接在真机上学习。
本节用同一个小任务贯穿全篇:一个受重力作用的单关节手臂,必须在 2 秒内转到随机给定的目标角度并保持住(这需要学会重力补偿),动作是归一化的电机力矩 \(a\in[-1,1]\)。PPO 和 SAC 都在浏览器里从零开始训练它。
2直觉:评论家给每一步打分
20.3 节已经看到,从回报里减去一个只依赖状态的基线 \(b(s_t)\) 不改变梯度的期望,却能大大降低方差,最好的基线接近 \(V^\pi(s_t)\)。Actor-Critic 把这件事推进一步:既然有了一个学出来的 \(V_\phi\),就连回报本身也可以用它来估计。最短的版本只看一步,叫时序差分误差(TD error,20.2 节):
"这一步拿到的奖励,加上评论家对下一状态的估值,减去评论家对这一状态的估值":如果 \(V_\phi=V^\pi\),它的期望正好是优势 \(A^\pi(s_t,a_t)=Q^\pi(s_t,a_t)-V^\pi(s_t)\)。它只含一步的随机性,方差很小;代价是一旦评论家估错,误差会原样漏进来,产生偏差。另一头是蒙特卡洛:把整段回报 \(G_t\) 减去 \(V_\phi(s_t)\),没有偏差(评论家只当基线用),但方差最大。广义优势估计 GAE(Schulman 等,2016)用一个旋钮 \(\lambda\in[0,1]\) 在两者之间连续插值:
下图用一个能精确算出真值的小例子来看这个折中。一个送货机器人在 10 格走廊里,从第 2 格出发去第 9 格的充电桩:每走一步奖励 \(-1\),到达充电桩额外 \(+10\);它的策略以 0.6 的概率向右、0.4 的概率向左,每次移动有 0.2 的概率打滑原地不动,\(\gamma=0.95\)。我们要估计"在起点向右走"的价值 \(Q^\pi(s_0,\rightarrow)\),等价于估计它的优势(两者只差一个常数 \(V_\phi(s_0)\))。评论家 \(V_\phi\) 等于真值加上每格一个固定的随机误差(标准差 \(\sigma_V\))。估计量的均值和方差都是精确算出来的(两条 Bellman 式递推,见第 5 节),直方图是 1500 条采样轨迹的实际估计值。
- 把评论家误差 \(\sigma_V\) 调到 0(完美的评论家),再把 \(\lambda\) 调到 1。偏差两端都是 0,但 \(\lambda=1\) 的方差约是 \(\lambda=0\) 的多少倍?
- 把 \(\sigma_V\) 设为 1.5 或更大,找出均方误差最小的 \(\lambda\):读数里的均方误差要在最小值的 10% 以内(读数会显示"✓ 接近最优")。再按"换一组评论家误差",最优的 \(\lambda\) 会变吗?
评论家是用偏差换方差。完美的评论家下,\(\lambda=0\) 只看一步、方差约为蒙特卡洛的百分之一,又没有偏差;评论家越不准,越要靠更长的真实回报(更大的 \(\lambda\))来稀释它的误差。实践里评论家是边学边用的,误差不大不小,所以 PPO 常用 \(\lambda\approx0.95\)、\(\gamma\approx0.99\):大部分噪声已经消掉,评论家的误差也被几十步的真实奖励冲淡了。注意这里的最优 \(\lambda\) 依赖评论家误差的具体形状,并不是一个普适常数。
3动手玩:PPO,步子迈小一点
有了优势估计 \(\hat A_t\),最直接的做法是对 \(\hat A_t\log\pi_\theta(a_t|s_t)\) 做一步梯度上升,然后把数据扔掉。这太浪费:采数据很贵,更新却很便宜。能不能在同一批数据上多走几步?问题是数据来自旧策略 \(\pi_{\theta_k}\),策略一变,"新策略下的期望"就要靠重要性采样(4.9 节)来纠正,权重就是概率比(这里记作 \(\rho\),因为 \(r\) 已经表示奖励;PPO 原文记作 \(r_t\)):
\(L^{\text{PG}}\) 在 \(\theta=\theta_k\) 处的梯度正好是策略梯度(\(\nabla\rho_t=\nabla\log\pi_\theta\)),但离旧策略越远,它越是建立在少数几个权重很大的样本上,估计值就越不可信,而优化器恰恰会利用这种不可信:哪里估计虚高就往哪里冲。PPO 的 \(L^{\text{CLIP}}\) 做了一件很简单的事:一个样本的概率比一旦超出 \([1-\epsilon,1+\epsilon]\),并且继续变化只会让目标"更好看",它对梯度的贡献就变成零。好动作的概率最多涨到 \(1+\epsilon\) 倍,坏动作的概率最多降到 \(1-\epsilon\) 倍;反方向(把坏动作变得更可能)则照常受罚,不被截断。
下图是一个只有动作没有状态的例子,正好能把"真实的改进"精确算出来。动作 \(a\) 是推关节的力度:推得越猛越好,可是超过 0.9 会触发安全停机,优势骤降 3。旧策略是 \(\mathcal N(0,0.4^2)\),它的 16 个样本里没有一个落在停机区,所以数据根本看不见这个悬崖。新策略 \(\mathcal N(m,0.4^2)\),拖动琥珀色手柄(或在右图里点击)改变 \(m\)。
- 把 \(m\) 往右拖,找一个"不截断的估计还许诺超过 0.5 的改进,而真实改进已经是负数"的位置。这时有效样本数还剩几个?
在 \(\epsilon=0.2\) 时 \(L^{\text{CLIP}}\) 的最高点在 \(m\approx0.15\)(KL 约 0.07),真实改进约 +0.25;真正的最优在 \(m\approx0.30\)(+0.36)。不截断的 \(L^{\text{PG}}\) 却在 \(m\approx0.53\) 达到 +0.66,那里的真实改进只剩 +0.09;到 \(m=0.8\) 它仍许诺 +0.52,真实值已是 \(-0.99\)。截断给出的是一个保守但可靠的小步;多走几步,用新数据再截断,比一步跳到估计值的顶点安全得多。
现在把这一切放进完整的算法里。PPO 的一次迭代:(1) 用当前策略在 \(N\) 个并行环境里各跑 \(H=40\) 步;(2) 用评论家算 GAE 优势,在这一批里归一化;(3) 把这 \(NH\) 个样本打乱成大小 128 的小批量,在 \(L^{\text{CLIP}}\) 和评论家的回归损失上做 \(K\) 轮 Adam;(4) 扔掉数据,回到 (1)。演员和评论家都是 3→32→32→1 的 tanh 网络,策略是均值由网络给出、标准差是一个可学习参数的高斯分布,\(\gamma=0.97\),\(\lambda=0.95\)。每次迭代后,用确定性策略(取均值)在 24 组固定的(起点,目标)上评估:曲线是 2 秒结束时与目标的平均角度误差。
- 用默认设置(\(N=16\),\(\epsilon=0.2\),\(K=4\))按"训练",直到评估误差低于 3°。用了多少次迭代、多少环境步?
- 把截断关掉(\(\epsilon\) 选"关"),轮数 \(K=10\),训练到某次迭代的 KL 超过 0.5。误差曲线发生了什么?再换回 \(\epsilon=0.2\) 比较。
- 选 \(N=64\)(每次迭代 2560 个样本),训练到误差低于 3°,要求不超过 12 次迭代。和 \(N=16\) 相比,迭代次数和环境步数各自怎么变?
在种子 1 下,默认设置第 7 次迭代(4480 步)第一次低于 3°,之后在 1°–8° 之间起伏,大约 30 次迭代后稳定在 1° 左右;\(N=64\) 只要 6 次迭代,却用了 15 360 步。也就是说,并行环境不省样本,省的是迭代次数:在 GPU 上一次推进几千个仿真环境的时间和推进一个差不多,所以真实耗时由迭代次数决定。关掉截断、做 10 轮时,每次迭代的 KL 从 0.002–0.05 跳到约 0.2–15,误差可能跳回 100° 以上。截断后的 KL 小而稳定,这才是"近端"(proximal)的意思。
4第二个视角:SAC,异策略加最大熵
PPO 的每个样本只服务于采它的那个策略。另一条路是学 \(Q(s,a)\):Bellman 方程 \(Q(s,a)=r+\gamma\,\mathbb E[V(s')]\) 对任何行为策略收集的转移 \((s,a,r,s')\) 都成立(20.2 节的 Q-learning 正是这样),所以旧数据可以存进重放缓冲区一直用下去。DQN 在离散动作上取 \(\max_a\);连续动作取不了 max,就让演员网络去找让 \(Q\) 大的动作,这就是 DDPG(Lillicrap 等,2016)和它的改进 TD3(Fujimoto 等,2018)的做法。SAC 在此之上改了目标本身:
每一步除了奖励,还奖励策略的熵 \(\mathcal H\)(4.11 节):在同样好的动作之间保持随机。温度 \(\alpha\) 决定熵值多少钱。这个"软"目标的最优策略是 Q 值的玻尔兹曼分布:\(\alpha\to0\) 时退化为 \(\arg\max\),\(\alpha\) 很大时接近均匀。SAC 的演员是一个 tanh 压缩的高斯(输出 \(\mu,\log\sigma\),\(a=\tanh(\mu+\sigma\varepsilon)\)),它在每个状态上最小化 \(\mathrm{KL}\big(\pi\,\|\,\pi^\star\big)\),等价于最小化 \(\mathbb E[\alpha\log\pi(a|s)-Q(s,a)]\),梯度靠重参数化(19.1 节)穿过采样。
下图把状态拿掉,只看一个固定的 \(Q(a)\):抓取一个物体有两个好的接近角度,左边的稍好(1.0),右边的稍差(0.8)。拖动 \(\alpha\),看玻尔兹曼目标怎么变;按"训练",看单峰的演员怎样去拟合它。
- 保持 \(\alpha\le0.05\)(不开自动 α),把紫色起点拖到 \(a\ge0.6\)(右边那个稍差的峰上),训练至少 300 步。演员会翻过去找左边更好的峰吗?KL 是多少?
- 把 \(\alpha\) 调到 0.3 以上并训练至少 200 步:演员的熵超过 0.5,同时罩住两个峰。这时玻尔兹曼目标长什么样?
- 打开"自动 α",目标熵选 −1.5,训练到演员的熵连续 100 步都在目标的 ±0.1 以内。\(\alpha\) 最后停在多少?
两件事值得记住。第一,\(\mathrm{KL}(\pi\|\pi^\star)\) 是寻模(mode-seeking)的:单峰的演员只会选一个峰,从右边出发就停在右边(\(\alpha=0.05\) 时 KL ≈ 3.7,而停在左峰时低于 0.1),这是 tanh 高斯表达能力的限制,也是 19.3 节提到用 flow 做策略的动机。第二,好的 \(\alpha\) 取决于奖励的尺度:奖励乘以 10,同样的 \(\alpha\) 就相当于小了 10 倍。这正是自动温度的用处:与其猜 \(\alpha\),不如指定"想要多少熵"(默认 \(\bar{\mathcal H}=-\dim\mathcal A\)),让 \(\alpha\) 自己去满足它。
SAC 的第二个部件对付 20.2 节的老问题:高估。评论家有误差,演员又专门去找 Q 最大的动作,于是它找到的往往是误差最大的地方,\(\mathbb E[\max_a\hat Q]\ge\max_a\mathbb E[\hat Q]\)。这个虚高被写进下一次的自举目标,一步步累积。TD3 和 SAC 的对策是训练两个独立初始化的评论家,目标里取较小值。下图把这件事单独拿出来看:真实的 \(Q(s',a)\) 是一条最大值为 1 的抛物线,两个评论家各自加上一条随机的平滑误差曲线(标准差 \(\sigma\),"粗糙度"是误差曲线的最高频率)。
- 把误差 \(\sigma\) 调到 0.3 以上、粗糙度调到 10 以上(坑坑洼洼的评论家):单评论家的平均高估超过 0.2,而双评论家的平均值低于 0。
- 保持 \(\sigma\ge0.3\),把粗糙度降到 2 或以下(误差几乎是一个常数偏移):单评论家的平均误差不到双评论家低估量的一半,而双评论家低估超过 0.1。为什么?
高估来自"挑选":误差越崎岖,演员越容易挑中一个虚高的尖峰(\(\sigma=0.3\)、粗糙度 12 时单评论家平均高估约 0.30,双评论家约 \(-0.12\))。取两个独立估计的较小值把它压了下去,代价是系统性地偏低:两个独立 \(\mathcal N(0,\sigma^2)\) 误差的较小值,期望是 \(-\sigma/\sqrt\pi\approx-0.56\sigma\)。低估比高估好,因为演员不会去"利用"一个被低估的动作。真实系统里两个评论家用同样的数据和目标训练,误差是相关的,低估比这里温和。
最后把完整的 SAC 放到同一个关节任务上。只有一个环境(像一台真机),前 400 步随机动作预热,之后每走一步就从重放缓冲区(容量 20 000)抽 32 个转移,做一次评论家更新和一次演员更新;目标网络用 \(\tau=0.02\) 的 Polyak 平均跟随;自动温度,目标熵 \(-1\);网络大小与 PPO 相同。右图同时画出 PPO 在 \(N=16\) 与 \(N=64\) 下的参考曲线(种子 1,与 FIG 3 同一份代码),以及你在 FIG 3 里最近一次的 PPO 训练。
- 按"训练",让 SAC 在 3000 个环境步以内把评估误差降到 8° 以下。PPO(\(N=16\))第一次降到 8° 以下用了多少步?
种子 1 下,SAC 在约 1000 个环境步(其中 400 步是随机预热)时误差第一次低于 8°,种子 1–6 都在 1000–1750 步之间;PPO \(N=16\) 要 4480 步,\(N=64\) 要 12 800 步。按环境步数算,SAC 在这个小任务上省了几倍到十几倍的数据。但 SAC 之后一直在晃,多数时候在 3°–15° 之间,而 PPO 能稳定到 1° 左右:价值梯度给出的动作修正很小又带噪声。换成并行仿真步数,PPO \(N=64\) 只要 240 步(6 次迭代 × 40)就低于 3°,SAC 一步也没法并行。这就是选算法时最重要的问题:你付的是样本,还是时间?
5再看数学
提示:把鼠标悬停在公式中带底色的符号上,对应的图元素会被高亮:\(\lambda\) 加粗 FIG 1 右图的 λ 竖线,\(V_\phi\) 放大 FIG 1 的紫色圆,\(\delta_t\) 加粗 FIG 1 的直方图,\(\rho_t\) 放大 FIG 2 下图的样本点,clip 加粗 FIG 2 的 \(L^{\text{CLIP}}\) 曲线与 \(1\pm\epsilon\) 线,\(\alpha\) 加粗 FIG 4 的绿色目标,\(\mathcal H\) 加粗 FIG 4 的琥珀色演员,\(Q\) 加粗 FIG 4 的蓝线,min 加粗 FIG 5 的琥珀色虚线。
策略梯度里的优势,与评论家的损失
20.3 节的策略梯度定理可以写成优势的形式:\(\nabla_\theta J=\mathbb E\big[\sum_t\nabla_\theta\log\pi_\theta(a_t|s_t)\,A^\pi(s_t,a_t)\big]\)。任何满足 \(\mathbb E[\hat A_t|s_t,a_t]\approx A^\pi(s_t,a_t)\) 的估计都可以代入。TD 误差满足 \(\mathbb E[\delta_t|s_t,a_t]=\mathbb E[r_{t+1}|s_t,a_t]+\gamma\mathbb E[V(s_{t+1})]-V(s_t)=Q^\pi-V^\pi=A^\pi\),前提是 \(V=V^\pi\)。把 \(k\) 步的估计 \(\hat A_t^{(k)}=\sum_{l<k}\gamma^l r_{t+l+1}+\gamma^kV(s_{t+k})-V(s_t)=\sum_{l<k}\gamma^l\delta_{t+l}\)(裂项相消)按权重 \((1-\lambda)\lambda^{k-1}\) 平均,就得到 GAE:
右边的递推就是代码里从轨迹末尾往回扫的那一行。\(\hat G_t\) 叫 \(\lambda\)-回报,评论家对它做回归(PPO 的做法)。如果回合因为时间上限被截断而不是真的结束,最后一步要用 \(V_\phi(s_T)\) 自举,而不是当作 0(误区 1);本页的关节任务就是这样处理的。FIG 1 的精确均值和方差来自两条递推:设 \(c=r+\gamma(1-\lambda)V_\phi(s')\),则 \(G=c+\gamma\lambda G'\),于是 \(U(s)=\mathbb E[G|s]=\mathbb E[c+\gamma\lambda U(s')]\),\(W(s)=\mathbb E[G^2|s]=\mathbb E[c^2+2c\gamma\lambda U(s')+\gamma^2\lambda^2W(s')]\),都是压缩映射,迭代即收敛。
从信赖域到截断:PPO
为什么"别离旧策略太远"是对的?性能差引理(Kakade & Langford,2002)给出精确的改进量:
右边把新策略的状态分布 \(d^{\pi'}\) 换成旧的 \(d^\pi\),于是可以用旧数据估计,这就是代理目标 \(L^{\text{PG}}\);只有当 \(\pi'\) 离 \(\pi\) 不远时这个替换才可靠(状态分布的差距可以用两策略间的 KL 来界定)。TRPO(Schulman 等,2015)直接求解带约束的问题 \(\max L^{\text{PG}}\ \text{s.t.}\ \mathbb E_s[\mathrm{KL}(\pi_{\theta_k}\|\pi_\theta)]\le\delta\),需要共轭梯度和线搜索。PPO 用 \(\min(\rho\hat A,\operatorname{clip}(\rho)\hat A)\) 的一阶近似代替约束,只要普通的小批量 SGD。完整的损失通常是
逐个样本看 \(\min(\rho\hat A,\operatorname{clip}(\rho,1-\epsilon,1+\epsilon)\hat A)\):\(\hat A>0\) 时它等于 \(\min(\rho,1+\epsilon)\hat A\),\(\rho>1+\epsilon\) 后对 \(\theta\) 的梯度为 0;\(\hat A<0\) 时它等于 \(\max(\rho,1-\epsilon)\hat A\),\(\rho<1-\epsilon\) 后梯度为 0。另一侧(\(\hat A>0\) 而 \(\rho<1-\epsilon\),或 \(\hat A<0\) 而 \(\rho>1+\epsilon\))仍是 \(\rho\hat A\),梯度照常把策略拉回来,这正是 FIG 2 下图里两条曲线的形状。本页 PPO 的 \(c_2=0\),演员和评论家分开两个网络;读数中的 KL 用估计式 \(\hat{\mathbb E}[(\rho-1)-\log\rho]\),它对每个样本都非负。
软 Bellman 方程与 SAC 的三个损失
在最大熵目标下,价值里也要算上未来的熵,于是有软 Bellman 方程 \(Q(s,a)=r+\gamma\,\mathbb E_{s'}[V(s')]\),\(V(s)=\mathbb E_{a\sim\pi}[Q(s,a)-\alpha\log\pi(a|s)]\)。SAC 用两个评论家 \(Q_{\phi_1},Q_{\phi_2}\)、它们的目标网络 \(\bar\phi_j\leftarrow\tau\phi_j+(1-\tau)\bar\phi_j\) 和重放缓冲区 \(\mathcal D\):
目标 \(y\) 里的 \(\tilde a'\) 是从当前策略新采的,不是缓冲区里存的旧动作,这就是它能异策略的原因:Bellman 方程只需要 \((s,a,r,s')\),而 \(s'\) 之后的行为由当前策略决定。tanh 压缩改变了密度,要加上雅可比修正 \(\log\pi(a|s)=\log\mathcal N(u;\mu,\sigma^2)-\log(1-\tanh^2u)\)。演员损失对 \(\theta\) 的梯度通过 \(\tilde a\) 传进评论家(\(\partial Q/\partial a\)),这就是"价值梯度":动作沿着 Q 增大的方向被推。温度损失的梯度 \(-(\log\pi+\bar{\mathcal H})\) 在熵低于目标时让 \(\alpha\) 增大,反之减小(本页用 \(\log\alpha\) 作参数)。
为什么演员损失是 KL?对固定状态,\(\mathrm{KL}(\pi\|\pi^\star)=\mathbb E_\pi[\log\pi-Q/\alpha]+\log Z=\tfrac1\alpha\mathbb E_\pi[\alpha\log\pi-Q]+\log Z\),\(\log Z\) 与 \(\theta\) 无关,所以两者最小值相同。FIG 4 的读数正是这样算 KL 的。
TD3:确定性演员的三个技巧
DDPG 的演员是确定性的 \(a=\mu_\theta(s)\),由确定性策略梯度 \(\nabla_\theta J=\mathbb E_s\big[\nabla_aQ(s,a)|_{a=\mu_\theta(s)}\nabla_\theta\mu_\theta(s)\big]\)(Silver 等,2014)更新,探索靠给动作加噪声。它在实践中很容易被评论家的高估带偏。TD3(Fujimoto 等,2018)加了三个修正:(1) 截断双 Q:目标取两个评论家的较小值(FIG 5);(2) 目标策略平滑:目标里的动作加上截断的高斯噪声 \(\tilde a'=\mu_{\bar\theta}(s')+\operatorname{clip}(\mathcal N(0,\tilde\sigma^2),-c,c)\),让评论家在动作邻域里平滑,不给尖峰留机会;(3) 延迟更新:评论家每更新 2 次,演员和目标网络才更新 1 次。SAC 也用第 (1) 条(两篇论文几乎同时发表);它的随机策略和熵项起到了与 (2) 类似的平滑作用。
6机器人中的它:什么时候用哪一个
FIG 6 的结论可以推广:先问数据从哪里来、付的是样本还是时间。
| PPO | SAC | |
|---|---|---|
| 数据 | 同策略:每批只用 \(K\) 轮就扔掉 | 异策略:重放缓冲区,每个样本被反复使用 |
| 并行 | 天然适合几千个并行环境,大批量、少迭代 | 每个环境步配一次(或几次)梯度更新,难以大规模并行 |
| 动作 | 离散或连续都行 | 为连续动作设计(有离散变体) |
| 稳定性 | 稳,对超参数相对不敏感;但实现细节影响很大 | 评论家的自举可能失稳;自动温度和双 Q 让它比 DDPG 稳得多 |
| 典型用途 | GPU 并行仿真中的腿式运动、灵巧手,然后 sim-to-real | 直接在真机上学习、样本昂贵的任务;离线到在线的微调 |
PPO + 大规模并行仿真:Rudin、Hoeller、Reist 与 Hutter(CoRL 2021)在单张 GPU 上同时仿真数千个 ANYmal 四足机器人,用 PPO 在 4 分钟以内学会平地行走、约 20 分钟学会崎岖地形,并迁移到真机;他们开源的 legged_gym 和 rsl_rl 成了后来很多腿式与人形机器人工作的起点,如今在 Isaac Lab 中延续(rsl_rl 默认用 \(\epsilon=0.2\)、\(\lambda=0.95\),并按目标 KL 自适应调学习率)。OpenAI 的灵巧手魔方实验(2019)也用 PPO 在大规模随机化仿真中训练(9.3 节)。仿真里的评论家还可以看到真机拿不到的特权信息(地形高度、摩擦系数),只给演员用真实传感器,这就是非对称 actor-critic,详见 23.1 节。SAC 直接在真机上学:Haarnoja、Ha、Zhou、Tan、Tucker 与 Levine(RSS 2019)用带自动温度的 SAC 让 Minitaur 四足机器人在真实世界里从零学会行走,大约用了 2 小时的真机数据;Smith、Kostrikov 与 Levine(arXiv 2022,RSS 2023)用每个环境步做多次评论家更新的同类异策略方法,让 A1 四足在约 20 分钟的真机训练里学会在多种地面上行走。软件:Stable-Baselines3 与 CleanRL 提供 PPO、SAC、TD3 的参考实现;rsl_rl、rl_games、skrl 面向 GPU 并行仿真。往后看:从固定数据集学习时,异策略评论家会被数据外的动作骗到,这是 20.5 节的主题;把评论家和学到的世界模型结合起来,就是 24.3 节的 Dreamer 与 TD-MPC。
7常见误区
机器人仿真几乎总有回合时长上限(本页是 2 秒)。时间到了,机器人并没有"死",它此后的价值不是 0。如果在 GAE 或 SAC 的目标里把这一步当成终止(乘以 \(1-\text{done}\)),评论家就会学到"快到 2 秒时价值突然跳变"(本页奖励为负,跳向 0),而它的输入里根本没有时间,只能把这种噪声抹平到所有状态上。正确做法是区分 terminated(真的结束:摔倒、到达)与 truncated(时间到),对后者照常用 \(V(s_T)\) 或 \(Q(s',\tilde a')\) 自举。Gymnasium 的 step 返回值就是这样把两者分开的。
截断只让超出范围的那些样本不再贡献梯度;神经网络是共享参数的,其余样本的梯度照样会把被截断样本的概率继续推远。FIG 3 读数里的"最大概率比"即使在 \(\epsilon=0.2\) 时也通常在 1.5 到 4 之间,偶尔超过 10,远在 \(1.2\) 之外。轮数 \(K\) 越多、学习率越大,越明显。所以实践里要监控每次迭代的 KL:rsl_rl 按目标 KL 调学习率,另一些实现在 KL 超过阈值时提前停止这一批的训练。
SAC 的固定 \(\alpha\) 是相对奖励尺度而言的:同一个 \(\alpha=0.2\),在每步奖励约为 1 的任务里是适度探索,在每步奖励约为 100 的任务里几乎等于没有熵项。PPO 对优势做了归一化,对奖励尺度不那么敏感,但评论家仍要回归原始尺度的回报,太大的回报会让价值损失主导梯度。常见做法:用自动温度;归一化观测(运行均值与方差);把奖励缩放到每步 \(O(1)\)。这些"细节"在 PPO 上影响很大(Engstrom 等,2020;Andrychowicz 等,2021)。
取较小值把高估换成了低估(FIG 5 中约 \(-0.56\sigma\)),只是因为演员不会去追逐被低估的动作,这个偏差才比较无害。评论家仍然处在 20.2 节"致命三角"(函数逼近 + 自举 + 异策略)里:更新太快、目标网络跟得太紧、每步更新次数太多,都可能让 Q 值发散。监控评论家的 Q 估计与实际回报之差,是调 SAC 时最有用的诊断之一。
PPO 和 SAC 训练时都在采样动作,部署时一般用均值动作(本页的评估曲线就是这样做的),两者的表现可能差得很多;报告结果时要说明用的是哪一个。比较算法时也要说明横轴:环境步数、并行仿真步数、梯度更新次数还是墙钟时间。FIG 6 里同一组曲线,换一个横轴,胜负就倒过来了。
8小练习
9延伸阅读
- R. S. Sutton & A. G. Barto, Reinforcement Learning: An Introduction, 2nd ed., MIT Press, 2018, Ch. 12–13 — 资格迹与 \(\lambda\)-回报、策略梯度与 actor-critic
- V. R. Konda & J. N. Tsitsiklis, Actor-Critic Algorithms, NIPS 1999 — 两时间尺度 actor-critic 的经典分析
- S. Kakade & J. Langford, Approximately Optimal Approximate Reinforcement Learning, ICML 2002 — 性能差引理与保守策略迭代
- J. Schulman, S. Levine, P. Abbeel, M. Jordan & P. Moritz, Trust Region Policy Optimization, ICML 2015 — TRPO
- J. Schulman, P. Moritz, S. Levine, M. Jordan & P. Abbeel, High-Dimensional Continuous Control Using Generalized Advantage Estimation, ICLR 2016 — GAE
- J. Schulman, F. Wolski, P. Dhariwal, A. Radford & O. Klimov, Proximal Policy Optimization Algorithms, arXiv:1707.06347, 2017 — PPO
- V. Mnih et al., Asynchronous Methods for Deep Reinforcement Learning, ICML 2016 — A3C/A2C:多个并行工作者的 actor-critic
- D. Silver, G. Lever, N. Heess, T. Degris, D. Wierstra & M. Riedmiller, Deterministic Policy Gradient Algorithms, ICML 2014; T. P. Lillicrap et al., Continuous Control with Deep Reinforcement Learning, ICLR 2016 — DPG, DDPG
- H. van Hasselt, Double Q-learning, NIPS 2010; S. Fujimoto, H. van Hoof & D. Meger, Addressing Function Approximation Error in Actor-Critic Methods, ICML 2018 — 高估与 TD3
- T. Haarnoja, A. Zhou, P. Abbeel & S. Levine, Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor, ICML 2018; T. Haarnoja et al., Soft Actor-Critic Algorithms and Applications, arXiv:1812.05905, 2018 — SAC 与自动温度
- T. Haarnoja, S. Ha, A. Zhou, J. Tan, G. Tucker & S. Levine, Learning to Walk via Deep Reinforcement Learning, RSS 2019 — Minitaur 在真实世界中学走路
- N. Rudin, D. Hoeller, P. Reist & M. Hutter, Learning to Walk in Minutes Using Massively Parallel Deep Reinforcement Learning, CoRL 2021 — GPU 并行仿真 + PPO(legged_gym)
- L. Smith, I. Kostrikov & S. Levine, A Walk in the Park: Learning to Walk in 20 Minutes With Model-Free Reinforcement Learning, RSS 2023 (arXiv:2208.07860, 2022) — 真机上的高效异策略学习
- L. Engstrom et al., Implementation Matters in Deep Policy Gradients: A Case Study on PPO and TRPO, ICLR 2020; M. Andrychowicz et al., What Matters in On-Policy Reinforcement Learning? A Large-Scale Empirical Study, ICLR 2021 — PPO 的实现细节有多重要