BeyondMimic 强化学习模型架构详解(机器人是如何学会时序动作)
·
BeyondMimic 强化学习模型架构详解(机器人是如何学会时序动作)
本文档系统梳理 BeyondMimic 项目中机器人运动跟踪的强化学习模型架构、输入输出设计、训练机制及部署流程。
1. 模型整体架构
1.1 核心组件
项目采用 Actor-Critic 架构的 PPO(近端策略优化)算法,包含两个独立的前馈神经网络:
- Actor(策略网络):输入当前观察,输出机器人的关节位置控制指令(动作)
- Critic(价值网络):评估当前状态的价值,用于训练时计算优势函数
- 经验归一化器:动态标准化观察数据,提高训练稳定性
1.2 算法选择理由
- PPO 算法:训练稳定性高,适合连续动作空间(关节角度控制)
- Actor-Critic 分离:Critic 提供低方差的优势估计,加速策略收敛
- 实时闭环控制:模型每帧(12.5Hz)根据最新状态决策,自然形成动作序列
2. 网络详细架构
2.1 隐藏层配置
所有机器人(PM01、PI Plus、HI)使用相同的三层 MLP 架构:
actor_hidden_dims=[512, 256, 128], # Actor 网络
critic_hidden_dims=[512, 256, 128], # Critic 网络
activation="elu", # 激活函数
2.2 网络变换过程
数学表示:
h₁ = ELU(W₁·x + b₁) # 输入 → 512维
h₂ = ELU(W₂·h₁ + b₂) # 512 → 256维
h₃ = ELU(W₃·h₂ + b₃) # 256 → 128维
输出 = 线性层(h₃) # 128 → 动作维度
以 PM01 的 Actor 为例(129维输入):
- 第一层权重
W₁形状:129 × 512(约66,048个参数) - 经过三层变换后输出24维动作(24个关节的目标位置)
2.3 配置位置
- 通用配置:
source/whole_body_tracking/whole_body_tracking/tasks/tracking/config/pm01/agents/rsl_rl_ppo_cfg.py - 训练日志:
logs/rsl_rl/pm01_flat/2026-04-18_17-03-04_test_run_fight1/params/agent.yaml
3. 输入维度分析
3.1 Actor vs Critic 输入差异
| 观察项 | Actor(策略网络) | Critic(价值网络) | 维度(PM01) |
|---|---|---|---|
| command | ✓ 运动命令 | ✓ 运动命令(无噪声) | 48维 |
| motion_anchor_pos_b | ✗ 禁用(PM01配置) | ✓ 锚点位置(无噪声) | 3维 |
| motion_anchor_ori_b | ✓ 锚点方向(带噪声) | ✓ 锚点方向(无噪声) | 6维 |
| body_pos | ✗ 无 | ✓ 机器人身体位置(特权信息) | 39维 |
| body_ori | ✗ 无 | ✓ 机器人身体方向(特权信息) | 78维 |
| base_lin_vel | ✗ 禁用(PM01配置) | ✓ 基座线速度(无噪声) | 3维 |
| base_ang_vel | ✓ 基座角速度(带噪声) | ✓ 基座角速度(无噪声) | 3维 |
| joint_pos | ✓ 关节位置(带噪声) | ✓ 关节位置(无噪声) | 24维 |
| joint_vel | ✓ 关节速度(带噪声) | ✓ 关节速度(无噪声) | 24维 |
| actions | ✓ 上一动作(无噪声) | ✓ 上一动作(无噪声) | 24维 |
| 总计维度 | 129维 | 约252维 | - |
3.2 不同机器人输入维度对比
| 机器人 | Actor输入维度 | Critic输入维度(估算) | 动作维度 |
|---|---|---|---|
| PM01 | 129维 | ~252维 | 24 |
| PI Plus | 119维 | ~242维 | 22 |
| HI | 124维 | ~247维 | 23 |
3.3 观察项详细说明(PM01 Actor)
| 观察项 | 维度 | 说明 | 噪声配置 |
|---|---|---|---|
| command | 48 | 运动命令:参考关节位置(24)+参考身体位置/方向(24) | 无 |
| motion_ref_ori_b | 6 | 参考锚点方向(旋转矩阵前两行) | ±0.05 |
| base_ang_vel | 3 | 基座角速度(ω_x, ω_y, ω_z) | ±0.2 |
| joint_pos | 24 | 当前关节位置(相对参考姿态) | ±0.01 |
| joint_vel | 24 | 当前关节速度 | ±0.5 |
| actions | 24 | 上一时间步执行的动作 | 无 |
配置位置:
- 观察定义:
source/whole_body_tracking/whole_body_tracking/tasks/tracking/tracking_env_cfg.py:156-247 - PM01 特定配置:
source/whole_body_tracking/whole_body_tracking/tasks/tracking/config/pm01/flat_env_cfg.py:119-135 - 维度验证:
scripts/sim2sim.py:145-152
4. 输出维度分析
4.1 Actor 输出
- 维度:等于机器人关节数量
- PM01: 24维(24个关节的目标位置)
- PI Plus: 22维
- HI: 23维
- 范围:关节位置控制指令,经过动作缩放(
PM01_ACTION_SCALE) - 控制频率:12.5Hz(仿真200Hz,控制抽取率 decimation=4)
4.2 Critic 输出
- 维度:1维标量,表示当前状态的价值 V(s)
- 用途:仅用于训练阶段计算优势函数
5. Actor 和 Critic 交互机制(PPO算法流程)
5.1 训练阶段交互
收集数据 → 计算优势函数 → 更新网络
↓ ↓ ↓
Actor Critic 同时更新
5.2 详细步骤
步骤1:数据收集(并行4096个环境)
动作 = Actor(当前观察) # Actor决策(129维输入)
奖励, 新观察 = 环境.step(动作) # 执行动作
存储(观察, 动作, 奖励, 新观察) # 收集轨迹数据
步骤2:优势函数计算(Critic的核心作用)
价值 = Critic(状态) # Critic评估(252维输入)
回报 = 累计折扣奖励 # R = Σγ^t * r_t
优势 = 回报 - 价值 # A(s,a) = R - V(s)
# 实际使用广义优势估计(GAE)
优势_GAE = Σ(γλ)^t * δ_t # δ_t = r_t + γV(s_{t+1}) - V(s_t)
步骤3:网络更新(PPO核心)
# Actor更新:最大化"裁剪"后的策略改进
ratio = π_新(a|s) / π_旧(a|s) # 新旧策略概率比
目标 = min(ratio·优势, clip(ratio, 1-ε, 1+ε)·优势)
损失_Actor = -mean(目标) # 最大化期望奖励
# Critic更新:最小化价值误差
损失_Critic = mean((回报 - Critic(s))²) # 最小化价值预测误差
# 联合优化
总损失 = 损失_Actor + 损失_Critic
5.3 设计思路
| 角色 | 比喻 | 输入特点 | 输出用途 |
|---|---|---|---|
| Actor | “盲人舞者” | 带噪声的有限观察 | 实时动作决策 |
| Critic | “全知教练” | 精确的完整状态 | 评估动作质量,指导学习 |
6. 训练与部署的区别
6.1 组件使用对比
| 阶段 | Actor | Critic | 经验归一化器 | 运动命令模块 |
|---|---|---|---|---|
| 训练 | ✓ 决策动作 | ✓ 计算优势 | ✓ 动态归一化 | ✓ 提供参考运动 |
| 部署 | ✓ 实时控制 | ✗ 不需要 | ✓ 固定参数 | ✓ 提供参考运动 |
| 验证 | ✓ 性能测试 | ✗ 可选 | ✓ 固定参数 | ✓ 提供参考运动 |
6.2 模型导出
关键代码(source/whole_body_tracking/whole_body_tracking/utils/exporter.py:50):
def forward(self, x, time_step):
return self.actor(self.normalizer(x)) # 只导出Actor!
导出流程:
- 训练完成后固定经验归一化器参数
- 将Actor网络转换为ONNX格式
- 可选转换为RKNN格式用于嵌入式部署
6.3 部署优化
- 计算精简:仅保留Actor,推理速度快
- 内存节省:Critic网络不加载,减少内存占用
- 实时性:12.5Hz控制频率满足实时要求
7. 动作时长对网络大小的影响
7.1 核心结论
动作时长(如1分钟 vs 半分钟)本身通常不需要调整网络大小。
7.2 原因分析
| 因素 | 说明 |
|---|---|
| 输入维度不变 | 观察空间维度由机器人状态决定,与动作时长无关 |
| 输出维度不变 | 动作空间维度等于机器人关节数,固定不变 |
| 任务本质相同 | 都是"跟随当前参考姿态",无论参考姿态来自多长的动画 |
| 训练数据采样 | 训练时随机采样运动片段(通常10秒),不直接处理完整长序列 |
7.3 何时可能需要调整网络
| 情况 | 是否需要调整网络 | 更有效的解决方案 |
|---|---|---|
| 动作复杂度显著增加 | 可能 | 如果1分钟动作包含更复杂的动态(快速转身、跳跃组合等) |
| 训练收敛慢或效果差 | 可尝试 | 先调整超参数(学习率、批大小) |
| 过拟合明显 | 需要减小 | 如网络容量远大于任务需求 |
| 需要长时序建模 | 需要结构调整 | 当前MLP缺乏显式记忆,可考虑添加LSTM层 |
7.4 调整建议
配置文件位置:source/whole_body_tracking/whole_body_tracking/tasks/tracking/config/pm01/agents/rsl_rl_ppo_cfg.py
修改方法:
# 当前配置
actor_hidden_dims=[512, 256, 128]
critic_hidden_dims=[512, 256, 128]
# 增大容量(增加50%)
actor_hidden_dims=[768, 384, 192]
critic_hidden_dims=[768, 384, 192]
# 减小容量(轻量化)
actor_hidden_dims=[256, 128, 64]
critic_hidden_dims=[256, 128, 64]
推荐调试顺序:
- 基准测试:先用默认网络训练长动作
- 超参数调优:调整学习率、训练轮数等
- 网络调整:如效果仍不佳,按20-30%幅度逐步增大网络
- 架构变更:极少数情况可考虑添加LSTM(需修改rsl_rl底层实现)
8. 观察空间设计原理
8.1 时序信息编码
虽然网络是静态前馈MLP,但观察中包含了足够的时序上下文:
| 观察项 | 时序信息 | 作用 |
|---|---|---|
| joint_vel | 关节运动的瞬时变化率 | 提供时间导数信息 |
| actions | 上一时刻执行的动作 | 显式的一步历史记忆 |
| 运动命令 | 当前及未来的参考轨迹 | 模型可据此预测即将到来的动作 |
8.2 噪声设计策略
# Actor观察噪声配置(模拟传感器误差)
motion_anchor_ori_b: noise=Unoise(n_min=-0.05, n_max=0.05) # 方向噪声
base_ang_vel: noise=Unoise(n_min=-0.2, n_max=0.2) # 角速度噪声
joint_pos: noise=Unoise(n_min=-0.01, n_max=0.01) # 位置噪声
joint_vel: noise=Unoise(n_min=-0.5, n_max=0.5) # 速度噪声
8.3 特权信息设计
Critic接收的额外信息(Actor没有):
- body_pos:机器人各身体部位的精确3D位置
- body_ori:机器人各身体部位的精确方向
- 无噪声观察:所有观察项均为精确值
9. 序列动作执行原理
9.1 闭环控制循环
仿真步进(200Hz) → 观察获取 → 策略推理 → 动作施加 → 循环重复
↓
12.5Hz控制频率
9.2 为什么MLP能处理序列?
| 因素 | 说明 |
|---|---|
| 闭环实时控制 | 模型每80ms被调用一次,根据最新状态产生动作 |
| 观察含时序信息 | 关节速度、上一动作、参考运动命令提供时间上下文 |
| 运动命令引导 | 每一帧都提供当前及未来的参考姿态 |
| 训练目标 | 奖励函数鼓励跟踪整个运动轨迹,而非单一时刻姿态 |
| 前馈网络高效性 | MLP推理速度快,适合实时控制 |
10. 工程经验与最佳实践
10.1 性能优化建议
- 数据质量优先:确保运动数据(NPZ文件)平滑、物理可行
- 奖励函数调优:调整各奖励项权重,平衡跟踪精度与动作平滑性
- 域随机化强度:适当增加物理参数随机化范围,提高sim-to-real性能
- 训练稳定性:启用经验归一化(
empirical_normalization = True)
10.2 故障排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 训练收敛慢 | 网络容量不足/学习率不当 | 调整超参数,验证数据质量 |
| 过拟合明显 | 网络容量过大 | 减小网络规模,增加正则化 |
| 动作不连贯 | 观察中时序信息不足 | 检查joint_vel和上一动作是否正常 |
| sim-to-real差距大 | 域随机化不足 | 增加摩擦、质心、外部扰动等随机化 |
10.3 验证与测试
# 1. 训练策略
python scripts/rsl_rl/train.py --task=Tracking-Flat-PM01-Wo-v0 --headless
# 2. 播放训练策略
python scripts/rsl_rl/play.py --task=Tracking-Flat-PM01-Wo-v0 --checkpoint {model_path}.pt
# 3. MuJoCo验证(sim2sim)
python scripts/sim2sim.py --robot pm01 --policy_path {model_path}.onnx
# 4. 导出部署模型
python -c "from whole_body_tracking.utils.exporter import export_motion_policy_as_onnx; ..."
附录:关键配置文件路径
| 文件 | 路径 | 说明 |
|---|---|---|
| 模型配置 | source/whole_body_tracking/whole_body_tracking/tasks/tracking/config/pm01/agents/rsl_rl_ppo_cfg.py |
PPO超参数、网络架构 |
| 环境配置 | source/whole_body_tracking/whole_body_tracking/tasks/tracking/config/pm01/flat_env_cfg.py |
PM01特定观察、动作设置 |
| 基础环境 | source/whole_body_tracking/whole_body_tracking/tasks/tracking/tracking_env_cfg.py |
通用观察、奖励、终止条件 |
| 训练脚本 | scripts/rsl_rl/train.py |
主要训练流程 |
| 模型导出 | source/whole_body_tracking/whole_body_tracking/utils/exporter.py |
ONNX导出工具 |
| 验证脚本 | scripts/sim2sim.py |
MuJoCo跨仿真验证 |
总结
BeyondMimic 的强化学习模型通过设计的 Actor-Critic 架构,实现了人形机器人运动跟踪:
- 架构简洁高效:三层MLP(512→256→128)平衡表达能力和计算效率
- 输入设计智能:Actor带噪声观察提高鲁棒性,Critic特权信息确保准确评估
- 训练机制稳定:PPO算法配合经验归一化,实现稳定收敛
- 部署优化充分:训练-部署解耦,仅保留轻量级Actor满足实时要求
- 扩展性强:模块化设计支持不同机器人、不同动作的快速适配
这种设计在保持实时性能的同时,实现了高质量的动态运动模仿,为人形机器人控制提供了可靠的解决方案。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐




所有评论(0)