观测压缩与状态抽象

一句话定位

问题:原始像素观测维度高达数万(如 64×64×3=12288 维),而真正决策相关的状态可能仅有数十维。如何从高维观测中提取紧凑且有意义的低维状态表征?

定位:第二章第一节,属于”观测与表征”的核心基础,承接”世界模型定义”,为后续”隐状态与潜空间”奠定基础。


前置依赖


核心思想

观测压缩的直觉来源于信息瓶颈(Information Bottleneck)原理:智能体不需要编码每一个像素的信息,只需要编码对预测未来有用的信息

关键洞察

  • 并非所有像素都同等重要——背景、光照变化、阴影等对决策可能是无关的
  • 关键信息是因果相关的状态变量(如物体位置、速度、几何属性)
  • 压缩的目标不是最小化重建误差,而是保留任务相关的语义信息

状态抽象则是将原始感知映射到本质状态变量的过程:

  • 同一物理状态在不同视角、光照下应有相似的隐状态表征
  • 不同物理状态需要可区分的隐状态表征

模型结构图

                观测压缩与状态抽象
                ==================

原始观测 o_t (64×64×3 = 12288维)
        │
        ▼
┌─────────────────────────────────────────────────────────────┐
│                  编码器 q_φ(s_t | o_t)                        │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│   输入层:  o_t ∈ ℝ^12288                                    │
│       │                                                    │
│       ▼                                                    │
│   Conv Layers: 3×64×64×3                                   │
│       │  → 32×32×32 (32768)                                 │
│       ▼                                                    │
│   Dense Layer:  flatten → 512                              │
│       │                                                    │
│       ▼                                                    │
│   输出层:  μ, σ  →  s_t ∈ ℝ^32 (或 deterministic)           │
│                                                             │
└─────────────────────────────────────────────────────────────┘
        │
        ▼ s_t ∈ ℝ^32 (压缩率 ≈ 384:1)
        │
        ▼
┌─────────────────────────────────────────────────────────────┐
│                    状态空间                                   │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│   s_t = [位置_x, 位置_y, 速度_vx, 速度_vy, 形状, ...]       │
│                                                             │
│   维度: d_s ∈ [32, 256]                                     │
│   性质: 马尔可夫性(给定 s_t, s_{t+1} 仅依赖 a_t)           │
│                                                             │
└─────────────────────────────────────────────────────────────┘
        │
        ▼
┌─────────────────────────────────────────────────────────────┐
│                  解码器 p_θ(o_t | s_t)                        │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│   输入:  s_t ∈ ℝ^32                                         │
│       │                                                    │
│       ▼                                                    │
│   Dense → reshape → Deconv Layers                          │
│       │                                                    │
│       ▼                                                    │
│   输出:  o_t̂ ∈ ℝ^64×64×3                                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

信息流与压缩率

原始像素 ──[encoder]──▶ 隐状态 ──[decoder]──▶ 重构像素
   │                      │                      │
12288 dim            32-256 dim             12288 dim
   │                      │                      │
   └──────────────────────┴──────────────────────┘
                   重构损失: L_recon = -log p(o|s)

数学推导

1. 从像素到状态的映射

设原始观测 ,目标隐状态 ,其中

编码器 将观测映射到隐状态:

通常 是一个深度卷积神经网络(CNN)或视觉Transformer(ViT)。

解码器 从隐状态重建观测:

2. 变分压缩框架(VAE)

在变分世界模型中,编码器输出的是一个分布而非确定性向量:

证据下界(ELBO)

其中 是标准高斯先验。

3. 重构损失的形式

对于图像观测,重构损失通常使用像素级二元交叉熵(BCE)

这等价于假设观测服从伯努利分布(或像素级的 sigmoid 输出)。

对于连续值观测(如深度图),可以使用均方误差(MSE)

4. 压缩效率的度量

压缩比

典型值:(如 Dreamer 的设置)。

信息保留率(重构质量):

或使用 SSIM(结构相似性)度量感知质量。

5. 状态抽象的信息论视角

从信息瓶颈的角度,状态抽象最大化:

其中:

  • 是隐状态与动作的互信息(决策相关信息)
  • 是隐状态与观测的互信息(受容量 约束)

这意味着最优的编码器会丢弃观测中与动作无关的信息(如背景),保留与动作效果相关的信息。

6. 马尔可夫状态假设

强马尔可夫假设:给定当前状态 ,历史观测 与未来状态 条件独立:

这使得状态抽象必须捕获所有预测未来所需的信息,即:


训练细节

数据构造

观测压缩的训练数据是无标注的原始观测序列(无需动作-奖励标签):

这使得观测压缩可以无监督地从大量未标注数据中学习。

数据增强(防止模型学习身份映射):

  • 随机裁剪(Random Crop)
  • 颜色抖动(Color Jitter)
  • 随机翻转(Horizontal Flip)
  • 随机遮挡(Random Erasing)

输入输出(IO)

变量维度说明
(输入)原始像素
(隐状态)压缩后的向量
(输出)重构的像素

损失计算

VAE 损失函数

其中:

  • 第一项是重构损失(pixelwise BCE 或 MSE)
  • 第二项是 KL 正则项,强制后验接近标准正态先验
  • 是权重(通常 for -VAE)

优化器配置

  • 学习率(Adam)
  • 批次大小:32 到 128
  • KL 权重调度:通常使用 ( KL weight = 1.0)
  • 梯度裁剪:1.0 或 0.5

训练流程

# 观测压缩训练流程(VAE 风格)
for epoch in range(N_epochs):
    for batch in dataloader(images):
        # 1. 编码
        mu, logvar = encoder(batch)  # q_phi(s|o)
        std = exp(0.5 * logvar)
        eps = torch.randn_like(std)
        s = mu + eps * std  # reparameterization trick
 
        # 2. 解码(重构)
        o_hat = decoder(s)
 
        # 3. 计算损失
        recon_loss = F.binary_cross_entropy(o_hat, batch, reduction='sum')
        kl_loss = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
        loss = recon_loss + beta * kl_loss
 
        # 4. 反向传播
        optimizer.step()

稳定性问题与缓解

  1. Posterior Collapse(后验坍缩)

    • 问题:KL 项过大时,编码器趋向于输出先验 ,忽略输入
    • 缓解:使用 KL-free loss 或逐渐增加 KL 权重(annealing)
  2. 重构质量下降

    • 问题:过度压缩导致隐状态丢失关键信息
    • 缓解:监控重构 PSNR,使用跳跃连接(skip connection)保留低级特征
  3. 梯度消失/爆炸

    • 问题:深层 encoder/decoder 训练不稳定
    • 缓解:使用残差连接、谱归一化(Spectral Normalization)

推理/应用过程

编码过程(实时推理)

# 观测编码(推理时使用确定性后验)
def encode(o_t):
    mu, logvar = encoder(o_t)
    # 推理时使用均值(无需采样)
    s_t = mu  # 或使用 mu + eps * std(带噪声)
    return s_t

与世界模型的其他组件集成

真实环境观测 o_t
        │
        ▼
   encoder(o_t) → s_t
        │
        ├──▶ transition(s_t, a_t) → s_{t+1}  [世界模型]
        │
        ├──▶ reward(s_t, a_t) → r_t           [世界模型]
        │
        └──▶ decoder(s_t) → o_t̂              [观测重构]

优点与局限

优点

  1. 维度约简:将高维像素压缩到低维向量,大幅降低后续计算成本
  2. 无监督学习:无需标注数据,可利用大规模未标注观测
  3. 去噪效果:隐状态自动过滤观测中的噪声(如相机抖动、阴影)
  4. 泛化能力:对视角、光照变化的鲁棒性强于原始像素
  5. 语义聚类:相似状态在隐空间中接近,支持相似性推理

失败模式

  1. 过度压缩 过小导致关键信息丢失,重构模糊或语义错误
  2. 身份映射:模型可能学习恒等映射( 无效压缩),尤其在 KL 权重过低时
  3. 任务无关信息保留:编码器可能保留与决策无关的背景细节,浪费容量
  4. 时间一致性差:逐帧编码可能产生时间上不一致的隐状态(如闪烁)

与后续内容的衔接

观测压缩为世界模型提供了紧凑的输入表征,使得:

  • 转移模型在低维空间中进行高效预测
  • 策略网络在低维空间中进行快速决策
  • 想象 rollout 在低维空间中长期规划成为可能

可复现实现要点

最小模块

# 最简单的观测压缩模型(VAE)
class ObservationEncoder(nn.Module):
    def __init__(self, input_dim=3, hidden_dim=256, latent_dim=32):
        super().__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(input_dim, 32, 4, 2, 1),
            nn.ReLU(),
            nn.Conv2d(32, 64, 4, 2, 1),
            nn.ReLU(),
            nn.Conv2d(64, 128, 4, 2, 1),
            nn.ReLU(),
            nn.Flatten()
        )
        self.fc = nn.Linear(8*8*128, hidden_dim)
        self.mu = nn.Linear(hidden_dim, latent_dim)
        self.logvar = nn.Linear(hidden_dim, latent_dim)
 
    def forward(self, x):
        h = self.conv(x)
        h = self.fc(h)
        mu = self.mu(h)
        logvar = self.logvar(h)
        return mu, logvar
 
class ObservationDecoder(nn.Module):
    def __init__(self, latent_dim=32, hidden_dim=256, output_dim=3):
        super().__init__()
        self.fc = nn.Linear(latent_dim, 8*8*128)
        self.deconv = nn.Sequential(
            nn.ConvTranspose2d(128, 64, 4, 2, 1),
            nn.ReLU(),
            nn.ConvTranspose2d(64, 32, 4, 2, 1),
            nn.ReLU(),
            nn.ConvTranspose2d(32, output_dim, 4, 2, 1),
            nn.Sigmoid()
        )
 
    def forward(self, s):
        h = self.fc(s)
        h = h.view(-1, 128, 8, 8)
        return self.deconv(h)

常见bug

  1. 输出激活函数:decoder 输出需要 sigmoid(像素值在 [0,1])或 tanh(如果使用标准化)
  2. KL 权重 时模型退化为普通自编码器,可能坍缩到身份映射
  3. 重参数化:训练时必须使用 ,而非直接输出
  4. 批次维度:确保 encoder 输出正确的批次维度,与 decoder 匹配

章节摘要

  1. 观测压缩将高维原始像素(如 64×64×3=12288 维)映射到低维隐状态(如 32 维),实现 384:1 的压缩比。
  2. VAE 框架通过重构损失与 KL 正则项的联合优化,确保隐状态既保留重建观测的信息,又接近先验分布。
  3. 信息瓶颈原理指出最优的压缩应保留对预测未来有用的信息,丢弃任务无关的背景细节。
  4. 马尔可夫状态假设要求 中预测 的充分统计量,即
  5. 压缩比是观测压缩的核心指标,但过高的压缩比会导致信息丢失与重构质量下降。
  6. 无监督训练使得观测压缩可以从大量未标注数据中学习,不依赖动作-奖励标签。
  7. 后验坍缩是 VAE 的主要训练问题,可以通过 KL 权重调度或 FREE bit 机制缓解。
  8. 观测压缩为世界模型的转移模型提供了紧凑的输入,使低维空间的长期规划成为可能。

关键词

观测压缩、状态抽象、降维、自编码器、VAE、重构损失、KL 正则、信息瓶颈、马尔可夫状态假设、压缩比、后验坍缩、变分推断、重参数化技巧、无监督学习、像素级 BCE、隐状态维度、泛化能力、去噪效果