ControlVAE: Model-Based Learning of Generative Controllers for Physics-Based Characters

论文信息: ACM Transactions on Graphics, 2023, Heyuan Yao et al., Peking University

Link: 项目主页


一、核心问题

1.1 研究背景

基于物理的角色控制器可以被公式化为生成模型:

  • 潜在空间中的样本被解码为具体的角色动作
  • 目标是学习多样化的技能表示和通用的控制策略

现有生成控制方法的局限:

方法代表工作局限性
自动编码器Merel et al. 2018, 2020需要大量专家策略蒸馏
条件 VAEWon et al. 2022使用标准正态先验,技能解耦不佳
对抗模仿学习AMP (Peng 2021, 2022)需要训练两个间接监督的系统,训练不稳定
MCPPeng et al. 2019技能表示能力有限

1.2 核心问题

如何学习一个生成式控制器,能够:

  1. 从多样化的无组织动作序列中学习丰富的技能潜在表示
  2. 通过潜在空间采样生成真实的人类行为
  3. 让高层控制策略复用学到的技能完成各种下游任务
  4. 训练过程稳定高效

1.3 现有方法及其局限性

VAE 在角色控制中的应用:

  • 通常使用标准正态分布 N(0,I) 作为先验 p(z)
  • 问题:这种状态无关的先验不能有效地解耦不同技能的表示

观察到的问题:

  • 角色频繁快速切换技能
  • 导致抽搐的动作和偶尔摔倒
  • 下游控制策略效率低下(如方向控制任务中难以保持恒定方向)

原因分析:

  • 状态无关的先验分布没有提供足够的信息用于正则化
  • 编码器计算出不一致的技能分布
  • 相同的技能在不同状态下被编码到潜在空间的不同部分

1.4 本文方法

论文提出了 ControlVAE 框架:

核心创新:

  1. 状态条件先验分布 (State-Conditional Prior)

    • p(z|s) 而非 p(z)
    • 根据当前角色状态生成更合适的技能嵌入
    • 在下游任务中表现优于非条件先验
  2. 基于世界模型的学习 (Model-Based Learning)

    • 学习可微的世界模型近似模拟系统动力学
    • 世界模型提供直接监督信号
    • 实现高效稳定的训练
  3. 数据平衡策略 (Data Balancing)

    • 解决简单动作占用过多训练样本的问题
    • 确保困难技能也能被有效学习

框架能力:

  • 从多样化无组织动作序列学习
  • 潜在空间采样生成真实行为
  • 支持各种下游任务(高度控制、方向控制、转向控制、风格控制)

二、核心贡献

  1. ControlVAE 框架

    • 基于 VAE 的生成式控制策略
    • 状态条件先验分布
    • 可微世界模型
  2. 模型强化学习算法

    • 使用世界模型进行直接监督
    • 训练稳定高效
    • 支持多种下游任务
  3. 数据平衡技术

    • 基于状态价值的采样
    • 确保困难技能的学习
  4. 多样化任务演示

    • 高度控制、方向控制、转向控制
    • 风格迁移和控制

三、大致方法

3.1 框架概述

┌─────────────────────────────────────────────────────────────────┐
│                      ControlVAE System                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  输入:无组织动作数据集 D = {τ̃_i}                                  │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  ControlVAE (生成式控制策略)                             │   │
│  │  - 编码器 q(z|s_t, s_{t+1}): 状态转移 → 技能嵌入         │   │
│  │  - 解码器/策略 π(a|s,z): 状态 + 技能 → 动作              │   │
│  │  - 条件先验 p(z|s): 状态 → 技能先验分布                  │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  World Model (世界模型) ω(s'|s,a)                        │   │
│  │  - 预测下一状态:给定当前状态和动作                      │   │
│  │  - 可微,允许梯度反向传播                                │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  训练:最大化 ELBO + 动作正则化                                  │
│       使用世界模型生成合成轨迹进行训练                          │
│                                                                 │
│  下游任务:训练高层策略 μ_g(s) → z                              │
│           使用学到的技能嵌入完成特定任务                        │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

3.2 核心组件

(1) 生成过程

ControlVAE 基于变分自编码器 (VAE) 框架。

ELBO (Evidence Lower Bound): $$\mathcal{L} = \mathbb{E}{q(z|s_t,s{t+1})}[\log p(s_{t+1}|s_t,z)] - D_{KL}(q(z_t|s_t,s_{t+1}) | p(z_t|s_t))$$

  • 第一项:重建损失(鼓励准确预测下一状态)
  • 第二项:KL 散度(鼓励后验分布接近先验分布)

(2) 状态条件先验

标准 VAE 先验的问题:

  • p(z) = N(0,I) 是状态无关的
  • 导致技能表示不一致

本文的条件先验: $$p(z_t|s_t) \sim \mathcal{N}(\mu_p(s_t; \theta_p), \sigma_p^2 I)$$

  • 均值 μ_p 是神经网络,输入是当前状态 s_t
  • 方差 σ_p 是超参数
  • 根据当前状态生成合适的先验分布

(3) 策略表示

技能条件策略: $$\pi(a_t|s_t, z_t) \sim \mathcal{N}(\mu_\pi, \Sigma_\pi)$$

  • 均值 μ_π(s_t, z_t; θ_π) 是神经网络
  • 输入:状态 s_t 和技能 z_t
  • 输出:动作分布(PD 控制器目标)

(4) 编码器

近似后验分布: $$q(z_t|s_t, s_{t+1}) \sim \mathcal{N}(\mu_q(s_t, s_{t+1}), \sigma_q^2 I)$$

  • 输入:状态转移 (s_t, s_{t+1})
  • 输出:技能嵌入 z_t

训练技巧:设置 μ_q 使得 KL 散度计算简化: $$D_{KL}(q | p) = \frac{\mu_q^T \mu_q}{2\sigma_p^2}$$


四、训练细节

4.1 世界模型

模型结构

世界模型学习预测下一状态: $$\omega(s_{t+1}|s_t, a_t) \sim \mathcal{N}(\mu_\omega(s_t, a_t), \Sigma_\omega(s_t, a_t))$$

输出:

  • 均值 μ_ω(s_t, a_t): 预测的下一状态
  • 协方差 Σ_ω(s_t, a_t) = diag(σ_ω²): 预测不确定性

世界模型训练

损失函数: $$\mathcal{L}\omega = \mathbb{E}{s_t, a_t, s_{t+1}}[||s_{t+1} - \mu_\omega(s_t, a_t)||W^2 + ||\log \sigma\omega + \frac{(s_{t+1} - \mu_\omega)^2}{2\sigma_\omega^2}||_1]$$

  • 第一项:状态预测误差
  • 第二项:不确定性校准

训练方式:

  • 从经验缓冲区采样真实轨迹
  • 最小化预测误差

4.2 ControlVAE 训练

损失函数

总损失: $$\mathcal{L} = \mathcal{L}{rec} + \mathcal{L}{kl} + \mathcal{L}_{act}$$

重建损失: $$\mathcal{L}{rec} = \sum{t=0}^{T-1} \gamma^t \mathbb{E}{q, \pi}[||\tilde{s}{t+1} - \mu_\omega(s_t, a_t)||_W^2]$$

  • s̃_{t+1}: 参考轨迹的下一状态
  • s_t: 合成轨迹的当前状态
  • a_t: 策略生成的动作

KL 损失: $$\mathcal{L}{kl} = \sum{t=0}^{T-1} \gamma^t \frac{||\mu_q(s_t, \tilde{s}_{t+1})||_2^2}{2\sigma_p^2}$$

动作正则化: $$\mathcal{L}{act} = \sum{t=0}^{T-1} \gamma^t (w_{a1}||a_t||1 + w{a2}||a_t||_2^2)$$

  • 防止过度的控制输入
  • 产生更平滑的动作

合成轨迹生成

训练过程:

  1. 从参考轨迹 D 中选择随机起始状态 s̃_0
  2. 使用策略 π(a|s,z) 在世界模型 ω 中展开轨迹
  3. 技能 z_t 从后验 q(z|s_t, s̃_{t+1}) 采样
  4. 使用重参数化技巧保证梯度反向传播

折扣因子:γ = 0.95

  • 降低不准确状态的权重
  • 合成轨迹会随时间偏离真实轨迹

4.3 数据平衡策略

问题

  • 数据集中包含多样化技能(走路、跑步、跳跃、起身等)
  • 简单动作(如走路)产生更长的模拟轨迹
  • 占据经验缓冲区,使 ControlVAE 难以学习困难技能

解决方案:基于状态的采样

状态价值计算: $$V_t^* = \sum_{k=0}^{T-t} \gamma^k r_{t+k} + \gamma^{T+1-t} V_{T+1}$$ $$V_t = (1-\alpha)V_t + \alpha V_t^*$$

奖励定义: $$r_t = \exp(-||W(\tilde{s}_t - s_t)||_1 / T_V)$$

  • T_V = 20: 温度参数
  • 跟踪误差越小,奖励越高

采样概率: $$P(s_t) \propto \frac{1}{\max(0.01, V_t)}$$

  • 低价值状态(困难技能)有更高采样概率
  • 每 200 个 epoch 更新一次价值

4.4 轨迹采样器

数据增强策略:

  • 在模拟过程中随机切换参考动作片段
  • 鼓励学习动作之间的新过渡
  • 新的起始状态也使用数据平衡策略选择

效果:

  • 许多切换会导致角色摔倒(姿势/速度不匹配)
  • 角色在训练中自动学习恢复策略
  • 鼓励先验分布嵌入多样化的动作过渡

4.5 训练算法

Algorithm 1: ControlVAE Training

输入:动作数据集 D
1: 初始化世界模型 ω, ControlVAE (π, q, p)
2: B ← ∅  // 经验缓冲区
3: for epoch = 1, ... do
4:   // 轨迹收集
5:   while |B'| < N_B' do
6:     根据状态价值从 D 采样起始状态 s̃_0
7:     s_0 ← s̃_0
8:     for t = 0, 1, ... do
9:       z_t ← q(z|s_t, s̃_{t+1})  // 重参数化采样
10:      a_t ← π(a|s_t, z_t)
11:      s_{t+1} ← ω(s_t, a_t)  // 模拟或世界模型
12:      if 摔倒或超时 then break
13:    end for
14:    存储轨迹到 B'
15:  end while
16:  B ← B ∪ B'  // 替换最旧的轨迹
17:
18:  // 更新世界模型
19:  for step = 1, ..., 8 do
20:    从 B 采样批次 {τ*}
21:    计算 L_ω 并更新 ω
22:  end for
23:
24:  // 更新 ControlVAE
25:  从 B 采样起始状态生成合成轨迹
26:  计算 L_rec + L_kl + L_act
27:  更新 π, q, p
28:
29:  // 更新状态价值
30:  if epoch % 200 == 0 then
31:    根据轨迹更新 V_t
32:  end if
33: end for

4.6 实现细节

参数值
经验缓冲区大小 N_B50,000
每 epoch 轨迹数 N_B'2,048
最大轨迹长度 T_max512
世界模型批次大小 N_w512
世界模型轨迹长度 T_w8
ControlVAE 批次大小 N_VAE512
ControlVAE 轨迹长度 T_VAE24
折扣因子 γ0.95
早终止时间 T_term1 秒
早终止距离 d_max0.5m

网络架构:

  • 所有网络使用 3 层 MLP
  • 隐藏层维度:512
  • ReLU 激活

训练时间:

  • 20,000 次迭代
  • 约 50 小时(4 线程并行)
  • CPU: Intel Xeon Gold 6240 @ 2.60GHz
  • GPU: NVIDIA GTX 2080Ti

五、下游任务

训练好 ControlVAE 后,可以学习高层策略来完成各种任务。

5.1 高度控制

任务:控制角色的身高

损失函数: $$\mathcal{L}_g = H \cdot h_0$$

  • h_0: 角色根关节高度
  • H ∈ {-1, 1}: 任务参数
    • H = -1: 蹲下直到躺在地上
    • H = 1: 站起来并尽可能跳高

5.2 方向控制

任务:朝目标方向以目标速度移动

损失函数: $$\mathcal{L}g = w{\theta_h}|\theta_h^* - \theta_h| + w_v \frac{|v^* - v|}{\max(v^*, 1)}$$

  • θ_h: 当前朝向
  • v: 当前速度
  • θ_h^*: 目标朝向
  • v^*: 目标速度 [0, 3] m/s
  • 权重:(w_θ, w_v) = (2.0, 1.0)

5.3 转向控制

任务:同时控制朝向和行进方向

损失函数: $$\mathcal{L}g = w{\theta_h}|\theta_h^* - \theta_h| + w_{\theta_v}|\theta_v^* - \theta_v| + w_v \frac{|v^* - ||\bar{v}_0||_2|}{\max(v^*, 1)}$$

  • θ_v: 行进方向角度
  • v_0: 根节点线速度的平面分量

5.4 风格控制

任务:在完成目标的同时保持特定风格(如跛行、悲伤行走)

方法:使用对抗训练

损失函数: $$\mathcal{L}g = \mathcal{L}{g'} + w_D \mathcal{L}_D + w_C \mathcal{L}C + w_r \mathcal{L}{reg}$$

  • L_{g'}: 目标任务损失
  • L_D: 对抗损失(区分真实/生成动作)
  • L_C: 分类器损失(确保正确的技能)
  • L_{reg}: 正则化项

鉴别器训练: $$\min_D \mathbb{E}{\tau_c}[(D(s_t, s{t+1}; c) - 1)^2] + \mathbb{E}{\tau_g}[(D(s_t, s{t+1}; c) + 1)^2] + w_g \mathbb{E}_{\tau_c}[||\nabla D||^2]$$


六、实验与结论

6.1 角色模型

  • 自由度: 未指定(标准人形角色)
  • 动作数据集: 包含走路、跑步、跳跃、起身等多样化长序列

6.2 评估结果

重建能力

  • 使用学到的后验 q(z|s,s') 作为跟踪控制
  • 角色准确执行输入动作
  • 在动作切换时自动平滑过渡
  • 极端情况下摔倒后自动恢复(起身动作不在数据集中)

随机采样

  • 从条件先验 p(z|s) 随机采样
  • 角色执行多样化技能:
    • 停止然后开始走路
    • 随机转向
    • 单脚跳、跳跃等

6.3 学习曲线

  • 约 10,000 次迭代后开始收敛
  • 动作质量持续提升
  • 完整训练 20,000 次迭代

6.4 下游任务表现

任务描述结果
高度控制蹲下/站起/跳跃✅ 能够精确控制
方向控制朝目标方向移动✅ 保持目标方向和速度
转向控制独立控制朝向和行进✅ 实现解耦控制
风格控制保持特定行走风格✅ 自然风格迁移

七、局限性

  1. 训练时间

    • 约 50 小时(虽有并行)
    • 对于实时应用仍然较长
  2. 世界模型误差累积

    • 合成轨迹随时间偏离真实轨迹
    • 使用折扣因子缓解但不能完全解决
  3. 技能表示维度

    • 固定维度的潜在空间可能限制技能多样性
    • 更复杂的技能可能需要更大的潜在空间
  4. 早终止策略

    • 头部跟踪误差阈值可能过于简单
    • 某些技能(如地面动作)可能被错误终止
  5. 数据依赖性

    • 需要多样化的动作数据集
    • 数据集中没有的技能难以学习

八、启发

8.1 方法学启发

  1. 条件先验的优势

    • 状态条件先验比标准正态先验更有效
    • 提供额外的上下文信息
    • 类似思想可应用于其他生成模型
  2. 模型强化学习的价值

    • 世界模型提供直接监督信号
    • 训练更稳定、样本效率更高
    • 避免了奖励工程的困难
  3. 数据平衡的重要性

    • 简单样本会主导训练
    • 需要显式平衡策略
    • 基于价值的采样是有效方法

8.2 与相关工作对比

方法先验类型学习方式技能多样性
ControlVAE状态条件模型强化学习高
AMP无显式先验对抗模仿高
ASE球形均匀对抗 + 无监督非常高
MCP组合权重强化学习中等

8.2.1 ControlVAE vs ASE:核心区别

ControlVAE 和 ASE 都学习技能嵌入 z,但先验设计哲学完全不同。

(1) 先验分布设计

方面ASE (199)ControlVAE (202)
预训练先验p(z) 球面均匀分布p(z|s) 状态条件高斯
z 与 s 关联预训练时无关预训练时就有关
关联方式后天学习(通过 ω)先天设计(通过 p(z|s))

ASE 的设计:

预训练阶段:
- z 从 p(z) 随机采样(与 s 无关)
- 策略 π(a|s, z) 学习"对任何 z 都能执行"
- 互信息最大化强制不同 z 产生不同行为

任务训练阶段:
- 高级策略 ω(z|s,g) 学习"什么状态用什么 z"
- z 与 s 的关联是后天学习的

优势:
- 技能库真正解耦(z 独立于 s)
- 高级策略可灵活学习任何 z-s 映射

ControlVAE 的设计:

预训练阶段:
- z 从 p(z|s) 采样(与 s 有关)
- p(z|s) = N(μ_p(s), σ_p²I) 直接输出条件先验
- 技能与状态天然关联

优势:
- 技能切换平滑
- 减少抽搐和摔倒

(2) 训练方式对比

方面ASE (199)ControlVAE (202)
训练方式对抗学习 + RL世界模型监督
判别器有(对抗训练)无(仅风格任务用)
世界模型无有(可微动力学)
训练稳定性较难(GAN+RL)更稳定(直接监督)
多样性保证互信息最大化KL 散度 + 数据平衡

(3) 推理流程对比

ASE 推理:

状态 s + 任务目标 g
         ↓
高级策略 ω(z|s,g)  ← 训练好的神经网络
         ↓
输出 z(技能代码)
         ↓
低级策略 π(a|s,z)  ← 预训练后固定
         ↓
输出动作 a

ControlVAE 推理:

状态 s + 任务目标 g
         ↓
高层策略 μ_g(s)  ← 训练好的神经网络
         ↓
输出 z(技能代码)
         ↓
策略 π(a|s,z)  ← VAE 解码器
         ↓
输出动作 a

(4) 适用场景

场景ASEControlVAE
需要技能多样性✅ 优(互信息保证)中
需要平滑切换中✅ 优(状态条件先验)
训练稳定性中✅ 优(直接监督)
大量下游任务✅ 优(预训练复用)中
技能解耦✅ 优(z 独立于 s)中

选择建议:

优先选择 ASE 的情况:
- 需要学习高度多样化的技能库
- 有大量下游任务需要复用
- 技能需要真正解耦(如独立控制)

优先选择 ControlVAE 的情况:
- 需要平滑的技能切换
- 训练稳定性要求高
- 技能与状态天然关联(如 locomotion)

8.3 实际应用价值

  • 游戏动画: 生成多样化 NPC 行为
  • 虚拟现实: 实时角色控制
  • 机器人: 技能学习和迁移
  • 影视动画: 自动生成中间动作

九、遗留问题

9.1 开放性问题

  1. 潜在空间结构

    • 技能在潜在空间中如何组织?
    • 能否实现更细粒度的技能控制?
  2. 零样本技能组合

    • 能否组合已学技能完成新任务?
    • 如何实现技能的层次化表示?
  3. 世界模型改进

    • 能否使用更强大的世界模型(如 Transformer)?
    • 如何处理长视野预测?
  4. 多角色泛化

    • 能否在一个模型中学习多个角色的技能?
    • 如何实现形态学迁移?

9.2 未来方向

论文提到的未来工作:

  • 扩展到更复杂的技能
  • 与高层任务规划结合
  • 改进世界模型准确性

十、关键公式总结

公式含义
p(z_ts_t) = N(μ_p(s_t), σ_p²I)
L = L_rec + L_kl + L_actControlVAE 总损失
L_rec = Σ γ^t E[
V_t ∝ 1/max(0.01, V_t)数据平衡采样概率
L_g = L_g' + w_D L_D + w_C L_C风格控制损失

十一、代码与资源

  • 项目主页: https://github.com/HeyuanYao/ControlVAE
  • 代码: GitHub 开源
  • 视频: 项目主页提供演示视频

笔记说明:ControlVAE 提出了一种基于模型的学习框架,结合 VAE 和世界模型实现高效的生成式控制。理解本文有助于学习基于物理的角色控制中的生成模型方法,与 AMP、ASE 等工作形成对比和互补。