docs: actpred 模型 C 实验报告——固定范围归一化+逐列加权的闭环发散根因

teacher forcing val 0.000394 三方最优,但闭环 overall_mse 19843、
error_growth 13.4 首次发散。根因:spk.F 尺度放大(1 归一化单位
=5000Hz)与 w=0.2 放松叠加 exposure bias,自预测反馈滚雪球。
排除保留位列失控与推理端实现 bug。加权方案部分有效(hand 类
episode 2.2-2.8× 优于模型 B),需叠加 R1-B rollout(模型 D 训练中)。
This commit is contained in:
qing committed 2026-08-14 13:19:09 +00:00
1 parent 85bf68f505
commit b73628b2e5
1 file changed
+96
@@ -0,0 +1,96 @@
# actpred 模型 C 实验报告:固定范围归一化 + 逐列加权
> 文档类型:实验报告
> 模块:actpred
> 作者:自动生成
> 日期:2026-08-14
> 前置实验:`pybot_actpred_dataset_training_eval_20260814.md`(模型 A/B)
> 开发方案:`actpred_action_norm_weighting_plan_20260814.md`(本实验为其步骤 4)
> 后续实验:模型 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)
1. **尺度放大**:fixed_range 下 1 个归一化单位 = spk.F 5000Hz 原始量(z-score 下各列单位方差,单位误差对应原始量级相当)。spk.F 归一化空间漂移 ±0.2 → 原始 ±1000Hz
2. **权重放松**:w=0.2 使训练对 spk.F 施加 1/5 压力,配合 28 倍尺度放大,spk.F 成为闭环最脆弱列
3. **反馈滚雪球**:漂移后的 spk.F 回写历史 → 注意力被污染 → 舵机列(col 7)跟漂 → 误差逐轮放大(episode 内 growth 3.6-430×)
4. **teacher forcing 掩盖一切**:训练/验证喂真值历史,上述回路从未出现,故 val loss 0.000394 最优而闭环最差
### 4.3 直接诱因确认
- 保留位列(权重 0)预测值正常(±0.18)——**排除**"零权重列无梯度失控"假设
- 推理端归一/反归一逻辑正确(`predict.py` fixed_range 分支逐行核对)——**排除**实现 bug
- `denormalize_action` 不 clamp("保留模型外推能力"的设计决策)放大了越界值的回传,为次要因素
## 5. 结论
1. **逐列加权方案部分有效**:spk.F 跟踪达到三方最优(hand 类 2.2-2.8× 优于 B),方案目标"频率也要跟踪"达成
2. **方案不完整**:缩放方式(fixed_range)与列权重正交解耦后,暴露了**尺度放大 × exposure bias** 的叠加风险——单步 teacher forcing 训练无法抵御闭环反馈
3. **教训**: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 变换)