【模型式强化学习】(二)PETS——从概率动力学模型到模型预测控制(MPC)

前言

  • 本系列将从模型式强化学习的基本原理出发,逐步介绍经典方法与现代世界模型,结合核心公式、算法架构与核心代码,讨论智能体如何在学习行动的同时预测行动的后果,并利用预测结果指导决策
  • 上一期我们介绍了 Dyna,它利用环境模型预测下一状态与奖励,把同一条真实经验反复用于价值更新
    • 既然模型已经能回答"做了什么会发生什么",一个自然的问题是:能不能直接用它向前推演未来,比较不同动作序列的结果,然后选择当前最值得执行的动作?
  • 本期回答这个问题,介绍 PETS(Probabilistic Ensembles with Trajectory Sampling,概率集成与轨迹采样):用概率动力学模型集成 描述状态变化的分布,用轨迹采样 把不确定性沿预测时域传播,用交叉熵方法 在模型中搜索动作序列,再以模型预测控制的方式滚动执行
  • 全文分三章:第 1 章讨论环境模型本身;第 2 章拆解 PETS 的模型、采样与规划三个模块;第 3 章在连续控制任务上复现整套流程,逐层检查模型精度、不确定性与规划器的作用

文章目录

    • 前言
    • [1 环境模型](#1 环境模型)
        • [1-1 什么是环境模型](#1-1 什么是环境模型)
        • [1-2 动力学模型](#1-2 动力学模型)
        • [1-3 如何学习动力学模型](#1-3 如何学习动力学模型)
        • [1-4 从单步预测到轨迹预测](#1-4 从单步预测到轨迹预测)
    • [2 PETS](#2 PETS)
        • [2-1 介绍](#2-1 介绍)
        • [2-2 整体架构](#2-2 整体架构)
        • [2-3 概率动力学模型集成(PE)](#2-3 概率动力学模型集成(PE))
          • [2-3-1 为什么使用概率模型](#2-3-1 为什么使用概率模型)
          • [2-3-2 多个模型](#2-3-2 多个模型)
        • [2-4 轨迹采样(Trajectory Sampling)](#2-4 轨迹采样(Trajectory Sampling))
          • [2-4-1 介绍](#2-4-1 介绍)
          • [2-4-2 TS1 与 TS∞](#2-4-2 TS1 与 TS∞)
        • [2-5 MPC 与 CEM,如何选出动作?](#2-5 MPC 与 CEM,如何选出动作?)
          • [2-5-1 介绍](#2-5-1 介绍)
          • [2-5-2 模型预测控制(MPC)](#2-5-2 模型预测控制(MPC))
          • [2-5-3 交叉熵方法(CEM)](#2-5-3 交叉熵方法(CEM))
          • [2-5-4 为什么不需要单独训练策略网络](#2-5-4 为什么不需要单独训练策略网络)
        • [2-6 PETS 的完整训练与决策流程](#2-6 PETS 的完整训练与决策流程)
        • [2-7 与无模型强化学习(MFRL)的对比](#2-7 与无模型强化学习(MFRL)的对比)
    • [3 实验](#3 实验)
        • [3-1 介绍](#3-1 介绍)
        • [3-2 实验一:单步预测与真实环境](#3-2 实验一:单步预测与真实环境)
        • [3-3 实验二:多步预测与误差累积](#3-3 实验二:多步预测与误差累积)
        • [3-4 实验三:训练数据量对预测误差的影响](#3-4 实验三:训练数据量对预测误差的影响)
        • [3-5 实验四:两类不确定性的作用与校准](#3-5 实验四:两类不确定性的作用与校准)
          • [3-5-1 认知不确定性地图](#3-5-1 认知不确定性地图)
          • [3-5-2 认知不确定性与预测误差的散点图](#3-5-2 认知不确定性与预测误差的散点图)
          • [3-5-3 校准检验](#3-5-3 校准检验)
        • [3-6 实验五:闭环控制与数据效率](#3-6 实验五:闭环控制与数据效率)
        • [3-7 实验六:规划器的消融](#3-7 实验六:规划器的消融)
        • [3-8 实验小结](#3-8 实验小结)
    • 总结

1 环境模型

1-1 什么是环境模型
  • 在强化学习中,环境模型指智能体对环境如何变化的内部表示,它通常由两部分组成:
    • 动力学模型:描述在当前状态执行动作后环境转移到哪里,即状态转移规律
    • 奖励模型:描述这次转移带来多少即时奖励
  • 用马尔可夫决策过程的语言,真实环境由 P ( s t + 1 ∣ s t , a t ) P(s_{t+1}\mid s_t,a_t) P(st+1∣st,at) 与 R ( s t , a t ) R(s_t,a_t) R(st,at) 定义,环境模型是对这两个未知函数的估计:
    P ^ ϕ ( s t + 1 ∣ s t , a t ) , R ^ ψ ( s t , a t ) \hat{P}\phi(s{t+1}\mid s_t,a_t),\qquad \hat{R}_\psi(s_t,a_t) P^ϕ(st+1∣st,at),R^ψ(st,at)
  • 以防你忘记:
    • s t s_t st: t t t 时刻的状态
    • a t a_t at: t t t 时刻的动作
    • ϕ \phi ϕ、 ψ \psi ψ:两类模型的参数
  • 模型有两种实现形态:
    • 表格模型对每个 ( s , a ) (s,a) (s,a) 单独记录结果,只覆盖访问过的状态-动作对
    • 函数逼近模型(如神经网络)共享参数,能在未访问的区域泛化,代价是引入逼近误差
  • 动力学模型与奖励模型的难度并不对等:很多任务的奖励由状态与动作直接算出,例如到目标的距离、能量消耗、越界的惩罚,只有状态转移必须从数据中学习。因此多数模型式方法只学习动力学模型,奖励沿用已知函数

说人话:环境模型就是智能体自己写的一份操作说明书,查一下当前状态和动作,就知道下一步会到哪、能拿多少分

1-2 动力学模型
  • 确定性动力学模型给出唯一的下一状态,其中 f ϕ f_\phi fϕ 输出的是状态变化量:
    s ^ t + 1 = s t + f ϕ ( s t , a t ) \hat{s}{t+1}=s_t+f\phi(s_t,a_t) s^t+1=st+fϕ(st,at)
  • 概率动力学模型给出下一状态的概率分布,最常用的是对角高斯:
    p ϕ ( s t + 1 ∣ s t , a t ) = N ( s t + μ ϕ ( s t , a t ) , Σ ϕ ( s t , a t ) ) p_\phi(s_{t+1}\mid s_t,a_t)=\mathcal{N}\left(s_t+\mu_\phi(s_t,a_t),\Sigma_\phi(s_t,a_t)\right) pϕ(st+1∣st,at)=N(st+μϕ(st,at),Σϕ(st,at))
  • 之所以让网络输出状态变化量而不是 s t + 1 s_{t+1} st+1 本身,是因为相邻状态高度相关,直接预测会让网络把大量容量用于重建当前状态,而真正需要学的是变化的那一部分:
    Δ s t = s t + 1 − s t , Δ s t ∼ N ( μ ϕ ( s t , a t ) , Σ ϕ ( s t , a t ) ) \Delta s_t=s_{t+1}-s_t,\qquad \Delta s_t\sim\mathcal{N}\left(\mu_\phi(s_t,a_t),\Sigma_\phi(s_t,a_t)\right) Δst=st+1−st,Δst∼N(μϕ(st,at),Σϕ(st,at))
  • 后文统一用 f ϕ f_\phi fϕ 与 μ ϕ \mu_\phi μϕ 表示状态变化量的预测,下一状态由 s t s_t st 加上该变化量还原
  • 设状态维度为 d s d_s ds,对角形式下网络只需输出 μ ϕ ∈ R d s \mu_\phi\in\mathbb{R}^{d_s} μϕ∈Rds 与 σ ϕ 2 ∈ R d s \sigma_\phi^2\in\mathbb{R}^{d_s} σϕ2∈Rds,协方差矩阵取 d i a g ( σ ϕ 2 ) \mathrm{diag}(\sigma_\phi^2) diag(σϕ2)
    • 确定性模型可以看作概率模型在 Σ ϕ → 0 \Sigma_\phi\to 0 Σϕ→0 时的特例。概率模型多出的方差有两层用途:训练时表达数据中的噪声,规划时参与不确定性传播
  • 需要注意,模型输出的方差是模型对自身不确定程度的估计,并不必然等于真实误差。两者是否一致属于校准问题,只能通过实验检验

说人话:确定性动力学模型直接预测下一个状态是什么,而概率动力学模型预测下一个状态可能是什么,以及不同状态出现的概率有多大

1-3 如何学习动力学模型
  • 与环境的每次交互都会产生一条转移记录,累计得到训练集:
    D = { ( s i , a i , s i + 1 , r i ) } i = 1 N \mathcal{D}=\{(s_i,a_i,s_{i+1},r_i)\}_{i=1}^{N} D={(si,ai,si+1,ri)}i=1N
  • 记状态变化量为 Δ s i = s i + 1 − s i \Delta s_i=s_{i+1}-s_i Δsi=si+1−si,按 1-2 节的参数化,网络的监督目标就是它,而不是 s i + 1 s_{i+1} si+1 本身
  • 确定性模型用状态变化量的一步预测误差作为损失:
    L ( ϕ ) = 1 N ∑ i = 1 N ∥ Δ s i − f ϕ ( s i , a i ) ∥ 2 \mathcal{L}(\phi)=\frac{1}{N}\sum_{i=1}^{N}\left\|\Delta s_i-f_\phi(s_i,a_i)\right\|^2 L(ϕ)=N1i=1∑N∥Δsi−fϕ(si,ai)∥2
  • 概率模型用高斯负对数似然(Negative Log-Likelihood,NLL),目标值同样是状态变化量:
    L ( ϕ ) = 1 N ∑ i = 1 N ∑ d = 1 d s ( Δ s i , d − μ ϕ , d ) 2 2 σ ϕ , d 2 + 1 2 log ⁡ σ ϕ , d 2 \mathcal{L}(\phi)=\frac{1}{N}\sum_{i=1}^{N}\sum_{d=1}^{d_s}\left\\frac{(\\Delta s_{i,d}-\\mu_{\\phi,d})\^2}{2\\sigma_{\\phi,d}\^2}+\\frac{1}{2}\\log\\sigma_{\\phi,d}\^2\\right L(ϕ)=N1i=1∑Nd=1∑ds2σϕ,d2(Δsi,d−μϕ,d)2+21logσϕ,d2
  • 第一项要求均值贴近真实变化,第二项惩罚过大的方差。若只保留第一项,网络会把方差压向零,因为方差越小,第一项越小;对数项正是用来阻止这种退化
  • 对应的实现只有两行:
python 复制代码
def gaussian_nll(mean, logvar, target):
    # 对应 1-3 节的高斯负对数似然,logvar = log(sigma^2)
    # target 为状态变化量 s_{i+1} - s_i,与网络输出的均值同量纲
    inv_var = torch.exp(-logvar)
    return 0.5 * (logvar + (target - mean) ** 2 * inv_var).mean()
  • 一步误差小并不意味着模型可用。多步预测时,模型自己的输出会成为下一步的输入,误差沿时域累积,分布内的微小偏差也可能被放大
  • 一种缓解方式是直接用多步预测误差训练,但展开 k k k 步后计算图变长、梯度方差增大,训练也更容易不稳定。PETS 的选择是不改训练目标,而是把不确定性显式建模,并在规划阶段处理误差累积
1-4 从单步预测到轨迹预测
  • 前面我们已经介绍了如何通过真实环境的交互数据训练动力学模型,使其能够根据当前状态和动作预测下一时刻的状态
    • 但是,对于控制任务而言,只预测下一时刻的状态还不够。智能体需要考虑未来连续多个时刻的状态变化,才能判断一组动作是否值得执行。
  • 因此,我们可以将动力学模型反复应用,把单步预测扩展为多步预测,得到未来一段时间内的状态轨迹
  • 给定初始状态与动作序列 A = ( a t , ... , a t + H − 1 ) A=(a_t,\ldots,a_{t+H-1}) A=(at,...,at+H−1),把模型递推展开即可得到一条预测轨迹:
    s ^ t + k + 1 = s ^ t + k + f ϕ ( s ^ t + k , a t + k ) , k = 0 , ... , H − 1 \hat{s}{t+k+1}=\hat{s}{t+k}+f_\phi(\hat{s}{t+k},a{t+k}),\qquad k=0,\ldots,H-1 s^t+k+1=s^t+k+fϕ(s^t+k,at+k),k=0,...,H−1
  • 第 k k k 步的输入已经包含前 k k k 步的预测误差,因此误差大致随时域增长;误差的方向还会影响后续预测,形成复合偏差。这就是模型式方法最常见的失效来源
  • 用模型评估一条动作序列,就是沿预测轨迹累加奖励:
    J ^ ( A ) = ∑ k = 0 H − 1 γ k   R ^ ψ ( s ^ t + k , a t + k ) \hat{J}(A)=\sum_{k=0}^{H-1}\gamma^{k}\,\hat{R}\psi(\hat{s}{t+k},a_{t+k}) J^(A)=k=0∑H−1γkR^ψ(s^t+k,at+k)
  • 只有一个确定性模型时, J ^ ( A ) \hat{J}(A) J^(A) 是单点估计。模型在状态空间某些区域不可靠时,单点估计会给出过度自信的判断,规划器据此选出的动作可能在真实环境中表现很差
  • 概率模型与多个模型提供了另一种选择:不再只推演一条平均轨迹,而是采样多条可能的轨迹,用样本均值估计期望回报:
    J ^ ( A ) = 1 P ∑ p = 1 P ∑ k = 0 H − 1 γ k   R ^ ψ ( s ^ t + k ( p ) , a t + k ) \hat{J}(A)=\frac{1}{P}\sum_{p=1}^{P}\sum_{k=0}^{H-1}\gamma^{k}\,\hat{R}\psi\left(\hat{s}^{(p)}{t+k},a_{t+k}\right) J^(A)=P1p=1∑Pk=0∑H−1γkR^ψ(s^t+k(p),at+k)
  • 这样规划器看到的不只是"平均会发生什么",还包括"未来可能偏离多远"。第 2 章的轨迹采样正是围绕这一点设计的

2 PETS

2-1 介绍
  • PETS (Probabilistic Ensembles with Trajectory Sampling,概率集成与轨迹采样)由 Chua 等人在 2018 年提出,论文题为 Deep Reinforcement Learning in a Handful of Trials using Probabilistic Dynamics Models
  • 论文的出发点是:模型式方法样本效率高,但在使用深度网络作为模型时,渐近性能往往落后于最好的无模型算法。作者认为差距的一个重要来源是模型误差没有在规划中被显式处理
  • PETS 的应对方式是同时处理两类不确定性,并让不确定性沿预测时域传播:
    • 用概率神经网络集成(Probabilistic Ensemble,PE)描述模型自身的不确定性
    • 用轨迹采样(Trajectory Sampling,TS)把模型不确定传播到多步预测
    • 用交叉熵方法(Cross-Entropy Method,CEM)在模型中搜索动作序列,用模型预测控制(Model Predictive Control,MPC)滚动执行
  • 论文报告,在 Half-cheetah 任务上达到与无模型算法相当的渐近性能时,PETS 所需的交互样本约为 SAC(Soft Actor-Critic,软演员-评论家)所需的八分之一,约为 PPO(Proximal Policy Optimization,近端策略优化)所需的一百二十五分之一
  • 算法名称 PE-TS 也由此而来:模型端的关键设计是概率集成,传播端的关键设计是轨迹采样
2-2 整体架构
  • PETS 的一次完整运行可以概括为五个步骤:

    1. 用真实环境交互收集状态转移数据
    2. 在全部数据上训练概率动力学模型集成
    3. 在当前时刻用 CEM 生成候选动作序列
    4. 用轨迹采样在模型中推演每个候选序列,估计期望累计回报
    5. 执行最优序列的第一个动作,获得新状态后回到第 3 步
  • 与 Dyna 的差别在模型的使用方式。Dyna 把模型生成的转移送回价值更新,最终仍由 Q 表或策略网络输出动作;PETS 不训练策略网络,动作由每个决策时刻的规划直接给出

  • 由此带来两个性质:

    • 规划的计算量与决策频率相关,与训练样本量无关
    • 策略的信息保存在模型里,模型更新后策略随之改变,不需要额外的策略蒸馏步骤
  • 论文的结构图把模型端与传播端并列画出:左侧是模型端,多个 bootstrap 各自训练一个概率网络;右侧是传播端,粒子在每一步重新采样模型或沿轨迹固定模型;最右侧再把规划接上去

  • 图 1 给出论文中的方法示意图,三栏依次对应模型、传播与规划

  • 左栏是模型:两个 bootstrap 成员对同一段真实轨迹各给出一条均值曲线与一条方差带,数据密集处两条带收拢,数据稀疏处分开,分歧本身就是认知不确定性的可视化

  • 中栏是传播:粒子从同一个初始状态出发,按各自成员的分布逐层扩展,椭圆随步数增大,表示未来越远越不确定

  • 右栏是规划:CEM 在模型中评估大量动作序列,只有回报最高的一条被执行,而且只执行它的第一步

  • 这三栏也对应了后面三节的结构:2-3 节讨论模型,2-4 节讨论传播,2-5 节讨论规划

2-3 概率动力学模型集成(PE)
2-3-1 为什么使用概率模型
  • 普通的确定性模型只输出一个预测值:

    s ^ t + 1 = f θ ( s t , a t ) \hat{s}{t+1}=f\theta(s_t,a_t) s^t+1=fθ(st,at)

  • 概率模型则输出下一状态的概率分布。例如假设状态变化服从高斯分布:

    Δ s t ∼ N ( μ θ ( s t , a t ) , Σ θ ( s t , a t ) ) \Delta s_t \sim \mathcal{N}\left( \mu_\theta(s_t,a_t), \Sigma_\theta(s_t,a_t) \right) Δst∼N(μθ(st,at),Σθ(st,at))

  • 其中:

    • μ θ \mu_\theta μθ:预测的状态变化均值
    • Σ θ \Sigma_\theta Σθ:预测的不确定性,通常用对角协方差矩阵表示
    • Δ s t = s t + 1 − s t \Delta s_t=s_{t+1}-s_t Δst=st+1−st:状态变化量
  • 这里预测状态变化量而不是直接预测完整的下一状态,是一种常用的建模方式,有助于简化学习任务

  • 举个例子,模型预测机器人下一步向前移动:

    • 均值:向前 20 cm
    • 标准差:3 cm
  • 这意味着模型认为机器人下一步的位移大致集中在 20 cm 附近,但实际位移可能有所偏差。在高斯分布假设下,约 68% 的预测结果会落在 17~23 cm 之间
  • 图 2 给出这一预测对应的分布曲线:横轴是预测的位移,纵轴是概率密度
  • 这样的好处显然易见:

    • 确定性模型仅输出单一预测值,无法直接刻画预测结果的不确定性
    • 概率模型则通过预测均值与方差,分别描述状态变化的期望值及其分布的离散程度,从而表征状态转移的不确定性。
  • 在 PETS 中,这种不确定性信息会进一步用于轨迹采样与动作规划,使规划器能够综合考虑不同可能的未来状态及其对应的回报,降低因过度依赖单一预测轨迹而产生决策偏差的风险

  • 因此,概率动力学模型的价值不只是预测下一步状态,还在于将预测的不确定性带入后续的轨迹采样与动作规划中

2-3-2 多个模型
  • 单个概率神经网络通过预测均值与方差,能够描述给定状态和动作下的状态转移分布,但其输出方差主要反映模型所学习到的条件分布的不确定性,无法充分刻画因训练数据不足或模型认知有限而产生的不确定性
  • 为此,PETS 采用概率模型集成(Probabilistic Ensemble,PE),通过训练多个独立的概率动力学模型,利用不同模型之间的预测差异进一步刻画模型的不确定性。论文采用由 5 个成员组成的模型集成,各成员独立初始化并进行训练

需要注意的是,PETS 中的 PE 由五个网络结构相同、但参数相互独立的 MLP 组成。每个网络都有自己独立的权重和偏置,用于学习动力学模型。

  • 每个成员在自己的 Bootstrap(自助采样) 样本上训练,即在 N N N 条转移中有放回地抽取 N N N 条。不同成员看到的样本不同,因此在数据稀疏的区域会给出不同预测,这种分歧就是认知不确定性的来源

    • Bootstrap是一种统计重采样方法,其核心思想是从原始数据集中进行有放回抽样,构造多个重采样数据集,以此估计统计量的不确定性,或为多个模型提供不同的训练数据
  • 图 3 给出论文附录中的拟合实验(Figure A.5),用一维函数直观说明成员之间的分歧从何而来

    • 黑线是真实函数,绿色叉号是带观测噪声的训练数据,红线与蓝线是两个 bootstrap 成员各自的均值预测,同色阴影是该成员自报的 ± 1 σ \pm1\sigma ±1σ 区间
    • 数据附近,两条均值曲线基本重合,阴影也随之收窄:成员看到的是同一批样本,对条件分布的判断一致,此时阴影的宽度主要反映观测噪声
    • 远离数据处,两条曲线分离,阴影同时变宽:成员各自的训练集不同,外推结果不同,这种成员之间的分歧就是认知不确定性
    • 论文为图面清晰只画了两个成员,实际使用五个;成员越多,分歧的估计越稳定,但计算量也按成员数线性增长
  • 由此可以看出 PE 的两层含义:P 指每个成员输出概率分布,用成员内的方差表达偶然不确定性;E 指多个成员构成集成,用成员之间的分歧表达认知不确定性

  • 集成主要帮助区分两种不确定性:

不确定性 英文 直观理解 估计方式
偶然不确定性 Aleatoric uncertainty 环境本身具有随机性,例如地面摩擦变化 成员内部的预测方差
认知不确定性 Epistemic uncertainty 数据不足导致模型之间对结果意见不一致 成员预测之间的分歧
  • 论文用一张表归纳了各类动力学模型能够表达哪一类不确定性,结论是只有概率集成同时覆盖两者

  • 确定性网络两者皆无;概率网络的方差来自条件分布,只覆盖偶然不确定性;确定性集成靠成员分歧表达认知不确定性,却没有办法表示环境噪声;高斯过程需要同方差假设,同样受限

  • 集成预测的均值与总方差可以写成: μ ∗ = 1 M ∑ m = 1 M μ m , σ ∗ 2 = 1 M ∑ m = 1 M σ m 2 + 1 M ∑ m = 1 M ( μ m − μ ∗ ) 2 \mu_*=\frac{1}{M}\sum_{m=1}^{M}\mu_m,\qquad \sigma_*^2=\frac{1}{M}\sum_{m=1}^{M}\sigma_m^2+\frac{1}{M}\sum_{m=1}^{M}\left(\mu_m-\mu_*\right)^2 μ∗=M1m=1∑Mμm,σ∗2=M1m=1∑Mσm2+M1m=1∑M(μm−μ∗)2其中:

    • 第一项是成员内方差的平均,对应偶然不确定性
    • 第二项是成员均值的方差,对应认知不确定性。在数据密集处第二项趋于零,在数据稀疏处它主导总方差
  • 训练目标为每个成员的高斯 NLL(Gaussian Negative Log-Likelihood,高斯负对数似然)。为防止方差在训练中发散,log 方差被压进一个固定区间:

    log ⁡ σ 2 ← log ⁡ σ max ⁡ 2 − softplus ⁡ ( log ⁡ σ max ⁡ 2 − log ⁡ σ 2 ) \log\sigma^2\leftarrow \log\sigma^2_{\max}-\operatorname{softplus}\left(\log\sigma^2_{\max}-\log\sigma^2\right) logσ2←logσmax2−softplus(logσmax2−logσ2)

    log ⁡ σ 2 ← log ⁡ σ min ⁡ 2 + softplus ⁡ ( log ⁡ σ 2 − log ⁡ σ min ⁡ 2 ) \log\sigma^2\leftarrow \log\sigma^2_{\min}+\operatorname{softplus}\left(\log\sigma^2-\log\sigma^2_{\min}\right) logσ2←logσmin2+softplus(logσ2−logσmin2)

  • 第一步把过大的 log 方差压回上界,第二步把过小的值抬回下界,中间区域近似恒等映射。softplus 的平滑性保证了边界处的梯度不会突然消失

  • 代码实现上,所有成员共享一套参数张量,第一个维度是成员编号,一次前向即可算完整个集成:

python 复制代码
class EnsembleMLP(nn.Module):
    def forward(self, x):
        h = x
        last = len(self.weights) - 1
        for i, (w, b) in enumerate(zip(self.weights, self.biases)):
            h = h @ w + b
            if i < last:
                h = F.silu(h)
        mean, raw_logvar = h.chunk(2, dim=-1)
        # 软边界:把 log 方差压进 [min_logvar, max_logvar]
        logvar = self.max_logvar - F.softplus(self.max_logvar - raw_logvar)
        logvar = self.min_logvar + F.softplus(logvar - self.min_logvar)
        return mean, logvar
  • 权重张量的形状为 [M, in, out],输入先复制到成员维,再与权重做批量矩阵乘法;这样 5 个成员的训练与前向都在同一次核函数调用中完成
  • 训练循环为每个成员采样各自的下标,并逐成员记录验证误差:
python 复制代码
boot = rng.integers(0, N, size=(M, N))          # 每个成员一套有放回的样本
for epoch in range(max_epochs):
    # 每个 epoch 重新打乱行内顺序,bootstrap 集合本身不变
    boot = boot.gather(1, torch.argsort(torch.rand(M, N), dim=1))
    for start in range(0, N, batch):
        idx = boot[:, start:start + batch]
        mean, logvar = self.net(xt[idx])
        loss = nll_loss(mean, logvar, yt[idx])
        opt.zero_grad(set_to_none=True)
        loss.backward()
        opt.step()
  • 每个成员独立早停:验证误差连续若干轮不再下降时,恢复该成员自己的最佳权重。因此各成员最终训练轮数可以不同,这一点与普通集成做法一致

说人话:五个模型各自看过一批略有差异的数据。数据多的地方大家意见一致,数据少的地方各说各话,这种分歧就是模型在说"这里我不确定"

2-4 轨迹采样(Trajectory Sampling)
2-4-1 介绍
  • 有了概率模型,下一步要解决如何预测未来
  • 假设机器人在当前状态 s t s_t st,现在有三组候选动作序列: A ( i ) = ( a t ( i ) , a t + 1 ( i ) , ... , a t + H − 1 ( i ) ) A^{(i)}=(a_t^{(i)},a_{t+1}^{(i)},\ldots,a_{t+H-1}^{(i)}) A(i)=(at(i),at+1(i),...,at+H−1(i))其中 H H H 是规划时域
  • 对于每组动作序列,PETS 都可以利用动力学模型向前模拟 H H H 步,得到一条预测轨迹
  • 但由于模型存在不确定性,同一组动作序列不应该只预测一次。PETS 通过采样生成多个可能的未来轨迹,也可以理解为多个假想世界。每条这样的轨迹称为一个粒子(particle),每一步的状态变化从选中成员的高斯分布中抽取:
    s ^ t + k + 1 = s ^ t + k + Δ s , Δ s ∼ N ( μ m , diag ⁡ ( σ m 2 ) ) \hat{s}{t+k+1}=\hat{s}{t+k}+\Delta s,\qquad \Delta s\sim\mathcal{N}\left(\mu_m,\operatorname{diag}(\sigma_m^2)\right) s^t+k+1=s^t+k+Δs,Δs∼N(μm,diag(σm2))
  • 粒子数与候选序列数相乘,构成一次规划的主要计算量。论文与官方实现取 20 个粒子
  • 期望回报随之用粒子平均近似:
    J ^ ( A ) = 1 P ∑ p = 1 P ∑ k = 0 H − 1 γ k   R ^ ψ ( s ^ t + k ( p ) , a t + k ) \hat{J}(A)=\frac{1}{P}\sum_{p=1}^{P}\sum_{k=0}^{H-1}\gamma^{k}\,\hat{R}\psi\left(\hat{s}^{(p)}{t+k},a_{t+k}\right) J^(A)=P1p=1∑Pk=0∑H−1γkR^ψ(s^t+k(p),at+k)
  • 粒子平均代替了对状态分布的积分,其精度随粒子数增加而提高,代价是计算量线性增长

说人话:PETS 不会只根据模型预测的一条未来轨迹来评价动作序列,而是通过多次采样,模拟同一组动作可能产生的多种未来。然后计算这些轨迹的平均回报,以此估计这组动作的长期表现,降低单次预测结果带来的偶然性。

2-4-2 TS1 与 TS∞
  • 原论文研究了两种轨迹采样方式:
    • TS1:在每个时间步重新采样使用哪个集成模型
    • TS∞:每条粒子轨迹开始时选择一个集成模型,后续整条轨迹都使用这个模型
  • 两者的区别在于,模型集成中的模型身份是否沿着整条轨迹保持一致。TS∞ 可以更连贯地体现不同动力学模型对未来的不同判断,TS1 的粒子则更像是在每一步重新掷骰子

说人话:TS1 就像机器人每走一步,都重新随机选一个"预测专家"来判断下一步会发生什么;TS∞ 则是每条轨迹一开始就选定一个专家,之后一直听这个专家的预测直到轨迹结束。

  • 实现里,粒子编号对成员数取模,保证各成员被均匀使用;每一步先取出被选中成员的均值与方差,再采样状态变化:
python 复制代码
if mode == "tsinf":
    member_idx = torch.arange(B * P, device=device) % M
elif mode == "member":
    member_idx = torch.zeros(B * P, dtype=torch.long, device=device)

for t in range(H):
    a = actions[:, t].unsqueeze(1).expand(B, P, 1).reshape(B * P, 1)
    x = torch.cat([s, a], dim=-1)
    mean, logvar = model.predict_norm(model.normalize_x(x))   # [M, N, 3]
    if mode == "ts1":
        idx = torch.randint(0, M, (B * P,), device=device)
    else:
        idx = member_idx
    rows = torch.arange(B * P, device=device)
    mu = mean[idx, rows]
    sd = torch.exp(0.5 * logvar[idx, rows])
    delta = mu + sd * torch.randn_like(mu)
    s = s + model.denormalize_delta(delta)
  • 论文还对比了不做采样的传播方式,即只按集成均值推演。它计算量最小,但把模型不确定完全忽略,在模型不可靠的区域容易产生过度自信的规划
  • 需要说明的是,这种差别是否显现取决于模型本身的可信度:当模型在规划区域内足够准确时,均值推演与采样的结论可能完全一致,第 3 章会给出这种情形
2-5 MPC 与 CEM,如何选出动作?
2-5-1 介绍
  • PETS 在学到概率动力学模型后,需要进一步解决如何利用模型选择动作的问题。它采用模型预测控制(Model Predictive Control,MPC),通过预测未来一段时间内的状态变化,选择当前要执行的动作。
    • 对 PETS 而言,动力学模型具有不确定性,因此评估动作序列时,还需要通过轨迹采样估计其期望回报。
  • 但连续动作空间中,一条 H H H 步动作序列的维度为 H × d a H\times d_a H×da,直接穷举不可行。因此,PETS 使用交叉熵方法(CEM)在动作序列空间中搜索较优解。

说人话:有了动力学模型,我们就能预测不同动作序列可能带来的结果。MPC 负责根据预测结果规划未来一段时间的动作,但最终只执行第一个动作。由于连续动作空间中的候选序列数量巨大,难以直接穷举搜索,因此 PETS 借助 CEM,通过反复采样、筛选和更新采样分布,逐步找到表现较好的动作序列。

2-5-2 模型预测控制(MPC)
  • MPC 是一种滚动时域控制方法。它不是一次性规划好整个任务后就不再改变,而是反复预测未来、执行当前动作,再根据最新状态重新规划
  • 对一组候选动作序列,可以计算其预测累计回报: J ( A ) = E ∑ k = 0 H − 1 γ k r ( s t + k , a t + k ) J(A)=\mathbb{E}\left \\sum_{k=0}\^{H-1}\\gamma\^k r(s_{t+k},a_{t+k}) \\right J(A)=Ek=0∑H−1γkr(st+k,at+k)其中:
    • H H H:规划时域
    • γ \gamma γ:折扣因子
    • r ( s , a ) r(s,a) r(s,a):奖励函数
    • 期望值:考虑模型预测及轨迹采样中的不确定性
  • 求解得到最优序列 A ∗ A^* A∗ 后,只执行第一个动作 a t ∗ a_t^* at∗,丢弃其余动作;下一步在新状态上重新求解:
    A ∗ = arg ⁡ max ⁡ A ( i ) ,   i = 1 , ... , N J ^ ( A ( i ) ) , A ∗ = ( a t ∗ , a t + 1 ∗ , ... , a t + H − 1 ∗ ) A^*=\arg\max_{A^{(i)},\,i=1,\ldots,N}\ \hat{J}\left(A^{(i)}\right),\qquad A^*=\left(a_t^*,a_{t+1}^*,\ldots,a_{t+H-1}^*\right) A∗=argA(i),i=1,...,Nmax J^(A(i)),A∗=(at∗,at+1∗,...,at+H−1∗)
  • 只执行第一个动作的理由是:后续动作是在旧状态上规划的,新状态到来后它们已不再最优。滚动重规划每一步都获取真实状态重新起算,避免把旧状态下规划的整段动作开环执行,从而抑制预测误差的持续累积
  • 但这不等于误差被消除:规划器在每一步仍要借助模型推演未来 H H H 步,模型误差依然会影响候选序列的评估与最终的动作选择,只是不再有机会沿整段开环轨迹连续放大
  • 为了减少每步优化的开销,通常把上一次的解左移一位作为下一次的初值,即热启动(warm start)
  • 控制器的代价函数与动作执行可以写成(具体代价项由任务定义,这里只保留聚合方式):
python 复制代码
def cost_fn(samples):
    actions = samples.reshape(-1, horizon, action_dim)
    states0 = state.expand(actions.shape[0], state_dim)
    traj = rollout(model, states0, actions, mode=mode, n_particles=n_particles)
    state_cost = cost_state(traj)        # [C, P, H],状态偏离目标的代价
    action_cost = cost_action(actions)   # [C, H, d_a],动作幅度的代价
    # 对粒子取均值,对时域求和;CEM 最小化该值
    return state_cost.sum(dim=2).mean(dim=1) + action_cost.sum(dim=(1, 2))
  • 规划完成后只取解向量的第一个动作,其余丢弃:
python 复制代码
def act(self, state):
    sol, _ = self.plan(state)      # CEM 求解 H 步序列
    return sol[:self.action_dim]   # 只执行第一个动作
2-5-3 交叉熵方法(CEM)
  • 交叉熵方法(Cross-Entropy Method,CEM)是一种基于随机采样的无梯度优化方法,通过反复采样候选解、筛选精英样本并更新采样分布,逐步搜索高回报的解。
    • 在 PETS 中,CEM 用于优化连续动作空间中的动作序列。对于规划时域为 H H H、动作维度为 d a d_a da 的控制任务,待优化的动作序列可表示为一个 H × d a H\times d_a H×da 维向量。CEM 不直接对该向量进行梯度优化,而是通过参数化的概率分布生成候选动作序列。
  • 它的基本过程是:
    1. 初始化动作序列的采样分布,例如给未来各时刻的动作设置均值和方差
    2. 从这个分布中采样大量候选动作序列
    3. 使用概率动力学模型和轨迹采样,估计每组动作序列的累计回报
    4. 选出回报最高的一批序列,也就是精英样本
    5. 根据精英样本更新动作分布,再重复采样和评估

说人话:CEM 就是先撒一大把候选动作序列,利用模型预测每组动作执行后的状态,并根据奖励计算累计回报,挑出回报最高的几个,再把下一轮的采样范围往这些好样本附近收缩,如此重复几轮,最终找到一组累计回报较高的动作序列。

  • 在这个过程中,CEM 会根据精英样本调整采样分布的均值和方差,让下一轮采样更集中于累计回报较高的动作序列附近。
  • 采样分布取"截断正态",即采样值限制在均值 ± 2 σ \pm2\sigma ±2σ 内,同时方差还受动作边界约束:
    σ j 2 ← min ⁡ ( σ j 2 , ( μ j − l j 2 ) 2 , ( u j − μ j 2 ) 2 ) \sigma_j^2\leftarrow \min\left(\sigma_j^2,\left(\frac{\mu_j-l_j}{2}\right)^2,\left(\frac{u_j-\mu_j}{2}\right)^2\right) σj2←min(σj2,(2μj−lj)2,(2uj−μj)2)
  • 其中 l j l_j lj、 u j u_j uj 是第 j j j 个动作维度的下界与上界。约束的作用是防止分布在靠近边界时把大量样本采到界外,导致有效样本数骤减
  • 需要说明实现与理论分布的差别:代码并不是用拒绝采样等方式生成严格的截断正态,而是从标准正态采样后把标准化采样值裁剪到 − 2 , 2 -2,2 −2,2 再缩放平移。两者在端点附近的概率质量并不相同,这里的做法只是工程近似,好处是采样开销固定、不会因拒绝而波动
  • 设精英集合为 E \mathcal{E} E,其均值为 μ ˉ E \bar{\mu}{\mathcal{E}} μˉE、方差为 σ ˉ E 2 \bar{\sigma}^2{\mathcal{E}} σˉE2,更新规则为:
    μ ← α μ + ( 1 − α ) μ ˉ E , σ 2 ← α σ 2 + ( 1 − α ) σ ˉ E 2 \mu\leftarrow\alpha\mu+(1-\alpha)\bar{\mu}{\mathcal{E}},\qquad \sigma^2\leftarrow\alpha\sigma^2+(1-\alpha)\bar{\sigma}^2{\mathcal{E}} μ←αμ+(1−α)μˉE,σ2←ασ2+(1−α)σˉE2
  • α \alpha α 控制新旧分布的混合比例,取 0.1 时新分布主要跟随精英,但保留少量历史信息,避免过早收缩到局部
  • 一次规划结束后返回的不是最终均值,而是迭代过程中见过的最优样本:均值可能落在两条好序列之间,而 CEM 实际评估的是离散样本
  • 对应代码如下,省略了初始化与 NaN 保护:
python 复制代码
for _ in range(self.max_iters):
    # 方差受动作边界约束
    constrained_var = torch.minimum(
        torch.minimum(((mean - lb) / 2.0) ** 2, ((ub - mean) / 2.0) ** 2), var)
    eps = torch.randn(popsize, sol_dim, device=device)
    eps.clamp_(-2.0, 2.0)                      # 裁剪到 ±2σ,近似截断正态
    samples = (mean + eps * torch.sqrt(constrained_var)).clamp(lb, ub)

    costs = cost_fn(samples)
    values, indices = torch.topk(costs, num_elites, largest=False)
    if values[0] < best_cost:                  # 记录历史最优样本
        best_cost, best_sol = values[0], samples[indices[0]].clone()

    elites = samples[indices]
    mean = alpha * mean + (1.0 - alpha) * elites.mean(dim=0)
    var = alpha * var + (1.0 - alpha) * elites.var(dim=0, unbiased=False)
  • 为什么叫交叉熵方法:每一轮用精英样本的经验分布去逼近"好解"的真实分布,两个分布之间的差异用交叉熵度量,最小化交叉熵等价于让采样分布逐步集中到高回报区域
  • 这样就能避免对连续动作空间中所有可能的未来动作序列进行穷举,从而通过迭代采样与筛选,为 MPC 寻找较优的动作序列。
2-5-4 为什么不需要单独训练策略网络
  • 我们看看分工:
    • PE 负责预测未来:训练概率动力学模型集成(PE),使其能够根据当前状态 s t s_t st 和动作 a t a_t at,预测下一时刻的状态 s t + 1 s_{t+1} st+1 及其不确定性。
    • CEM 负责搜索较优动作:利用 PE 预测候选动作序列对应的未来状态,并根据奖励函数计算累计回报。CEM 根据精英样本调整采样分布,逐步搜索累计回报较高的动作序列,供 MPC 执行。
    • MPC 负责闭环控制:每次只执行选定动作序列中的第一个动作 a t a_t at,随后获取真实环境的新状态,再重新规划下一步动作。
  • 因此,PETS 在训练阶段主要需要训练 PE,而不需要额外训练一个独立的策略网络。它通过在线规划直接求解当前状态下的动作,而不是通过训练好的策略网络直接输出动作。

说人话:PE 负责预测,CEM 负责挑选高回报的动作序列,MPC 负责执行并重新规划。三者配合起来,就能在不单独训练策略网络的情况下实现控制。不过,搜索到的是当前模型和计算预算下的较优解,不保证全局最优。

2-6 PETS 的完整训练与决策流程
  • 把上述模块串起来,可以得到下面的完整流程:

#mermaid-svg-5c9j3rSX6o1hoIxH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5c9j3rSX6o1hoIxH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5c9j3rSX6o1hoIxH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5c9j3rSX6o1hoIxH .error-icon{fill:#552222;}#mermaid-svg-5c9j3rSX6o1hoIxH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5c9j3rSX6o1hoIxH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5c9j3rSX6o1hoIxH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5c9j3rSX6o1hoIxH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5c9j3rSX6o1hoIxH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5c9j3rSX6o1hoIxH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5c9j3rSX6o1hoIxH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5c9j3rSX6o1hoIxH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5c9j3rSX6o1hoIxH .marker.cross{stroke:#333333;}#mermaid-svg-5c9j3rSX6o1hoIxH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5c9j3rSX6o1hoIxH p{margin:0;}#mermaid-svg-5c9j3rSX6o1hoIxH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5c9j3rSX6o1hoIxH .cluster-label text{fill:#333;}#mermaid-svg-5c9j3rSX6o1hoIxH .cluster-label span{color:#333;}#mermaid-svg-5c9j3rSX6o1hoIxH .cluster-label span p{background-color:transparent;}#mermaid-svg-5c9j3rSX6o1hoIxH .label text,#mermaid-svg-5c9j3rSX6o1hoIxH span{fill:#333;color:#333;}#mermaid-svg-5c9j3rSX6o1hoIxH .node rect,#mermaid-svg-5c9j3rSX6o1hoIxH .node circle,#mermaid-svg-5c9j3rSX6o1hoIxH .node ellipse,#mermaid-svg-5c9j3rSX6o1hoIxH .node polygon,#mermaid-svg-5c9j3rSX6o1hoIxH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5c9j3rSX6o1hoIxH .rough-node .label text,#mermaid-svg-5c9j3rSX6o1hoIxH .node .label text,#mermaid-svg-5c9j3rSX6o1hoIxH .image-shape .label,#mermaid-svg-5c9j3rSX6o1hoIxH .icon-shape .label{text-anchor:middle;}#mermaid-svg-5c9j3rSX6o1hoIxH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5c9j3rSX6o1hoIxH .rough-node .label,#mermaid-svg-5c9j3rSX6o1hoIxH .node .label,#mermaid-svg-5c9j3rSX6o1hoIxH .image-shape .label,#mermaid-svg-5c9j3rSX6o1hoIxH .icon-shape .label{text-align:center;}#mermaid-svg-5c9j3rSX6o1hoIxH .node.clickable{cursor:pointer;}#mermaid-svg-5c9j3rSX6o1hoIxH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5c9j3rSX6o1hoIxH .arrowheadPath{fill:#333333;}#mermaid-svg-5c9j3rSX6o1hoIxH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5c9j3rSX6o1hoIxH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5c9j3rSX6o1hoIxH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5c9j3rSX6o1hoIxH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5c9j3rSX6o1hoIxH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5c9j3rSX6o1hoIxH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5c9j3rSX6o1hoIxH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5c9j3rSX6o1hoIxH .cluster text{fill:#333;}#mermaid-svg-5c9j3rSX6o1hoIxH .cluster span{color:#333;}#mermaid-svg-5c9j3rSX6o1hoIxH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5c9j3rSX6o1hoIxH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5c9j3rSX6o1hoIxH rect.text{fill:none;stroke-width:0;}#mermaid-svg-5c9j3rSX6o1hoIxH .icon-shape,#mermaid-svg-5c9j3rSX6o1hoIxH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5c9j3rSX6o1hoIxH .icon-shape p,#mermaid-svg-5c9j3rSX6o1hoIxH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5c9j3rSX6o1hoIxH .icon-shape .label rect,#mermaid-svg-5c9j3rSX6o1hoIxH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5c9j3rSX6o1hoIxH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5c9j3rSX6o1hoIxH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5c9j3rSX6o1hoIxH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
是
否
是
否
与真实环境交互
收集数据 (s_t, a_t, s_{t+1}, r_t)
训练概率动力学模型集成 PE
获取当前真实状态 s_t
CEM 采样候选动作序列
概率动力学模型预测未来状态
根据预测状态与动作计算奖励 r_t
评估轨迹累计回报
达到规划迭代次数?
选择累计回报较高的动作序列
仅执行第一个动作 a_t
获取真实新状态 s_{t+1}
将新交互数据加入数据集
需要重新训练模型?
继续控制?
结束

  • 模型更新与决策是两个不同频率的过程。 每执行一个动作,PETS 就会获取新的真实状态并重新规划;但概率动力学模型不必每一步都重新训练,通常可以在积累一定数量的新数据后再更新。新数据持续补充到训练集中,使模型能够逐步适应环境动力学。
  • 训练与规划的计算开销也有所不同。 模型训练的开销与训练数据量、模型规模等因素有关;在线规划的开销则与候选动作序列数量、规划迭代次数、规划时域及轨迹采样粒子数等因素有关。因此,实际控制中需要在模型精度、规划效果和计算预算之间进行权衡。
2-7 与无模型强化学习(MFRL)的对比
  • 论文在 Cartpole、7-DOF Pusher、7-DOF Reacher 与 Half-cheetah 四个任务上,将 PETS 与 MFRL(Model-Free Reinforcement Learning,无模型强化学习)中的典型算法 PPO、DDPG(Deep Deterministic Policy Gradient,深度确定性策略梯度)与 SAC 做了比较,同时对照了多种基于高斯过程(Gaussian Process,GP)的模型式算法

  • 作者报告,PETS 在 Half-cheetah 上达到相近表现时,所需环境交互样本约为 SAC 的八分之一、PPO 的一百二十五分之一

  • 图 4 给出论文中的学习曲线

  • 从曲线可以看到三点趋势:

    • Pusher 与 Reacher 上,PETS 在几千步内进入平台,且平台高度高于其余全部方法;Reacher 上只有 PETS 与 GP 变体脱离负回报区间,DDPG 停在较低水平
    • Cartpole 上 GP 变体与 PETS 接近,绿色曲线(GP-E)的上升甚至略快:该任务状态维度低、动态平滑,GP 的先验正好合适
    • Half-cheetah 上 PETS 在四十万步内持续上升,同预算下 SAC 收敛在它的一半左右,DDPG 更低;横轴量级也远大于其余三个任务,说明高维连续控制的样本效率差距最大
  • 论文同时指出,模型的选择比不确定性传播方式更重要:在模型、传播方式两组消融中,把确定性模型换成概率模型带来的性能差距,大于 TS1 与 TS∞ 之间的差距

  • 这一点解释了 PETS 的设计重点:先保证模型能在数据稀疏处表达不确定,再讨论如何把这种不确定传播到多步


3 实验

3-1 介绍
  • 由于论文已经做了与无模型算法的对比,本文不再重复大规模基准,而是用一个低维连续控制任务把算法逐层拆开检查:模型准不准、不确定性有没有意义、规划器靠什么起作用

  • 环境只用 Pendulum-v1 :状态为 cos ⁡ θ , sin ⁡ θ , θ ˙ \\cos\\theta,\\sin\\theta,\\dot\\theta cosθ,sinθ,θ˙,动作为一维力矩,奖励由角度偏差、角速度与力矩幅度共同决定,回合长度固定

  • 实验数据全部由随机策略采集,训练集、验证集与测试集的回合互不重叠;模型与规划器均为本文用 PyTorch 重写,官方仓库的 TensorFlow 实现只作为对照参考

  • 六个实验分别检查算法的不同层次:

实验 检查对象 主要问题
实验一 单步预测 模型能否复现真实环境的一步转移
实验二 多步预测 误差如何随预测时域累积
实验三 数据量 多少数据足以让模型可用
实验四 不确定性 两类不确定性是否可分离、是否可信
实验五 闭环控制 模型加规划能否在少量真实交互内学会控制
实验六 规划器 时域、传播方式与滚动执行各自贡献多少
  • 与论文的设置相比,本文缩小了网络宽度与 CEM 规模,以适应低维状态;这些差异不影响各模块的作用机制
3-2 实验一:单步预测与真实环境
  • 实验内容:在每个真实转移上比较模型的一步预测与环境的真实下一状态,检查模型对状态变化的拟合程度,以及模型自报的不确定性是否合理

  • 实验实现:预测时始终把环境的真实状态输入模型,即采用教师强制(teacher forcing),避免误差累积干扰单步评估

  • 图 5 给出角度、角速度两条时间序列,以及对应的预测残差与模型自报的 ± 1 σ \pm1\sigma ±1σ 带

  • 结果分析:两条曲线在整个回合内几乎完全重合,残差在零附近小幅波动,量级远小于模型自报的标准差带

  • 这说明模型在训练分布内的一步预测已经足够精确,同时它的不确定性估计偏保守:模型给出的误差范围比实际误差更宽

结论:单步精度不是瓶颈,模型在这一层已经可用;真正的问题出现在把预测串起来的时候

3-3 实验二:多步预测与误差累积
  • 实验内容:固定起点与动作序列,让模型开环推演若干步,比较不同预测时域下的误差,并对照"状态不变"这一朴素基线

  • 实验实现:从测试集中抽取大量起点,分别用单成员均值、集成均值、TS1 与 TS∞ 推演;误差同时统计角度与角速度两个维度

  • 图 6 给出误差随预测时域的变化,横轴为开环推演的时间,纵轴为状态误差,两栏分别对应角度与角速度

  • 结果分析:无变化基线的误差在很短的时域内就升到饱和,之后基本不再变化;模型误差同样随时域增长,但增长更慢,在最长时域上仍明显低于基线

  • 误差随时间持续增长,这正是 1-4 节所述的复合偏差:当前步的误差进入下一步的输入,误差被再次放大

结论:多步预测的精度由单步精度与误差累积共同决定,概率模型能减缓累积,但不能消除它;规划时域越长,模型越不可靠

3-4 实验三:训练数据量对预测误差的影响
  • 实验内容:固定模型结构与训练轮数,只改变训练转移数量,观察单步与多步误差如何变化,并分别统计两类不确定性
  • 实验实现:从同一份数据中按固定置换取嵌套子集,保证不同数据量的训练集彼此包含,使对比只改变数据量这一个变量
  • 以防你不知道:
    • RMSE(Root Mean Squared Error,均方根误差),用于衡量模型预测值与真实值之间的误差大小。这里用它评估概率动力学模型 PE 对下一时刻状态的预测精度。公式为: R M S E = 1 N ∑ i = 1 N ( y ^ i − y i ) 2 \mathrm{RMSE}=\sqrt{\frac{1}{N}\sum_{i=1}^{N}(\hat y_i-y_i)^2} RMSE=N1i=1∑N(y^i−yi)2 其中:
      • N N N:样本数量。
      • y ^ i \hat y_i y^i:模型预测值。
      • y i y_i yi:真实值。

说人话: 计算每个预测值与真实值的差,平方后求平均,再开平方,就得到 RMSE。数值越小,通常说明预测越准确。

  • 图 7 给出单步与多步误差随数据量的变化,以及两类不确定性的同步变化

  • 结果分析:单步误差随数据量增加而下降,在中等数据量附近出现明显拐点,之后下降趋缓;多步误差的下降更陡,说明误差累积对数据量更敏感

  • 两类不确定性随数据量同步下降,但形态不同:

    • 认知不确定性(epistemic)在数据很少时先略有上升,说明少量数据反而放大了成员之间的差异,数据充足后才收敛到较低水平;
    • 偶然不确定性(aleatoric)则平稳下降,最后停在地板附近
  • 这一趋势与设计假设一致:认知不确定性依赖数据覆盖,因此适合作为规划时的"未知区域"信号;偶然不确定性由环境噪声决定,只有在真正随机的环境中才会形成一个不可消除的地板。本实验的环境是确定性的,因此后者也会随数据量下降,只是形态更平稳

结论:数据量的收益在中等规模区间最明显;当误差进入平台后,继续增加随机数据不如提高数据覆盖度

3-5 实验四:两类不确定性的作用与校准
  • 实验内容:分别训练一个只用低角速度数据训练的受限模型与一个使用全部数据的模型,比较它们在状态空间网格上的认知不确定性与真实误差,并检验模型给出的预测标准差是否与实测误差相称

  • 实验实现:受限模型只保留角速度绝对值不超过 3 rad/s 的转移,全数据模型使用同一批随机数据;两者在角度与角速度构成的网格上逐点做零力矩的一步预测,用成员之间的分歧估计认知不确定性;校准实验在留出数据上按预测的总标准差(认知与偶然两项合成)分箱,比较分箱内的平均预测标准差与实测 RMSE

  • 图 8 由四个面板组成,上排是两张认知不确定性地图,下排是散点检验与校准曲线

  • 这一节图不好读,我们分开说明

3-5-1 认知不确定性地图
  • 面板 a 与面板 b 是"认知不确定性地图",横轴为角度、纵轴为角速度,颜色表示该状态下五个成员一步预测的角度分歧,色标取对数,颜色越亮表示分歧越大
    • 面板 a 是受限模型,白色散点是它见过的训练样本,两条白色虚线是 ±3 rad/s 的支撑边界;边界以内颜色很暗,说明成员意见一致,越出边界后迅速转黄转绿,最大分歧约 1.4°
    • 面板 b 是全数据模型,因为见过更多状态,整张图都偏暗,最大分歧降到约 1°;残余的不确定性集中在高角速度两端,那里随机策略采样得少,成员分歧比中心高出约一个数量级,但绝对值仍在 1° 以内

说人话:数据受限的模型在没见过的数据类型分歧最大(图中亮色的部分,见图a)

3-5-2 认知不确定性与预测误差的散点图
  • 面板 c 回答另一个问题:模型之间意见不一致的地方(即受限模型),实际预测误差是不是也更大

    • 横轴是受限模型在网格上的预测分歧,即认知不确定性,纵轴是集成均值与真实下一时刻状态之间的角度误差,两轴都取对数,颜色表示该点的角速度
    • 左下角分布比较散:模型分歧和真实误差都比较小,但两者之间不一定存在严格的数值对应关系。即使分歧只发生微小变化,误差也可能有不同程度的变化,因此点会比较分散。
    • 右上角分布比较密集:在高角速度、训练数据稀疏的区域,模型分歧和真实误差通常都比较大,许多状态都集中在这一区域。

说人话:误差大(纵轴靠上)的都是没见过的角度(横轴靠右边),也就是模型预测误差越大的地方,通常模型之间的分歧也越大,说明这些状态可能是训练时没怎么见过、模型还没学明白的区域。

3-5-3 校准检验
  • 面板 d 是校准检验:把留出数据按预测的总标准差分箱,比较每箱的平均预测标准差与实测 RMSE,虚线为 y = x y=x y=x
    • 绝大多数点落在对角线下方,即预测标准差大于对应的实测 RMSE,模型倾向于高估自身误差
    • 这与两边的统计口径不同有关:预测标准差是单个成员给出的,而实测 RMSE 衡量的是集成均值的误差;五个成员的误差在取均值时部分抵消,均值自然比单个成员准,而标准差并没有体现这层受益
    • 只有最右端一箱略高于对角线,对应数据最稀疏、误差最大的样本,模型在这些点上的悲观程度仍不足以覆盖真实误差

说人话:大部分情况下,模型预估的误差比实际误差更大,显得比较保守;但在最右端的数据稀疏区域,实际误差反而超过了模型的预估,说明模型在这些没怎么见过的状态下,仍然低估了预测风险。

3-6 实验五:闭环控制与数据效率
  • 实验内容:从少量随机交互数据起步,让 PETS 自己采集数据、训练模型、规划控制,观察所需真实交互步数与最终控制效果

  • 实验实现:初始数据来自若干条随机策略回合;每一轮用全部累计数据重新训练集成,再在真实环境中执行若干条 MPC 回合,把这些回合的转移并入训练集;评测固定使用三条初始状态固定的回合,同时给出同条件下的随机策略基线

  • 图 9 的三栏依次给出回合代价随累计真实转移数的下降曲线、末尾直立步数的占比,以及第一轮与最后一轮的角度轨迹

  • 结果分析:数据量很少时,PETS 在这三条评测回合上的代价与随机策略相当甚至更差;随着数据增加,代价快速下降,最终三条回合都进入稳定控制状态

  • 早期变差的原因是模型误差被规划放大:规划器在错误的模型里找到的"最优"动作序列,在真实环境中并不可靠;这也是模型式方法在数据不足时的典型风险

  • 曲线中段下降最陡,与实验三的结论对应:模型精度越过某个门槛后,规划才开始产生正收益

结论:在本实验设置下,PETS 的数据效率成立,但存在门槛;在模型达到一定精度之前,规划不但无益,还可能有害。该判断只基于三条固定初始状态的评测回合与单一 Pendulum-v1 任务,不能直接推广为其他任务或其他评测条件下的表现

3-7 实验六:规划器的消融
  • 实验内容:固定同一个训练好的模型,只改变规划器的设置,分离时域长度、传播方式与滚动执行三者的贡献

  • 实验实现:分别扫描规划时域,比较集成均值、TS1 与 TS∞ 三种传播方式,并把滚动执行替换为"规划一次、连续执行整段动作"的开环方式作为对照

  • 图 10 的三栏依次给出规划时域的扫描、传播方式与开环方式的对照,以及同一初始状态下短时域与可用时域的轨迹曲线

  • 结果分析:时域过短时多数回合控制失败,规划器只能看到甩起过程的一小段,无法评估稳定后的收益;时域增加到一定程度后控制稳定,继续加长则因优化维度上升与模型误差累积而略有退化

  • 三种传播方式在本文的实验设置下没有可测差别:同一个模型、同一组初始状态、同样的回合数与 CEM 预算。原因是该任务的模型已接近确定性,单步误差很小,噪声传播不足以改变规划结论;论文在更高维、模型误差更大的任务上才观察到 TS∞ 与 TS1 的差别

  • 开环执行则全面失败:一旦不再根据新状态重规划,动作序列很快就与实际状态脱节,模型误差无法被纠正

结论:在这类低维任务上,规划器起作用的主要机制是足够长的时域与滚动重规划;传播方式的收益依赖于模型不确定性的量级,不能脱离任务讨论

3-8 实验小结
  • 六个实验由浅入深地验证了算法的每一层:单步预测足够精确,多步误差随时域累积,数据量越过门槛后模型可用,两类不确定性可以分离且认知不确定性指向数据稀疏区,闭环控制在少量交互后收敛(以三条固定评测回合为准),规划器的关键在于时域长度与滚动执行
  • 与论文的差异同样需要说明:本文的任务维度低、模型规模小、CEM 预算低,因此传播方式之间没有拉开差距;这属于该设置下的观察,而不是对论文结论的反驳
  • 更一般地,PETS 的有效性依赖三个条件:模型在访问区域足够准、不确定性能够指向不可靠区域、规划时域覆盖任务的关键时间尺度。三者缺一,规划都可能退化

总结

  • 本文从环境模型的基本概念出发,介绍了 PETS 的概率模型集成、轨迹采样与 CEM-MPC 规划,并在连续控制任务上完成了六组逐层验证实验
  • 核心要点回顾:
    • 环境模型分动力学与奖励两部分:多数任务只需要学习状态转移,奖励可沿用已知函数
    • 概率模型表达偶然不确定性:每个成员输出状态变化的高斯分布,NLL 训练同时约束均值与方差
    • 集成表达认知不确定性:bootstrap 成员之间的分歧在数据稀疏处升高,可作为规划时的可信度信号
    • 轨迹采样把不确定传播到未来:TS1 与 TS∞ 的区别在于模型身份是否沿轨迹保持一致
    • CEM 在模型中搜索动作序列:±2σ 截断采样(实现上把标准正态采样值裁剪到 ±2 再缩放)、精英更新与历史最优返回,构成稳定的无梯度规划器
    • MPC 只执行第一个动作:每步用真实状态重新起算,避免把整段动作开环执行、让误差沿轨迹连续放大;模型误差仍然存在,只是不再累积到整段执行上
  • 如有错误,欢迎指出!感谢观看!
相关推荐
Python自动化直播2 小时前
智能脚本批量管理拆开看:导入、导出、重写、试听
前端·python·ai·秒播
伤心的梧桐叶5 小时前
Picset与创客贴比等待时间,没做完的任务不能从表里消失
python
没有气的汽水5 小时前
一次 SQS 消费者静默退出的排查:问题最后竟然出在日志里
python
用户450030140235 小时前
物业催缴系统为什么总在"冷却"这一步翻车:账期建模与规则命中的几个取舍
python
Web极客码5 小时前
决策模型 + LLM:用 Python 拆解浏览器自动化工作流
java·python·自动化
fanruitian5 小时前
python 装饰器 闭包
python
泡茶喝茶写代码6 小时前
A股量化策略回测实战:从行情数据到绩效评估(第 13 篇):放量突破策略
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口
cxyxixiy6 小时前
数智码力:数据核对不用人工比对,Python 快速完成多表格差异校验
开发语言·python·学习
LMT流氓兔6 小时前
第五单元——第11课:自动测试“拒绝后绝不能写入”
数据库·人工智能·python·langchain