长时序预测与误差传播

一句话定位

长时序预测的核心问题是误差在多步rollout中的指数级累积,通过数学分析揭示其机制并探讨ensemble、正则化和随机性等缓解技术。

前置依赖

核心思想

长时序预测(Long-horizon Prediction)是世界模型应用于规划的核心前提。理想情况下,我们希望世界模型能够精确预测数十甚至数百步后的未来状态。然而,任何有限的模型都无法完美建模真实动力学的所有细节,这些误差在多步rollout中会不断累积和放大,最终导致预测完全偏离真实轨迹。

1.1 误差累积的直观理解

考虑一个简单例子:机器人控制任务

t=0:  真实位置 (10.0, 10.0), 预测位置 (10.0, 10.0)  误差: 0
t=1:  真实位置 (10.1, 10.2), 预测位置 (10.09, 10.19) 误差: 0.02m
t=2:  真实位置 (10.2, 10.4), 预测位置 (10.17, 10.37) 误差: 0.05m
t=5:  真实位置 (10.5, 11.0), 预测位置 (10.38, 10.85) 误差: 0.2m
t=10: 真实位置 (11.0, 12.0), 预测位置 (10.45, 11.45) 误差: 0.8m ← 开始明显偏移
t=20: 真实位置 (12.0, 14.0), 预测位置 (10.12, 12.10) 误差: 2.1m ← 完全偏离

观察:误差不是线性增长,而是加速增长(在某些条件下呈指数增长)。

1.2 误差来源分类

误差类型描述来源可缓解程度
模型偏差真实 dynamics 无法被有限模型精确拟合模型容量不足、归纳偏置错误部分可缓解
初始化误差第一步预测就存在的微小偏差观测噪声、编码器误差难以完全消除
随机扰动环境本身的部分随机性真实世界的固有随机性必须建模
状态漂移累积微小偏差导致状态空间偏移误差累积的非线性效应较难缓解

关键洞察:即使没有任何随机扰动,仅靠模型偏差和初始化误差,多步rollout也会导致显著漂移。

数学推导

2.1 单步误差传播模型

设世界模型为 ,真实动力学为

单步误差定义

其中真实转移:

预测转移:

引理 2.1(误差分解) 误差可分解为两部分:

2.2 多步误差的精确上界

定理 2.1(多步误差界) 假设 关于状态是 -Lipschitz 的,则 T 步 rollcout 的误差满足:

证明(Sketch):

使用数学归纳法。设

添加并减去

由 Lipschitz 条件,最后一步来自:

递推展开即得定理结论。

2.3 误差指数增长条件

推论 2.1(指数增长) 如果存在 使得 ,则:

时, 指数增长。

推论 2.2(稳定条件) 为了保证误差不指数增长,需要 ,即模型必须是收缩映射(contraction)。

定义 2.1(收缩映射) 如果

,则 是收缩映射。

问题:真实的物理动力学通常不满足 (例如,初始误差小幅,经过多次放大后可能大幅偏离)。

2.4 随机动力学下的误差分析

考虑随机动力学:

预测模型:

定理 2.2(随机情况下的误差期望) 误差期望满足:

推论:随机扰动会加剧误差累积,但通过合适的模型设计可以部分控制。

模型结构图

┌─────────────────────────────────────────────────────────────────┐
│                    误差传播机制图                                │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  真实轨迹:        s_0 → s_1 → s_2 → s_3 → s_4 → ... → s_T      │
│                       ↓     ↓     ↓     ↓                       │
│  预测轨迹:        s_0 → \hat{s}_1 → \hat{s}_2 → \hat{s}_3 → ... │
│                       ↓     ↓     ↓     ↓                       │
│  单步误差:        ε_0   ε_1    ε_2    ε_3                       │
│                       ↓     ↓     ↓                             │
│  累积误差:        ||ε_1|| < ||ε_2|| < ||ε_3|| < ...             │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  误差传播公式:                                            │   │
│  │  ε_{t+1} = δ_t + J_t · ε_t                               │   │
│  │  其中 J_t = ∂f_θ/∂s 是雅可比矩阵                          │   │
│  │       δ_t = p(s_t,a_t) - f_θ(s_t,a_t) 是模型偏差         │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                误差增长曲线(不同L值)                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  误差 ||ε_T||                                                
│     │                                                        
│  高 │          ╱ (L>1, 不稳定)                                
│     │        ╱                                               
│     │      ╱                                                 
│     │    ╱ L=1 (临界)                                         
│     │  ╱                                                    
│     │╱ L<1 (稳定)                                            
│  ───┼─────────────────────────────────────────────────── 时间T   
│     │                                                       
└─────────────────────────────────────────────────────────────────┘

训练细节

3.1 缓解误差累积的技术

3.1.1 Ensemble 方法

核心思想:多个模型取平均,误差相互抵消。

个独立训练的世界模型。

聚合预测

定理 3.1(Ensemble误差缩减) 假设各模型误差独立同分布,方差为 ,则 ensemble 预测的方差为

实践中的问题

  • 模型通常不完全独立(共享架构、数据)
  • 计算成本线性增加

变体

  • Dropout Ensemble:在推理时使用不同的 dropout mask
  • Snapshot Ensemble:保存训练过程中的多个检查点
  • Weighted Ensemble:给不同模型赋予不同权重

3.1.2 正则化技术

1. Contractive Regularization

鼓励模型满足收缩条件:

这直接优化 的条件。

2. Lipschitz Continuity

通过权重裁剪或谱归一化强制 Lipschitz 连续:

def spectral_normalization(layer):
    """谱归一化实现Lipschitz约束"""
    # 计算权重矩阵的谱范数(最大奇异值)
    u, s, v = torch.svd(layer.weight.data)
    # 将权重除以谱范数
    layer.weight.data = layer.weight.data / s[0]

3. Prediction Smoothing

在连续状态空间加入平滑:

这相当于人为增加阻尼。

3.1.3 随机性建模

核心思想:如果真实动力学有随机成分,将其显式建模可以减缓确定性预测的误差累积。

Stochastic World Model

训练目标

优点:随机性引入了”探索”机制,可能探索到正确轨迹附近。

缺点:引入随机性后planning变得困难。

3.2 课程学习策略

渐进式horizon扩展

def curriculum_training(world_model, horizon_schedule):
    """
    课程学习:从短horizon逐步扩展
    horizon_schedule: [1, 2, 4, 8, 16, 32, 64, 128]
    """
    for epoch, horizon in enumerate(horizon_schedule):
        if epoch < len(horizon_schedule) - 1:
            # 使用混合horizon
            current_horizon = horizon
        else:
            # 最后阶段使用目标horizon
            current_horizon = horizon_schedule[-1]
 
        # 生成训练数据
        batch = sample_rollout_batch(horizon=current_horizon)
 
        # 计算损失(只对短horizon部分BP)
        loss = compute_loss(world_model, batch)
 
        # 早期阶段,horizon短,梯度稳定
        # 后期阶段,horizon长,但模型已足够稳定

Reed-feathering:在长horizon训练时,对不同时间步的损失加权:

是误差开始急剧增长的临界时间步。

推理/rollout/planning过程

4.1 Rollout过程中的误差监控

def monitored_rollout(world_model, obs, actions, true_env=None):
    """
    带误差监控的rollout
    如果提供了true_env,可以实时测量预测误差
    """
    trajectory = [obs]
    predictions = []
    errors = []
 
    latent = world_model.encode(obs)
 
    for t, action in enumerate(actions):
        # 预测
        next_latent = world_model.dynamics(latent, action)
        next_pred = world_model.decode(next_latent)
        predictions.append(next_pred)
 
        # 如果有真实环境,测量误差
        if true_env is not None:
            true_next_obs, _, done, _ = true_env.step(action)
            error = F.mse_loss(next_pred, true_next_obs)
            errors.append(error.item())
 
            if done:
                break
 
        latent = next_latent
        trajectory.append(next_pred if true_env is None else true_next_obs)
 
    return {
        'predictions': predictions,
        'errors': errors,
        'trajectory': trajectory
    }

4.2 自适应Horizon规划

核心思想:当误差超过阈值时,提前截断rollout。

def adaptive_horizon_planning(world_model, obs, goal, max_horizon=100, error_threshold=0.1):
    """
    自适应horizon规划
    当预测误差超过阈值时停止rollout
    """
    latent = world_model.encode(obs)
    best_action = None
    best_reward = float('-inf')
 
    # 尝试多个action candidates
    for action_seq in candidate_actions:
        latent_current = latent
        total_reward = 0
        errors = []
 
        for t in range(max_horizon):
            # 检查误差
            if t > 0:
                # 粗略估计误差(可以用预测不确定性)
                uncertainty = estimate_uncertainty(world_model, latent_current)
                if uncertainty > error_threshold:
                    break  # 停止rollout
 
            # 执行一步
            next_latent = world_model.dynamics(latent_current, action_seq[t])
            reward = estimate_reward(world_model, next_latent, goal)
            total_reward += reward
            latent_current = next_latent
 
        if total_reward > best_reward:
            best_reward = total_reward
            best_action = action_seq[0]  # 只返回第一步
 
    return best_action

优点与局限

5.1 优点

  1. 数学框架完善:误差传播有坚实的理论基础
  2. 多种缓解策略:Ensemble、正则化、随机性等各有优势
  3. 可量化监控:误差可以实时监控,便于调试
  4. 与控制系统理论联系:与控制理论中的稳定性分析有联系

5.2 局限

  1. 无法根本消除:在确定性模型下,误差累积是不可避免的
  2. 计算成本高:Ensemble和多步训练计算量大
  3. 不稳定动力学难以处理:高度非线性、高度不确定的系统误差增长极快
  4. 理论边界悲观:理论界通常假设最坏情况,实际中可能没这么悲观

5.3 当前未解决的理论问题

问题描述重要性
非 Lipschitz 系统的误差界高度非线性系统的误差分析尚不完善
自适应误差控制如何自动检测和阻止误差增长
有限样本下的误差界数据驱动世界模型的样本复杂度
多模态系统的误差分析多模态预测下的误差量化

与前后内容的衔接

可复现实现要点

7.1 误差传播实验

def error_propagation_experiment():
    """
    验证不同L值下的误差增长
    """
    # 创建不同L约束的模型
    models = {
        'no_reg': WorldModel(),  # 无正则化
        'contractive': WorldModel(reg='contractive'),  # 收缩正则化
        'lipschitz': WorldModel(reg='lipschitz'),  # Lipschitz约束
    }
 
    results = {}
    for name, model in models.items():
        # 收集不同horizon下的误差
        errors_by_horizon = {h: [] for h in [1, 5, 10, 20, 50, 100]}
 
        for trial in range(100):
            obs = env.reset()
            for h in errors_by_horizon.keys():
                # h步rollout
                errors = rollout_with_error(model, obs, horizon=h)
                errors_by_horizon[h].append(errors[-1])  # 记录最终误差
 
        results[name] = {h: np.mean(errs) for h, errs in errors_by_horizon.items()}
 
    return results

7.2 雅可比计算和L值估计

def compute_model_lipschitz(world_model, state_dim, action_dim, samples=1000):
    """
    估计模型的有效Lipschitz常数
    """
    max_l = 0
    for _ in range(samples):
        s = torch.randn(state_dim, requires_grad=True)
        a = torch.randn(action_dim)
        s.requires_grad_(True)
 
        s_next = world_model.dynamics(s, a)
        # 计算雅可比矩阵 ∂f/∂s
        J = torch.autograd.grad(s_next.sum(), s, create_graph=True)[0]
        # 计算谱范数(最大奇异值)
        l = torch.linalg.svd(J).S[0].item()
        max_l = max(max_l, l)
 
    return max_l

7.3 实现注意事项

  1. L值估计需要真实梯度计算:不要用数值差分,效率太低
  2. 误差阈值需要任务相关:不同任务的误差容忍度不同
  3. 多步loss的BPTT:需要梯度截断避免过长BPTT带来数值问题
  4. 不确定性估计:可以用Monte Carlo dropout估计预测不确定性

章节摘要

长时序预测的核心挑战是误差在多步rollout中的累积。对于 Lipschitz 常数为 的模型,T步后的误差上界为 ,当 时误差指数增长。缓解技术包括:Ensemble(通过模型平均减小方差)、收缩正则化(强制 )、随机性建模(显式建模环境随机性)、课程学习(渐进式增加horizon)。然而,这些方法都无法根本消除误差累积——这是有限模型逼近真实动力学的固有限制。理论上有意义的未来方向是:更紧的误差界、自适应误差控制、多模态系统的误差分析。

关键词

长时序预测、误差传播、Lipschitz常数、收缩映射、指数增长、Ensemble、正则化、随机性建模、课程学习、梯度截断、自适应horizon