观测压缩与状态抽象
一句话定位
问题:原始像素观测维度高达数万(如 64×64×3=12288 维),而真正决策相关的状态可能仅有数十维。如何从高维观测中提取紧凑且有意义的低维状态表征?
定位:第二章第一节,属于”观测与表征”的核心基础,承接”世界模型定义”,为后续”隐状态与潜空间”奠定基础。
前置依赖
- 1-世界模型的定义:世界模型的基本架构(Encoder-Decoder 框架)
- 2-理解世界与预测未来:理解世界的整体框架(理解与预测的协同)
核心思想
观测压缩的直觉来源于信息瓶颈(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. 从像素到状态的映射
设原始观测
编码器
通常
解码器
2. 变分压缩框架(VAE)
在变分世界模型中,编码器输出的是一个分布而非确定性向量:
证据下界(ELBO):
其中
3. 重构损失的形式
对于图像观测,重构损失通常使用像素级二元交叉熵(BCE):
这等价于假设观测服从伯努利分布(或像素级的 sigmoid 输出)。
对于连续值观测(如深度图),可以使用均方误差(MSE):
4. 压缩效率的度量
压缩比:
典型值:
信息保留率(重构质量):
或使用 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()稳定性问题与缓解
-
Posterior Collapse(后验坍缩):
- 问题:KL 项过大时,编码器趋向于输出先验
,忽略输入 - 缓解:使用 KL-free loss 或逐渐增加 KL 权重(annealing)
- 问题:KL 项过大时,编码器趋向于输出先验
-
重构质量下降:
- 问题:过度压缩导致隐状态丢失关键信息
- 缓解:监控重构 PSNR,使用跳跃连接(skip connection)保留低级特征
-
梯度消失/爆炸:
- 问题:深层 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̂ [观测重构]
优点与局限
优点
- 维度约简:将高维像素压缩到低维向量,大幅降低后续计算成本
- 无监督学习:无需标注数据,可利用大规模未标注观测
- 去噪效果:隐状态自动过滤观测中的噪声(如相机抖动、阴影)
- 泛化能力:对视角、光照变化的鲁棒性强于原始像素
- 语义聚类:相似状态在隐空间中接近,支持相似性推理
失败模式
- 过度压缩:
过小导致关键信息丢失,重构模糊或语义错误 - 身份映射:模型可能学习恒等映射(
无效压缩),尤其在 KL 权重过低时 - 任务无关信息保留:编码器可能保留与决策无关的背景细节,浪费容量
- 时间一致性差:逐帧编码可能产生时间上不一致的隐状态(如闪烁)
与后续内容的衔接
观测压缩为世界模型提供了紧凑的输入表征,使得:
- 转移模型在低维空间中进行高效预测
- 策略网络在低维空间中进行快速决策
- 想象 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
- 输出激活函数:decoder 输出需要 sigmoid(像素值在 [0,1])或 tanh(如果使用标准化)
- KL 权重:
时模型退化为普通自编码器,可能坍缩到身份映射 - 重参数化:训练时必须使用
,而非直接输出 - 批次维度:确保 encoder 输出正确的批次维度,与 decoder 匹配
章节摘要
- 观测压缩将高维原始像素(如 64×64×3=12288 维)映射到低维隐状态(如 32 维),实现 384:1 的压缩比。
- VAE 框架通过重构损失与 KL 正则项的联合优化,确保隐状态既保留重建观测的信息,又接近先验分布。
- 信息瓶颈原理指出最优的压缩应保留对预测未来有用的信息,丢弃任务无关的背景细节。
- 马尔可夫状态假设要求
是 中预测 的充分统计量,即 。 - 压缩比是观测压缩的核心指标,但过高的压缩比会导致信息丢失与重构质量下降。
- 无监督训练使得观测压缩可以从大量未标注数据中学习,不依赖动作-奖励标签。
- 后验坍缩是 VAE 的主要训练问题,可以通过 KL 权重调度或 FREE bit 机制缓解。
- 观测压缩为世界模型的转移模型提供了紧凑的输入,使低维空间的长期规划成为可能。
关键词
观测压缩、状态抽象、降维、自编码器、VAE、重构损失、KL 正则、信息瓶颈、马尔可夫状态假设、压缩比、后验坍缩、变分推断、重参数化技巧、无监督学习、像素级 BCE、隐状态维度、泛化能力、去噪效果