隐状态转移函数(Latent Transition)

一句话定位:系统化定义隐状态空间中状态转移的数学形式,包括后验 vs 先验分布的结构化设计,以及时间维度的信息传播机制。


前置依赖

  • 随机动力学建模(变分推断、ELBO、重参数化)
  • 马尔可夫假设与条件独立性
  • 贝叶斯网络与因子图基础
  • 信息论基础(KL 散度、互信息)

核心思想

在前两节(确定性动力学和随机动力学)中,我们分别讨论了无随机性和有随机性的动力学建模。在本节中,我们将系统化地定义隐状态转移函数的数学形式,为 RSSM(Recurrent State Space Model)奠定理论基础。

核心问题:如何设计隐状态空间的转移结构,使其既能高效地进行时间序列推断,又能保留表达不确定性所需的随机性?

解决方案:将隐状态空间分解为两个相互作用的组件——确定性隐藏状态(deterministic hidden state)随机隐变量(stochastic latent variable)。这种设计结合了两种建模方式的优点:

组件特点作用
确定性,可长期记忆传递长期上下文信息,梯度平稳传播
随机性,捕捉局部不确定性建模观测噪声、多模态动态

这种分离设计的直觉来源于:环境的”规律”(physics)是确定性的,而”噪声”(noise)是随机的。确定性部分可以被 RNN 记住并在时间上传播;随机部分只需要在局部建模。


模型结构图

A. 朴素状态空间模型(Naive SSM)

o_t         o_{t+1}
 │           │
 ▼           ▼
┌────────┐ ┌────────┐
│编码器  │ │编码器  │
└───┬────┘ └──┬────┘
    │         │
    ▼         ▼
  z_t ~~~>  z_{t+1}
  ▲           ▲
  │           │
  └── a_t ────┘

朴素 SSM 将整个隐状态建模为随机变量 ,转移依赖前一时刻的 。问题:长期依赖传递效率低,梯度消失问题严重

B. 混合状态空间模型(Hybrid SSM / RSSM)

                    a_t
                     │
     o_t──────────────┼──────────────┐
      │               │              │
      ▼               ▼              ▼
┌─────────┐     ┌─────────────┐  ┌─────────┐
│后验q(z_t│h_{t-1},a_{t-1})│  │先验p(z_t│h_{t-1},a_{t-1})
└────┬────┘     └──────┬──────┘  └────┬────┘
     │                  │              │
     ▼                  ▼              ▼
   z_t ───────────────> z_{t+1}
     │                  │              │
     ▼                  ▼              ▼
┌─────────────────────────────────────────────┐
│           确定性转移函数 p(h_{t+1}|h_t,z_t,a_t) │
└─────────────────────────────────────────────┘
                     │
                     ▼
                   h_{t+1}

这种结构的关键特点是:

  1. 随机变量 仍然存在,但其分布由两部分组成:先验(预测)和后验(观测校正)
  2. 确定性 hidden state 作为”信息高速公路”,高效传递长期依赖
  3. 后验-先验对比学习:训练时通过 KL 项让后验靠近先验,但保持一定距离以保留信息

C. 时序信息流

时间步 t-1          时间步 t           时间步 t+1
    │                  │                  │
    ▼                  ▼                  ▼
┌──────┐           ┌──────┐           ┌──────┐
│ h_t-1│ ────────► │  h_t │ ────────► │h_t+1 │  (确定性信息流)
└──────┘           └──────┘           └──────┘
    │                  ▲                  │
    │                  │                  │
    ▼                  ▼                  ▼
┌──────┐           ┌──────┐           ┌──────┐
│ z_t-1│ ────────► │  z_t │ ────────► │z_t+1 │  (随机信息流)
└──────┘           └──────┘           └──────┘

信息在两个通道中同时传播: 通道负责高效传递确定性信息, 通道负责建模随机性。


数学推导

A. 状态空间模型的因子分解

给定观测序列 和动作序列 ,完整的状态空间模型定义如下:

生成模型(第一因子分解)

各因子的含义

因子分布说明
先验初始 hidden state,通常设为固定值或零向量
先验基于历史预测 latent variable 先验分布
转移函数确定性的 hidden state 转移
解码器/似然基于 hidden state 重构观测

推断模型(第二因子分解)

其中 通常是确定性的(由 RNN 实现),而 是变分近似的后验分布。

B. 后验分布的分解

利用马尔可夫假设和条件独立性,我们有:

这个分解说明:后验分布 = 先验 × 似然,即先验分布被当前观测 所校正。

更具体地:

  • 先验 :基于历史信息对当前 latent variable 的预测
  • 似然 :给定 latent variable 时观测的条件分布

在实践中,我们通常用神经网络参数化:

C. 先验分布的设计

标准高斯先验

条件先验(RSSM 中使用):

先验网络的输入是前一时刻的 hidden state 和动作 ,输出 latent variable 的均值和方差。

先验的设计动机

  • 先验网络能够学习”物理规律”——给定当前状态和动作,预测可能的下一状态分布
  • 动作影响先验分布,使得不同动作下的预测有不同的不确定性水平

D. ELBO 的完整推导

目标:最大化观测对数似然的下界

从 Jensen 不等式出发:

引入变分分布

应用 Jensen 不等式(对 这个凹函数):

将联合分布因式分解代入:

对每个时间步 进行分解,利用条件独立性:

代入 ELBO:

简化后的 ELBO

解释

  • 重构项:给定后验采样的 latent variable,通过确定性 hidden state 预测观测
  • KL 项:让后验分布 接近先验分布

E. 后验-先验对比学习的直观理解

训练目标(KL 项):

最小化这个 KL 项,使 靠拢。

关键洞察:在训练完成后, 应该不完全一致——否则 latent variable 就失去了其建模不确定性的意义。

为什么 latent variable 有用

  • 先验 :基于历史预测下一状态分布
  • 后验 :基于历史 + 当前观测校正预测

两者之间的差异度量了当前观测带来的新信息量。如果差异大,说明观测提供了关于当前状态的重要信息;如果差异小,说明预测已经足够准确。


训练细节

A. 训练目标

其中单步 ELBO 为:

B. 训练算法

对于每个训练 batch (o_{1:T}, a_{1:T-1}):

1. 编码观测序列:
   h_0 = zeros
   对于 t = 1 to T:
       h_t = Encoder(o_t)    # 或使用 RNN 逐步编码

2. 初始化累积损失:
   total_loss = 0

3. 对于 t = 1 to T:
   a. 计算先验分布:
      p_theta(z_t | h_{t-1}, a_{t-1}) = N(mu_prior, sigma_prior)
      mu_prior, sigma_prior = PriorNet(h_{t-1}, a_{t-1})

   b. 计算后验分布:
      q_phi(z_t | o_{1:T}) = N(mu_post, sigma_post)
      mu_post, sigma_post = PosteriorNet(h_t)

   c. 重参数化采样:
      z_t = mu_post + sigma_post * epsilon, epsilon ~ N(0,I)

   d. 计算确定性 hidden state 转移:
      h_t = TransitionNet(h_{t-1}, z_t, a_{t-1})

   e. 重构观测:
      o_hat_t = Decoder(h_t)

   f. 计算单步损失:
      recon_loss = -log p_theta(o_t | h_t)  (或 MSE)
      kl_loss = D_KL(q_phi || p_theta)
      step_loss = recon_loss + beta * kl_loss

   g. 累积损失:
      total_loss += step_loss

4. 反向传播更新:
   total_loss.backward()
   optimizer.step()

C. 关键训练技巧

  • 延迟后验(Delayed Posterior):后验网络输入不仅是当前观测 ,还可以包含未来观测 ,以获得更好的全局信息
  • 自由比特(Free Bits):避免后验分布崩塌,允许每个样本保留一定的 KL”预算”
  • KL 权重调度 从小到大 schedule,防止后验过度依赖先验

推理/rollout/规划过程

A. 先验 rollout(训练后用于规划)

训练完成后,使用先验分布进行免费 rollout:

h_0 = encoder(o_0)
对于 t = 1 to T:
    z_t ~ p_theta(z_t | h_{t-1}, a_{t-1})   # 从先验采样
    h_t = f_theta(h_{t-1}, z_t, a_{t-1})   # 确定性转移
    a_t = policy(h_t)                       # 策略网络

B. 后验 rollout(用于视频预测/重建)

如果要生成与真实轨迹一致的预测,可以使用后验 rollout:

h_0 = encoder(o_0)
对于 t = 1 to T:
    z_t ~ q_phi(z_t | o_{1:T})              # 从后验采样
    h_t = f_theta(h_{t-1}, z_t, a_{t-1})   # 确定性转移

后验 rollout 保证生成轨迹与真实观测一致(因为 由观测决定)。

C. 与确定性 RNN 的对比

方面确定性 RNNLatent Transition (RSSM)
状态更新
随机性有(通过 建模)
后验推断不支持支持(
不确定性传播有(先验-后验对比)
多模态建模不支持支持

优点与局限

优点

  1. 长期依赖高效传播:确定性 hidden state 作为信息高速公路,避免了随机变量序列的梯度消失问题
  2. 不确定性显式建模:随机 latent variable 显式捕获动态不确定性
  3. 后验-先验对比学习:通过 KL 项结构化地学习哪些信息来自观测,哪些来自先验预测
  4. 多模态表达:latent variable 的混合分布能够表达同一状态-动作对的不同结果
  5. 规划友好:先验 rollout 生成多样化的想象轨迹用于规划

局限

  1. 后验推断复杂度:后验 需要看到整个观测序列,计算成本高
  2. 训练不稳定:KL 项权重需要仔细调参, 过小导致后验崩溃, 过大导致先验失效
  3. 隐变量维度设计:隐变量维度需要权衡表达能力和计算效率
  4. 先验假设限制:高斯先验假设可能不足以捕获复杂的隐变量分布

与前后内容的衔接

  • 前置内容:确定性动力学提供了 的确定性转移机制;随机动力学引入了 的变分推断框架
  • 后续内容:RSSM 是本节 Latent Transition 概念的完整实现,定义了具体网络架构和训练流程
  • 核心贡献:本节明确了后验 vs 先验的结构化设计,为 RSSM 的 KL 对比学习提供理论基础

可复现实现要点

A. 核心模块实现

import torch
import torch.nn as nn
import torch.nn.functional as F
 
class LatentTransition(nn.Module):
    """Latent Transition 模块:后验-先验对比结构"""
    
    def __init__(self, hidden_dim, action_dim, latent_dim):
        super().__init__()
        self.hidden_dim = hidden_dim
        self.latent_dim = latent_dim
        
        # 先验网络:基于 h_{t-1} 和 a_{t-1} 预测 latent 分布
        self.prior_net = nn.Sequential(
            nn.Linear(hidden_dim + action_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, latent_dim * 2)  # 均值 + 对数方差
        )
        
        # 后验网络:基于 h_t(编码了 o_t 信息)推断后验分布
        self.posterior_net = nn.Sequential(
            nn.Linear(hidden_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, latent_dim * 2)
        )
        
        # 确定性转移函数:p(h_t | h_{t-1}, z_t, a_{t-1})
        self.transition_net = nn.Sequential(
            nn.Linear(hidden_dim + latent_dim + action_dim, hidden_dim),
            nn.GRU(hidden_dim, hidden_dim)
        )
        
    def prior(self, h_prev, action):
        """计算先验分布 p(z_t | h_{t-1}, a_{t-1})"""
        x = torch.cat([h_prev, action], dim=-1)
        stats = self.prior_net(x)
        mu, log_sigma = stats.chunk(2, dim=-1)
        sigma = F.softplus(log_sigma) + 1e-6
        return mu, sigma
    
    def posterior(self, h_t):
        """计算后验分布 q(z_t | h_t)"""
        stats = self.posterior_net(h_t)
        mu, log_sigma = stats.chunk(2, dim=-1)
        sigma = F.softplus(log_sigma) + 1e-6
        return mu, sigma
    
    def forward(self, h_prev, z_t, action):
        """确定性转移函数 p(h_t | h_{t-1}, z_t, a_{t-1})"""
        x = torch.cat([h_prev, z_t, action], dim=-1)
        h_t = self.transition_net(x, h_prev)
        return h_t
    
    def reparameterize(self, mu, sigma):
        """重参数化技巧"""
        epsilon = torch.randn_like(mu)
        return mu + sigma * epsilon
    
    def kl_divergence(self, q_mu, q_sigma, p_mu, p_sigma):
        """计算 D_KL(q || p)"""
        # KL(N(q_mu, q_sigma) || N(p_mu, p_sigma))
        # = log(p_sigma/q_sigma) + (q_sigma^2 + (q_mu-p_mu)^2)/(2*p_sigma^2) - 0.5
        log_ratio = torch.log(p_sigma / q_sigma + 1e-6)
        return log_ratio + (q_sigma**2 + (q_mu - p_mu)**2) / (2 * p_sigma**2 + 1e-6) - 0.5

B. 训练循环

def train_step(model, encoder, decoder, optimizer, obs_seq, action_seq, beta=1.0):
    T = obs_seq.size(1)
    batch_size = obs_seq.size(0)
    
    # 初始化 hidden state
    h_prev = torch.zeros(batch_size, model.hidden_dim, device=obs_seq.device)
    
    total_recon_loss = 0
    total_kl_loss = 0
    
    for t in range(1, T):
        # 编码当前观测获取 h_t(简化版,实际可能用 RNN)
        h_t = encoder(obs_seq[:, t])
        
        # 1. 先验分布
        p_mu, p_sigma = model.prior(h_prev, action_seq[:, t-1])
        
        # 2. 后验分布
        q_mu, q_sigma = model.posterior(h_t)
        
        # 3. 重参数化采样(训练时用后验)
        z_t = model.reparameterize(q_mu, q_sigma)
        
        # 4. 确定性转移
        h_t = model.forward(h_prev, z_t, action_seq[:, t-1])
        
        # 5. 重构观测
        obs_recon = decoder(h_t)
        recon_loss = F.mse_loss(obs_recon, obs_seq[:, t], reduction='sum')
        
        # 6. KL 损失
        kl_loss = model.kl_divergence(q_mu, q_sigma, p_mu, p_sigma).mean()
        
        total_recon_loss += recon_loss
        total_kl_loss += kl_loss
        
        h_prev = h_t
    
    # 总损失
    loss = total_recon_loss + beta * total_kl_loss
    
    optimizer.zero_grad()
    loss.backward()
    torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
    optimizer.step()
    
    return loss.item(), total_recon_loss.item(), total_kl_loss.item()

C. 关键实现细节

  • 先验/后验共享部分统计量:在某些实现中,后验网络接收额外信息(如未来观测),以提升后验质量
  • KL 权重 :使用 标准的 KL 权重,或使用 的 KL annealing
  • 多步 KL 分解:在长序列训练中,可将 KL 项分解到每一步,而非使用全局后验

章节摘要

Latent Transition 是对隐状态转移函数的系统化设计,通过将隐状态空间分解为确定性 hidden state 随机 latent variable ,同时实现:

  1. 高效的时间信息传播 通过 RNN 传递长期依赖
  2. 显式的不确定性建模 捕获局部随机性
  3. 后验-先验对比学习:通过 KL 项结构化地学习预测与观测的差异

核心数学

  • 生成模型:
  • ELBO:
  • KL 项度量后验与先验的差异,反映观测带来的新信息量

这一设计为 RSSM 提供了理论基础,是 Dreamer 系列算法的核心组件。


关键词

Latent Transition、后验分布、先验分布、状态空间模型、后验-先验对比、KL 散度、马尔可夫假设、条件独立性、变分推断、重参数化技巧、隐变量模型、信息高速公路、自由比特、KL annealing、确定性 hidden state、随机 latent variable