【四足强化学习经典算法】(三):DreamWaQ——隐式地形想象与显式状态估计
前言
- 强化学习的价值不仅在于算法本身,更在于解决复杂实际问题。在四足机器人领域,结合具体任务与应用场景,才能更深入地理解算法的设计思想与应用价值
- 本系列围绕经典论文与开源代码展开,重点分析算法原理、网络结构与具体实现,并与另一个侧重算法复现和实物部署的系列并行推进
- 前两期我们分别介绍了两种不同的状态估计思路:以 RMA 为代表的隐式环境表征,以及以 State Estimator 为代表的显式状态估计
- 隐式路线不要求网络输出任何有物理含义的量,只要求潜在编码对控制任务有用
- 显式路线用监督信号把网络约束到机身线速度、足端高度、接触概率这些可测量的状态上
- 由此产生一个自然的问题:
- 能否把两者放进同一个估计器,让它既输出有物理意义的机身状态,又保留一个可供策略使用的隐式环境表征,从而让机器人更好地理解自身与地形之间的关系?
- 本期要介绍的 DreamWaQ 正是围绕这一问题展开的工作,它用 CENet(Context-Aided Estimator Network,上下文辅助估计网络)把显式状态估计与隐式上下文推断放在共享编码器上联合训练,再用自适应引导(
AdaBoot,Adaptive Bootstrapping)按训练阶段把估计值与仿真真值混合成策略输入,最终只用本体感知完成零样本仿真到真实(zero-shot sim-to-real)
需要说明的是,论文作者并未提供完整的官方训练代码,公开资料主要包括论文及相关实验视频。不过,这并不影响我们对其核心方法的分析与理解。DreamWaQ 的整体算法框架相对简洁,其关键在于三个方面:状态与环境信息的估计目标、估计网络的监督学习机制,以及估计结果与强化学习策略之间的融合方式。
文章目录
1 回顾
1-1 状态估计思路
- 在机器人控制中,状态是控制器进行决策的依据,而受传感器能力的限制,系统状态通常无法被直接测量,只能从可获得的观测中推断。其一般形式可以写为
x
^
t
=
f
(
I
t
)
\hat{x}_t = f\left(\mathcal{I}_t\right)
x^t=f(It)以防你忘记:
- x ^ t \hat{x}_t x^t:时刻 t t t 的状态估计
- I t \mathcal{I}_t It:估计时可利用的信息,可以是当前观测、历史观测或仿真中的特权信息
- 在四足机器人强化学习中, I t \mathcal{I}_t It 通常是本体感知序列,包括机身角速度、投影重力方向、关节位置、关节速度、上一时刻动作与速度指令
- 根据 x ^ t \hat{x}_t x^t 是否有明确物理含义,可以把前两期的方法分成两类
| 方法 | 估计目标 | 监督信号 | 潜在表征的物理含义 |
|---|---|---|---|
| RMA | 环境编码 z t z_t zt | 回归特权因子 x t x_t xt | 间接受特权因子监督,不保证逐维对应 |
| State Estimator | 状态量 s ^ t \hat{s}_t s^t | 回归仿真真值状态 | 有,对应机身速度、足端高度、接触概率 |
| DreamWaQ | 机身线速度 v t v_t vt 与上下文 z t z_t zt | 速度回归与下一时刻观测重建 | v t v_t vt 有, z t z_t zt 只有统计意义 |
1-2 RMA:隐式环境表征

- RMA 的核心思想是不直接估计完整的环境状态,而是通过适应模块(Adaptation Module)将历史本体观测映射为潜在环境编码 z t z_t zt,再由基础策略(Base Policy)结合 z t z_t zt 完成运动控制。
- 适应模块的训练目标是使预测得到的潜在编码逼近仿真环境中的特权因子
x
t
x_t
xt。因此,虽然
z
t
z_t
zt 是网络学习得到的潜在表征,但其学习过程受到特权因子的监督约束,从而具备一定的物理意义。
- 优点: 网络结构相对简单,部署阶段仅依赖机器人自身的本体感知信息,无需额外的外部环境感知传感器。
- 局限: 潜在编码的学习目标受到特权因子定义与选取方式的影响。如果特权因子未能充分描述任务相关的环境信息,适应模块所学习的表征也可能无法充分覆盖这些因素。
说人话:RMA 通过历史本体观测学习一个隐式的环境表示,并利用仿真中的特权信息指导这一表示的学习。
1-3 Concurrent Training of a Control Policy and a State Estimator:显式状态估计

- 该工作将状态估计器与控制策略纳入同一个训练循环,即并发训练(Concurrent Training):策略网络直接使用状态估计器的当前输出作为输入,而估计器的监督标签则来自同一批训练轨迹对应的仿真真值。
- 优点: 估计结果具有明确的物理意义,可解释性较强,便于分析估计误差及其对控制策略的影响。
- 局限: 状态估计器的学习目标主要集中于预先定义的物理状态量,并不直接承担地形特征提取与环境表征学习的任务。
说人话:Concurrent Training 学习一个显式的状态估计器,直接预测机器人运动过程中需要的物理状态信息。
2 DreamWaQ
2-1 介绍
2-1-1 论文信息

- 本文介绍的算法来自论文 DreamWaQ: Learning Robust Quadrupedal Locomotion With Implicit Terrain Imagination via Deep Reinforcement Learning,由 KAIST 团队提出,发表于 IEEE ICRA 2023。论文预印本为 arXiv:2301.10602(v2),项目主页:DreamWaQ。
- 其中算法名字:DreamWaQ = Dream Walking for Quadrupedal Robots。
- 论文的研究问题可以概括为:
- 只用惯性测量单元(IMU,Inertial Measurement Unit)与关节编码器,如何让四足机器人在非结构化地形上稳定行走并零样本迁移到真机;
- 实验平台为 Unitree A1,验证覆盖楼梯、草坪坡道、雨后湿滑地面与累计爬升约 22 m 的登山道
- 从研究方向来看,DreamWaQ 同样属于本体感知运动控制(Proprioceptive Locomotion)领域,与前两期介绍的 RMA 和 Concurrent Training of a Control Policy and a State Estimator 一脉相承。其主要区别在于网络设计:通过共享编码器,将机身运动状态估计与隐式地形表征学习结合起来,使两类信息能够共同服务于后续的运动控制策略。
2-1-2 问题与动机
- 论文把问题建模为无限时域的部分可观测马尔可夫决策过程(POMDP,Partially Observable Markov Decision Process),其元组记为 M = ( S , O , A , d 0 , p , r , γ ) \mathcal{M}=(\mathcal{S},\mathcal{O},\mathcal{A},d_0,p,r,\gamma) M=(S,O,A,d0,p,r,γ)
- 这部分内容我们曾经在【POMDP】从单帧图像到时序感知:CNN、VAE、GRU 与 PPO 的视觉控制实验 提到过
- 以防你忘记:
- s ∈ S s\in\mathcal{S} s∈S:完整状态,包含机器人与环境的全部信息
- o ∈ O o\in\mathcal{O} o∈O:策略实际能拿到的部分观测
- a ∈ A a\in\mathcal{A} a∈A:动作,对应十二个期望关节角
- d 0 ( s 0 ) d_0(s_0) d0(s0):初始状态分布
- p ( s t + 1 ∣ s t , a t ) p(s_{t+1}\mid s_t,a_t) p(st+1∣st,at):状态转移概率
- r r r:奖励函数,把状态与动作映射为实数
- γ ∈ [ 0 , 1 ) \gamma\in[0,1) γ∈[0,1):折扣因子
- 论文指出,感知路线(相机或激光雷达)在恶劣天气与光照条件下并不可靠,而且外观与实际可通行性常常不一致,例如积雪看起来坚硬实则松软、高草丛看起来不可通行实则能穿过;相比之下,本体感知传感器轻量且鲁棒
- 但只用本体感知的策略在两件事上受限
- 一是表征学习瓶颈:策略需要先理解地形属性才能学出稳健步态,而要理解地形属性又需要机器人先能走起来去探索,两者互为前提
- 二是长距离退化:仿真与真实之间的偏差在高不确定性环境中会累积,短距离实验看不出问题,长距离行走容易失败
- 论文的贡献可以概括为三点
- 提出一种基于非对称 Actor-Critic 的运动学习框架,只依赖本体感知就能隐式地"想象"地形属性
- 提出 CENet,把机身状态估计与环境上下文估计联合起来训练,性能优于已有方法
- 在 Unitree A1 上完成真实户外环境的鲁棒性与耐久性验证,包括坡道、草地、楼梯与湿滑地面
2-1-3 与前两期的关系
- 从训练范式看,DreamWaQ 去掉了教师—学生两阶段:策略在训练全程都能拿到估计值,不需要先冻结一个教师再蒸馏
- 论文明确指出,行为克隆(BC,Behavior Cloning)会把学生策略的上界锁死在教师策略上,教师没有学会的失败状态学生也学不到
- 顺序训练还带来了额外的数据开销,教师与学生需要各自采集数据
从估计目标看,DreamWaQ 同时保留了显式与隐式两条路线:机身线速度用均方误差显式监督,环境上下文用 β-变分自编码器隐式学习
2-2 整体架构

- 图 2-1 给出论文的整体框架,图中上半部分的虚线框是仿真训练阶段,下半部分的绿底是零样本仿真到真实的部署阶段
2-2-1 仿真训练阶段
- 训练阶段有三条信息通路
- 上下文估计器接收一段时间内的本体观测历史 o t H o_t^H otH,输出机身线速度估计与上下文向量
- 策略网络(Actor)接收当前观测 o t o_t ot 以及估计得到的 v t v_t vt、 z t z_t zt,输出动作 a t a_t at
- 价值网络(Critic)接收特权观测 s t s_t st,其中包含真值线速度、随机扰动力与地形高度扫描
- 图中标注的网络规模分别是 CENet 的 128 × 64 × 19 128\times64\times19 128×64×19、Actor 的 512 × 256 × 128 × 12 512\times256\times128\times12 512×256×128×12 与 Critic 的 512 × 256 × 128 × 1 512\times256\times128\times1 512×256×128×1
- 三个网络在同一次训练循环中更新:Actor 与 Critic 用 PPO(Proximal Policy Optimization,近端策略优化)更新,CENet 用第 2-3 节的混合损失更新
- 观测与状态的维度在论文中写成
o t = [ ω t , g t , c t , θ t , θ ˙ t , a t − 1 ] T o_t = \left[\omega_t,\ g_t,\ c_t,\ \theta_t,\ \dot{\theta}_t,\ a_{t-1}\right]^{\mathsf T} ot=[ωt, gt, ct, θt, θ˙t, at−1]T
s t = [ o t , v t , d t , h t ] T s_t = \left[o_t,\ v_t,\ d_t,\ h_t\right]^{\mathsf T} st=[ot, vt, dt, ht]T
- 其中:
- ω t \omega_t ωt:机身角速度
- g t g_t gt:重力向量在机体系下的投影
- c t c_t ct:速度指令
- θ t \theta_t θt 与 θ ˙ t \dot{\theta}_t θ˙t:关节位置与关节速度
- a t − 1 a_{t-1} at−1:上一时刻动作
- v t v_t vt:机身线速度
- d t d_t dt:随机施加在机身上的扰动力
- h t h_t ht:机器人周边地形的高度扫描
- 动作空间是十二维向量,对应十二个期望关节位置。为便于学习,网络预测的是相对站立姿态的偏移量,实际下发的期望角为
θ d e s = θ s t a n d + a t \theta_{\mathrm{des}} = \theta_{\mathrm{stand}} + a_t θdes=θstand+at
- 期望关节角由比例微分(PD,Proportional-Derivative)控制器逐关节跟踪;真机上策略与 CENet 同步以 50 Hz 运行,PD 控制器以 200 Hz 运行,增益取 K p = 28 K_p=28 Kp=28、 K d = 0.7 K_d=0.7 Kd=0.7
说人话:Actor 和 Critic 看到的东西不一样。Actor 只能看到机器人自己能测到的量,加一个估计器"猜"出来的速度和上下文;Critic 在训练时能看到真值速度、外力和地形高度,它的作用是给 Actor 的动作打分,所以训练时可以作弊,部署时不必存在
2-2-2 部署阶段
- 部署时只保留 CENet 与 Actor,Critic 被丢弃,高度扫描、扰动力与真值线速度这些特权信息全部不可见
- 图 2-1 下半部分的实线即部署链路: o t H o_t^H otH 进入 CENet 得到 v t v_t vt 与 z t z_t zt,与 o t o_t ot 拼接后进入 Actor,输出 a t a_t at
- 论文强调这是零样本迁移,即网络权重不做任何在线微调,A1 出厂后直接在新场地上行走
2-3 CENet:上下文辅助估计网络
2-3-1 网络整体结构

- 图 2-2 给出 CENet 的结构,其特点是单编码器、双解码头:一个编码器把观测历史压成低维向量,两个头分别负责显式状态估计与隐式上下文重建
- 编码器的输入是长度为 H = 5 H=5 H=5 的观测历史,输出为 19 19 19 维向量;按论文 Fig. 2 的标注,其中 3 3 3 维是机身线速度估计 v ~ t \tilde{v}_t v~t, 16 16 16 维是上下文向量 z t z_t zt
- 解码器接收 z t z_t zt,重建下一时刻的部分观测 o t + 1 o_{t+1} ot+1
- 两个分支的分工可以汇总如下
| 分支 | 输出 | 学习目标 |
|---|---|---|
| 显式估计分支 | v ~ t \tilde{v}_t v~t | 当前真实机身线速度 v t v_t vt |
| β-VAE 分支 | z t z_t zt | 重建下一时刻观测 o t + 1 o_{t+1} ot+1 |
- 各部分的规模如下
| 模块 | 输入维度 | 隐藏层 | 输出维度 |
|---|---|---|---|
| 编码器 | H ⋅ n H\cdot n H⋅n, H = 5 H=5 H=5, n n n 为单步观测维数 | 128、64 | 19,其中 3 维速度、16 维上下文 |
| 解码器 | 16 | 64、128 | 与单步观测同维 |
| Actor | 单步观测、速度与上下文 | 512、256、128 | 12 |
| Critic | 特权观测 | 512、256、128 | 1 |
- 论文列出了共享编码器的两点好处
- 网络结构简化,推理时 CENet 与策略可以同步运行,不需要两套独立的时序网络
- 编码器通过自编码机制同时学习机器人前向与后向动力学,从而提高估计精度
说人话:一个编码器干两份活,一份是把历史压成"我现在跑多快",一份是压成"我脚下大概是什么地形"。两份活共享同一层特征,所以学速度的时候顺便也在学地形,学地形的时候顺便也在学速度
2-3-2 显式状态估计:机身线速度预测
- 显式分支用均方误差约束估计速度与仿真真值
L
e
s
t
=
M
S
E
(
v
~
t
,
v
t
)
\mathcal{L}_{\mathrm{est}} = \mathrm{MSE}\left(\tilde{v}_t,\ v_t\right)
Lest=MSE(v~t, vt)其中:
- v ~ t \tilde{v}_t v~t:编码器输出的机身线速度估计
- v t v_t vt:仿真器给出的真值机身线速度
- 论文采用学习式估计而不是对 IMU 加速度积分,原因是后者存在累积漂移:加速度二次积分后误差随时间增长,长距离行走时速度估计会明显偏离真值
- 用历史观测直接回归速度,等价于让网络从足端触地引起的关节运动变化中推断机身运动,这一思路与第二期的显式状态估计一致
说人话:积分加速度就像用走得快慢累加出走了多远,每一步的小误差都会被累加;回归速度则是每时每刻重新"看一眼"关节和 IMU,误差不会滚雪球
2-3-3 隐式环境表征:β-VAE 与下一时刻观测重建
2-3-3-1 β-VAE

- 关于变分自编码器我们曾经在往期内容讲过,这里不多做介绍:【生成式模型入门】(一):变分自编码器 VAE — 从 ELBO 推导到机器人轨迹生成
- 这里提下 β-VAE 和 VAE 的区别:普通 VAE 的训练目标是证据下界(ELBO,Evidence Lower Bound)的负值,重建项与 KL 项等权相加
- β-VAE 由 Higgins 等人于 2017 年提出,做法是在 KL 项前乘一个可调权重 β \beta β, β = 1 \beta=1 β=1 时退化为普通 VAE,因此 VAE 可以看作 β-VAE 的特例
- 取 β > 1 \beta>1 β>1 相当于刻意加重对后验的约束,鼓励潜变量形成更接近解耦的表征;代价是重建变模糊, β \beta β 越大潜变量携带的信息越少
- DreamWaQ 需要的正是这种信息受限的表征,因为 z t z_t zt 不对应任何物理量,只要求它携带预测下一时刻观测所必需的信息
- 隐式分支采用 β-变分自编码器(β-VAE,β-Variational AutoEncoder)框架,编码器输出潜变量的后验分布参数,解码器从采样得到的潜变量重建观测
q ( z t ∣ o t H ) = N ( μ t , d i a g ( σ t 2 ) ) q\left(z_t\mid o_t^H\right) = \mathcal{N}\left(\mu_t,\ \mathrm{diag}\left(\sigma_t^2\right)\right) q(zt∣otH)=N(μt, diag(σt2))
- 训练时用重参数化技巧采样,使梯度可以穿过随机采样这一步
z
t
=
μ
t
+
exp
(
1
2
log
σ
t
2
)
⊙
ϵ
,
ϵ
∼
N
(
0
,
I
)
z_t = \mu_t + \exp\left(\tfrac{1}{2}\log\sigma_t^2\right)\odot\epsilon,\qquad \epsilon\sim\mathcal{N}(0,I)
zt=μt+exp(21logσt2)⊙ϵ,ϵ∼N(0,I)以防你忘记:
- μ t \mu_t μt 与 σ t 2 \sigma_t^2 σt2:编码器输出的均值与方差
- ⊙ \odot ⊙:逐元素相乘
- ϵ \epsilon ϵ:标准正态噪声,采样这一步本身不带参数,随机性被转移到了 ϵ \epsilon ϵ 上
- β-VAE 损失由重建项与潜变量正则项组成
L
β
-VAE
=
M
S
E
(
o
~
t
+
1
,
o
t
+
1
)
+
β
D
K
L
(
q
(
z
t
∣
o
t
H
)
∥
p
(
z
t
)
)
\mathcal{L}_{\beta\text{-VAE}} = \mathrm{MSE}\left(\tilde{o}_{t+1},\ o_{t+1}\right) + \beta\,D_{\mathrm{KL}}\left(q\left(z_t\mid o_t^H\right)\,\|\,p(z_t)\right)
Lβ-VAE=MSE(o~t+1, ot+1)+βDKL(q(zt∣otH)∥p(zt))其中:
- o ~ t + 1 \tilde{o}_{t+1} o~t+1:解码器重建出的下一时刻部分观测
- p ( z t ) p(z_t) p(zt):上下文先验,论文取标准正态分布 N ( 0 , I ) \mathcal{N}(0,I) N(0,I)
- β \beta β:重建项与正则项的权重系数
- D K L D_{\mathrm{KL}} DKL:Kullback-Leibler 散度,衡量后验分布与先验分布的差异
- 先验取标准正态是合理的,因为所有观测在训练时都被归一化为零均值、单位方差
- 当先验与后验都取对角高斯时,KL 项有闭式解,实现时不需要采样
D
K
L
=
1
2
∑
j
=
1
L
(
μ
t
,
j
2
+
σ
t
,
j
2
−
1
−
log
σ
t
,
j
2
)
D_{\mathrm{KL}} = \frac{1}{2}\sum_{j=1}^{L}\left(\mu_{t,j}^2 + \sigma_{t,j}^2 - 1 - \log\sigma_{t,j}^2\right)
DKL=21j=1∑L(μt,j2+σt,j2−1−logσt,j2)其中:
- L L L:潜变量维数,论文中为 16 16 16
- 求和号内每一项都非负,最小值为零,此时后验退化为标准正态
- β \beta β 控制潜空间的约束强度: β \beta β 越大,后验越靠近先验,潜变量携带的信息越少但越平滑; β \beta β 越小,重建越精确但潜空间越松散。论文没有给出具体的 β \beta β 取值
2-3-3-2 下一时刻观测重建(核心)
- 标准自编码器的重建目标是当前输入,此时编码器只需将 o t o_t ot 压缩后再展开即可降低损失,潜变量在功能上等价于输入的有损副本;DreamWaQ 将重建目标改为下一时刻的观测 o t + 1 o_{t+1} ot+1,编码任务因而由压缩转变为预测
- 目标改变后,编码器需要从历史本体感知中提取对未来观测具有预测价值的信息
- 在复杂地形中,即使当前本体观测相似,不同地形条件也可能导致后续的运动状态与观测出现差异;因此 z t z_t zt 需要保留与环境交互相关的信息,才能帮助解码器重建下一时刻观测
- 这里的隐式地形想象并非显式恢复地形的几何形状,而是学习能够反映地形对机器人运动影响的潜在上下文
- 与显式路线的区别也落在这里:第二期的状态估计器描述当前的运动状态,DreamWaQ 的编码器还需携带与下一时刻观测相关的信息
- 需要说明,论文仅指出解码器重建 o t + 1 o_{t+1} ot+1,未对这一设计给出论证;上述分析由损失结构推出,并非论文原文的表述
说人话:标准自编码器恢复的是当前输入,DreamWaQ 要求恢复下一时刻观测;能够重建下一帧,说明 z t z_t zt 中已经保存了与地形影响相关的上下文
2-3-4 联合损失函数
- 两个分支共享编码器,因此在同一次前向中同时产生速度估计与潜变量,CENet 的总损失是两项之和
L C E = L e s t + L β -VAE \mathcal{L}_{\mathrm{CE}} = \mathcal{L}_{\mathrm{est}} + \mathcal{L}_{\beta\text{-VAE}} LCE=Lest+Lβ-VAE
- 把两项展开后可以写成
L C E = M S E ( v ~ t , v t ) + M S E ( o ~ t + 1 , o t + 1 ) + β D K L ( q ( z t ∣ o t H ) ∥ p ( z t ) ) \mathcal{L}_{\mathrm{CE}} = \mathrm{MSE}\left(\tilde{v}_t,\ v_t\right) + \mathrm{MSE}\left(\tilde{o}_{t+1},\ o_{t+1}\right) + \beta\,D_{\mathrm{KL}}\left(q\left(z_t\mid o_t^H\right)\,\|\,p(z_t)\right) LCE=MSE(v~t, vt)+MSE(o~t+1, ot+1)+βDKL(q(zt∣otH)∥p(zt))
- 三项损失的分工很明确
- 速度项提供显式监督,把编码器的一部分输出拉到有物理意义的量上
- 重建项提供动力学约束,迫使编码器理解动作与观测之间的因果关系
- KL 项提供容量约束,防止潜变量退化为对历史的简单复制
- 论文认为,地形与机身状态的估计之间存在相互促进的关系:准确的速度估计有助于判断地形是否被正确理解,而对地形的理解又有助于在打滑、绊倒等情形下修正速度估计
说人话:三项损失不是三件独立的事。速度项让网络"说得出自己跑多快",重建项让网络"猜得到下一步会发生什么",KL 项让网络"别把没用的细节也背下来"
2-4 Adaptive Bootstrapping:自适应引导机制
2-4-1 为什么需要 Bootstrapping
- 训练时机器人的真实状态在仿真里是已知的,而部署时只能用估计值,两者之间存在分布差异
- 一种常见做法是用仿真真值训练策略,部署时再换成估计值,但这样策略在训练中从未见过估计误差,部署时容易失效;
- 另一种做法是全程只喂估计值,把估计误差直接暴露给策略,让策略在训练中就学会容忍误差
- 论文倾向后一种做法,并把它称为 bootstrapping,即让策略的输入来自估计器而不是仿真真值
- 但全程 bootstrapping 在大规模并行训练中有新问题:训练初期所有估计器都很不准,如果策略只能看到噪声很大的估计值,学习信号会被噪声淹没
- 因此需要在"用估计值"和"用真值"之间按训练阶段动态切换,这就是
AdaBoot的出发点
2-4-2 自适应切换机制
AdaBoot用一个概率控制每一步是否使用估计值,概率由 m m m 个域随机化环境的回合奖励变异系数决定- 变异系数(CV,Coefficient of Variation)定义为标准差与均值之比
C V ( R ) = std ( R ) mean ( R ) \mathrm{CV}(R) = \frac{\operatorname{std}(R)}{\operatorname{mean}(R)} CV(R)=mean(R)std(R)
- 由此得到每一步的引导概率,它同时也是使用估计值的概率
p
b
o
o
t
=
1
−
tanh
(
C
V
(
R
)
)
p_{\mathrm{boot}} = 1 - \tanh\left(\mathrm{CV}(R)\right)
pboot=1−tanh(CV(R))其中:
- R R R: m m m 个并行环境在本轮训练迭代中的回合奖励, R ∈ R m R\in\mathbb{R}^{m} R∈Rm
- C V ( R ) \mathrm{CV}(R) CV(R):奖励的相对离散程度,越大说明各环境的学习进度越不一致
- tanh ( ⋅ ) \tanh(\cdot) tanh(⋅):双曲正切,把自变量平滑地压到 ( − 1 , 1 ) (-1,1) (−1,1),因此 p b o o t ∈ ( 0 , 1 ] p_{\mathrm{boot}}\in(0,1] pboot∈(0,1]
- 这个设计的两种极端情形很好理解
- 各环境奖励接近, C V \mathrm{CV} CV 小, p b o o t p_{\mathrm{boot}} pboot 接近 1 1 1,说明各环境的学习进度接近,此时可以逐步增加策略对估计值的依赖,让策略对残余的估计误差保持鲁棒
- 各环境奖励差距大, C V \mathrm{CV} CV 大, p b o o t p_{\mathrm{boot}} pboot 接近 0 0 0,说明仍有环境未学会,此时主要用真值,避免学习信号被估计噪声淹没
- 训练时策略输入的机身线速度按伯努利采样在估计值与真值之间切换
b
∼
B
e
r
n
o
u
l
l
i
(
p
b
o
o
t
)
,
v
t
i
n
=
b
v
~
t
+
(
1
−
b
)
v
t
b \sim \mathrm{Bernoulli}\left(p_{\mathrm{boot}}\right),\qquad v_t^{\mathrm{in}} = b\,\tilde{v}_t + (1-b)\,v_t
b∼Bernoulli(pboot),vtin=bv~t+(1−b)vt其中:
- b b b:指示变量,取 1 1 1 时使用估计值,取 0 0 0 时使用仿真真值
- v t i n v_t^{\mathrm{in}} vtin:真正送入策略的机身线速度
- 需要说明的是,论文只给出了概率公式与作用对象的一般描述,没有逐字段展开混合的具体项。按上下文理解,被混合的是显式估计得到的机身线速度;上下文向量 z t z_t zt 没有对应的真值,只能来自编码器
说人话:这是一套"按班级平均分决定作业难度"的机制。全班分数差得远,说明还有人在及格线以下,就先照着标准答案(真值)练;全班分数接近,说明大家都会了,就改用自己算出来的答案(估计值),这样上考场才不至于一见误差就慌
2-5 训练机制
2-5-1 非对称 Actor-Critic
- 论文采用非对称 Actor-Critic 结构:Actor 只接收部分观测,Critic 接收完整状态
- 从强化学习角度看,Critic 的作用是估计状态价值以降低策略梯度方差,它的输入不参与部署,因此可以更完整;Actor 的输入必须与部署条件一致,否则策略会依赖真机上不存在的量
- 论文指出,这种结构是"隐式地形想象"能够成立的关键:价值网络与策略网络的相互作用,足以让策略在只有部分观测时学会补偿缺失的信息
- 由于只有一次训练阶段,DreamWaQ 省去了教师—学生顺序训练所需的额外数据采集开销,论文未给出与两阶段方法的数据效率对比
2-5-2 Actor 与 Critic 的输入区别
- 两个网络的输入可以对照如下
| 输入分量 | 含义 | Actor 可见 | Critic 可见 |
|---|---|---|---|
| ω t \omega_t ωt | 机身角速度 | 是 | 是 |
| g t g_t gt | 投影重力方向 | 是 | 是 |
| c t c_t ct | 速度指令 | 是 | 是 |
| θ t \theta_t θt、 θ ˙ t \dot{\theta}_t θ˙t | 关节位置与速度 | 是 | 是 |
| a t − 1 a_{t-1} at−1 | 上一时刻动作 | 是 | 是 |
| v t v_t vt | 机身线速度 | 用估计值 v ~ t \tilde{v}_t v~t | 用真值 |
| z t z_t zt | 上下文向量 | 用估计值 | 不直接需要 |
| d t d_t dt | 随机构身扰动力 | 否 | 是 |
| h t h_t ht | 周边地形高度扫描 | 否 | 是 |
- 策略网络的完整形式是一个以参数 ϕ \phi ϕ 定义的随机策略
a t ∼ π ϕ ( a t ∣ o t , v t i n , z t ) a_t \sim \pi_\phi\left(a_t\mid o_t,\ v_t^{\mathrm{in}},\ z_t\right) at∼πϕ(at∣ot, vtin, zt)
- 策略用 PPO 的裁剪目标更新
L C L I P ( ϕ ) = E t [ min ( ρ t A ^ t , clip ( ρ t , 1 − ϵ , 1 + ϵ ) A ^ t ) ] \mathcal{L}^{\mathrm{CLIP}}(\phi) = \mathbb{E}_t\left[\min\left(\rho_t\hat{A}_t,\ \operatorname{clip}\left(\rho_t,1-\epsilon,1+\epsilon\right)\hat{A}_t\right)\right] LCLIP(ϕ)=Et[min(ρtA^t, clip(ρt,1−ϵ,1+ϵ)A^t)]
- 其中:
- ρ t = π ϕ ( a t ∣ ⋅ ) π ϕ o l d ( a t ∣ ⋅ ) \rho_t = \dfrac{\pi_\phi\left(a_t\mid\cdot\right)}{\pi_{\phi_{\mathrm{old}}}\left(a_t\mid\cdot\right)} ρt=πϕold(at∣⋅)πϕ(at∣⋅):新旧策略的概率比
- A ^ t \hat{A}_t A^t:优势函数估计,论文用广义优势估计(GAE,Generalized Advantage Estimation)计算
- ϵ \epsilon ϵ:裁剪范围,论文取 0.2 0.2 0.2
- 优势函数与价值网络的关系是
A ^ t = ∑ l = 0 T − t − 1 ( γ λ ) l δ t + l , δ t = r t + γ V ( s t + 1 ) − V ( s t ) \hat{A}_t = \sum_{l=0}^{T-t-1}\left(\gamma\lambda\right)^l\delta_{t+l},\qquad \delta_t = r_t + \gamma V\left(s_{t+1}\right) - V\left(s_t\right) A^t=l=0∑T−t−1(γλ)lδt+l,δt=rt+γV(st+1)−V(st)
- 其中 λ \lambda λ 为 GAE 的衰减系数,论文取 0.95 0.95 0.95;折扣因子 γ \gamma γ 取 0.99 0.99 0.99;优化器取 Adam,学习率 10 − 3 10^{-3} 10−3
2-5-3 训练与部署的区别
- 训练与部署的差异可以归纳成四点
| 环节 | 训练阶段 | 部署阶段 |
|---|---|---|
| Critic | 使用,输入含真值线速度、地形高度与扰动力 | 丢弃 |
| 策略输入中的速度 | 以 p b o o t p_{\mathrm{boot}} pboot 的概率使用估计值,其余时刻用仿真真值 | 只有估计值 |
| 地形高度扫描 | 仅用于 Critic | 完全不可见 |
| 在线微调 | 不适用 | 不做,直接零样本迁移 |
- 论文的仿真设置在 Isaac Gym 上完成,4096 个域随机化环境并行训练,共 1000 次迭代;训练曲线中的横轴就是迭代次数
- 真机平台是 Unitree A1,全部估计与控制运行在机载的 Intel NUC 上,额外加装的板载计算机与电池带来约 500 g 负载
2-6 奖励设置与域随机化设计
2-6-1 奖励函数
- 论文的奖励设计刻意保持与已有工作一致,以便突出 DreamWaQ 各组件本身的作用,而不是靠调奖励取得优势
- 总奖励是各项奖励的加权和
r t ( s t , a t ) = ∑ i w i r i ( s t , a t ) r_t\left(s_t,a_t\right) = \sum_i w_i\, r_i\left(s_t,a_t\right) rt(st,at)=i∑wiri(st,at)
- 各项奖励的形式与权重如下
| 奖励项 | 表达式 r i r_i ri | 权重 w i w_i wi |
|---|---|---|
| 线速度跟踪 | exp { − 4 ( v x y c m d − v x y ) 2 } \exp\left\{-4\left(v_{xy}^{\mathrm{cmd}}-v_{xy}\right)^2\right\} exp{−4(vxycmd−vxy)2} | 1.0 1.0 1.0 |
| 角速度跟踪 | exp { − 4 ( ω y a w c m d − ω y a w ) 2 } \exp\left\{-4\left(\omega_{yaw}^{\mathrm{cmd}}-\omega_{yaw}\right)^2\right\} exp{−4(ωyawcmd−ωyaw)2} | 0.5 0.5 0.5 |
| 机身竖直速度 | v z 2 v_z^2 vz2 | − 2.0 -2.0 −2.0 |
| 机身横滚俯仰角速度 | ω x y 2 \omega_{xy}^2 ωxy2 | − 0.05 -0.05 −0.05 |
| 姿态 | ∣ g ∣ 2 \left\vert g\right\vert^2 ∣g∣2 | − 0.2 -0.2 −0.2 |
| 关节加速度 | θ ¨ 2 \ddot{\theta}^2 θ¨2 | − 2.5 × 10 − 7 -2.5\times10^{-7} −2.5×10−7 |
| 关节功率 | ∣ τ ∣ ∣ θ ˙ ∣ \left\vert\tau\right\vert\left\vert\dot{\theta}\right\vert ∣τ∣ θ˙ | − 2 × 10 − 5 -2\times10^{-5} −2×10−5 |
| 机身高度 | ( h d e s − h ) 2 \left(h_{\mathrm{des}}-h\right)^2 (hdes−h)2 | − 1.0 -1.0 −1.0 |
| 足端离地高度 | ( p f , z , k d e s − p f , z , k ) 2 ⋅ v f , x y , k \left(p_{f,z,k}^{\mathrm{des}}-p_{f,z,k}\right)^2\cdot v_{f,xy,k} (pf,z,kdes−pf,z,k)2⋅vf,xy,k | − 0.01 -0.01 −0.01 |
| 动作变化率 | ( a t − a t − 1 ) 2 \left(a_t-a_{t-1}\right)^2 (at−at−1)2 | − 0.01 -0.01 −0.01 |
| 动作平滑性 | ( a t − 2 a t − 1 + a t − 2 ) 2 \left(a_t-2a_{t-1}+a_{t-2}\right)^2 (at−2at−1+at−2)2 | − 0.01 -0.01 −0.01 |
| 功率分布 | var ( τ ⋅ θ ˙ ) 2 \operatorname{var}\left(\tau\cdot\dot{\theta}\right)^2 var(τ⋅θ˙)2 | − 10 − 5 -10^{-5} −10−5 |
- 以防你忘记:
- 上标 c m d \mathrm{cmd} cmd 表示指令值,上标 d e s \mathrm{des} des 表示期望值
- g g g 是投影到机体系的重力向量, x x x 轴向前、 z z z 轴向上
- p f , z , k p_{f,z,k} pf,z,k 与 v f , x y , k v_{f,xy,k} vf,xy,k 分别表示第 k k k 个足端的离地高度与水平速度
- τ \tau τ 与 θ ˙ \dot{\theta} θ˙ 分别为关节力矩与关节角速度
- 最后一项功率分布是论文新增的项。常见的功率惩罚只最小化总功率,不考虑各电机之间的分配是否均衡,长期运行时部分电机会先过热;对功率的方差做惩罚,可以把负载摊平到十二个电机上
- 论文还使用了课程学习:地形由平滑、粗糙、离散化与楼梯四类组成,每类十级,倾角范围 [ 0 ∘ , 22 ∘ ] [0^\circ,22^\circ] [0∘,22∘],训练中逐级提升难度
- 对低速运动,论文采用网格自适应课程,以改善转向时的稳定性并减少足端绊倒
说人话:奖励表前半段是"要它做什么",后半段是"别做什么"。功率分布项比较特别,它管的不是总功耗,而是十二个电机干活的均衡程度,目的是让真机上不会有单个电机先烧掉
2-6-2 域随机化设计
- 为缩小仿真与真实的差距,论文在训练中对以下参数做随机化
| 参数 | 随机化范围 | 单位 |
|---|---|---|
| 负载 | [ − 1 , 2 ] [-1,\ 2] [−1, 2] | kg |
| K p K_p Kp 缩放因子 | [ 0.9 , 1.1 ] [0.9,\ 1.1] [0.9, 1.1] | Nm/rad |
| K d K_d Kd 缩放因子 | [ 0.9 , 1.1 ] [0.9,\ 1.1] [0.9, 1.1] | Nms/rad |
| 电机强度因子 | [ 0.9 , 1.1 ] [0.9,\ 1.1] [0.9, 1.1] | Nm |
| 质心偏移 | [ − 50 , 50 ] [-50,\ 50] [−50, 50] | mm |
| 摩擦系数 | [ 0.2 , 1.25 ] [0.2,\ 1.25] [0.2, 1.25] | 无量纲 |
| 系统延迟 | [ 0.0 , 15.0 ] [0.0,\ 15.0] [0.0, 15.0] | ms |
- 摩擦系数下界取到 0.2 0.2 0.2,覆盖了湿滑地面;系统延迟取到 15 15 15 ms,覆盖了通信与执行器的滞后
- 这些随机化项只改变机器人自身的动力学参数,并不直接出现在第 2-2 节的特权观测
s
t
s_t
st 里
- 对 Critic 而言,它们体现为同一指令下不同的状态转移与奖励
- 对 Actor 而言,只能通过 CENet 从本体感知历史中间接推断,因此估计精度直接决定了这些随机化项对策略的影响能否被抵消
2-7 对比实验
2-7-1 对比设置与学习曲线
- 实验内容:在仿真中比较五种只用本体感知的方法,外加一个能看到地形高度图的 Oracle 策略
- 实验实现:五种方法分别是
- 不带适应机制的基线(Baseline)
- 用教师—学生框架的 AdaptationNet
- 并发训练的 EstimatorNet
- 去掉
AdaBoot的 DreamWaQ - 完整的 DreamWaQ
- 所有方法共用同一套网络规模、奖励与课程设置,并固定初始随机种子,每个方法用十组随机种子训练 1 000 次迭代
- 结果:学习曲线如图 2-3 所示

- 图 2-3 各算法的学习曲线,曲线为十个随机种子的均值,阴影为标准差
- 从曲线可以读出三点
- DreamWaQ(含
AdaBoot)从约 100 次迭代起保持领先,最终回报略低于 Oracle,但走势几乎重合,说明不用外感也能接近有高度图的策略 - EstimatorNet 在前 300 次迭代里回报最高,之后持续下滑,论文将其归因于课程学习中后期地形变难
- AdaptationNet 在 400 次迭代之后、Baseline 在 600 次迭代之后分别开始下滑,其中 Baseline 的最终回报最低
- DreamWaQ(含
- 值得注意的是,
AdaBoot带来的提升主要体现在训练中后期:含与不含AdaBoot的两条曲线在前 500 次迭代基本重合,之后才逐渐拉开
结论:在相同训练预算下,共享编码器的联合估计比纯显式估计或教师—学生方案收敛得更好,且
AdaBoot对最终回报有正向贡献
2-7-2 指令跟踪误差
- 实验内容:在 Gazebo 中给机器人随机速度指令,持续十分钟,每十秒重新采样一次,指令在 [ − 1.0 , 1.0 ] [-1.0,1.0] [−1.0,1.0] 内均匀分布,统计前向、侧向与偏航三个通道的绝对跟踪误差
- 实验实现:为保证可比,各控制器使用相同的随机种子生成指令,每个控制器重复五次;误差差异用配对 t t t 检验评估显著性
- 结果:跟踪误差的箱线图如图 2-4 所示

- 图 2-4 指令跟踪误差箱线图,横轴为前向速度误差 v x e v_x^e vxe、侧向速度误差 v y e v_y^e vye 与偏航角速度误差 ω z e \omega_z^e ωze,星号表示 p < 10 − 4 p<10^{-4} p<10−4
- 三个通道上 DreamWaQ(含
AdaBoot)的中位数都最低,且与各基线的差异在统计上显著- 前向通道上,Baseline 的箱体明显更高,说明其在速度指令变化时更难跟上
- 偏航通道上,DreamWaQ 的中位数最低,但箱体与 AdaptationNet 有交叠,说明改善幅度小于前向通道
- 从箱体高度看,DreamWaQ 的四分位距也较小,说明跟踪表现更稳定,而不仅是均值更好
结论:显式速度估计与上下文推断结合在一起,能够降低三个通道的跟踪误差,并且改善具有统计显著性
2-7-3 估计误差对比
- 实验内容:让机器人在楼梯环境中行走,比较 CENet 与 EstimatorNet 的机身线速度平方估计误差
- 实验实现:两者使用相同的观测历史与网络规模,误差在整段轨迹上逐时刻统计;图中标注了足端绊倒发生的时刻
- 结果:估计误差曲线如图 2-5 所示

- 图 2-5 机身线速度平方估计误差随时间的变化,蓝虚线为 EstimatorNet,橙实线为 CENet
- 平地上两者都很小,差异不明显;在 1250 1250 1250 至 1500 1500 1500 ms 的绊倒区间,EstimatorNet 的误差峰值超过 0.10 0.10 0.10,CENet 的峰值不到它的一半
- 论文给出两点解释
- 前向与后向动力学的重建让 CENet 在各种地形上的估计更准
- 编码器同时被要求推断地形属性,因此在绊倒这类状态突变时能借助地形上下文修正速度估计
结论:共享编码器带来的"地形上下文"不是附加信息,它在状态突变时确实改善了显式估计的精度
2-7-4 鲁棒性测试
- 实验内容:在仿真中对机器人施加随机方向、随机大小的推搡速度,直到其摔倒,统计可承受的最大推搡速度与三十分钟随机行走的存活率
- 实验实现:推力沿机体系的 x x x、 y y y、 z z z 三轴施加,每间隔一秒施加一次,速度在 [ − v p u s h max , v p u s h max ] [-v_{\mathrm{push}}^{\max},v_{\mathrm{push}}^{\max}] [−vpushmax,vpushmax] 内均匀采样;存活率定义为三十分钟内未摔倒的时间占比
- 结果:结果如下
| 方法 | 最大推搡速度(m/s) | 存活率(%) |
|---|---|---|
| Baseline | 0.511 ± 0.053 0.511\pm0.053 0.511±0.053 | 20.51 ± 6.44 20.51\pm6.44 20.51±6.44 |
| AdaptationNet | 0.714 ± 0.096 0.714\pm0.096 0.714±0.096 | 82.37 ± 2.49 82.37\pm2.49 82.37±2.49 |
| EstimatorNet | 0.871 ± 0.124 0.871\pm0.124 0.871±0.124 | 80.92 ± 5.73 80.92\pm5.73 80.92±5.73 |
DreamWaQ 去掉 AdaBoot | 1.015 ± 0.121 1.015\pm0.121 1.015±0.121 | 90.71 ± 1.25 90.71\pm1.25 90.71±1.25 |
DreamWaQ 含 AdaBoot | 1.121 ± 0.164 1.121\pm0.164 1.121±0.164 | 95.23 ± 1.61 95.23\pm1.61 95.23±1.61 |
- 完整方法的最大推搡速度比 Baseline 高出一倍以上,存活率从约两成提升到九成以上
- 论文指出,多数方法的摔倒都发生在指令发生大幅变化、机器人需要快速刹车或改变运动方向的时候,而 DreamWaQ 在这类时刻的恢复能力最强
AdaBoot在带来鲁棒性提升的同时没有牺牲基础性能,这一点与学习曲线的结论一致
结论:估计精度与策略鲁棒性之间存在耦合,
AdaBoot通过调节策略对估计值的依赖程度,把两者的收益叠加在了一起
2-7-5 足端反射与步态调整
- 实验内容:在真实户外地形中观察机器人在绊倒与打滑两类扰动下的步态反应,同时记录足端相对机身的 z z z 向位置
- 实验实现:图 2-6 上方为连续视频帧,下方为对应时段的足端高度曲线,底色区分正常行走、下楼梯、上楼梯、不规则落脚、适应与恢复等阶段
- 结果:如图 2-6 所示

- 图 2-6 足端反射,(a)为绊倒场景,(b)为打滑场景
- 在下楼梯阶段,机器人把机身压低、前足远离机身,这是快速找到稳定落脚点的步态;上楼梯阶段则明显增大步幅,以便足端越过台阶
- 打滑场景中,机器人能立即识别不规则落脚点,改变步态并逐步恢复正常模式
- 由于 CENet 的速度估计足够稳定,整个过程中没有出现速度估计失准导致的性能下降
结论:隐式地形想象在真机上表现为步态层面的自适应,而不是显式的落脚点规划
2-7-6 长距离户外行走
- 实验内容:在校内两条路线上做长距离验证,航线 A 为草坪与坡道组成的非结构化场地,航线 B 为累计爬升约 22 m 的登山道
- 实验实现:机器人顶部安装实时动态差分定位(RTK,Real-Time Kinematic)的 GPS 接收机,以 10 Hz 记录轨迹,颜色表示相对起点的海拔
- 结果:轨迹如图 2-7 所示

- 图 2-7 两条户外航线的轨迹与海拔分布,航线 A 长 430 m,航线 B 长 465 m
- 航线 A 中机器人遇到过被植被缠住腿部的情况,通过增大关节功率自行脱困;雨后地面湿滑时,下楼梯与泥泞坡道也没有中断
- 航线 B 中前腿电机因持续爬坡进入过热保护,论文因此降低指令速度以减小所需力矩;最终机器人在十分钟内完成 465 m 并到达山顶
- 论文把这类表现归因于两点:估计足够准,策略足够稳;并明确指出方法的局限在于适应机制,即机器人需要先与障碍发生足端接触才能做出反应,高台阶这类需要在接触前规划的结构仍需引入外感
3 CENet 的工程实现与数值验证
- 本节给出我们在复现中对 CENet 的实现。结构按论文 Fig. 2 搭建:共享编码器同时输出机身线速度与上下文潜变量,解码器把潜变量重建为下一时刻的本体观测,损失由速度项、重建项与 KL 项组成。这一部分目前只到模块级:网络、损失与采样都已经落地并通过数值检查,把上下文接入策略的训练循环尚未接通,因此本节不报告训练结果
3-1 观测切分与历史窗口
- 论文的观测 o t o_t ot 与工程中的可用量需要先对齐。Go2 有十二个关节,单步观测由六项组成
| 分量 | 含义 | 维度 |
|---|---|---|
| 机身角速度 | ω t \omega_t ωt | 3 |
| 投影重力方向 | g t g_t gt | 3 |
| 关节位置 | θ t \theta_t θt | 12 |
| 关节速度 | θ ˙ t \dot{\theta}_t θ˙t | 12 |
| 上一时刻动作 | a t − 1 a_{t-1} at−1 | 12 |
| 速度指令 | c t c_t ct | 3 |
| 合计 | o t o_t ot | 45 |
- 上表按工程代码中的观测拼接顺序排列,与论文公式中把速度指令放在第三项的顺序略有不同,但各分量的定义与维数保持一致
- 历史窗口取
H
=
5
H=5
H=5,控制频率为 50 Hz,对应约
0.1
0.1
0.1 s 的采样窗口;五帧之间只有四个时间间隔,因此首末两帧的实际时间差为
(
H
−
1
)
/
50
=
0.08
(H-1)/50=0.08
(H−1)/50=0.08 s。展平后的编码器输入为
o
t
H
=
[
o
t
−
H
+
1
T
,
o
t
−
H
+
2
T
,
…
,
o
t
T
]
T
∈
R
H
⋅
n
,
H
⋅
n
=
225
o_t^H = \left[o_{t-H+1}^{\mathsf T},\ o_{t-H+2}^{\mathsf T},\ \dots,\ o_t^{\mathsf T}\right]^{\mathsf T}\in\mathbb{R}^{H\cdot n},\qquad H\cdot n = 225
otH=[ot−H+1T, ot−H+2T, …, otT]T∈RH⋅n,H⋅n=225其中:
- n = 45 n=45 n=45:单步观测维数
- H = 5 H=5 H=5:历史步数,与论文一致
- 部署时只有本体感知可用,因此历史窗口里的每一项都必须是真机上可测量的量;机身线速度只作为速度头的回归标签,地形高度只进入 Critic,二者都不出现在编码器的输入里
- 重建目标是下一时刻的同构观测 o t + 1 o_{t+1} ot+1,它与 o t o_t ot 维数相同,因此解码器的输出维数同样是 45 45 45
3-2 网络结构与重参数化采样
- 编码器用两层隐藏层把 225 维历史压到 3 + 2 L 3+2L 3+2L 维,前 3 3 3 维是机身线速度估计,其后 L L L 维是均值、 L L L 维是对数方差;潜变量维数取 L = 16 L=16 L=16,隐藏层宽度取论文 Fig. 2 的 128 128 128 与 64 64 64
h 1 = E L U ( W 1 o t H + b 1 ) h 2 = E L U ( W 2 h 1 + b 2 ) [ v ~ t T , μ t T , log σ t 2 T ] T = W 3 h 2 + b 3 \begin{aligned} h_1 &= \mathrm{ELU}\left(W_1 o_t^H + b_1\right)\\ h_2 &= \mathrm{ELU}\left(W_2 h_1 + b_2\right)\\ \left[\tilde{v}_t^{\mathsf T},\ \mu_t^{\mathsf T},\ \log\sigma_t^{2\mathsf T}\right]^{\mathsf T} &= W_3 h_2 + b_3 \end{aligned} h1h2[v~tT, μtT, logσt2T]T=ELU(W1otH+b1)=ELU(W2h1+b2)=W3h2+b3
- 论文 Fig. 2 把编码器输出标为 19 19 19 维,即 3 3 3 维速度加 16 16 16 维上下文;实现中把这 16 16 16 维上下文拆成均值与对数方差各 16 16 16 维以便重参数化采样,因此编码器实际输出 35 35 35 维,速度头与潜变量仍共享同一层特征
- 其中 E L U \mathrm{ELU} ELU(Exponential Linear Unit,指数线性单元)是论文为所有隐藏层选择的激活函数![[Pasted image 20261102133232.png]]
- 对数方差在采样前做了截断,避免 exp \exp exp 溢出导致采样值发散
log σ t 2 = clamp ( log σ t 2 , − 10 , 10 ) \log\sigma_t^2 = \operatorname{clamp}\left(\log\sigma_t^2,\ -10,\ 10\right) logσt2=clamp(logσt2, −10, 10)
- 采样与解码的代码如下,每一步与上面的公式一一对应
# 编码:历史展平后进两层 MLP,输出速度估计、均值与对数方差
v_hat, mu, logvar = self.encoder(history).split((3, 16, 16), dim=-1)
logvar = logvar.clamp(-10.0, 10.0)
# 重参数化采样:随机性来自 eps,梯度可以穿过 z 回传到 encoder
eps = torch.randn_like(mu)
z = mu + eps * torch.exp(0.5 * logvar)
# 解码:潜变量重建下一时刻的部分观测 o_{t+1}
obs_pred = self.decoder(z)
- 解码器是编码器的镜像结构,隐藏层逆序为 64 64 64 与 128 128 128,输出维数等于单步观测维数 45 45 45,对应论文 Eq. 7 中的 o ~ t + 1 \tilde{o}_{t+1} o~t+1
- 这里保留了论文的一个关键取舍:潜变量是随机的。RMA 的适应模块输出确定的编码,而 DreamWaQ 输出一个分布,只有分布本身被监督,具体采样点不需要对应任何物理量
说人话:编码器不说"当前环境就是这一个向量",而是说"当前环境大概是这一带"。训练时从这一带里随机取一个点去重建,部署时取分布中心即可
3-3 联合损失与数值验证
- 损失按第 2-3-4 节的三项实现,KL 用闭式解,不做采样估计
# 速度项:速度头与仿真真值的均方误差
vel = F.mse_loss(v_hat, v_true)
# 重建项:解码器输出与下一时刻观测的均方误差
recon = F.mse_loss(obs_pred, obs_next)
# KL 项:对角高斯对标准正态的闭式解,先对潜变量维求和,再对批量取平均
kl = -0.5 * torch.sum(1.0 + logvar - mu.pow(2) - logvar.exp(), dim=-1).mean()
# 总损失:速度 + 重建 + beta 加权的 KL
total = vel + recon + kl_coef * kl
- 三项与论文 Eq. 5 到 Eq. 7 一一对应: L e s t \mathcal{L}_{\mathrm{est}} Lest 是速度项, L β -VAE \mathcal{L}_{\beta\text{-VAE}} Lβ-VAE 是重建项加 KL 项,两者相加得到 L C E \mathcal{L}_{\mathrm{CE}} LCE
- KL 项的归约方式需要单独说明。闭式解中的求和是对潜变量维进行的,若随后直接对整个张量取平均,batch 与潜变量两个维度会一起被平均,KL 的数值被缩小 L = 16 L=16 L=16 倍,它与速度项、重建项的相对权重随之改变;因此实现中先沿最后一维求和、再对 batch 取平均,使 KL 保持为逐样本量
- 系数
kl_coef在含义上对应论文的 β \beta β,工程中默认取 10 − 2 10^{-2} 10−2。但由于论文未给出 β \beta β 的取值与归约细节,两者的数值不能直接等同;当前未接通训练循环,这个系数也没有经过调参验证 - 特权信息在这里只承担两件事:机身线速度作为速度头的标签,其余特权量交给 Critic;编码器不会把特权因子当作回归目标,这是与 RMA 的结构性区别
- 数值检查用随机张量完成,验证四件事
- 编码器对 ( B , T ⋅ n ) (B,\ T\cdot n) (B, T⋅n) 形状的输入能同时输出 3 3 3 维速度与 μ \mu μ、 log σ 2 \log\sigma^2 logσ2
- 重参数化后 z z z 的形状与 μ \mu μ 一致
- 解码器输出维数等于单步观测维数
- 总损失为有限值,且诊断项分成速度、重建与 KL 三项
- 这类检查只回答"公式有没有写错、张量形状对不对",不回答"能不能训出策略"。按我们的经验,先把这一步做扎实,后面接训练时出问题才能定位到是损失写错还是环境配置错
总结
- 本文从状态估计的两条路线出发,完整梳理了 DreamWaQ 的动机、架构、CENet、
AdaBoot、训练机制、奖励与域随机化,以及论文给出的仿真与真机实验,并给出了我们对 CENet 的工程实现与数值验证 - 核心要点回顾:
- 共享编码器是结构的核心:显式速度估计与隐式上下文推断共用一层特征,两个任务互相提供约束
- 重建下一时刻观测是隐式表征的抓手:要预测下一步,编码器就必须理解动作与地形的关系,这就是标题中"想象"的实现方式
AdaBoot调节的是依赖程度:用回合奖励的变异系数决定策略多依赖估计值,各环境奖励差距大时多用真值以免学习信号被噪声淹没,差距小时逐步增加对估计值的依赖- 非对称 Actor-Critic 是训练期的特权通道:Critic 看得到真值速度、外力与地形高度,Actor 只看部署时能拿到的量
- 局限在于必须先接触:适应机制依赖足端与障碍的接触,需要在接触前规划的高台阶结构仍需引入外感
- 与前两期的关系可以概括为一句话:RMA 学环境、State Estimator 学状态,DreamWaQ 学的是"状态与环境的联合表征"
- 如有错误,欢迎指出!
- 感谢观看!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)