G1-23dof 强化学习超参数系统调优指南
文档版本:V1.0
机器人平台:Unitree G1-23dof
仿真框架:IsaacLab 2.3.0 + IsaacSim 5.1.0
编写日期:2026-04-12
适用任务:Velocity / CPG-Flat / Fusion V0~V11
1. 超参数分类体系
G1-23dof 训练涉及的超参数分为 6 大类:
| 类别 |
参数数量 |
调参难度 |
优先级 |
| PPO 算法参数 |
10+ |
★★☆ |
P0 |
| 网络结构参数 |
5+ |
★☆☆ |
P1 |
| 奖励函数权重 |
17~27 |
★★★ |
P0 |
| 传感器配置 |
8+ |
★★☆ |
P1 |
| 环境随机化 |
10+ |
★☆☆ |
P2 |
| Curriculum 学习 |
5+ |
★★★ |
P1 |
2. PPO 算法超参数
2.1 学习率(Learning Rate)
learning_rate: 3e-4 # MLP/Attention
encoder_learning_rate: 1e-4 # 视觉编码器(Fusion 专用)
| 场景 |
推荐范围 |
观察指标 |
| 初期探索(0~5k iter) |
3e-4 ~ 5e-4 |
noise_std 快速下降 |
| 稳定收敛(5k~20k iter) |
1e-4 ~ 3e-4 |
reward 持续上升 |
| 精细调整(20k+ iter) |
5e-5 ~ 1e-4 |
KL divergence 稳定 |
| 过高(>1e-3) |
— |
loss 发散、reward 震荡 |
| 过低(<5e-5) |
— |
收敛极慢、陷入局部最优 |
自适应调度(schedule="adaptive"):
# 当 KL(π_new || π_old) > desired_kl 时,自动降低学习率
desired_kl = 0.008 # 对于 78D 输入,0.008 是合理阈值
# KL 过大 → 策略更新太激进 → 降 lr
# KL 过小 → 策略更新太保守 → 升 lr
2.2 PPO 裁剪参数(Clip Parameter)
clip_param = 0.2 # PPO epsilon 裁剪范围
| clip_param |
效果 |
| 0.1 |
极保守,策略更新幅度受限,收敛慢 |
| 0.2(推荐) |
平衡探索与利用 |
| 0.3 |
更激进,可能提升最终性能但不稳定 |
| 0.5 |
几乎退化为随机策略,训练崩溃风险 |
2.3 Epoch 和 Mini-Batch
num_learning_epochs = 5 # 每次收集数据后更新次数
num_mini_batches = 16 # 将数据分成多少个 mini-batch
# 总更新次数 = 5 epochs × 16 mini-batches = 80 次/iteration
# 实际 batch_size = num_envs × num_steps_per_env / num_mini_batches
# = 4096 × 24 / 16 = 6144 samples/mini-batch
| 参数 |
过大影响 |
过小影响 |
num_learning_epochs |
过拟合、数据效率低 |
梯度估计噪声大 |
num_mini_batches |
梯度估计稳定、显存增加 |
方差大、收敛不稳定 |
2.4 折扣因子和 GAE
gamma = 0.99 # 折扣因子(1-step 回报)
lam = 0.95 # GAE lambda(优势估计平滑度)
| 参数组合 |
适用场景 |
| γ=0.99, λ=0.95(推荐) |
标准行走任务 |
| γ=0.995, λ=0.98 |
需要更长时序规划的任务 |
| γ=0.99, λ=0.8 |
需要快速响应变化(高频重启环境) |
物理意义:
- γ 控制视野:0.99 意味着 100 步后的奖励仍有 ~37% 权重
- λ 控制优势估计的偏差-方差权衡:λ=1 偏向蒙特卡洛(高方差无偏),λ=0 偏向 TD(低方差有偏)
2.5 熵正则化(Entropy Coefficient)
entropy_coef = 0.008 # (Fusion V11)
entropy_coef = 0.01 # (Velocity)
| 权重 |
效果 |
| 0.0 |
无探索,策略快速收敛但可能陷入局部最优 |
| 0.001 |
轻度探索 |
| 0.008~0.01(推荐) |
适度探索,平衡 |
| 0.05 |
过度探索,reward 下降 |
监控指标:Entropy / Episode_Reward / entropy_coef
健康的熵衰减曲线:
Iteration 0: Entropy ≈ 3.5 (高探索)
Iteration 1000: Entropy ≈ 2.8 (逐渐收敛)
Iteration 5000: Entropy ≈ 2.2 (稳定策略)
Iteration 10000+: Entropy ≈ 1.9 (收敛完成)
3. 网络结构超参数
3.1 隐层维度
actor_hidden_dims = [512, 256, 128] # 标准配置
critic_hidden_dims = [512, 256, 128] # 同 Actor
# 可调维度映射:
# 78D proprio → [512] → [256] → [128] → 23D
# 142D fused → [512] → [256] → [128] → 23D
| 配置 |
适用场景 |
显存占用 |
| [256, 128, 64] |
小规模测试、快速原型 |
低 |
| [512, 256, 128](推荐) |
标准训练 |
中 |
| [1024, 512, 256] |
大规模并行、复杂任务 |
高 |
3.2 激活函数
activation = "elu" # ELU: f(x) = x if x>0 else α(e^x - 1)
| 激活函数 |
优点 |
缺点 |
| ELU(推荐) |
负值区有梯度,收敛快 |
计算量略大 |
| ReLU |
简单高效 |
负值区死亡梯度 |
| Tanh |
输出有界 [-1, 1] |
梯度消失 |
| GELU |
Transformer 常用 |
需 CUDA 支持 |
3.3 动作噪声标准差
init_noise_std = 1.0 # 初始动作噪声
# 策略输出: tanh(mean) + noise_std * N(0,1)
| 初始 std |
效果 |
| 0.1 |
低探索,仅适用于从已有策略微调 |
| 0.5 |
中等探索 |
| 1.0(推荐) |
高探索,适合从零训练 |
| 2.0 |
极高探索,初期 reward 可能很低 |
自适应 std(可选):noise_std 随训练自动衰减
4. 奖励函数权重调参
4.1 调参优先级矩阵
| 奖励项 |
优先级 |
调整难度 |
典型范围 |
track_lin_vel_xy |
P0 |
★★☆ |
1.0 ~ 3.0 |
alive |
P0 |
★☆☆ |
0.1 ~ 0.2 |
base_height |
P0 |
★★☆ |
-5.0 ~ -15.0 |
flat_orientation_l2 |
P1 |
★★☆ |
-1.0 ~ -5.0 |
feet_gait |
P1 |
★★☆ |
0.3 ~ 1.0 |
feet_clearance |
P1 |
★★☆ |
0.5 ~ 2.0 |
action_rate |
P2 |
★☆☆ |
-0.01 ~ -0.05 |
joint_vel |
P2 |
★☆☆ |
-0.0005 ~ -0.002 |
4.2 调参思路
问题 1:机器人走路像滑行(不抬脚)
原因:feet_clearance 权重过低,或 gait 奖励不足
解决:feet_clearance 1.0 → 2.0,feet_gait 0.3 → 0.8
问题 2:机器人偏向摔倒(reward 升高但实际摔倒快)
原因:alive 权重过高,掩盖了其他惩罚
解决:alive 0.15 → 0.05,增强 base_height + flat_orientation
问题 3:步态不规律(时而快走时而慢走)
原因:缺少周期步态奖励约束
解决:增加 feet_gait 0.5,或增加 action_rate -0.05
问题 4:关节能量消耗过高
原因:energy 权重过低
解决:energy -2e-5 → -5e-5,配合 joint_vel -0.001 → -0.003
4.3 奖励权重平衡检查
# 经验法则:主要任务奖励总和 ≈ 1.0~2.0
task_total = track_lin_vel_xy + track_ang_vel_z + alive + feet_gait + feet_clearance
# → 应该是正值的主要来源
# Safety 惩罚总和应适中,不应完全压制正奖励
safety_total = abs(base_height) + abs(flat_orientation) + abs(undesired_contacts)
# → 如果 safety_total >> task_total,策略无法学习
# 合理比例:task_total / |safety_total| ≈ 0.2 ~ 0.5
# 即正奖励的绝对值应该是安全惩罚的 2~5 倍
5. 传感器超参数
5.1 Depth Camera
| 参数 |
默认值 |
调整影响 |
max_distance |
5.0m |
过小:看不到远处障碍;过大:分辨率浪费 |
height |
48 |
影响卷积特征粒度 |
width |
64 |
影响水平视野分辨率 |
5.2 Height Scanner
| 参数 |
默认值 |
调整影响 |
resolution |
0.1m(10cm) |
过粗:漏掉小障碍;过细:维度爆炸 |
size |
[1.6, 1.0] |
扫描范围,过小看不到脚前方 |
5.3 LiDAR
| 参数 |
默认值 |
调整影响 |
num_azimuth |
360 |
每圈射线数,影响角度分辨率 |
num_channels |
8 |
垂直层数,影响俯仰视野 |
max_range |
10.0m |
最大探测距离 |
6. Curriculum 超参数
6.1 Terrain Curriculum
terrain_levels = CurrTerm(func=mdp.terrain_levels_vel)
# 或
terrain_levels = CurrTerm(func=failure_adaptive_terrain_curriculum)
| 类型 |
适用场景 |
参数 |
terrain_levels_vel |
标准速度任务 |
成功率阈值自动升降 |
failure_adaptive_terrain_curriculum |
Fusion 复杂地形 |
失败驱动的难度适应 |
quality_gated_terrain_curriculum |
V11 最终版 |
距离 + 存活率双门控 |
6.2 Quality-Gated Curriculum(V11)
# 门控条件:同时满足才升级难度
min_distance = 2.0 # 单 episode 至少走 2m
min_survival_rate = 0.6 # 存活率 > 60%
# 优势:防止"转圈也能升级"的漏洞
# 转圈机器人距离短但存活率高,quality-gated 堵住此漏洞
7. 调参流程实战
7.1 推荐调参顺序
Step 1: 验证基础训练(默认超参数)
→ 检查 reward 曲线是否单调上升
→ 检查 episode_length 是否合理(>300)
Step 2: 优先调学习率(3e-4 → 1e-4 → 5e-4)
→ 观察 KL divergence 是否稳定
Step 3: 调奖励权重(先 task,再 safety)
→ 如果 track_lin_vel 不上升:增大权重或减少干扰项
→ 如果姿态很差:增强 base_height + flat_orientation
Step 4: 调 PPO 参数(clip_param + entropy_coef)
→ 不稳定:降低 clip_param 或增大 entropy_coef
→ 收敛慢:适当提高学习率
Step 5: Curriculum 调整
→ 升级太快:提高 min_survival_rate
→ 升级太慢:降低 min_survival_rate 或增加 init_terrain_level
7.2 快速验证清单
| 检查项 |
健康指标 |
| Reward 曲线 |
单调上升,无剧烈震荡 |
| Episode length |
>500(10秒以上存活) |
| noise_std |
初期下降,后期稳定 |
| Policy entropy |
逐渐降低但不趋于零 |
| Value loss |
< 1.0,稳定 |
| KL divergence |
< 0.02,若持续 >0.05 需降学习率 |
版本记录
| 版本 |
日期 |
修改内容 |
作者 |
| V1.0 |
2026-04-12 |
初始版本,超参数系统调优指南 |
AI Assistant |
本文档由 AI 辅助整理自 unitree_lab_locomotion 仓库源码