NanoJev 专家轨迹采集实战:双环境同步 ViZDoom 如何让 AI 学会瞄准移动目标射击
【免费下载链接】NanoJevA nano replica of Jev: parallel decisions, dynamic candidates, and an end-to-end training pipeline.项目地址: https://gitcode.com/gh_mirrors/na/NanoJev
在NanoJev 专家轨迹采集实践中,如何用 ViZDoom 双环境同步机制采集高质量射击演示数据?NanoJev 是一个 0.6B 参数的并行决策模型,通过让一个"纯视觉专家"在一套冻结的 ViZDoom 环境中逐 tick 扮演射击高手,再把它的动作蒸馏给学生模型,最终让小模型学会在 Predict Position 场景中瞄准并击落移动目标。这篇文章带你看懂这条端到端管线的设计与验证细节。
什么是"专家轨迹采集"?
简单说:先请一位会打靶的老师,在固定关卡里打几百局游戏,把每一步的"观察 → 动作概率"完整记录下来,再让学生模型模仿学习。
NanoJev 的专家来自 Sonic Doom 发布的纯视觉 Predict Position 策略:一个 CNN + GRU 网络,只吃 RGB 画面,没有声音输入、没有自动瞄准、没有 Sonic Aim 辅助——它和任何普通玩家看到的画面一样,靠真本事打靶。
学生的任务则苛刻得多:每局只有一发火箭,目标会左右移动,必须在正确的时间选择shoot才能命中。候选动作只有 4 个:noop(等待)、left、right、shoot,每 4 个物理 tick 决策一次。
双环境同步:一台"专家机" + 一台"学生机"
采集脚本 sonic_predict_data.py 的核心是MirroredPredictEnvironment类:它同时启动两个同步的 ViZDoom 1.3.0 实例,像一对孪生游戏一样逐 tick 联动。
| 角色 | 画面 | 看到的素材 | 用途 |
|---|---|---|---|
| 专家环境 | 160×120 | 旧版 Freedoom 1.2.4 素材 | 喂给视觉专家做推理 |
| 学生环境 | 320×240 | 标准结构化可见状态 | 记录学生模型的真实输入 |
两个实例共享同一份场景配置、同一个随机种子、同样的按钮、奖励与终止规则。为什么要分两台机器?因为专家权重是按旧版 160×120 画面训练的(推理时会精确缩放为 128×72 CHW),直接换素材会破坏它的输入分布;而学生必须使用 NanoJev 标准的结构化观察。两边各取所需,又不互相污染。
关键约束写在协议文件 sonic_predict_supervision_v1.json 里:
- 每一步都必须通过tick 镜像检查:两台游戏的物理状态逐 tick 哈希比对,任何一个 tick 不一致就整局作废;
- 专家的每个画面输入都记录 6 项哈希(原始像素、缩放后 CHW、归一化输入、GRU 状态前后),形成完整的可审计链条;
- 学生观察中绝不插入专家的画面、隐藏状态或动作——学生只能靠自己的可见标签做决策;
- 每局结束后,还要在只有标准环境的干净实例里独立重放整条轨迹,验证奖励、转场与最终结果完全一致。
专家侧的加载同样严格:sonic_predict_policy.py 只允许以weights_only方式加载权重,并逐项校验检查点的 SHA256、配置字段(禁用声音与瞄准辅助、GRU 尺寸 512、frameskip=4 等),任何偏差都会直接报错拒绝加载。
从 896 局游戏到 11,173 个决策问题
采集产物是一个冻结的专家队列:
| 划分 | 局数 | 决策节奏 | 作用 |
|---|---|---|---|
| Train | 512 | 每 4 tick 决策一次 | 蒸馏训练 |
| Dev / Calibration | 64 + 64 | 每 4 tick | 模型选择 |
| Test | 128 | 每 4 tick | 分布内评估 |
| OOD | 128 | 每 8 tick | 决策节奏泛化评估 |
共17,498 条决策记录。随后 prepare_sonic_supervision.py 把它们整理成监督数据:
- 生成11,173 个 Predict Position 问题(其中 6,788 个训练问题);
- 每行问题提供两种目标:Hard(专家概率最高的动作)与Soft(专家完整的四动作概率分布);
- 原有 7,587 行 Maze、Snake、Basic 数据逐字节保留,最终每个数据集共18,760 行;
- 监督只保留"开火前仍有弹药"的观察,让学习聚焦在真正影响唯一一发火箭轨迹的决策上。
混合监督训练与最终战绩
训练由 run_sonic_supervision.py 编排,配置见 sonic_unified_sft_v1.json:四个对照组(Hard/Soft × 主干学习率 1e-5/2e-5),各自 600 次更新、固定种子 17、相同采样序列,按 dev 加权成功率选出hard_lr1e5的 step-400 检查点,随后才进入 548 局的闭式测试。
训练带来的提升非常直观(128 局测试集,全部策略共用 epsilon-greedy 控制器与种子 17):
| 模型 | Predict Position(移动目标射击) | Basic(静态射击) |
|---|---|---|
| NanoJev(混合专家 SFT 后) | 27/128 | 128/128 |
| 训练前的 NanoJev | 11/128 | 128/128 |
| Jev | 11/128 | 56/128 |
| 未调优 Qwen3-0.6B | 11/128 | 56/128 |
成功率从 8.6% 提升到21.1%,配对比较中赢了 Jev 25 局、只输 9 局(McNemar p≈0.009)。更重要的是零回归:Basic 仍保持 128/128,Snake 还从 6/8 涨到 8/8——同一个检查点通吃四个游戏。
本地复现要点
环境依赖很轻,只需要 requirements-vizdoom.txt 里的vizdoom==1.3.0与gymnasium==1.3.0(建议在虚拟环境中安装)。标准流程是两步:
- 采集:
python scripts/sonic_predict_data.py --cases configs/sonic_predict_supervision_v1_cases.jsonl --config configs/sonic_predict_supervision_v1.json ...,8 个 CPU 并行 worker,每局独立重放校验; - 制数与训练:
prepare_sonic_supervision.py产出 Hard/Soft 数据集,run_sonic_supervision.py跑四臂对照并生成完整报告。
完整协议、验证逻辑与复现命令详见 docs/SONIC_PREDICT_POSITION.md,完整评估结果与配对统计见 docs/SONIC_PREDICT_POSITION_RESULTS.md。
小结
这套管线的精髓在于**"严格"二字**:专家身份哈希冻结、双环境逐 tick 镜像、独立重放、目标有效性过滤、固定种子的对照训练——每一环都让最终数据不可篡改、可复现。对新手而言,它给出了一个可借鉴的完整范式:如何用双环境同步采集干净的专家轨迹,再用混合监督让小模型真正学会"看时机、瞄移动目标"的射击能力。
【免费下载链接】NanoJevA nano replica of Jev: parallel decisions, dynamic candidates, and an end-to-end training pipeline.项目地址: https://gitcode.com/gh_mirrors/na/NanoJev
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考