审查确认三篇方案(固定范围归一化+逐列加权、多头 one-hot、 安全图像增强)均已落地实现,删除对应文档;同步修复 4 篇 实验报告与 bins.py docstring 中的 6 处引用,MODULES.md 文档 计数更新为 64 篇。
4.9 KiB
4.9 KiB
actpred 模型 C 实验报告:固定范围归一化 + 逐列加权
文档类型:实验报告 模块:actpred 作者:自动生成 日期:2026-08-14 前置实验:
pybot_actpred_dataset_training_eval_20260814.md(模型 A/B) 后续实验:模型 D(fixed_range + 加权 + R1-B rollout),训练中
1. 实验设置
按开发方案步骤 4 训练对照模型 C:固定物理范围归一化 + 默认逐列权重。
| 项 | 值 |
|---|---|
| normalize_mode | fixed_range([0,1] min-max,action_norm.py 常量表) |
| column_weights | 默认:舵机 1.0 / spk 0.2 / 保留位 0.0 |
| 数据 / 种子 / 增强 | 与模型 A/B 相同(763/41 样本,seed 42,ColorJitter) |
| epochs / patience | 100 / 15 |
| checkpoint | actpred/checkpoints/recorded_run_fixed/ |
2. 训练结果(teacher forcing 口径)
- 34 epochs 触发 early stopping
- best val_loss = 0.000394(epoch 21)——三方最优(A: 19.02 原始量纲、B: 0.0288)
- train loss 收敛至 ~0.0004-0.0008
teacher forcing 口径下,方案目标完全达成:loss 数值稳定(<0.001)、保留位列剔除、spk 列仍保留梯度(w=0.2)。
3. 闭环评估(R4)——目标失败
| 指标 | 模型 A(raw) | 模型 B(zscore) | 模型 C(fixed+加权) |
|---|---|---|---|
| overall_mse | 6446.7 | 2445.4 | 19843.5 |
| error_growth | 0.005 | 0.082 | 13.43(发散) |
| smoothness_ratio | 0.147 | 1.047 | 3.19 |
| oob_rate(物理界) | — | 28.1% | 100% |
teacher forcing 指标与闭环行为完全背离:C 的训练/验证 loss 最好,闭环却首次出现发散(error_growth 13.4 > 1)。
3.1 逐 episode 闭环 mean_mse
| Episode | A | B | C | C 相对 B |
|---|---|---|---|---|
| 0000 stand | 25.5 | 134.0 | 52882.2 | 395× 恶化 |
| 0001 jump | 20.5 | 221.1 | 35228.6 | 159× 恶化 |
| 0002 left-hand | 21252.2 | 6849.7 | 2420.3 | 2.8× 改善 |
| 0003 left-turn | 276.0 | 641.0 | 3630.5 | 5.7× 恶化 |
| 0004 lie-down | 35.2 | 46.9 | 470.8 | 10× 恶化 |
| 0005 rght-hand | 21340.0 | 8022.9 | 3691.2 | 2.2× 改善 |
| 0007 stdd | 49.8 | 115.9 | 47180.4 | 407× 恶化 |
| 0008 t0 | 644.5 | 553.3 | 3927.6 | 7.1× 恶化 |
| 0009-0012 tilt-* | 29.8-34.2 | 59.6-751.7 | 45111-46268 | 61-775× 恶化 |
C 在 hand 类 episode(spk.F 大跨度)上三方最优(2.2-2.8× 优于 B),证明加权确实教好了频率跟踪;但其余 episode 全部严重发散。
4. 根因分析
4.1 逐列预测定位(episode_0000,76 步闭环滚动)
| 列 | 预测范围 | 真值 | 判定 |
|---|---|---|---|
| col 7 s8 舵机 | 1.6 → 159.0 | 0 | 舵机漂移 159° |
| col 10 spk.F | 27.6 → 1080.2 | 10 | 频率漂移 1080Hz |
| col 11 spk.delay | -9.8 → 12.6 | 10 | 负时延越界 |
| col 12-17 保留位 | ±0.18 | 0 | 正常(排除权重 0 列失控假设) |
4.2 发散机制(尺度放大 + exposure bias)
- 尺度放大:fixed_range 下 1 个归一化单位 = spk.F 5000Hz 原始量(z-score 下各列单位方差,单位误差对应原始量级相当)。spk.F 归一化空间漂移 ±0.2 → 原始 ±1000Hz
- 权重放松:w=0.2 使训练对 spk.F 施加 1/5 压力,配合 28 倍尺度放大,spk.F 成为闭环最脆弱列
- 反馈滚雪球:漂移后的 spk.F 回写历史 → 注意力被污染 → 舵机列(col 7)跟漂 → 误差逐轮放大(episode 内 growth 3.6-430×)
- teacher forcing 掩盖一切:训练/验证喂真值历史,上述回路从未出现,故 val loss 0.000394 最优而闭环最差
4.3 直接诱因确认
- 保留位列(权重 0)预测值正常(±0.18)——排除"零权重列无梯度失控"假设
- 推理端归一/反归一逻辑正确(
predict.pyfixed_range 分支逐行核对)——排除实现 bug denormalize_action不 clamp("保留模型外推能力"的设计决策)放大了越界值的回传,为次要因素
5. 结论
- 逐列加权方案部分有效:spk.F 跟踪达到三方最优(hand 类 2.2-2.8× 优于 B),方案目标"频率也要跟踪"达成
- 方案不完整:缩放方式(fixed_range)与列权重正交解耦后,暴露了尺度放大 × exposure bias 的叠加风险——单步 teacher forcing 训练无法抵御闭环反馈
- 教训:teacher forcing val loss 不能作为方案验收指标,必须过 R4 闭环评估;本实验正是 R4 的价值证明
6. 后续
- 模型 D(训练中):fixed_range + 加权 + R1-B rollout(
rollout_len=4, ss_prob=0.5),让模型在训练期面对自预测反馈,直击 exposure bias - 若 D 闭环仍不稳,备选路线(已在讨论中评估):
denormalize_action输出 clamp 到物理界(快速缓解)- one-hot 离散化 + CE(对数分箱 + 软标签):消除尺度放大、内置物理界、NPU 友好;代价是序数信息与数据需求
- spk.F 对数尺度(z-score 前 log 变换)