MicroDuck 从零到真机(03):训练参数、采样预算与实验配置
读取官方 PPO 配置,解释环境数、rollout、mini-batch、网络、学习率、随机化和课程进度,并建立从冒烟测试到正式训练的参数调整方法。
训练参数应围绕三个问题选择:一次收集多少有效经验、每批经验更新网络多少次、策略是在什么难度下学习。把环境数和迭代数一起放大,只会让错误更快、更贵地重复。
1. 先把配置分成三层
| 层次 | 代表参数 | 改变的内容 |
|---|---|---|
| 环境与物理 | 地形、物理步长、质量、指令、随机化 | 策略正在解决的问题 |
| 学习器 | 网络、PPO clip、学习率、熵、GAE | 如何从数据更新策略 |
| 运行管理 | 并行环境数、迭代数、日志、保存间隔 | 采样规模、资源与可追溯性 |
源码中的 MicroduckRlCfg 位于行走任务配置末尾。CLI 覆盖适合一次实验的规模调整;任务级的奖励、事件和课程改动应保存在独立配置或代码提交中。
2. 固定版本的官方行走配方
下表是源码事实,不代表对所有任务都最优:
| 参数 | 值 | 用途 |
|---|---|---|
| actor/critic 隐层 | 512, 256, 128 |
两个网络各自的表达能力 |
| 激活 | ELU | 网络非线性 |
| 观测归一化 | 开启 | 调整不同量纲输入的尺度 |
| 初始动作标准差 | 1.0 |
初期探索强度 |
| rollout 长度 | 24 |
每次更新前每环境采样步数 |
| learning epochs | 5 |
每批采样数据复用轮数 |
| mini-batches | 4 |
每轮数据划分数 |
| learning rate | 1e-3,adaptive |
更新步长及自适应策略 |
| clip parameter | 0.2 |
PPO 概率比裁剪范围 |
| entropy coefficient | 0.01 |
鼓励探索 |
| gamma/lambda | 0.99 / 0.95 |
折扣与 GAE 平滑 |
| desired KL | 0.01 |
自适应更新尺度的参考 |
| max grad norm | 1.0 |
梯度裁剪 |
| 保存间隔 | 250 |
官方配置的检查点间隔 |
| max iterations | 50,000 |
配置中的上限;实际入门运行应显式覆盖 |
官方配置的 experiment_name 是 velocity,run_name 也是 velocity。这些值与社区 Isaac 项目的日志目录不同。实际运行仍以终端输出及保存的 params/agent.yaml 为准。
3. 用采样量理解环境数
设并行环境数为 N,每环境 rollout 步数为 T,则每次更新收集 B=N×T 条转移。在没有额外截断或特殊采样器的普通路径下:
| N | T | B | 4 个 mini-batch 时每批大小 |
|---|---|---|---|
| 64 | 24 | 1,536 | 384 |
| 256 | 24 | 6,144 | 1,536 |
| 1,024 | 24 | 24,576 | 6,144 |
| 4,096 | 24 | 98,304 | 24,576 |
5 个 epoch、4 个 mini-batch,意味着每次采样后执行约 20 个 mini-batch 更新步骤,而不是把 B 乘 20 当作新增环境经验。
50 Hz 控制下,单个环境的 24 步覆盖 0.48 秒。增加环境数提高同一更新中并行样本的数量;增加 T 则延长每条采样片段,并改变时间相关性与优势估计条件。两者不应视为相同旋钮。
例如 256 环境、4,000 次更新约对应 2,457.6 万条转移。这个数帮助核对采样预算,不能直接推算 T4 上要几小时,也不能与不同 reset 分布的实验等价比较。
4. 先让最小训练闭环结束
安装环境的方法见已有启动指南。在官方训练仓库根目录,先运行:
rtk proxy uv run train Mjlab-Velocity-Flat-MicroDuck \
--env.scene.num-envs 64 \
--agent.max-iterations 5 \
--agent.save-interval 1 \
--agent.logger tensorboard \
--agent.run-name smoke
这组参数是小规模检查方案,本文没有执行。它应检查初始化、PPO 更新、数值稳定性、配置保存和检查点重载。若显存不足,先查看其他进程,再缩小环境数;不要同时重写网络、奖励和物理参数。
第一次结束后,检查当前运行目录中的 model_*.pt、参数文件和事件日志;不要套用第三方项目的 model_final.pt 或自定义摘要名称。
5. 再扩大资源,最后延长实验
在小规模闭环通过后,可以按显存与实际吞吐逐步尝试 256、512、1024 个环境。以下是一个待验证的正式运行示例:
rtk proxy uv run train Mjlab-Velocity-Flat-MicroDuck \
--env.scene.num-envs 256 \
--agent.max-iterations 4000 \
--agent.logger tensorboard \
--agent.run-name baseline256
不要一次把“环境更多”“训练更久”“速度更快”“扰动更大”全打开。若策略失败,四种改变会混在一起,无法判断原因。先在同一任务配置下测显存峰值和每迭代耗时,再决定采样规模。
6. 随机化参数是任务的一部分
固定版本中,行走工厂包含以下设置:
| 项目 | 当前配置的例子 |
|---|---|
| 速度指令 | vx ±0.4 m/s、vy ±0.3 m/s、yaw ±1.0 rad/s |
| 原地转向 | 单独分配 15% 的环境指令桶 |
| 质量与惯量 | 联合缩放至基准的 0.95–1.05 |
| BAM 摩擦尺度 | 0.9–1.1 |
| 编码器偏置 | 每关节约 ±0.015 rad |
| 推扰间隔 | 3–6 秒 |
| 基座重心 | 从较小范围开始,随课程扩大 |
这些值只是该配方的假设。若实物更换电池、外壳、脚垫或舵机,应先量化差异再调整范围。过宽的随机化可能让训练总在解决不可能的平衡问题;完全关闭又会让策略过度依赖名义模型。
7. 课程用什么“时钟”推进
官方课程常使用 env.common_step_counter,即向量环境的控制步计数。对于每次更新采样 24 步的配置,500 次迭代大致对应 500×24 个向量环境步,而不是再乘环境数。
这意味着改变 num_steps_per_env 会影响按固定 step 阈值编写的课程落在哪一次迭代。改变环境数则改变相同课程阶段已经见过的总样本量。比较实验时,应同时记录课程阶段与样本量。
行走配置逐步增加站立指令比例,并把动作变化惩罚从较弱值分阶段加强。它不是任意时间连续插值;课程函数按阶段更新 manager 中实际生效的配置。
续训还会涉及计数器恢复。加载另一个任务的检查点用于新任务探索,与接着原实验跑不是一回事;应阅读官方 --init-checkpoint 和 warm-start 语义,不能只换 experiment_name 就以为课程从零开始。
8. 如何读日志并决定改哪个参数
| 现象 | 先检查 | 再考虑的调整 |
|---|---|---|
| KL 突增、行为迅速变坏 | 是否有 NaN、配置切换或异常样本 | 学习率、更新轮数 |
| 探索过早消失 | 动作标准差、熵与任务信号 | 熵系数、初始探索 |
| 一直抖动但不移动 | 速度项、动作尺度、接触和限位 | 奖励分配;不只降低学习率 |
| 总奖励上升却总趴着 | 分项奖励是否给了静态捷径 | 奖励设计与门控 |
| 在课程边界退步 | 该阶段改变了什么 | 推迟或细化课程阶段 |
| 显存溢出 | 环境数、地形复杂度与其他进程 | 缩小规模或简化非关键地形 |
每次只改变能回答当前假设的一组参数。为配置取有含义的运行名,保存实际配置文件,而不是只保留一条命令历史。
9. 建立最小实验记录
至少记录代码提交、依赖锁文件、机器人模型哈希、随机种子、任务名、命令、配置、检查点编号和回放条件。比较基线与改进版时,尽量保持相同评估指令、起始状态和扰动集合,并使用多个种子了解波动。
训练中也要定期回放早期、中期和最新检查点。最后一个检查点不一定行为最好;选择标准应包括跟踪误差、跌倒、停止表现、动作变化与可解释的视频观察。下一篇会解释为什么这些指标不能只压缩成一个总奖励。