Zhicheng

Robotics, Learning, and Control

0%

safe learning实践 - 基于强化学习的MPC

论文《Learning Safety in Model-Based Reinforcement Learning using MPC and Gaussian Processes》讨论的是一个很实际的问题:

如何在性能优化安全约束之间取得平衡,使强化学习在更新控制器参数时,不会因为探索而把系统带到危险区域。

这篇文章里,作者把三个部分结合起来:

  • MPC 负责根据当前模型和约束求控制量;
  • 强化学习 负责在线调整 MPC 的参数;
  • 高斯过程(GP) 负责估计哪些参数更新仍然是安全的。

1. 问题背景

传统强化学习在机器人控制里常见两个问题:

  1. 样本效率低,需要大量交互;
  2. 探索过程可能违反状态约束或输入约束。

而 MPC 天然适合处理约束控制问题。于是论文的核心思路是:

不直接让强化学习输出动作,而是让强化学习去更新 MPC 的参数,再由 MPC 负责执行受约束控制。

这样做的好处是,策略仍然具有优化结构,且更容易把系统安全约束显式写进控制器中。

2. 强化学习优化的对象

这里学习的不是“动作表”本身,而是 MPC 中的一组参数 θ\theta。这些参数可以理解为:

  • 代价函数权重;
  • 模型中的部分参数;
  • 终端惩罚或约束相关参数。

目标函数写作

$$J(\pi_\theta)=\mathbb{E}_{\tau_{\pi_\theta}}\left[\sum_{k=0}^{\infty}\gamma^k L(s_k, a_k)\right].$$

其中:

  • sks_k 表示第 kk 步状态;
  • aka_k 表示第 kk 步动作;
  • L(sk,ak)L(s_k, a_k) 表示阶段损失;
  • γ(0,1)\gamma \in (0,1) 是折扣因子;
  • πθ\pi_\theta 是由参数 θ\theta 决定的 MPC 策略。

因此,学习的目标就是找到更优的 θ\theta,使闭环性能更好,同时不破坏安全性。

3. MPC 在这里扮演什么角色

MPC 不是背景板,而是整个方法的策略核心。给定当前状态 ss,MPC 通过在线优化输出控制量:

$$\pi_\theta(s)=\arg\min_{u} Q_\theta(s, u).$$

这意味着:

  • 强化学习负责“调参数”;
  • MPC 负责“解优化并出动作”。

相比直接学习动作策略,这种方式更适合机器人与控制场景,因为它保留了约束、模型和代价函数这些结构化信息。

4. 参数更新的基本形式

若忽略安全限制,参数更新可以写成梯度型形式:

$$\theta^{+}=\theta-\alpha\nabla_{\theta}\sum_{k=0}^{m}\psi(s_k, a_k, s_{k+1}, \theta).$$

其中:

  • α\alpha 是学习率;
  • ψ()\psi(\cdot) 是强化学习中的损失项;
  • mm 是一个批量内的样本数。

这里的重点不是“动作如何更新”,而是“如何更新 MPC 参数 θ\theta”。

5. 为什么需要安全约束

如果直接做参数更新,新的 θ+\theta^{+} 可能导致:

  • MPC 解出的动作过激;
  • 状态轨迹触碰约束边界;
  • 实际系统进入不安全区域。

所以论文在更新时加入一个投影到安全集合的思想:

$$\theta^{+}=\arg\min_{\vartheta}\frac{1}{2}\lVert \vartheta-\theta \rVert_2^2+\alpha\nabla_{\theta}\sum_{k=0}^{m}\psi(s_k, a_k, s_{k+1}, \theta).$$

subject to ϑSD\vartheta \in S_D.

其中 SDS_D 是由数据驱动方法估计出来的安全参数集合

直观地说,这一步不是“想怎么更新就怎么更新”,而是:

先按性能目标提出更新方向,再把更新结果限制在安全区域内部。

6. 高斯过程如何保证安全

论文用高斯过程(Gaussian Process, GP)来估计参数是否安全。其作用不是直接控制,而是构造一个关于安全性的概率模型。

若用 z(θ)z(\theta) 表示某个与安全相关的指标,则安全集合可以表示为

$$S_D=\left\{\theta \;\middle|\; \mathbb{P}\big(z(\theta)\le 0\big)\ge \beta\right\}.$$

其中 β\beta 是设定的安全置信水平。

这表示:

  • 当某组参数对应的风险足够低时,才允许强化学习采用它;
  • 当 GP 判断某次更新不可靠时,该更新会被拒绝或修正。

这也是整篇论文最关键的思想之一:安全不是靠训练结束后再检查,而是嵌入每次参数更新中。

7. 文中采用的强化学习方法

论文中使用的是 LSTD Q-Learning,更具体地说,是一种二阶最小二乘时序差分 Q 学习方法。

相比传统 Q-Learning,它的特点是:

  • 更关注参数化值函数的拟合;
  • 样本效率更高;
  • 更适合和带结构的控制器参数更新结合。

7.1 Q 函数近似

记参数化的动作价值函数为

$$Q_\theta(s, a)=\phi(s, a)^\top \theta.$$

其中 ϕ(s,a)\phi(s,a) 是特征向量,θ\theta 是待学习参数。

7.2 TD 误差

时序差分误差写作

$$\delta=L(s, a)+\gamma V_\theta(s')-Q_\theta(s, a).$$

它衡量“当前估计”和“下一步回报估计”之间的偏差。

7.3 梯度与二阶信息

文中使用二阶形式更新参数,常见表达为

$$p=-\sum_{i=1}^{m}\delta_i\nabla_\theta Q_\theta(s_i, a_i).$$ $$H=\sum_{i=1}^{m}\nabla_\theta Q_\theta(s_i, a_i)\nabla_\theta Q_\theta(s_i, a_i)^\top-\delta_i \nabla_\theta^2 Q_\theta(s_i, a_i).$$

于是参数更新可以写成

$$\theta^{+}=\theta + \alpha H^{-1} p.$$

如果再考虑安全约束,那么这个更新还需要再经过上一节的安全投影。

8. 整体流程

把整篇论文的方法浓缩后,可以写成如下循环:

  1. 用当前参数 θ\theta 的 MPC 控制器执行一轮任务;
  2. 采集轨迹数据 (sk,ak,sk+1)(s_k, a_k, s_{k+1})
  3. 计算损失与 TD 误差,得到 RL 更新方向;
  4. 用 GP 根据已有数据估计安全集合 SDS_D
  5. 将参数更新限制在 SDS_D 内;
  6. 用新的参数继续下一轮控制。

9. 这个方法为什么有价值

我认为这篇论文最值得关注的地方有三点:

9.1 把“安全”从后验检查变成了先验约束

很多方法是在训练后再看轨迹是否危险,而这里是在参数更新时直接加入安全判断。

9.2 强化学习没有破坏控制器结构

策略依然由 MPC 求解,不是纯黑箱策略网络,因此更适合工程控制系统。

9.3 数据效率优于完全无模型方法

由于学习对象是 MPC 参数而不是整套动作映射,再加上 LSTD 类方法本身的数据效率,整体会更接近控制场景的实际需求。

10. 一个更直观的理解

可以把它理解成下面这个分工:

模块 作用
MPC 根据当前参数和约束,求最优动作
RL 根据轨迹表现,提出参数更新方向
GP 判断这次参数更新是否仍然安全

所以这不是“RL 替代 MPC”,而是:

RL 负责学,MPC 负责控,GP 负责守住边界。

11. 总结

这篇论文的核心结论可以概括为:

  • 学习对象是 MPC 参数 θ\theta,而不是直接学习动作;
  • 安全约束通过 GP 构造的安全集合 SDS_D 来保证;
  • 参数更新既考虑性能提升,也必须满足安全性;
  • LSTD Q-Learning 提供了较高的数据利用效率;
  • 整体框架非常适合机器人控制和安全强化学习场景。

如果后面你准备把这篇内容继续扩展成“推导版”,我建议下一步可以单独补三块:

  1. MPC 代价函数和约束的具体形式;
  2. GP 如何更新安全置信边界;
  3. LSTD Q-Learning 与普通 Q-Learning 的差异推导。