Part VI · 第 24 章 Model-based 方法 · 24.4

学习模型 + MPC

MPC 的一切都建立在模型上,而模型可以从数据里学。把一个学到的动力学模型放进 MPC,要回答四个问题:用梯度还是采样去优化这个模型;能不能把非线性模型“抬”到一个线性的空间里,让每个周期仍然只解一个凸 QP(Koopman);怎样让规划器知道模型在哪里没把握,并在代价和约束里为此留出余量(高斯过程 MPC);以及怎样只学物理模型漏掉的那一部分(残差学习)。本节在浏览器里现场训练模型,用倒立摆、刚度渐增的弹簧、泥地里的小车、靠墙的小车和高速飞圆圈的“无人机”逐一演示,最后讨论什么时候“经典 MPC + 学到的残差”比端到端强化学习更合适。

约 50 分钟 前置:6.11 无梯度与采样优化 · 13.4 模型预测控制 MPC · 24.1 学习动力学模型 6 个交互

    1为什么机器人需要它

    13.4 节的 MPC 每个周期用模型预测未来几秒、在约束下优化、只执行第一步。它默认模型是写出来的:小车是质点,自行车模型有轴距,四足是单刚体。可很多机器人身上,最要紧的那部分动力学恰恰写不出来或写不准:

    • 空气动力:四旋翼以 10 m/s 以上飞行时,阻力、桨叶的气动效应以及旋翼下洗流与机身的相互作用会造成明显的跟踪误差,它们与速度、姿态和转速都有关,很难用几个参数描述。
    • 轮胎和地面:赛车在附着极限附近的侧偏、越野车在泥地和草地上的打滑,取决于路面,而路面每天都不一样。
    • 软体与摩擦:气动软体手指、绳驱关节、减速器里的摩擦和间隙,物理建模要么太粗,要么太贵。

    24.1 节讲了怎样从数据里学 \(\mathbf x_{k+1}=f_\theta(\mathbf x_k,\mathbf u_k)\)(那里按强化学习的习惯写作 \(s,a\);本节沿用 13.4 节的控制记号 \(\mathbf x,\mathbf u\)),24.2 节和 24.3 节讲了用它学策略或在潜空间里规划的 model-based RL 方法。这一节站在控制工程师的角度:已经有一个 MPC,怎样把学到的模型接进去,让它仍然实时、仍然尊重约束,并且在模型不可信的地方不出事。

    2直觉:规划器只看得见模型

    MPC 的优化器从不碰真实的机器人:它在模型里试遍各种动作序列,挑出模型认为最好的那一条。所以规划的好坏完全取决于模型在规划会去的那些状态上准不准。重新测量、重新求解(13.4 节的反馈)可以纠正一部分误差,但纠正不了“模型把整个方向都弄错了”的情形。

    下图是一个力矩受限的单摆(\(m=l=1\),\(|u|\le5\) N·m,比重力矩 9.81 N·m 小,所以必须来回摆几次才能立起来),关节角 \(q\) 从竖直向下量起,\(q=\pm\pi\) 是倒立。真实动力学里还有黏性摩擦和库仑摩擦。每 0.05 s 用 MPPI(6.11 节)在 1.5 s 的时域上规划一次。四种模型可选:真实物理;“手册模型”(以为质量是 0.7 kg,并且没有摩擦);以及两个从数据里学出来的网络 \(\hl{fth}{f_\theta}\),输入 \((q,\dot q,u)\),输出这一步的角速度变化。两个网络结构完全一样(3→32→32→1,tanh),区别只在训练数据 \(\hl{data}{\mathcal D}\):一个的 2000 个样本铺满整个相平面,另一个只来自摆在下方附近晃动(\(|q|\le1.2\) rad,\(|\dot q|\le3\) rad/s)。24.2 节的 PETS 在一个“学模型、规划、再采数据”的循环里让摆学会甩起;这里把循环拿掉,数据固定,只换 MPC 里的模型,单独看数据覆盖的作用。24.1 节的 FIG 3 已经看到,开环展开一旦离开数据就会崩;这里看的是闭环:每 0.05 s 重新测量、重新规划的反馈,能不能救回来。

    FIG 1同一个 MPC,换一个模型:数据覆盖到哪里,规划就可靠到哪里
    单摆
    相平面 (q, q̇)
    相平面里绿色是真实走过的轨迹,蓝色虚线是此刻 MPC 用所选模型预测的 1.5 s,青色小点是所选网络的训练数据(选物理模型时不画)。琥珀色圆点是倒立目标 \(q=\pm\pi\)。左图的蓝色虚线是预测的摆尖轨迹。下方是两个网络的训练损失(对数坐标,蓝色 = 全相平面数据,紫色 = 只在下方的数据),损失按网络输出的归一化单位计。“竖起”指 \(|q\mp\pi|<0.2\) rad 且 \(|\dot q|<1\) rad/s。每次运行 8 s,选学到的模型前要先训练(约两三秒)。
    试一试
    • 按“训练”,然后选“学到的 · 全相平面数据”并跑满 8 s:单摆在 4.5 s 内竖起,并且 8 s 里至少 3.5 s 处于竖起状态(这里是 4.00 s 时竖起、竖起 4.05 s,与真实物理的 4.05 s 和 4.00 s 几乎一样)。
    • 再选“学到的 · 只在下方的数据”跑满 8 s:它一次也没有竖起来。可读数显示,在它有数据的区域里,它比全数据网络还准(加速度误差 0.15 对 0.58 rad/s²);问题出在整个相平面上(4.52 对 0.51 rad/s²)。看蓝色预测在摆过水平之后怎样和绿色分道扬镳。
    核心洞见

    对 MPC 来说,“模型准不准”不是一个数,而是一张地图:在规划会去的那些状态上准才算准。手册模型质量错了 30%、还没有摩擦,可它的误差是“全局温和”的,反馈能吸收,所以 4.50 s 就竖起来了;只见过下方数据的网络在训练分布里更准,可规划器偏偏要把摆带到它从没见过的地方,在那里它说的话毫无根据。这正是后面几节的主线:要么让数据覆盖规划会去的地方,要么让规划器知道哪里不能信。

    3动手玩:在学到的模型上,用梯度还是用采样?

    神经网络模型有一个物理仿真器常常没有的好处:它处处可导。16.3 节的反向传播不但能求损失对权重的梯度,也能求网络输出对输入的梯度;把 \(N\) 步展开串起来,再沿时间往回传(与 6.13 节的打靶法相同,只是 Jacobian 由网络给出),就得到预测代价对整串动作的梯度 \(\hl{grad}{\nabla_{\mathbf U}J}\)。另一条路是 6.11 节和 13.4 节的 MPPI:把网络当黑盒,撒一批动作序列,按代价加权平均(权重 \(\hl{wts}{w_i}\))。

    下图两个单摆用同一个学到的网络(FIG 1 的全数据网络)和同样的代价,每个控制周期给同样多的网络计算预算(一次前向记 1 份,一次反向记 2 份)。蓝色用梯度:每周期从平移后的上一计划出发做几步投影 Adam;琥珀色用 MPPI。打开“禁区”后,代价里加一项:摆的角度落在 \(q\in(-2.6,-1.6)\) rad 这块扇形里,每一步罚 50。它是一个指示函数,几乎处处梯度为 0。

    FIG 2同样的预算:穿过网络求梯度 vs. 在网络里采样
    上:左边蓝色单摆用梯度规划,右边琥珀色单摆用 MPPI;红色扇形是禁区(关闭时画成虚线轮廓)。下:两者的“离倒立的高度” \(1+\cos q\)(0 = 倒立,2 = 竖直向下)随时间变化。预算 300 时,梯度法每周期做 3 步(每步一次 30 步展开的前向和反向),MPPI 用 10 条样本;预算 900 时分别是 10 步和 30 条;1800 时是 20 步和 60 条。“ms/周期”是你的浏览器里实测的计算时间。
    试一试
    • 禁区关闭,预算 300,跑满 8 s:梯度法比 MPPI 先竖起来(3.40 s 对 5.35 s)。把预算加到 1800,MPPI 追近了(4.05 s),梯度法几乎没变(3.45 s)。
    • 打开禁区,预算 900 或 1800,跑满 8 s:梯度法照样穿过禁区(900 时 13 个周期落在里面),MPPI 一次也没进去,代价是晚一点竖起来(5.30 s)。
    核心洞见

    可导的模型让梯度法在代价光滑时用很少的计算就找到好计划:一次反向传播给出所有 \(N\) 个动作的方向,而采样要靠很多条样本“摸”出同样的信息。可梯度只看得见局部的斜率:指示函数、碰撞、接触切换这类不连续的代价,它根本感觉不到(预算 300 时梯度法没进禁区,只是因为它恰好往另一侧摆)。采样不需要导数,能处理任何代价,代价是在高维动作空间里需要更多样本。实践中两者常常合用:TD-MPC(24.3 节)用 MPPI 在学到的潜模型里规划,也有工作先采样找到好的盆地,再用梯度精修。

    4第二个视角:把非线性模型“抬”成线性的

    FIG 2 的两个规划器都在解一个非凸问题,没有收敛保证,也难以加硬约束。13.4 节告诉我们,线性模型 + 二次代价 + 线性约束是一个凸 QP,几毫秒就能解到全局最优。能不能让学到的模型是线性的,同时又能描述非线性系统?

    Koopman 算子理论给了一个答案:不直接预测状态 \(\mathbf x\),而是预测状态的一组函数 \(\hl{psi}{\boldsymbol\psi}(\mathbf x)\)(“观测量”或“提升函数”)。对很多非线性系统,在足够丰富的函数空间里,这些函数的演化近似是线性的:\(\boldsymbol\psi(\mathbf x_{k+1})\approx A\boldsymbol\psi(\mathbf x_k)+B\mathbf u_k\)。\(A,B\) 用最小二乘(1.13 节)从数据里一次算出,这叫扩展动态模态分解(EDMD)。因为 \(\mathbf u\) 仍然线性地进入、状态又是 \(\boldsymbol\psi\) 的前两个分量,MPC 在提升空间里就是一个标准的线性 MPC,每个周期一个凸 QP;缩并之后,QP 的规模只取决于时域和输入维数,与提升维数基本无关(Korda 与 Mezić,2018)。

    下图的系统是一个刚度随形变变硬的弹簧(气动软体执行器常有这种特性):\(\ddot x=-x-2x^3-0.5\dot x+u\),\(|u|\le12\)。小位移时它像线性弹簧,大位移时 \(x^3\) 项占主导。四种模型对比:在原点处的局部线性化 \(\hl{Alin}{A_{\rm lin}}\)(紫色,“在工作点附近把模型线性化”的经典做法);以及从 4000 个随机激励的数据点用 EDMD 学出的模型(蓝色),提升函数可选:不提升(只用 \(x,\dot x\),即普通的线性回归,也叫 DMD)、多项式 \([x,\dot x,x^3,x^2\dot x,x^5]\)、10 个或 30 个径向基函数。

    FIG 3Koopman 提升:线性的模型,非线性的预测,凸的 MPC
    自由响应预测:拖动琥珀色初值
    闭环跟踪 x(t)
    左:从琥珀色初值出发、\(u=0\) 的 2 s 自由响应,绿色是真实系统,紫色是局部线性化的预测,蓝色是所选 EDMD 模型的预测(每一步都在提升空间里线性推进,从不回到 \(\mathbf x\) 再重新提升)。右:两个线性 MPC(时域 20 步 = 1 s,代价 \(\sum_k(x_k-r_k)^2+10^{-3}u_k^2\),\(|u|\le12\),每周期一个 20 变量的盒约束 QP)跟踪幅值为 \(A\)、频率 0.25 Hz 的正弦参考(琥珀色虚线)。每个周期都从测到的真实状态重新提升 \(\boldsymbol\psi(\mathbf x)\)。读数里的“20 步预测误差”是在 200 段随机激励的测试轨迹上,1 s 后位置误差的平均值。
    试一试
    • 选“不提升”,先把幅值调到 \(A\le0.5\):局部线性化跟踪得比数据拟合的线性模型好(\(A=0.5\) 时平均误差 0.008 对 0.042);再调到 \(A\ge1.5\):反过来了(\(A=1.5\) 时 0.097 对 0.041)。两个都是线性模型,各自只在一个范围里好。
    • 把幅值调到 \(A\ge1.5\),换一种提升函数,让蓝色的跟踪误差不到紫色的三分之一(例如 \(A=1.8\) 时多项式提升 0.040 对 0.149)。再把幅值调回 0.3:多项式提升在小幅值时也和局部线性化一样好(0.004 对 0.004;10 个 RBF 太粗,这里是 0.017)。
    核心洞见

    提升让“线性”成为模型的形式,而不是对系统的假设:\(A,B\) 仍是线性的,所以 MPC 仍是凸 QP;非线性藏在 \(\boldsymbol\psi\) 里。这不是免费的。有限个提升函数只能近似 Koopman 算子,预测会随时域变差:20 步时四种提升的误差是 0.24、0.21、0.17、0.16,40 步时都在 0.43 到 0.45 之间。好的提升函数取决于系统(这里多项式里恰好有 \(x^3\)),而控制输入线性进入只是一个假设;对于输入和状态强耦合的系统(例如力矩乘以 \(\cos q\)),这种形式本身就有误差。

    5第三个视角:让规划器知道模型在哪里没把握

    代价里的不确定性:悲观、中性还是乐观

    FIG 1 的失败有一个更深的原因,24.2 节的直觉部分已经看到:优化器在主动寻找模型说得好听的地方。模型误差在某处碰巧偏乐观,规划就会往那里去。24.2 节用集成的分歧给候选动作悲观地打分;这里把同一个想法放进 MPC 的代价和约束里。21.3 节的认知不确定性正好标出了这些地方:没有数据的地方,模型只是在猜。

    下图是一辆巡视车要从左边穿过一片地到右边。地里藏着泥(真实的泥塘画成红色虚线圆,车不知道),泥里的速度只有平地的 15%。车用一个高斯过程(GP,第 6 节)学“地面速度系数” \(s(\mathbf p)\),先验是 \(s=1\)(没去过的地方默认是平地)。它只走过一次下方的那条绕行路线(绿色数据点)。规划时把速度换成一个“置信下界”:

    $$ \mathbf p_{k+1}=\mathbf p_k+\Delta t\;\max\!\big(0.1,\;\mu_s(\mathbf p_k)-\hl{beta}{\beta}\,\hl{sig}{\sigma_s(\mathbf p_k)}\big)\begin{bmatrix}\cos a_k\\ \sin a_k\end{bmatrix},\qquad J=\sum_{k=1}^{N}\|\mathbf p_k-\mathbf p_{\rm goal}\| $$

    \(\beta>0\) 是悲观(“没把握的地方按最坏的情况算”),\(\beta=0\) 只用均值,\(\beta<0\) 是乐观(“没把握的地方可能很好,去看看”,即探索)。MPPI 每 0.25 s 对 24 步的航向序列规划一次。每跑完一趟,车把沿途每 0.3 m 测到的速度加进 GP 的数据里。

    FIG 4没去过的地方:按均值规划会陷进去,按置信下界规划会绕开
    底色是 GP 的估计:越红 = 估计的速度系数 \(\mu_s\) 越低,越青 = 不确定性 \(\sigma_s\) 越大(没去过的地方)。绿色小点是数据,琥珀色实线是这一趟实际走的路线,蓝色虚线是此刻的计划。“出发时预测”是出发那一刻规划器(用它的模型和 \(\beta\))认为到达终点要多久,“实际”是真实用时。动画按 4 倍速播放。
    试一试
    • 先按“重置数据”,用 \(\beta=0\) 跑第一趟:车直奔终点,陷进泥里,实际用时是出发时预测的两倍以上(21.5 s 对 8.55 s)。接着不重置再跑两趟:第三趟学乖了,绕开泥塘,9.0 s 到达。
    • 按“重置数据”,把 \(\beta\) 调到 1.5 或更大再跑第一趟:第一次就没有一步踩进泥里(\(\beta=2\) 时 10.0 s)。再试 \(\beta=1\):它仍然陷进去(18.75 s)。为什么“有点悲观”还不够?(提示:24 步 × 0.25 s 的时域看得有多远?)

    约束里的不确定性:高斯过程 MPC 与机会约束

    代价里的 \(\beta\) 改变“想去哪”,约束里的不确定性决定“离边界留多少余量”。Hewing 等人的谨慎 MPC(cautious MPC)是这条路线的代表:标称模型加一个 GP 学到的残差 \(\mathbf x_{k+1}=f(\mathbf x_k,\mathbf u_k)+B_d\,d(\mathbf x_k)\),\(d\sim\mathcal{GP}\);沿预测时域同时传播均值和方差,把状态约束写成机会约束 \(\Pr(h(\mathbf x_k)\le0)\ge1-\varepsilon\),再近似成收紧的确定性约束 \(h(\boldsymbol\mu_k)+\hl{tube}{\kappa\,\sigma_{h,k}}\le0\)。

    下图:小车(加速度输入 \(|u|\le1\) m/s²,与 13.4 节同款)从 \(p=-4\) 出发,要停在离墙 25 cm 的 \(p=-0.25\)。墙前最后一米是一段下坡,车不知道,坡给它额外 0.4 m/s² 的推力,刹车只剩六成力气。GP 学这个残差加速度 \(d(p)\),它只在 \(p\in[-4.2,-1.8]\) 有数据(以前来过的地方)。“标称”模式不用 GP;“GP 均值”把 \(\hl{gpmean}{\mu_d}\) 放进预测;“GP + 收紧”还要求预测位置加 \(\kappa\) 倍标准差不越过墙。CEM 每 0.1 s 在 2.5 s 时域上规划一次;每跑完一趟,沿途的残差测量加进数据。

    FIG 5GP-MPC:不确定的地方,约束自动收紧
    残差加速度 d(p)(m/s²)
    位置 p(t)(m)与此刻的预测管道
    上:绿色虚线是真实的残差(坡),蓝色是 GP 均值,青色带是 ±2 个标准差,绿色小点是数据,琥珀色竖线是小车此刻的位置。下:琥珀色实线是这一趟的 \(p(t)\),蓝色是此刻的均值预测,青色带是 \(\pm\kappa\sigma_p\) 的预测管道(\(\kappa=0\) 时画成 \(\pm\sigma_p\) 作参考),红线是墙 \(p=0\),绿色虚线是目标。预测管道的宽度来自 GP 的标准差沿时域的传播(第 6 节)。
    试一试
    • 按“重置数据”,用“标称”或“GP 均值”跑第一趟:小车撞上墙(越过 \(p=0\),标称时最远到 \(+0.26\) m)。坡附近没有数据,GP 均值就等于先验 0,和标称模型一样乐观。
    • 按“重置数据”,选“GP + 收紧”,\(\kappa\ge2\),跑第一趟:小车停在墙前(\(\kappa=2\) 时离墙 2.4 cm,7.1 s 才到目标)。不重置再跑一趟:数据有了,管道变窄,4.6 s 以内就停到目标,离墙仍有 20 cm 以上。
    核心洞见

    “不知道”本身是可以用的信息。认知不确定性只在没数据的地方大,所以不确定性感知的 MPC 在熟悉的地方和普通 MPC 一样快,在陌生的地方自动变谨慎,数据一多,余量就自己收回来(FIG 5 第二趟)。代价是它依赖不确定性估计本身靠得住:GP 的核长度、先验均值选错,\(\sigma\) 就会说错(FIG 4 若先验是“泥地”,车就永远不敢走直线);而 \(\kappa\)、\(\beta\) 的大小与“出错的概率”之间的对应,只在模型假设成立时才精确。

    6再看数学

    提示:把鼠标悬停在公式中带底色的符号上,对应的图元素会被高亮(FIG 1 的预测曲线或数据点、FIG 2 的蓝色或琥珀色单摆、FIG 3 的蓝色或紫色曲线、FIG 4 的不确定性底色或计划路线(跑动时)、FIG 5 的 GP 均值或预测管道(跑动时)、FIG 6 的紫色残差箭头(有数据之后))。

    学到的模型进入 MPC

    $$ \min_{\mathbf u_0,\dots,\mathbf u_{N-1}}\ \sum_{k=0}^{N-1}\ell(\mathbf x_{k+1},\mathbf u_k)\quad\text{s.t.}\quad \mathbf x_{k+1}=\hl{fth}{f_\theta}(\mathbf x_k,\mathbf u_k),\ \ \mathbf x_0=\mathbf x(t),\ \ \mathbf u_k\in\mathcal U $$

    与 13.4 节唯一的不同是 \(f_\theta\) 由数据 \(\hl{data}{\mathcal D}=\{(\mathbf x_i,\mathbf u_i,\mathbf x_i^+)\}\) 拟合而来(24.1 节)。FIG 1 的网络预测角速度增量,位置用半隐式欧拉积分:\(\dot q_{k+1}=\dot q_k+\Delta t\,\hat a_\theta(q_k,\dot q_k,u_k)\),\(q_{k+1}=q_k+\Delta t\,\dot q_{k+1}\)。这种“结构已知的部分写死,只学未知的部分”的做法本身就是一种先验(24.1 节的“预测增量”)。

    梯度:沿时间反向传播

    令 \(J=\sum_k\ell(\mathbf x_{k+1},\mathbf u_k)\),并把含 \(\mathbf x_k\) 的那一项记作 \(\ell_k=\ell(\mathbf x_k,\mathbf u_{k-1})\)。从最后一步往回递推伴随变量 \(\boldsymbol\lambda_k=\partial J/\partial\mathbf x_k\):

    $$ \boldsymbol\lambda_N=\nabla_{\mathbf x}\ell_N,\qquad \boldsymbol\lambda_k=\nabla_{\mathbf x}\ell_k+\Big(\frac{\partial f_\theta}{\partial\mathbf x}\Big)^{\!\top}_{\!k}\boldsymbol\lambda_{k+1},\qquad \hl{grad}{\frac{\partial J}{\partial\mathbf u_k}}=\nabla_{\mathbf u}\ell_{k+1}+\Big(\frac{\partial f_\theta}{\partial\mathbf u}\Big)^{\!\top}_{\!k}\boldsymbol\lambda_{k+1} $$

    每一个 \((\partial f_\theta/\partial\cdot)^\top\boldsymbol\lambda\) 正是对网络做一次反向传播、把上游梯度设为 \(\boldsymbol\lambda_{k+1}\) 时得到的“对输入的梯度”,不需要显式构造 Jacobian。所以一次梯度的代价约等于一次前向展开加一次反向展开(FIG 2 记为 3 份)。动作约束 \(|u|\le u_{\max}\) 用投影处理:每步更新后截断到盒子里。

    采样:MPPI 与 CEM

    MPPI 在当前计划 \(\mathbf U\) 周围采 \(K\) 条 \(\mathbf U+\boldsymbol\epsilon_i\),在模型里展开得到 \(J_i\),然后 \(\mathbf U\leftarrow\sum_i\hl{wts}{w_i}(\mathbf U+\boldsymbol\epsilon_i)\),\(w_i\propto\exp(-(J_i-J_{\min})/\lambda)\);CEM 只平均最好的若干条,并更新采样方差(6.11 节)。FIG 2 的 MPPI 用 \(\sigma=3\) N·m、\(\lambda=0.3\);FIG 5 用 CEM(48 条、精英 6 条、每周期 3 轮)。它们只需要模型的前向计算,所以模型可以是网络、GP、甚至不可导的仿真器。

    优化器在利用模型误差

    24.1 节称之为“模型被利用”,24.2 节给出了直觉;这里写成式子。写 \(\hat J(\mathbf U)=J(\mathbf U)+\varepsilon(\mathbf U)\),\(\varepsilon\) 是模型误差造成的代价误差。规划器求的是 \(\arg\min_{\mathbf U}\hat J\),它会偏向 \(\varepsilon\) 为负(模型过于乐观)的那些 \(\mathbf U\)。即使对每个固定的 \(\mathbf U\) 都有 \(\mathbb E[\varepsilon]=0\),也有 \(\mathbb E[\min_{\mathbf U}\hat J]\le\min_{\mathbf U}J\):优化后的预测代价系统性地偏低(“优化者的诅咒”)。\(\varepsilon\) 的散布在没有数据的地方最大,所以这种偏差专门把计划拉向没数据的地方。这就是 FIG 1 窄数据网络、FIG 4 \(\beta=0\) 时出事的机制,也是用不确定性修正代价的理由。

    Koopman 提升与 EDMD

    对自治系统 \(\mathbf x^+=F(\mathbf x)\),Koopman 算子作用在函数上:\((\mathcal K g)(\mathbf x)=g(F(\mathbf x))\)。它是线性的(\(\mathcal K(ag+bh)=a\mathcal Kg+b\mathcal Kh\)),代价是它作用在无穷维的函数空间上。EDMD 取有限个函数 \(\hl{psi}{\boldsymbol\psi}=[\psi_1,\dots,\psi_n]^\top\),用数据求它在这个子空间上的最小二乘近似;Korda 与 Mezić 把输入写成线性项:

    $$ \min_{A,B}\ \sum_i\big\|\boldsymbol\psi(\mathbf x_i^+)-A\boldsymbol\psi(\mathbf x_i)-B\mathbf u_i\big\|^2,\qquad \mathbf y_{k+1}=A\mathbf y_k+B\mathbf u_k,\quad \mathbf y_0=\boldsymbol\psi(\mathbf x(t)),\quad \hat{\mathbf x}_k=C\mathbf y_k $$

    这里 \(\boldsymbol\psi\) 的前两个分量就是 \(x,\dot x\),所以 \(C=[I\ 0]\)。闭式解是正规方程 \([A\ B]^\top=(Z^\top Z)^{-1}Z^\top Y^+\),\(Z\) 的每行是 \([\boldsymbol\psi(\mathbf x_i)^\top,\mathbf u_i^\top]\)。有了线性模型,13.4 节的缩并就照搬:\(\hat x_{k}=\mathbf c^\top A^k\mathbf y_0+\sum_{j\lt k}\mathbf c^\top A^{k-1-j}B\,u_j\),代价是 \(U\) 的二次型,状态约束 \(C\mathbf y_k\in\mathcal X\) 仍是线性不等式。对比之下,\(\hl{Alin}{A_{\rm lin}}=\partial F/\partial\mathbf x|_{\mathbf 0}\) 只在原点附近准;“不提升”的 EDMD 是对整个数据范围的最佳线性拟合,在原点附近反而不如 \(A_{\rm lin}\)(FIG 3 第一个任务)。

    高斯过程回归

    21.3 节的贝叶斯线性回归用有限个高斯鼓包当特征;鼓包无限多、铺满整个空间时,就得到高斯过程。给定数据 \(X=\{\mathbf z_i\}\)、带噪声 \(\sigma_n\) 的观测 \(\mathbf y\)、核 \(k(\mathbf z,\mathbf z')=\sigma_f^2\exp(-\tfrac12\sum_j(z_j-z_j')^2/\ell_j^2)\),在新点 \(\mathbf z\) 的预测是

    $$ \hl{gpmean}{\mu(\mathbf z)}=m_0+\mathbf k_*^\top(K+\sigma_n^2I)^{-1}(\mathbf y-m_0),\qquad \sigma^2(\mathbf z)=k(\mathbf z,\mathbf z)-\mathbf k_*^\top(K+\sigma_n^2I)^{-1}\mathbf k_*,\qquad (\mathbf k_*)_i=k(\mathbf z,\mathbf z_i) $$

    离所有数据都远时 \(\mathbf k_*\to\mathbf 0\),于是 \(\mu\to m_0\)(先验均值),\(\sigma\to\sigma_f\)(先验标准差)。这两条性质就是本节的全部用处:FIG 4、FIG 5 的 \(\sigma\) 标出没数据的地方;FIG 6 取 \(m_0=0\),所以残差模型在没数据的地方退回到物理模型。代价是计算:求逆是 \(O(n^3)\),每次预测 \(O(n)\)(均值)或 \(O(n^2)\)(方差),所以实时 GP-MPC 都用稀疏近似(几十到几百个诱导点)。本页 FIG 4 的超参数 \(\sigma_f=0.4,\ \ell=0.9\) m,FIG 5 为 \(\sigma_f=0.3\) m/s²、\(\ell=0.35\) m,FIG 6 为 \(\sigma_f=3\) m/s²、\(\ell=2.5\) m/s,且只保留最多 150 个数据点;都是手选的,没有用边际似然优化。

    沿时域传播不确定性,收紧约束

    FIG 5 的模型是 \(\mathbf x_{k+1}=A\mathbf x_k+B u_k+B_d\,d(p_k)\),\(\mathbf x=(p,v)\),\(B_d=[\tfrac12\Delta t^2,\ \Delta t]^\top\)。真实轨迹与均值的偏差 \(\mathbf e_k\) 在一个预稳定反馈 \(u=\bar u+K\mathbf e\)(\(K=[-1.2,\,-1.8]\))下近似满足(这个反馈只用来传播方差;闭环里真正的反馈是每周期重新规划)

    $$ \mathbf e_{k+1}\approx\underbrace{\big(A+BK+B_d\,[\mu_d'(\bar p_k)\ \ 0]\big)}_{\tilde A_k}\mathbf e_k+B_d\,\delta_k,\qquad \delta_k\sim\mathcal N\!\big(0,\sigma_d^2(\bar p_k)\big) $$

    Hewing 等人假设各步的 \(\delta_k\) 相互独立,于是 \(\Sigma_{k+1}=\tilde A_k\Sigma_k\tilde A_k^\top+B_d\sigma_d^2B_d^\top\)。可 GP 的误差是位置的函数,相邻几步的 \(\bar p_k\) 很接近,误差几乎是同一个值;当成独立会低估累积。本页取另一个极端:把它们当作完全相关(同一个未知偏差),标准差直接线性累加 \(\mathbf s_{k+1}=\tilde A_k\mathbf s_k+B_d\,\sigma_d(\bar p_k)\),\(\sigma_{p,k}=|s_{k,1}|\)。这是一个偏保守的上界。机会约束 \(\Pr(p_k\le0)\ge1-\varepsilon\) 在高斯近似下变成

    $$ \bar p_k+\hl{tube}{\kappa\,\sigma_{p,k}}\le0,\qquad \kappa=\Phi^{-1}(1-\varepsilon)\quad(\kappa=2\Rightarrow\varepsilon\approx2.3\%,\ \ \kappa=3\Rightarrow\varepsilon\approx0.13\%) $$

    它在 FIG 5 里作为软约束(罚 \(400\,v^2+20\,v\),\(v\) 是越界量)进入 CEM 的代价。注意这里的 \(\varepsilon\) 是每一步的违反概率,而且只有在 GP 的不确定性本身校准良好(21.3 节)时才是真的概率。

    残差模型

    $$ \mathbf x_{k+1}=f_{\rm phys}(\mathbf x_k,\mathbf u_k)+B_d\,\hl{res}{\mathbf r_\phi}(\mathbf z_k),\qquad \mathbf r_\phi\ \text{fitted to}\ \ \mathbf r_i=B_d^{+}\big(\mathbf x_i^+-f_{\rm phys}(\mathbf x_i,\mathbf u_i)\big) $$

    \(\mathbf z\) 是残差依赖的那几个量(FIG 6 里是速度),往往比完整状态低维得多,所以需要的数据少。把它放进二次规划的常用办法是:在上一周期计划(平移后)的预测轨迹上计算 \(\mathbf r_\phi\),把它当作已知的时变加速度加进线性预测,每周期重新计算。这和 13.4 节的实时迭代是一个思路:模型的非线性部分在上一个解附近“冻结”,每个周期只解一个 QP。

    7机器人中的它:用学到的残差高速飞行

    Torrente 等人(2021)的做法很有代表性:四旋翼的标称模型是刚体动力学,高速时的空气动力效应用 GP 从飞行数据里学成残差加速度,再接进非线性 MPC。下图是它的平面简化版:一个质点“无人机” \(\ddot{\mathbf p}=\mathbf u+\mathbf d(\mathbf v)\),\(|u_x|,|u_y|\le25\) m/s²,真实的阻力 \(\mathbf d(\mathbf v)=-0.12\,\|\mathbf v\|\mathbf v-0.15\,\mathbf v\),标称模型不知道它。它要以给定速度沿半径 5 m 的圆飞一圈。控制器是线性 MPC(时域 20 步 = 1 s,x、y 两个方向各一个 20 变量的盒约束 QP);“物理 + GP 残差”模式按第 6 节的办法把 GP 预测的加速度沿预测轨迹加进去。每飞完一圈,沿途测到的残差(\(\Delta\mathbf v/\Delta t-\mathbf u\),带 0.1 m/s² 的噪声)加入数据。24.1 节的 FIG 5 已经在开环预测里比较过残差网络和黑箱网络:残差更省数据,出了数据范围有物理兜底。这里不再重复那个比较,而是看残差放进 MPC 闭环之后的事:它怎样作为已知的时变加速度进入每周期的 QP,跟踪误差降多少,以及 GP 的先验均值 0 怎样决定它在没飞过的速度上的行为。

    FIG 6残差学习:只学物理模型漏掉的阻力
    俯视 (x, y)
    速度平面:数据与 GP 残差
    左:琥珀色虚线是参考圆,蓝色是这一圈的飞行轨迹(误差放大 5 倍画出,便于看清),点是无人机此刻的位置。右:速度平面 \((v_x,v_y)\),绿色小点是数据,底色越青 = GP 越没把握,紫色箭头是 GP 在网格上预测的残差加速度(缩小画出),红色箭头是同一处的真实阻力,琥珀色虚线圆是当前设定的速度。RMSE 统计第 1 s 之后的位置误差。“物理 + 真实阻力”是知道真实阻力时 MPC 能做到的下限。
    试一试
    • 按“重置数据”,在 8 m/s 下用“物理”飞一圈(RMSE 0.153 m,阻力把它往圆内拖),再换“物理 + GP 残差”以同样速度飞一圈:误差降到物理模型的 30% 以下(约 0.02 m)。
    • 接着把速度调到 10 m/s 以上,用“物理 + GP 残差”飞:只要数据都来自比当前慢 3 m/s 以上的飞行,残差帮的忙就很小(误差仍超过物理模型的 60%;先飞 8 m/s 再飞 11 m/s 时 0.297 对 0.363 m)。在速度平面里看:这个速度圈落在青色区域,GP 退回了先验 0,也就是退回了物理模型。再飞一圈,误差就降下来(0.115 m)。
    真实系统里

    神经网络模型 + 采样 MPC:Williams 等人(ICRA 2017)把多层网络学到的车辆动力学放进 MPPI,在 1/5 比例的 AutoRally 越野车上做激进驾驶;Nagabandi 等人(ICRA 2018)用网络动力学加随机打靶的 MPC 控制模拟机器人和一台真实的小型足式机器人,并用它初始化无模型 RL(这类方法在 24.2 节展开)。GP 残差:Hewing、Kabzan 与 Zeilinger 的谨慎 MPC(IEEE TCST 2020)在 1:43 微型赛车上以 20 ms 采样周期运行;Kabzan 等人(RA-L 2019)把同一思路用在 AMZ Driverless 的全尺寸方程式赛车上,用稀疏 GP 在线学车辆模型的残差,随着数据积累,单圈用时缩短。Torrente 等人(RA-L 2021)用 GP 学四旋翼的空气动力残差,在最高 14 m/s 的飞行里把跟踪误差降低了最多 70%。神经网络残差:Salzmann 等人的 Real-time Neural MPC(RA-L 2023)把大得多的网络残差放进四旋翼的 MPC,在嵌入式平台上以 50 Hz 运行,位置跟踪误差比不带网络的 MPC 最多降低 82%。Koopman:Korda 与 Mezić(Automatica 2018)提出了带输入的 EDMD 与线性 MPC;Bruder 等人(IEEE T-RO 2021)用 Koopman 模型和线性 MPC 控制气动软体机械臂。价值 + 学到的模型:TD-MPC 在学到的潜模型里用 MPPI 规划,并以学到的价值函数作终端代价(24.3 节),这正是 13.4 节“终端代价代替时域之外的未来”在学习框架里的对应物。

    什么时候“经典 MPC + 学到的残差”胜过端到端强化学习

    端到端强化学习(23.1 节)直接学一个从观测到动作的策略,部署时只要一次网络前向。MPC + 残差则保留了一个可解释的优化问题。两者各有所长,下表是一个经验性的对照:

    情形倾向原因
    物理模型基本对,只差一部分(阻力、轮胎、摩擦)MPC + 残差残差低维、数据需求小(FIG 6 一圈数据就够),没数据处还能退回物理模型
    硬约束必须满足、任务和约束经常变MPC + 残差约束和代价写在优化问题里,换一个参考轨迹或障碍物不需要重新训练
    接触丰富、模型很难写(灵巧手、复杂地形上的行走)端到端 RL(仿真里训练)在线优化穿过接触切换很难;RL 把这份难度挪到离线的大规模仿真里
    机载算力很小、控制频率很高端到端 RL一次网络前向通常比每周期解一个优化问题便宜得多
    真正的目标难以写成跟踪误差(例如“最快通过所有门”)端到端 RLRL 可以直接优化任务层面的目标

    最后一行有一个很好的例子。Song 等人(Science Robotics 2023)在无人机竞速上系统比较了最优控制与强化学习,结论是 RL 的优势不在于把目标优化得更好,而在于它优化的是一个更好的目标:最优控制把任务拆成“先规划轨迹、再跟踪轨迹”,跟踪误差这一目标限制了控制器能表现的行为,遇到没建模的效应时表现更差;RL 直接优化任务层面的目标。同一个组的 Swift(Kaufmann 等,Nature 2023)就是用深度强化学习训练的竞速无人机,在比赛中赢过了人类冠军。所以“MPC + 残差”的优势主要在数据效率、约束和可改性,而不是在所有任务上都更强。两条路也在合流:用 RL 学的价值函数做 MPC 的终端代价(TD-MPC),或者用 MPC 生成的数据去训练策略。

    8常见误区

    误区 1:训练损失低,MPC 就会好

    FIG 1 里只见过下方数据的网络,训练集损失(\(1.5\times10^{-4}\))比全数据网络(\(1.8\times10^{-3}\))低一个数量级,在它的数据区域里也更准,可它让 MPC 一次也没竖起来。评估学到的模型要在闭环会访问的状态上测,最好是多步预测误差(24.1 节),而不是在训练分布上的一步误差。数据还要随着控制器变好而更新:控制器一变,访问的状态就变了(DAgger 式的迭代采集)。

    误区 2:模型可导,就一定用梯度

    FIG 2 里梯度在光滑代价上用三分之一的计算就赢了 MPPI,但它看不见禁区。网络的梯度还有两个隐患:在没数据的地方,网络对输入的导数可以任意大或任意错(它只被训练成拟合函数值,不是拟合导数);ReLU 网络的导数是分段常数。梯度把规划器沿着这些错误的斜率推向没数据的地方,正是“利用模型误差”的最快通道。

    误区 3:Koopman 模型是精确的线性化

    只有在提升函数张成一个对动力学不变的子空间时,EDMD 才是精确的;实际中几乎从不成立,所以预测误差随时域累积(FIG 3:40 步时所有提升的误差都接近 0.44)。提升维数越高,最小二乘越容易过拟合,状态约束 \(C\mathbf y\in\mathcal X\) 也只是在预测的 \(\hat{\mathbf x}\) 上成立。要把 Koopman MPC 的时域选在预测还可信的范围内,并像普通 MPC 一样为模型误差留余量。

    误区 4:不确定性一定要“越保守越好”

    FIG 5 里 \(\kappa=3\) 第一趟比 \(\kappa=2\) 离墙更远,也更早到目标(6.1 s 对 7.1 s),但这不是规律:太大的 \(\kappa\) 或 \(\beta\) 会让控制器永远不进入没数据的区域,于是那里永远没有数据,不确定性永远不会下降(FIG 4 的“绕行”路线就再也学不到中间的地有多好)。安全的学习需要有意识地在可控的风险下探索:在确定安全的集合里逐步扩张(安全贝叶斯优化、安全集方法),而不是只把余量调大。

    误区 5:残差可以用任何模型来学

    残差模型在没数据的地方应该“闭嘴”,也就是输出接近 0,让物理模型做主。GP(先验均值 0)天然如此(FIG 6 第二个任务;24.1 节 FIG 5 里的物理残差网络在数据外也靠物理模型兜底,但网络本身的输出并不会自动归零)。普通的 tanh 或 ReLU 网络在训练范围外会按自己的方式外推,可能把一个本来还算准的物理模型带偏;用网络时要配合不确定性估计(集成,21.3 节)、权重衰减,或把输出乘一个随“离数据距离”衰减的门控。另外,残差只能修正物理模型的状态和输入能解释的误差:如果误差来自没测到的量(风、载荷),它只会学到一个平均值。

    9小练习

    1. 一个学到的动力学模型在验证集上的一步预测误差很小,可接进 MPC 后闭环表现很差,规划的轨迹在模型里看起来很好。最可能的原因是什么?
    选项 B。验证集与训练集同分布,测的是模型在“数据去过的地方”的误差;而优化器专门寻找预测代价低的计划,模型误差偏乐观的地方最容易被选中(第 6 节的“优化者的诅咒”)。“模型里看起来很好”正是这个特征。FIG 1 的窄数据网络在自己的数据区域比全数据网络还准,却让 MPC 失败。欠拟合(C)会让验证误差也大;只执行第一步(D)是 MPC 的反馈来源,不是问题所在。
    2. 在一个学到的神经网络动力学模型上做 MPC,代价里有一项“碰到障碍物罚 100”(0/1 指示函数)。下面哪种规划器最合适?
    选项 C。网络可导,但代价不可导:指示函数的梯度几乎处处为 0,梯度法感觉不到障碍(FIG 2 打开禁区后,梯度法在预算 900 时有 13 个周期落在禁区里,MPPI 一次也没有)。采样法只需要代价值;或者把代价改成光滑的(例如到障碍的距离的罚函数)再用梯度。指示函数不是凸的(D 错),原点线性化对远离原点的轨迹不准(B 错)。
    3. 用 EDMD 学到了提升模型 \(\mathbf y^+=A\mathbf y+B\mathbf u\),\(\mathbf y=\boldsymbol\psi(\mathbf x)\),提升维数 32。在它上面做 MPC,下列哪个说法正确?
    选项 A。在提升空间里模型是线性的,所以 13.4 节的缩并照搬,QP 是凸的;缩并后决策变量只有 \(N\times m\) 个,32 维的提升状态只影响构造矩阵的开销。可提升只是近似(FIG 3 中 40 步预测误差约 0.44),所以 C 错,仍需每个周期从测量重新提升(这是反馈)。预测时不需要在每一步重新提升,正是“线性推进”让问题保持为 QP(D 错)。
    4. GP-MPC 把状态约束 \(p_k\le0\) 收紧成 \(\bar p_k+\kappa\sigma_{p,k}\le0\)。数据越来越多时,会发生什么?
    选项 D。\(\kappa\) 是设计者选的置信水平,不会变(A、B 错)。\(\sigma_{p,k}\) 由 GP 的预测标准差沿时域传播而来,数据越多,有数据处的认知不确定性越小(21.3 节),只剩观测噪声决定的下限。FIG 5 第二趟(\(\kappa=2\))就是这样:管道变窄,到达目标的时间从 7.1 s 缩短到约 4.5 s。
    5. 一台四旋翼的刚体模型已经相当准,只有高速时的空气阻力没建模;要在一周的实验时间里显著提高高速跟踪精度,并且必须满足推力上限和禁飞区。哪种方案最合适?
    选项 B。物理模型已经解释了大部分动力学,残差只依赖速度等少数几个量,所需数据少(FIG 6 里一圈数据就把 8 m/s 的误差降到约 0.02 m),没数据处又会退回物理模型;推力上限和禁飞区直接写成 MPC 的约束。Torrente 等人(2021)和 Salzmann 等人(2023)就是这条路线。从零学完整动力学(C)要多得多的数据,外推也没有物理兜底;在真机上从零训练 RL(A)一周内很难做到,也难以保证约束;加长时域(D)不能修正模型误差,反而让预测更远、误差更大。

    10延伸阅读

    • L. Hewing, K. P. Wabersich, M. Menner & M. N. Zeilinger, Learning-Based Model Predictive Control: Toward Safe Learning in Control, Annual Review of Control, Robotics, and Autonomous Systems 3, 2020 — 学习型 MPC 的综述:学模型、学代价、安全性
    • L. Hewing, J. Kabzan & M. N. Zeilinger, Cautious Model Predictive Control Using Gaussian Process Regression, IEEE Transactions on Control Systems Technology 28(6), 2020 — GP 残差、方差沿时域的传播与机会约束(FIG 5 的原型)
    • J. Kabzan, L. Hewing, A. Liniger & M. N. Zeilinger, Learning-Based Model Predictive Control for Autonomous Racing, IEEE Robotics and Automation Letters 4(4), 2019 — 全尺寸赛车上在线学习 GP 残差
    • G. Torrente, E. Kaufmann, P. Föhn & D. Scaramuzza, Data-Driven MPC for Quadrotors, IEEE Robotics and Automation Letters 6(2), 2021 — 四旋翼空气动力残差的 GP 学习(FIG 6 的原型)
    • T. Salzmann, E. Kaufmann, J. Arrizabalaga, M. Pavone, D. Scaramuzza & M. Ryll, Real-Time Neural MPC: Deep Learning Model Predictive Control for Quadrotors and Agile Robotic Platforms, IEEE Robotics and Automation Letters 8(4), 2023 — 把大型神经网络放进实时 MPC
    • M. Korda & I. Mezić, Linear Predictors for Nonlinear Dynamical Systems: Koopman Operator Meets Model Predictive Control, Automatica 93, 2018 — 带输入的 EDMD 与 Koopman MPC
    • D. Bruder, X. Fu, R. B. Gillespie, C. D. Remy & R. Vasudevan, Data-Driven Control of Soft Robots Using Koopman Operator Theory, IEEE Transactions on Robotics, 2021 — 软体机械臂上的 Koopman MPC
    • G. Williams, N. Wagener, B. Goldfain, P. Drews, J. M. Rehg, B. Boots & E. A. Theodorou, Information Theoretic MPC for Model-Based Reinforcement Learning, ICRA 2017 — 神经网络动力学 + MPPI,激进驾驶
    • A. Nagabandi, G. Kahn, R. S. Fearing & S. Levine, Neural Network Dynamics for Model-Based Deep Reinforcement Learning with Model-Free Fine-Tuning, ICRA 2018 — 网络动力学 + 随机打靶 MPC
    • Y. Song, A. Romero, M. Müller, V. Koltun & D. Scaramuzza, Reaching the Limit in Autonomous Racing: Optimal Control versus Reinforcement Learning, Science Robotics 8(82), 2023 — 最优控制与强化学习在无人机竞速上的系统比较
    • C. E. Rasmussen & C. K. I. Williams, Gaussian Processes for Machine Learning, MIT Press, 2006 — 高斯过程回归的标准参考
    • J. B. Rawlings, D. Q. Mayne & M. M. Diehl, Model Predictive Control: Theory, Computation, and Design, 2nd ed., Nob Hill Publishing, 2017 — 鲁棒与随机 MPC 的理论背景