Part VI · 第 23 章 机器人强化学习 · 23.1

机器人强化学习与 sim-to-real

强化学习在机器人上最成功的地方,是腿式运动和灵巧手:先在仿真里让成千上万个机器人并行试错,再把学到的策略搬到真机上。本节把这条流水线拆开来逐段实验:优化器怎样钻仿真器的空子;PPO 在许多并行环境里实时训练一个关节,动作接口选 PD 目标角还是力矩;奖励怎样写、课程怎样排;只在仿真里才有的“特权信息”怎样通过非对称 actor-critic 和教师–学生蒸馏用起来;现实差距(延迟、执行器、传感器)从哪来,系统辨识和执行器网络怎样把它缩小;最后核对 ANYmal、OpenAI 灵巧手和腿式跑酷这些里程碑到底做了什么。

约 55 分钟 前置:20.4 Actor-Critic:PPO 与 SAC · 20.3 策略梯度 · 22.1 模仿学习:BC 与 DAgger · 9.4 执行器与传感器 · 之后 23.2 域随机化 5 个交互

    1为什么机器人需要它

    有两类机器人问题,经典控制做得很辛苦:腿式运动(四条腿或两条腿在碎石、台阶、泥地上走、跑、摔倒后爬起来)和灵巧手操作(五指手在手里翻转一个方块)。它们的共同点是接触多、接触模式不断切换,模型写得出来(8.4 节)却很难拿来在线求解;而“好”的行为又很容易打分:走得快不快、摔没摔、方块转到目标朝向没有。这正是强化学习的地盘:只需要奖励,不需要专家演示,也不需要把控制律写出来。

    代价是样本。PPO(20.4 节)这类 on-policy 方法训练一个运动策略要上亿个环境步,按常见的 50 Hz 控制频率,\(10^8\) 步相当于一台真机不停地走约 23 天,还要摔几千次;OpenAI 的灵巧手更是用了约 100 年的仿真经验(第 6 节)。所以今天的主流做法是:在仿真里训练,用 GPU 同时跑几千个机器人,几分钟到几小时练完;然后零样本部署到真机(sim-to-real)。这把问题变成了三件工程:让仿真足够快(并行仿真)、让学习问题足够好学(观测、动作、奖励、课程的设计)、让仿真和真机足够像,或者让策略对“不像”足够不敏感(现实差距、系统辨识、23.2 节的域随机化)。

    本节的贯穿例子是一个受重力的机器人关节:它可以看成腿上的一个关节或机械臂的肩关节,要按指令转到目标角并保持住。它小到能在你的浏览器里几秒钟训练完,又足够真实:有力矩上限、控制周期、延迟、电机滞后和传感器噪声,sim-to-real 里的每个问题都能在它身上看到。

    2直觉:优化器会钻仿真器的空子

    先不用神经网络,只看一个两参数的“策略”:水平放置(不受重力)的关节,从 −0.3 rad 转回 0,控制器是 \(\tau=-k_pq-k_d\dot q\),每 40 ms(25 Hz)更新一次力矩,中间保持不变,力矩上限 12 N·m。代价 \(J\) 是 2 秒内角度误差平方的平均(加一点力矩惩罚),除以“什么都不做”时的值:\(J=1\) 等于没控制,越小越好。仿真器里没有延迟、电机理想;真机有通信延迟、电机滞后(力矩跟不上指令)和偏弱的电机。

    强化学习、CEM(6.11 节)或任何优化器在仿真里做的事都一样:找使 \(\hl{cem}{J_{\text{sim}}}\) 最小的参数。下图左边是仿真里的代价地形,右边是同一组增益在真机上的代价地形。按“在仿真里优化”,CEM 会一路爬到很高的增益:在仿真里,增益越高收敛越快,它没有理由停下。可这片区域恰好挨着真机的不稳定区。

    FIG 1同一组增益,两张代价地形:仿真的最优点在真机上很差
    两张图横轴 \(k_p\)(0–200),纵轴 \(k_d\)(0–40),背景是代价 \(J\),越青 = 代价越低(8 档,对数刻度,从 0.07 到 1);红色格子表示 \(J\ge1\):比不控制还差,多半是振荡或发散。左边是仿真器(无延迟、理想电机),右边是真机(滑块设定的延迟、电机滞后和强度)。琥珀色圆点是当前增益,在任一张图上都可以拖动。按钮运行 CEM(每轮 40 个样本、保留最好的 8 个、15 轮),走过的路径在“仿真里优化”时画成紫色,“在一组随机化的仿真里优化”时画成绿色;后者最小化 10 个仿真器的平均代价,这些仿真器的延迟取 0–80 ms、电机滞后取 0–40 ms、强度取 0.7 或 1(这就是 23.2 节的域随机化)。下方:当前增益下关节角 \(q(t)\) 的响应,紫线是仿真,琥珀线是真机。
    试一试
    • 按“在仿真里优化”:CEM 停在 \((k_p,k_d)\approx(76,12)\),\(J_{\text{sim}}\approx0.074\)。默认真机(延迟 40 ms)上同一组增益的代价是 0.127,已经比仿真差 1.7 倍;把延迟拉到 60 ms 以上,真机代价超过仿真代价的 2 倍(60 ms 时约 0.24,80 ms 时约 0.47),右图里红色的不稳定区几乎贴到了琥珀点上。
    • 保持延迟 \(\ge60\) ms,找一组在两边都过得去的增益:真机代价 \(<0.13\),同时仿真代价 \(<0.11\)。可以自己拖,也可以按“在一组随机化的仿真里优化”:它停在约 \((28,8)\),仿真里差一点(0.099),但真机上 60 ms 时 0.124、80 ms 时也只有 0.138。
    核心洞见

    优化器不知道哪部分仿真是真的、哪部分只是近似,它会利用一切能让代价变小的东西,包括仿真的缺陷:这里是“没有延迟”,在真实的接触仿真里可能是穿模、过大的摩擦、无限快的电机。仿真越不准,优化越彻底,部署后的落差往往越大。sim-to-real 的所有手段都在回答同一个问题:怎样让 \(J_{\text{sim}}\) 的最优点在真机上也好。三条路:把仿真做准(系统辨识,第 4 节),让策略不依赖不准的部分(域随机化、动作接口的选择),以及让策略在线识别它所处的环境(历史编码器与教师–学生,第 4 节和 23.2 节)。

    3动手:在许多并行环境里用 PPO 训练一个关节

    现在换成真正的强化学习。关节竖直放置,受重力(\(q=0\) 为自然下垂),每个回合开始时随机给一个指令角 \(q^\star\in[-1.5,1.5]\) rad,2 秒内要转过去并保持住。物理仿真 200 Hz,策略 25 Hz:每个动作保持 8 个物理步,这与腿式机器人的常见设置同构(仿真跑得比策略快几倍)。策略的输入是角度误差 \(q-q^\star\)、角速度、指令和上一步的动作;输出一个高斯分布的均值。奖励是每步一个跟踪项 \(\exp(-(q-q^\star)^2/0.05)\),减去很小的力矩惩罚和动作变化率惩罚。

    算法就是 20.4 节的 PPO:每次迭代,\(N\) 个环境用当前策略同时各跑一个回合(50 步),用 GAE 算优势,再做 4 轮、每轮 4 个小批量的截断更新。并行环境越多,每次迭代的数据越多,梯度越准,但每次迭代要模拟的步数也越多。在 GPU 仿真器上,几千个环境的一步和一个环境的一步花的时间相差不大,所以“迭代次数”近似就是墙钟时间;在 CPU 上逐个仿真,“环境步数”才是。

    还有一个设计选择:动作接口。“直接力矩”让策略每 40 ms 给一个力矩;“PD 目标角”让策略给一个目标角 \(\hl{pd}{q^{\text{tgt}}=a}\),由电机驱动器里 200 Hz 的 PD 回路 \(\tau=K_p(q^{\text{tgt}}-q)-K_d\dot q\)(\(K_p=20,\ K_d=1.5\))去跟踪。腿式机器人的学习控制器大多用后者。右下角把训练出来的策略放到“真机”上:延迟 30 ms、电机滞后 20 ms、强度 0.85、库仑摩擦和传感器噪声。

    FIG 2实时训练:PPO 驱动一批并行的仿真关节,再部署到“真机”
    左:前 16 个并行环境,回放上一次迭代里它们各自的回合(带探索噪声);紫色虚线是各自的指令角,连杆误差小于 0.1 rad 时画成绿色,否则琥珀色。环境数少于 16 时,空着的格子画成半透明的静止连杆。右上:测试误差(均值策略在 8 个固定指令上最后 0.5 秒的平均 \(|q-q^\star|\),对数刻度)随迭代次数(琥珀线),重置后上一次的曲线保留为紫色虚线,绿色虚线是 0.05 rad。右下:指令 1 rad 时均值策略的响应,青线是仿真,琥珀线是真机,紫色虚线是指令。读数记录每种环境数第一次达到 0.1 rad 时用了多少次迭代、多少环境步,以及最后一个训练到 0.05 rad 以下的 PD 策略和力矩策略在真机上的误差。训练每帧最多花约 7 ms;随机数有固定种子,同一设置每次结果相同。
    • 默认设置(PD 目标角,16 个环境)按“训练”:一开始测试误差约 0.85 rad(连杆基本不动),第 30 次迭代降到 0.1 rad 以下,第 37 次降到 0.05 rad 以下。
    • 分别用 4 个和 64 个环境(PD)训练到 0.1 rad 以下(切换会重置):4 个环境要 35 次迭代、只用 7000 个环境步;64 个环境只要 25 次迭代,却用了 80000 步。读数里 64 的迭代数比 4 少时完成。再试 128:27 次迭代、172800 步,迭代次数不再下降。
    • 16 个环境,先用 PD 目标角训练到 0.05 rad 以下,再切到“直接力矩”训练到 0.05 rad 以下(力矩接口在仿真里反而更快:23 次迭代就到 0.1 rad)。在默认真机上两者都还行(约 0.045 和 0.069 rad);把测试用真机的电机强度降到 0.6 以下:PD 策略的真机误差仍在 0.05 rad 左右(低于 0.07 即可),力矩策略是它的 2 倍以上(刚训练好时约 0.22 rad,多训练 20 次迭代后约 0.11)。
    有意思的细节

    (1) 环境越多,迭代越少,但“每个样本学到的东西”越少:从 4 到 64 个环境,样本多了 10 倍以上,迭代只少了约三成,到 128 个就饱和了。这正是 GPU 并行仿真的算账方式:样本几乎免费,墙钟时间才贵,所以宁可多花样本也要少迭代;在真机上则正好反过来(第 6 节的真机 RL)。 (2) PD 目标角接口的好处不在于学得快,而在于把一部分控制留在了高频、可靠的 PD 回路里:电机变弱、指令晚到 30 ms,PD 回路照样在 200 Hz 下修正误差;力矩策略则把“仿真里电机正好这么强”学进了权重。 (3) 动作 \(a=0\) 对应“回到默认姿态”,这让初始的随机策略就是安全、平稳的,探索从一个合理的地方开始。

    4另外三个视角:奖励与课程、特权信息、现实差距

    奖励怎样写,课程怎样排

    机器人 RL 的奖励几乎都是若干项的加权和:一两个任务项(跟踪指令速度、到达目标朝向)加上一串正则项(力矩、关节加速度、动作变化率、脚打滑、机身碰撞),20.1 节举过腿式机器人的例子。任务项的形状决定了学习信号:“到了才给分”的稀疏奖励最诚实,可在随机策略几乎碰不到目标时,它几乎没有梯度;像 \(\exp(-e^2/\sigma^2)\) 这样的稠密核处处给出“离目标多近”的信号,但核的宽度 \(\sigma\) 也决定了策略最终在乎多小的误差。

    课程(curriculum)把任务从易排到难。下图同时训练三个策略:稠密核、稀疏奖励(误差小于 0.05 rad 才得 1 分),以及带课程的稀疏奖励:容差从 0.8 rad 开始,只要回合最后 0.5 秒里有 60% 的步落在容差内,就把容差收紧 20%,直到 0.05 rad。这是 Rudin 等(2021)“地形难度随表现升降”的课程的同一个思路,只是这里升级的是精度而不是地形高度。

    FIG 3三种奖励同时训练:稠密核、稀疏奖励、带课程的稀疏奖励
    测试误差(与 FIG 2 相同的定义,对数刻度)随迭代次数:蓝线是稠密核,红线是稀疏奖励,绿线是带课程的稀疏奖励,绿色虚线是课程当前的容差。三个策略都用 PD 目标角、16 个环境、同一个种子,轮流各做一次迭代。读数里的“末段命中率”是上一次迭代中,回合最后 0.5 秒落在容差内的步数比例。
    • 按“训练”,等三条曲线都过了 40 次迭代:带课程的策略误差已低于 0.02 rad(约 0.013),稠密核约 0.037,纯稀疏奖励还在 0.1 rad 左右;注意纯稀疏的红线前 20 次迭代来回摆动(第 10 次约 0.6,第 20 次又回到约 0.82),之后才开始下降。再训练下去,三者在 80 次迭代时都到了 0.02 rad 以下(稠密核约 0.016,两种稀疏奖励约 0.01):稠密核的宽度 \(\sigma\) 让它不太在乎很小的误差。

    课程也可以排在正则项上。Hwangbo 等(2019)训练 ANYmal 时发现,一开始就把力矩、关节速度这些惩罚开满,策略最容易学到的是“站着别动”这个局部最优;他们把所有正则项乘上一个课程因子 \(k_c\),从 \(k_0=0.3\) 开始按 \(k_c\leftarrow k_c^{\,k_d}\)(\(0<k_d<1\))单调升到 1:先学会完成任务,再慢慢学会守规矩。

    特权信息:非对称 actor-critic 与教师–学生蒸馏

    仿真里一切都是已知的:真实速度、摩擦系数、负载质量、脚下的地形高度。真机只有它的传感器:编码器、IMU、有时是一台噪声很大的深度相机。部署的策略只能用真机的观测 \(o_t\),可训练时没有理由不用仿真里的特权信息 \(x^{\text{priv}}_t\)。有两种用法。

    • 非对称 actor-critic(Pinto 等,2018):critic 只在训练时用,所以让它看完整状态 \(V_\phi(s_t)\),actor 只看 \(o_t\)。critic 的任务(估计回报)因此容易得多,优势估计更准。OpenAI 的灵巧手(2018)就这样训练:价值网络能看到真机上拿不到的信息。
    • 教师–学生(Chen 等,2019;Lee 等,2020):先用 RL 训练一个看得见特权信息的教师策略 \(\pi^{\text{T}}(a\mid o_t,x^{\text{priv}}_t)\),这是一个容易得多的 RL 问题;再用监督学习训练只看观测历史的学生 \(\pi^{\text{S}}(a\mid o_{t-K:t})\) 去模仿教师。学生必须从历史里推断出教师直接看到的东西(这里是速度和负载),这一步就是 22.1 节的 DAgger:让学生自己开,教师在学生到达的状态上给标签。

    下图的关节用直接力矩控制,末端挂着每回合随机的负载(0 到 1,越重越难举,惯量也越大)。教师看到干净的角度、速度和负载;学生只有一个带噪声的角度读数(标准差 0.01 rad,没有速度传感器)和最近 4 步的读数与动作;对照组是同样只有带噪声角度、但没有历史的策略,直接用 PPO 训练。

    FIG 4教师用特权信息学会控制,学生从历史里学会同样的事
    左:所选策略的均值动作控制关节 2 秒(循环播放),末端圆点的大小表示负载;紫色虚线是指令角,拖动它的末端可以换指令。连杆颜色表示策略:蓝为教师,绿为学生,红为无记忆 PPO。右:三种策略在负载 0、0.5、1 下的测试误差(rad),颜色同左。先按①训练教师(60 次 PPO 迭代、32 个环境),再按②蒸馏学生(4 轮 DAgger,每轮 16 个回合:第 1 轮由教师驾驶,之后由学生驾驶,教师给每个状态打标签,数据累积起来做回归)。读数给出每种策略用掉的环境步数,以及学生每一轮之后的平均误差。
    • 按①:60 次迭代、96000 个环境步之后,教师在三个负载上的平均误差约 0.047 rad(低于 0.07 即完成)。
    • 按②:学生每轮之后的平均误差依次约为 0.39、0.12、0.061、0.047。第 1 轮只看过教师走过的状态(这就是行为克隆),自己开起来误差很大;DAgger 把学生自己会到达的状态补进数据之后,4 轮就追平了教师,只用了 3200 步,不到教师的 1/10(完成条件:误差不超过教师 + 0.02,步数少于教师的 1/10)。
    • 先完成②,再按“对照:无记忆 PPO”:同样 60 次迭代、96000 步,平均误差约 0.23 rad,是学生的 3 倍以上,在负载 0 时尤其差。只看一个带噪声的角度,它既估不出速度,也估不出负载。

    同样的历史输入也可以直接交给 PPO 训练(不经过教师):在这个小例子里,带 4 步历史的策略用 PPO 训练 60 次迭代后也能达到和教师相近的误差,critic 换成看特权状态的非对称 critic,最终结果也差不多。差距在观测离状态很远的时候才显现:Pinto 等(2018)的 actor 看的是图像,Lee 等(2020)的学生要从本体感觉历史里推断地形,这时直接对部分观测做 RL 又慢又不稳定,特权 critic 和教师就成了关键。

    现实差距从哪来:系统辨识与执行器网络

    现实差距有三个主要来源。动力学:质量、惯量、摩擦、接触刚度不准,最难的往往是执行器本身(9.4 节):减速器摩擦、反电动势带来的“转得越快力矩越小”、驱动器内部回路的带宽。延迟:传感器读数、网络通信、推理、电机驱动加起来几十毫秒,仿真里常常是零;它让系统不再是马尔可夫的,策略需要知道最近发出过什么动作。传感:噪声、偏置、量化、丢帧,以及仿真里干净、真机上满是空洞的深度图。

    系统辨识是最直接的对策:在真机上采一段数据,调仿真的参数让它复现这段数据(8.3 节讲过刚体参数是线性可辨识的)。执行器常常没有好用的物理模型,Hwangbo 等(2019)的做法是执行器网络:在真机上记录“目标位置误差和速度的最近历史 → 实际输出力矩”,训练一个 MLP 去拟合,再把它放进仿真循环里代替理想电机。下图用一个“真实”驱动器做这件事:它的力矩随转速下降(反电动势)、有约 15 ms 的滞后、比铭牌弱 15%,测量还带 0.15 N·m 的噪声。

    FIG 5辨识执行器:理想模型、物理参数拟合、执行器网络
    数据:关节在真机上跟踪一串随机目标角(每 0.25 s 换一次,叠加一个慢正弦),200 Hz 记录;6 秒用来拟合,另外 3 秒(不同的随机目标)用来测试。上:测试数据前 1.5 秒的测得力矩(琥珀点)与所选模型的预测(紫线)。下:整段 3 秒测试中真机的关节角(琥珀线)和把所选模型放进仿真、给同样目标时仿真出的关节角(紫线)。三种模型:理想 PD \(\tau=K_p(q^{\text{tgt}}-q)-K_d\dot q\);物理参数模型,在理想 PD 外乘一个强度系数、再过一个一阶滞后,两个参数可以用滑块调,也可以按“最小二乘拟合”在网格上找训练数据误差最小的一组;执行器网络,一个 6–16–16–1 的 tanh MLP,输入是当前、10 ms 前、20 ms 前的位置误差和速度(Hwangbo 等的输入配置),按“训练”用 Adam 在拟合数据上实时训练。
    • 理想 PD 的测试力矩误差是 3.69 N·m,仿真与真机的关节角差 0.189 rad。选“物理参数”,用滑块或“最小二乘拟合”把测试误差降到 1.3 N·m 以下。拟合给出强度 0.73、滞后 15 ms:误差 1.07 N·m,角度差 0.066 rad。注意强度比真值 0.85 低:把“真”参数 (0.85, 15 ms) 填进去,误差反而是 1.71。
    • 按“训练”训练执行器网络,直到测试力矩误差低于 1.0 N·m(约 1250 步,不到一秒)。继续训练几秒(5000 到 12000 步),误差在 0.75 到 0.8 N·m 之间,角度差约 0.02 到 0.04 rad,都比物理模型(1.07 N·m、0.066 rad)好。别训练太久:到 15000 步以后,力矩误差几乎不变,角度差却回升到 0.06 到 0.1 rad,不再胜过物理模型。网络只见过 6 秒的数据,仿真一旦走到数据之外,它的误差就会累积;实践中要用留出的数据决定何时停止。
    一个问题,几种看法

    辨识出来的参数不是“真值”:物理模型缺了转速对力矩的限制,最小二乘就用一个偏小的强度去补偿它;参数吸收了模型没写进去的效应。这不是错误,而是提醒:辨识得到的是“让这个模型最像真机的参数”。 执行器网络是一个学到的动力学模型:24.1 节会把整个系统的动力学都这样学出来。 域随机化是另一条路(23.2 节):不去把参数辨识准,而是让策略在一整片参数上都能工作,代价是策略可能变得保守。实践中常常组合使用:先辨识出一个中心值,再在它周围随机化。

    5再看数学

    提示:把鼠标悬停在公式中带底色的符号上,图中对应的元素会被高亮(FIG 1 的仿真地形边框与真机响应曲线、FIG 2 的指令虚线、FIG 3 的容差曲线、FIG 4 的教师与学生柱、FIG 5 的模型预测曲线)。

    sim-to-real 是在一族 MDP 上做优化

    沿用 20.1 节的记号(第 \(t\) 步动作之后得到奖励 \(r_{t+1}\)),把仿真器的物理参数(质量、摩擦、延迟、电机强度……)记为 \(\xi\),转移概率写成 \(P_\xi(s'\mid s,a)\)。同一个策略 \(\pi_\theta\) 在不同 \(\xi\) 下有不同的回报 \(J(\theta;\xi)=\mathbb E_{\tau\sim\pi_\theta,P_\xi}[\sum_{t\ge0}\gamma^tr_{t+1}]\)。在仿真里训练,就是在某个 \(\xi_{\text{sim}}\) 上求最优;真机的参数是未知的 \(\xi^\star\):

    $$ \theta_{\text{sim}}=\arg\max_\theta\,\hl{cem}{J(\theta;\xi_{\text{sim}})},\qquad J(\theta_{\text{sim}};\xi^\star)=J(\theta_{\text{sim}};\xi_{\text{sim}})-\hl{gap}{\Delta(\theta_{\text{sim}})},\qquad \Delta(\theta)=J(\theta;\xi_{\text{sim}})-J(\theta;\xi^\star) $$

    (FIG 1 里用的是代价 \(J\),越小越好,符号相反,道理相同。)现实差距 \(\Delta\) 这一项正是优化器看不见、也最容易被放大的部分:\(\theta_{\text{sim}}\) 是为 \(\xi_{\text{sim}}\) 量身定做的,它常常落在 \(J(\cdot;\xi_{\text{sim}})\) 很陡、或者紧挨着别的 \(\xi\) 下的不稳定区的地方。对策分三类:让 \(\xi_{\text{sim}}\) 接近 \(\xi^\star\)(系统辨识),把目标换成一个分布上的期望 \(\mathbb E_{\xi\sim p(\xi)}[J(\theta;\xi)]\)(域随机化,23.2 节;FIG 1 的绿色路径),或者让策略的输入里含有足以推断 \(\xi\) 的历史,使它对每个 \(\xi\) 分别接近最优(自适应策略,下文的教师–学生和 23.2 节的 RMA)。

    观测、动作与奖励的设计

    动作:位置目标是默认姿态 \(\mathbf q_0\) 加上缩放后的网络输出,由高频 PD 回路跟踪;FIG 2 的 \(\mathbf q_0=0\)、缩放 \(s=1\):

    $$ \hl{pd}{\mathbf q^{\text{tgt}}_t=\mathbf q_0+s\,\mathbf a_t},\qquad \boldsymbol\tau(t')=\operatorname{sat}\!\big(K_p(\mathbf q^{\text{tgt}}_t-\mathbf q(t'))-K_d\,\dot{\mathbf q}(t')\big),\quad t'\in[t,\,t+\Delta t_{\text{policy}}) $$

    PD 回路在策略的两个决策之间仍在用最新的 \(\mathbf q,\dot{\mathbf q}\) 做反馈,所以它像一个内环:策略只需要给出“去哪里”,“怎样稳定地去”有一部分由内环负责。\(K_p\) 不是越大越好:它太大,策略的小抖动就变成大力矩,太小,跟踪误差会依赖负载。注意,这时策略学到的是“目标角”与“实际角”之间的偏移,重力补偿就藏在这个偏移里(FIG 2 的 PD 策略在指令 1 rad 时输出的目标角明显大于 1)。

    观测:本体感觉(关节角、角速度、IMU 姿态与角速度)、指令、上一步的动作;延迟 \(d\) 步时,系统在增广状态 \(\tilde s_t=(s_t,\mathbf a_{t-1},\dots,\mathbf a_{t-d})\) 上才是马尔可夫的,所以把最近的动作放进观测几乎总是对的。奖励:

    $$ r_{t+1}=w_{\text{trk}}\,\exp\!\big(-\|\mathbf e_{t+1}\|^2/\sigma^2\big)\;-\;w_\tau\|\boldsymbol\tau_t\|^2\;-\;w_{\Delta a}\|\mathbf a_t-\mathbf a_{t-1}\|^2\;-\;\dots,\qquad r^{\text{sparse}}_{t+1}=\mathbb 1\big[\|\mathbf e_{t+1}\|<\hl{tol}{\varepsilon_k}\big] $$

    FIG 3 的课程规则是:命中率 \(h_k>0.6\) 时 \(\varepsilon_{k+1}=\max(0.8\,\varepsilon_k,\ 0.05)\),否则不变。Hwangbo 等的正则项课程是 \(r_{t+1}=r^{\text{task}}_{t+1}-k_c\sum_i w_i c_i\),\(k_c\leftarrow k_c^{\,k_d}\)。两者的共同点:课程改变目标函数,所以中途的回报曲线不能直接相比,要用一个固定的指标(这里是测试误差)来评估。

    并行环境里的 PPO

    20.4 节的截断目标不变,变的是一次迭代的批量:\(N\) 个环境各走 \(T\) 步,批量 \(B=NT\)。梯度估计的方差大致按 \(1/B\) 下降,所以 \(N\) 增大时,每次迭代的方向更准、可以少迭代几次;但当梯度已经足够准,瓶颈变成“每次迭代能把策略改多少”(受截断 \(\epsilon\) 和学习率限制),再加环境就没用了,这就是 FIG 2 在 64 到 128 之间饱和的原因。腿式机器人的常见规模是几千个环境、每个环境每次迭代只走几十步:\(T\) 短,GAE 用 \(V_\phi\) 在截断处自举(20.4 节误区 1),这正好让 \(N\) 可以很大。

    # 机器人 RL 的标准训练循环(伪代码,GPU 上所有环境是一个张量批量)
    envs = ParallelSim(N=4096, randomize=dr_ranges)          # 23.2 节:每个环境一组随机物理参数
    obs  = envs.reset()
    for it in range(n_iters):
        for t in range(T):                                    # T 约 24 步
            a, logp = policy.sample(obs)                      # 演员只看真机也有的观测
            v = critic(envs.privileged_state())               # 非对称:评论家可以看特权状态
            obs, r, done, timeout = envs.step(a)              # 内部:PD 回路跑 decimation 个物理步
            buffer.add(obs, a, logp, r, v, done, timeout)
        adv, ret = gae(buffer, gamma=0.99, lam=0.95)          # 超时截断处用 V 自举
        ppo_update(policy, critic, buffer, adv, ret, clip=0.2, epochs=5)
        curriculum.update(envs.episode_stats())               # 地形等级 / 容差 / 惩罚系数

    (这段伪代码里的数值只是这类代码库常见的量级,不是某篇论文的设置。)

    非对称 critic 为什么可以,以及它的边界

    演员的动作只依赖观测历史 \(h_t\):\(a_t\sim\pi_\theta(\cdot\mid h_t)\)。把任何不依赖 \(a_t\) 的量当作基线,梯度都无偏(20.3 节)。完整状态 \(s_t\) 就是这样一个量:给定 \((h_t,s_t)\),\(a_t\) 只通过 \(h_t\) 抽取,所以

    $$ \mathbb E\big[\nabla_\theta\log\pi_\theta(a_t\mid h_t)\,V_\phi(\hl{priv}{s_t})\big]=\mathbb E_{h_t,s_t}\Big[V_\phi(s_t)\,\underbrace{\mathbb E_{a_t\sim\pi_\theta(\cdot\mid h_t)}\big[\nabla_\theta\log\pi_\theta(a_t\mid h_t)\big]}_{=\,0}\Big]=0 $$

    所以把 \(V(s_t)\) 当基线从蒙特卡洛回报里减掉,是无偏的,而且因为 \(s_t\) 比 \(h_t\) 信息多,基线更准,方差更小。但 GAE 和 TD 还把 critic 当自举的目标,这时它应该估计的是“当前这个只看 \(h\) 的策略从这里出发的回报”,而这个回报一般同时依赖 \(h_t\) 和 \(s_t\)(同一个状态下,策略因为历史不同会做不同的事)。只用 \(s_t\) 的 critic 在部分可观测时一般是有偏的;Baisero 和 Amato(2022)给出了这一点的分析,并提出用 \(V(h_t,s_t)\) 作 critic 来消除偏差。实践中特权 critic 通常仍然有效,只要知道它的理论保证在哪里结束。

    教师–学生蒸馏的目标

    教师 \(\pi^{\text{T}}\) 用 RL 在 \((o_t,\hl{priv}{x^{\text{priv}}_t})\) 上训练好之后固定。学生的参数 \(\psi\) 最小化它和教师在学生自己的状态分布上的差别:

    $$ \hl{dagger}{\min_\psi\ \mathbb E_{s_t\sim d^{\pi^{\text{S}}_\psi}}\Big[\big\|\mu^{\text{S}}_\psi(o_{t-K:t},\,a_{t-K:t-1})-\mu^{\text{T}}(o_t,x^{\text{priv}}_t)\big\|^2\Big]} $$

    如果期望取在教师的状态分布 \(d^{\pi^{\text{T}}}\) 上,这就是行为克隆,误差会像 22.1 节分析的那样随时间累积(FIG 4 第 1 轮之后误差 0.39);DAgger 交替“用学生采样”和“在累积数据上回归”,把期望移到学生的分布上(第 4 轮 0.047)。这里的回归是监督学习,比 RL 便宜得多:学生用的环境步数不到教师的 1/10。前提是学生的输入里确实含有推断特权信息所需的东西:如果某个特权量无论多长的历史都推断不出来(比如前方还没踩到的地形),学生就学不会教师依赖它的那部分行为,这时要么给学生加上相应的传感器(相机、高度图),要么让教师少依赖它。

    系统辨识与执行器网络

    给一段真机记录 \(\{(\mathbf u_i,\tau_i)\}\)(\(\mathbf u_i\) 是驱动器的输入历史,\(\tau_i\) 是测得的力矩),物理参数的辨识与执行器网络都是最小二乘回归,只是模型族不同:

    $$ \hat\xi=\arg\min_\xi\sum_i\big(\tau_i-\tau_{\text{model}}(\mathbf u_i;\xi)\big)^2,\qquad \hat\psi=\arg\min_\psi\sum_i\big(\tau_i-\hl{act}{f_\psi(e_t,e_{t-0.01},e_{t-0.02},\dot q_t,\dot q_{t-0.01},\dot q_{t-0.02})}\big)^2 $$

    其中 \(e=q^{\text{tgt}}-q\)。前者参数少、可解释、外推好,但模型结构错了就有偏(FIG 5 的强度偏小);后者能拟合模型写不出来的效应,但只在采过数据的工况附近可信,所以激励信号要覆盖策略将来会用到的速度和力矩范围。延迟 \(d\) 可以单独辨识(比较指令和响应的互相关),然后在仿真里加同样长的缓冲;ANYmal 的执行器网络把驱动器内部的动态都包了进去。

    6机器人中的它:里程碑、工具与真机 RL

    下表只列出已核对过原文的事实;其余细节请看原论文。

    工作机器人做了什么(本节对应的概念)
    Hwangbo 等,Science Robotics 2019ANYmal 四足在真机上训练执行器网络、放进仿真;用 TRPO 训练策略,输出关节目标位置;对惩罚项用课程因子 \(k_c\)。所有训练在一台单 CPU、单 GPU 的电脑上完成,每次不超过 11 小时。真机最高速度 1.5 m/s,比 ANYmal 此前的纪录快 25%;还学会了从复杂姿态摔倒后爬起来。
    Lee 等,Science Robotics 2020ANYmal(两代)教师策略在仿真里看特权信息(如地形与接触状态)用 RL 训练,学生只看本体感觉的历史并模仿教师;配合自适应的地形课程。零样本部署到泥地、雪地、碎石、植被、流水等自然环境。
    Rudin 等,CoRL 2021ANYmal在一块工作站 GPU 上用成千上万个并行仿真机器人训练 PPO:平地行走 4 分钟以内,崎岖地形约 20 分钟;“游戏式”的地形课程按表现升降难度;迁移到真机。代码 legged_gym / rsl_rl 成了许多后续工作的起点。
    OpenAI 等,“Learning Dexterous In-Hand Manipulation”,2018(后刊于 IJRR 2020)Shadow 灵巧手PPO + LSTM 策略,全部在随机化仿真里训练,用非对称 actor-critic(价值网络可看真机拿不到的信息)。384 台各 16 核的机器生成经验、8 块 GPU 优化;全随机化下约 100 年的仿真经验、约 50 小时墙钟。真机上方块连续转到目标朝向的中位数是 13 次(仿真里 50 次)。
    OpenAI 等,“Solving Rubik's Cube with a Robot Hand”,2019Shadow 灵巧手自动域随机化(ADR,23.2 节):随机化范围随表现自动扩大。解法序列由 Kociemba 求解器给出,策略负责手内操作。需要 15 次面转动的打乱能成功 60%,最难的 26 次转动的打乱成功 20%。
    Zhuang 等,CoRL 2023(Robot Parkour Learning)Unitree A1 与 Go1先在“软动力学约束”(允许穿过障碍、逐步收紧)下用 RL 学会攀爬、跳跃、钻爬、侧身挤过等技能,再用 DAgger 把它们蒸馏进一个只用自身深度相机的策略。
    Cheng 等,Extreme Parkour,ICRA 2024Unitree A1一个直接从前置深度相机图像输出动作的策略:跳上自身高度 2 倍的障碍、跃过自身长度 2 倍的间隙;教师用特权的“scandots”地形信息训练,再蒸馏给看深度图的学生。
    仿真器

    Isaac Gym(Makoviychuk 等,2021):NVIDIA 的 GPU 物理仿真,物理状态和策略网络都在 GPU 上,通过 PyTorch 张量直接交换数据、不经 CPU,论文报告比“CPU 仿真 + GPU 网络”的常规做法快 2 到 3 个数量级。它已不再维护,继任者是 Isaac Lab(前身 Orbit,Mittal 等,2023),建在 Isaac Sim 之上,带相机、传感器和大量现成的机器人任务。MuJoCo(Todorov 等,2012)是 CPU 上最常用的接触仿真之一;MJX 是它用 JAX 重写的版本(随 MuJoCo 3 发布),可以在 GPU/TPU 上批量运行;MuJoCo Playground(Zakka 等,2025)在 MJX 上提供了四足、人形、灵巧手和机械臂的训练环境,论文称可在单块 GPU 上几分钟内训练出策略,并零样本迁移到真机。Google 的 Brax(Freeman 等,2021)是另一个 JAX 上的可并行仿真器。选哪个,更多取决于你的机器人模型、传感器需求和团队的框架(PyTorch 还是 JAX),而不是谁“更准”。

    真机上直接学

    没有仿真,也能做 RL,只是要换一套算法:真机样本贵,要用 off-policy、可以重复用数据的方法(20.4 节的 SAC)。QT-Opt(Kalashnikov 等,2018)用 7 台机械臂采集了约 58 万次真实抓取,学到的视觉抓取策略对没见过的物体成功率 96%;Haarnoja 等(2019)让 Minitaur 四足在真机上大约两小时学会稳定步态;Smith、Kostrikov 和 Levine(2022)让 Unitree A1 在约 20 分钟内学会行走。难点不在算法,而在工程:自动复位、安全的探索、不会被摔坏的硬件、可靠的奖励测量。今天常见的组合是:仿真里预训练,真机上少量微调或用离线数据(20.5 节)继续改进。

    7常见误区

    误区 1:把仿真里的回报当成真机的表现

    仿真回报只说明策略在 \(\xi_{\text{sim}}\) 上好。FIG 1 里仿真最优的增益在 60 ms 延迟下代价翻了 3 倍。部署前至少在一个“留出”的仿真上测:参数偏一点、加延迟、加噪声,看性能掉多少;掉得厉害的策略多半在钻某个缺陷的空子。还要看策略的动作本身:高频抖动、打满力矩、关节速度贴着上限,这些在仿真里不扣分,在真机上会烧电机。

    误区 2:让策略看到真机上没有的东西

    仿真里随手可得的量(机身真实线速度、精确的接触状态、无噪声的关节速度)一旦进了演员的输入,部署时就要拿估计值代替,而估计值的误差分布和训练时完全不同。规则很简单:演员的每个输入都要问“真机上它从哪来、多大噪声、多少延迟”,并在仿真里按这个答案去模拟;特权信息只给 critic 或教师。

    误区 3:忽略延迟和控制频率

    仿真里观测和动作是同一时刻的,真机上中间隔着几十毫秒。延迟让系统不再马尔可夫(第 5 节的增广状态),也把高增益策略推向不稳定(FIG 1)。要在仿真里加上与真机一致的延迟(最好再随机化一点),把最近的动作放进观测,保持训练和部署时的控制频率一致,部署时测一下真实的回路延迟。

    误区 4:奖励项越加越多,却不看每一项在做什么

    十几项奖励的权重互相影响,惩罚太重会落进“站着不动”的局部最优,太轻则学出抖动和怪异步态,而且总回报会掩盖这些。逐项记录每个奖励项的平均值,固定一组与奖励无关的评估指标(跟踪误差、能耗、摔倒率),一次只改一个权重;用课程先学任务、再加约束。

    误区 5:学生拿不到教师依赖的信息

    教师–学生蒸馏只在学生的观测“原则上”能推断出教师的特权信息时才行得通。教师若依赖了学生永远推断不出的东西(摩擦系数在没打滑前几乎不可观测、前方地形对盲走的学生不可观测),学生只能学到一个平均行为,常常是两边都不好的折中。对策:限制教师的特权输入,或给学生加传感器;并且像 FIG 4 那样用 DAgger 而不是只在教师的状态上做行为克隆。

    8小练习

    1. 在 GPU 并行仿真里训练 PPO,把并行环境从 64 增加到 4096,最主要的好处是什么?
    选项 C。FIG 2 里从 4 到 64 个环境,样本多了 10 倍以上而迭代只少了约三成:样本效率反而下降(排除 A)。并行仿真的意义在于样本几乎免费、墙钟时间才贵。GAE 照用(排除 B);鲁棒性来自随机化和接口设计,不来自环境数(排除 D)。
    2. 为什么腿式机器人的学习策略通常输出关节目标位置(由 PD 回路跟踪),而不是直接输出力矩?
    选项 B。FIG 2 里力矩接口在仿真里反而学得快(排除 A),但电机强度降到 0.6 时,它的真机误差是 PD 策略的 2 倍以上,PD 策略仍在 0.05 rad 左右。策略本身仍是非线性网络(排除 C);很多驱动器可以接受力矩指令(排除 D),PD 目标是一个设计选择。
    3. 非对称 actor-critic 里 critic 看完整状态 \(s_t\),actor 只看观测历史 \(h_t\)。下面哪句话是对的?
    选项 D。critic 只在训练时用,部署只需要 actor(排除 A)。基线只要不依赖 \(a_t\) 就无偏,第 5 节的推导说明 \(s_t\) 满足这一点(排除 B)。但自举时 critic 应当估计依赖历史的策略的回报,这一般同时依赖 \(h_t\) 和 \(s_t\)(Baisero 与 Amato,2022),所以两者并不等价(排除 C)。
    4. FIG 4 里学生第 1 轮之后误差约 0.39 rad,第 4 轮之后约 0.047 rad。第 1 轮差的主要原因是?
    选项 A。这正是 22.1 节的协变量偏移:网络和历史长度在各轮都一样(排除 B、D),教师在蒸馏开始前已经训练完并固定(排除 C)。DAgger 从第 2 轮起让学生驾驶、教师在学生到达的状态上打标签,把训练分布移到学生自己的分布上。
    5. FIG 5 里,最小二乘辨识出的电机强度是 0.73,而真实驱动器的强度是 0.85。最好的解释是?
    选项 C。把“真”参数 (0.85, 15 ms) 填进物理模型,测试误差是 1.71 N·m,比拟合值的 1.07 差得多:在这个模型结构下,0.73 才是最好的。数据量与网格步长(0.01)都不是问题(排除 A、B);测量噪声是零均值的、加在被预测的力矩上,不会系统地把强度往下拉(排除 D)。执行器网络没有这个结构限制,所以误差更低。

    9延伸阅读

    • J. Hwangbo, J. Lee, A. Dosovitskiy, D. Bellicoso, V. Tsounis, V. Koltun & M. Hutter, Learning Agile and Dynamic Motor Skills for Legged Robots, Science Robotics 4(26), 2019 — 执行器网络、惩罚课程、ANYmal 的 sim-to-real
    • J. Lee, J. Hwangbo, L. Wellhausen, V. Koltun & M. Hutter, Learning Quadrupedal Locomotion over Challenging Terrain, Science Robotics 5(47), 2020 — 特权教师与本体感觉学生
    • N. Rudin, D. Hoeller, P. Reist & M. Hutter, Learning to Walk in Minutes Using Massively Parallel Deep Reinforcement Learning, CoRL 2021 — GPU 上数千个并行环境与游戏式课程
    • V. Makoviychuk et al., Isaac Gym: High Performance GPU-Based Physics Simulation for Robot Learning, NeurIPS 2021 Datasets and Benchmarks — 端到端在 GPU 上的仿真与训练
    • M. Andrychowicz et al. (OpenAI), Learning Dexterous In-Hand Manipulation, IJRR 39(1), 2020 (arXiv:1808.00177) — Dactyl:随机化仿真、非对称 actor-critic、LSTM 策略
    • I. Akkaya et al. (OpenAI), Solving Rubik's Cube with a Robot Hand, arXiv:1910.07113, 2019 — 自动域随机化(23.2 节)
    • L. Pinto, M. Andrychowicz, P. Welinder, W. Zaremba & P. Abbeel, Asymmetric Actor Critic for Image-Based Robot Learning, RSS 2018 — critic 看状态、actor 看图像
    • A. Baisero & C. Amato, Unbiased Asymmetric Reinforcement Learning under Partial Observability, AAMAS 2022 — 只看状态的 critic 何时有偏,以及历史–状态 critic
    • D. Chen, B. Zhou, V. Koltun & P. Krähenbühl, Learning by Cheating, CoRL 2019 — 自动驾驶中的特权教师与视觉学生
    • J. Tan, T. Zhang, E. Coumans, A. Iscen, Y. Bai, D. Hafner, S. Bohez & V. Vanhoucke, Sim-to-Real: Learning Agile Locomotion for Quadruped Robots, RSS 2018 — Minitaur 上的执行器建模、延迟与随机化
    • Z. Zhuang, Z. Fu, J. Wang, C. Atkeson, S. Schwertfeger, C. Finn & H. Zhao, Robot Parkour Learning, CoRL 2023 — 软动力学约束与技能蒸馏
    • X. Cheng, K. Shi, A. Agarwal & D. Pathak, Extreme Parkour with Legged Robots, ICRA 2024 (arXiv:2309.14341) — 从深度图像直接输出动作的跑酷策略
    • D. Kalashnikov et al., QT-Opt: Scalable Deep Reinforcement Learning for Vision-Based Robotic Manipulation, CoRL 2018 — 大规模真机 RL 抓取
    • T. Haarnoja, S. Ha, A. Zhou, J. Tan, G. Tucker & S. Levine, Learning to Walk via Deep Reinforcement Learning, RSS 2019 — 在真机上用 SAC 学步态
    • L. Smith, I. Kostrikov & S. Levine, A Walk in the Park: Learning to Walk in 20 Minutes With Model-Free Reinforcement Learning, arXiv:2208.07860, 2022
    • J. Ibarz, J. Tan, C. Finn, M. Kalakrishnan, P. Pastor & S. Levine, How to Train Your Robot with Deep Reinforcement Learning: Lessons We Have Learned, IJRR 40(4–5), 2021 — 真机 RL 的工程经验
    • K. Zakka et al., MuJoCo Playground, arXiv:2502.08844, 2025 — 基于 MJX 的 GPU 训练环境与 sim-to-real