docs(actpred): 研究方向 R8 细化——三层流水线离线 RL + 样本级验证集报告

R8 细化:预训练→监督微调→离线 RL 流水线定稿;IQL/CQL/DT 选型对比;
IMU 奖励工程四分量(姿态稳定/抖动/平滑/任务进度);三阶段落地路径。
新增样本级验证集划分实验报告(整集 60 样本噪声大 → 样本级 142 样本
更稳,F2b 在更难验证集上取得更低 val)。实现:val_split_mode 默认
sample,dataset sample_indices 过滤 + zscore 统计口径保持训练集专属。
This commit is contained in:
qing committed 2026-08-15 03:52:27 +00:00
1 parent 8cf3dd2d93
commit 13beba09b4
6 files changed
+192 -4

No files matched your search

@@ -130,6 +130,52 @@ actpred 的状态表征——模型对自身俯仰/横滚/角速度是盲的。
**R8 的洞察**:离线 RL 正好契合"数据已有 + 不能实机探索"的现状。但前提是 R9 的奖励信号。
### R8 细化:预训练 → 监督微调 → 离线 RL 三层流水线
**流水线形态**(基于 2026-08 实验进展的定稿):
```
阶段 0 预训练(.mt 动作动力学) → 已有(pretrain_mt)
阶段 1 监督微调(录制 episode,MSE/CE)→ 已有(train.py)
阶段 2 离线 RL(录制数据 + IMU 奖励) → 待建(本细化)
```
**为什么离线而非在线**:在线探索在真机上有物理风险(舵机乱动、碰撞),且 R4 已证明闭环
反馈敏感——RL 探索的随机扰动会放大不稳定。离线 RL 从固定数据集学策略,零硬件风险。
**算法选型**:
| 算法 | 形态 | 适配度 |
|------|------|--------|
| IQL | 隐式 Q 学习,数据高效 | 首选:单策略、录制数据规模小 |
| CQL | 保守 Q 惩罚,抗分布外 | 备选:数据质量差时更稳 |
| 决策 Transformer(DT) | 回报条件化,无价值网络 | 简替:实现最简,但回报需已知 |
**IMU 奖励工程(R9 落地)**——传感器从"输入"变"监督信号":
| 奖励分量 | 公式(示意) | 物理意义 |
|---------|-------------|---------|
| 姿态稳定 | r₁ = -α·(|roll| + |pitch|) | 越正越接近站直 |
| 抖动惩罚 | r₂ = -β·var(角加速度) | 平滑运动,节能 |
| 动作平滑 | r₃ = -γ·Σ‖aₜ - aₜ₋₁‖ | 与 R4 平滑度指标同源 |
| 任务进度 | r₄ = 姿态变化率(完成检测) | 驱动任务完成 |
奖励为标量加权和:R = Σwᵢrᵢ。设计难点在于权重标定——需实机 IMU 统计
(静止 vs 动作时的量级差)确定 α/β/γ。
**落地路径**:
```
阶段 A(数据前提): 实机 --record 采集 + IMU 统计标定奖励权重
阶段 B(离线 RL): IQL 在录制数据上训练,R4 闭环对比监督基线
阶段 C(安全在线): 小幅度动作扰动微调 + 动作界/速率保护
```
**与当前实验的衔接**:one-hot 方案(F 系列)的固定列机制与有界输出天然
兼容 RL 的动作扰动保护;样本级验证集划分(20260815)为 RL 的价值函数
评估提供更稳的口径。R8 的前提不变:奖励信号(R9)与真实数据缺一不可——
当前 dry-run 数据(噪声帧 + 零 IMU)对 RL 无意义。
### Tier 3 · 远景(与 aibox 联动)
- **R11 语言条件策略**:aibox 高层语言指令("向前走""左转")作为条件,actpred 出低层动作——
@@ -0,0 +1,59 @@
# actpred 验证集划分方式实验报告:整集 vs 样本级随机
> 文档类型:实验报告
> 模块:actpred
> 作者:自动生成
> 日期:2026-08-15
> 前置:`actpred_zscore_baseline_20260815.md`(模型 B 基线)、
> `actpred_onehot_multihead_dev_plan_20260814.md`(one-hot 方案)
---
## 1. 问题
模型 F/F2 系列(one-hot,v2 数据)出现**过拟合签名**:train loss 持续下降(2.40→1.57)而 val loss 平台后上行(1.73→2.09),且 val 波动剧烈(区间 1.74-2.0)。
排查后发现**选模信号本身有缺陷**:
- 旧划分方式(`split_episodes`)按 **episode 整集划分**:val_split=0.15 × 12 集 → 验证集只有 **1 个 episode、60 个样本**
- 60 个样本全来自同一集(tilt 类),val loss 主要反映"这一集的难度"而非泛化能力
- 波动大 + 分布偏 → early stopping 的 best 模型选择被噪声主导
## 2. 方案:样本级随机划分
新增 `--val-split-mode {episode, sample}`(**新默认 sample**):
- `dataset.py`:`ActionDataset` 新增 `sample_indices` 参数(构建后按索引过滤);**zscore 统计量仍只由训练子集计算**(经 stats 文件复用给验证集,统计口径正确性不变)
- `train.py`:sample 模式下先建全量数据集取样本索引,按 seed 42 随机排列,取 val_ratio 为验证集
- 效果:验证集从 60 → **142 样本**(810 train / 142 val),跨全部 12 个 episode 混合
## 3. 结果对比(同配置:onehot + spk 固定 + v2 数据)
| | F2(整集划分) | F2b(样本级划分) |
|---|---|---|
| 验证集 | 60 样本(1 集) | 142 样本(12 集混合) |
| val 起点 | 1.914 | 2.056(更难、更有代表性) |
| 最优 | 1.737(epoch 7) | **1.695(epoch 5,仍在下降)** |
| 收敛形态 | 平台后上行(过拟合签名) | 平滑连续下降 |
| val 波动 | ±0.15(1.74-2.0) | ±0.05(无跳变) |
F2b 在更难的代表性验证集上取得**更低的 val loss**,且曲线平滑无异常跳变——说明 F2 的"过拟合"判断部分被验证集噪声误导,真实模型能力被低估。
## 4. 已知代价(诚实记录)
样本级划分**略乐观**:微动作插值使相邻样本高度相关(0.75°/步),随机划分后每个验证样本的近邻大量在训练集,val 会略高估泛化。适用场景:
- **选模/早停**(本次用途):噪声小、跨集混合 → 更可靠的 best 选择信号 ✓
- **能力评估**(需保守口径):仍建议整集划分或 leave-one-out,避免乐观偏差
## 5. 实施细节
- `dataset.py::ActionDataset(sample_indices=...)`:样本按索引过滤,位置在样本构建后、统计量计算前
- 签名顺序调整:`sample_indices` 置于 `frame_len` 之后,避免破坏既有位置参数调用(曾因插入位置错误导致 frame_len 错位 TypeError)
- `config.py`:`TrainConfig.val_split_mode`(默认 "sample")+ CLI + 校验
- 测试:+2(样本过滤与统计口径、CLI 映射),全套 185 通过
## 6. 后续
- F2b 训练完成后跑闭环评估,验证 onehot + spk 固定 + 新划分的实际闭环收益
- 若需严格能力评估,增加 `--val-split-mode episode` 复跑对照,或 leave-one-out 交叉验证