The sim to real gap
用控制理论的视角理解 sim2real 问题
可以把真实机器人写成一个部分可观测动态系统:
\[\begin{aligned} x_{t+1} &\sim R(x_{t+1}\mid x_t,\tau_t),\\ o_t &\sim H(o_t\mid x_t),\\ \tau_t &= C(r,\;o_{\le t},\tau_{<t}), \end{aligned}\]其中 $R$ 是真实世界动力学,$H$ 是 sensing/observation process。 $r$ 是控制目标。允许整个 history 进入 $C$,所以这个表达本身不要求 Markov。
更精确地说,model-based controller 内部通常至少可以拆成两个东西:
\(\boxed{ \text{history} \xrightarrow{\text{state estimator }E} \hat x_t \xrightarrow{\text{dynamics model }M} \hat x_{t+1} \xrightarrow{\text{planning/control }P} \tau_t }\) 其中
- $E$:observer / state estimator,解决 “现在系统处于什么状态?”
- $M$:system/dynamics model,解决 “如果我施加 $\tau$,之后会发生什么?”
- $P$:planner/controller,解决 “为了达到 $r$,应该施加什么 $\tau$?”
例如经典控制里: \(\hat x_t = E(o_{\le t},\tau_{<t}), \qquad \hat x_{t+1}=f_\theta(\hat x_t,\tau_t),\) 然后 MPC 解 \(\tau_{t:t+H}^* = \arg\min_{\tau_{t:t+H}} \sum_{k=t}^{t+H} \ell(\hat x_k,r,\tau_k).\)
在这个视角下,sim2real 本质上是:$R_{\rm sim}\neq R_{\rm real}$ 而我们有一个在 $C_{\rm sim}\circ R_{\rm sim}$ 上表现很好的闭环系统,希望 $C_{\rm real}\circ R_{\rm real}$ 仍然表现好。 问题转化为:如何让 closed-loop behavior 对 $R_{\rm sim}\to R_{\rm real}$ 的变化保持稳定?
大体可以分成三个路线:
1. Robustness:不去精确知道 real,只要求 policy 对 model mismatch 不敏感
Domain randomization、noise injection、adversarial perturbation、robust MPC,本质思想都是不去识别真实世界到底是什么,而是让C对一片可能世界 $R=R_0+\Delta R$ 都工作。
以 DR 为例,可以这样理解:
训练时人为定义一族参数化的系统 \(R_\theta,\qquad \theta\sim p(\theta),\quad s.t. R_{\rm real}\in \{R_\theta\}\) 然后优化 \(\max_C \mathbb E_{\theta\sim p(\theta)} J(C,R_\theta).\) (可以看到这里有个小mismatch, 预期高,不能保证在真机上一定好,也有可能被其他的参数带坏。扩大theta的覆盖让R_real尽可能在其中,和缩小theta范围避免不真实的动态mislead模型,是相互矛盾的。因此,我们希望在覆盖到真实世界参数的条件下,不要把theta采样范围搞得太宽。这种思路推到极限就变成了系统辨识,即,让theta的训练阶段采样分布贴近真实分布。)
2. Adaptation / System Identification:先推断 real world 是什么,再调整控制
这里又可以分两件事。
一件是你说的 observer/state estimation:
\[o_{\le t},\tau_{<t} \rightarrow \hat x_t.\]例如估计:
- object pose;
- velocity;
- contact state;
- friction/contact mode;
- unobserved joint state。
另一件实际上更加关键,是 system identification:
\[\mathcal D_{\rm real} = \{o_t,\tau_t,o_{t+1}\} \rightarrow \hat\theta_{\rm real},\]进而建立
\[\hat R_{\rm real} = R_{\hat\theta_{\rm real}}.\]也就是说:
\[\boxed{ \text{observer estimates state }x; \qquad \text{system identification estimates dynamics }R. }\]例如你最近做 in-hand manipulation 时遇到的 actuator/contact dynamics mismatch,更接近后一类:
\[(q_t,\dot q_t,\tau_t) \rightarrow (q_{t+1},\dot q_{t+1}).\]DexNDM 那种方法,本质就是:
\[R_{\rm sim} \rightarrow \hat R_{\rm real}\]然后在更准确的 dynamics model 里训练 controller。
3. Policy adaptation:不显式恢复 $R_{\rm real}$,直接用 real data 修正 $C$
这就是你说的 Online RL。
例如有
\[Q_\phi(x,a)\]通过真实 transition
\[(x_t,a_t,r_t,x_{t+1})\]更新:
\[Q_\phi \leftarrow r_t+\gamma Q_{\bar\phi}(x_{t+1},\pi(x_{t+1})).\]然后再更新 actor:
\[\pi_\theta \leftarrow \arg\max_\pi Q_\phi(x,\pi(x)).\]这并不是“更好地估计 $R_{\rm real}$”——至少 model-free online RL 并没有显式这么做。
它实际上是在做:
\[\boxed{ C_{\rm sim} \rightarrow C_{\rm real} }\]而不是
\[R_{\rm sim} \rightarrow \hat R_{\rm real}.\]这是一个很重要的区分。
所以可以把 sim2real 更干净地分成:
\(\boxed{ \begin{array}{lll} \textbf{Robustification} & R \text{ 不估计} & C\text{ 对 }R\text{ 的变化鲁棒} \\)3pt] \textbf{System adaptation} & R_{\rm real}\text{ 被估计} & C\text{ 根据 }\hat R_{\rm real}\text{ 控制} $$3pt] \textbf{Policy adaptation} & R_{\rm real}\text{ 不显式估计} & \text{直接用 real data 更新 }C \end{array}} $$
你这个视角特别适合进一步理解 为什么真机 RL 有价值。
假设你的仿真 SAC policy 是
\[\tau_t=\pi_{\rm sim}(o_t).\]在仿真中:
\[Q_{\rm sim}^{\pi}(o,a)\]学到的是
\[R_{\rm sim}\]下某个动作长期是否好。
一旦到了真实世界:
\[R_{\rm real}\neq R_{\rm sim},\]即使 observation 一模一样,也可能有
\[Q_{\rm real}^{\pi}(o,a) \neq Q_{\rm sim}^{\pi}(o,a).\]这其实精确描述了你现在遇到的问题。
例如对于同一个目标 frame:
\[o_t \xrightarrow{\pi_{\rm sim}} a_t,\]在 sim 中可能:
\[P_{\rm sim}(o_{t+1}\approx o_{\rm target})=0.95,\]而 real 中:
\[P_{\rm real}(o_{t+1}\approx o_{\rm target})=0.4.\]原因可能来自:
\[\text{motor dynamics} +\text{friction} +\text{contact} +\text{delay} +\text{state estimation error}.\]因此真机数据
\[(o_t,a_t,o_{t+1})\]其实是在给你提供关于
\[\boxed{R_{\rm real}}\]的信息。
接下来你有三个非常自然的问题:
\[\begin{aligned} &\text{Can I make }\pi\text{ robust to it?}\\ &\text{Can I identify }R_{\rm real}\text{ from it?}\\ &\text{Can I directly adapt }\pi/Q/V\text{ from it?} \end{aligned}\]这三句话基本就是你现在做真机 sim2real 文献调研的三个主要 research branch。
我甚至认为这套表述比单纯按照“domain randomization / residual learning / online RL / system ID”分方法更有用,因为它直接问了一个更根本的问题:
\[\boxed{ \text{real-world experience 到底被用来更新系统中的哪一个 component?} }\]是更新 $E$、$R$、$Q$,还是直接更新 $\pi$。这个分类方式很适合你接下来整理真机 dexterous manipulation 文献。