Files
blackbird/docs/reports/actpred_research_directions_20260814.md
T
qing 13beba09b4 docs(actpred): 研究方向 R8 细化——三层流水线离线 RL + 样本级验证集报告
R8 细化:预训练→监督微调→离线 RL 流水线定稿;IQL/CQL/DT 选型对比;
IMU 奖励工程四分量(姿态稳定/抖动/平滑/任务进度);三阶段落地路径。
新增样本级验证集划分实验报告(整集 60 样本噪声大 → 样本级 142 样本
更稳,F2b 在更难验证集上取得更低 val)。实现:val_split_mode 默认
sample,dataset sample_indices 过滤 + zscore 统计口径保持训练集专属。
2026-08-15 03:52:27 +00:00

213 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# actpred × pybot 研究方向报告:循环神经网络思想与机器人学习演进路线
日期:2026-08-14(Asia/Shanghai)
范围:`actpred/`(动作预测,大脑)与 `pybot/`(机器人运行时,身体)
类型:技术研究方向调研(`advisory`;涉及部署可行性的判断标注 `verify_pending`,需 Hailo 实测确认)
## 0. 报告说明
本报告源于两个递进的调研问题:(1)动作预测能否引入更多循环神经网络(RNN)思想;(2)在此之上的整体研究方向。报告先剖析 actpred 当前建模范式的本质与痛点,再给出 RNN 思想的四个切入点,最后组织成分层的演进路线图。所有判断基于当日代码基线(进程内闭环已落地、Hailo NPU 部署链已实机验证)与项目现实约束。
## 1. 现状建模范式与核心痛点
### 1.1 当前是"单步窗口预测",模型无跨步隐状态
actpred 的 `ActionPredictor`([model.py:89-147](../../actpred/model.py#L89-L147))每步独立地用
`[F帧图像, H步动作, PRED]` token 序列做一次性 Transformer 注意力融合,取 PRED 位置回归下一动作。
关键事实:**模型本身没有任何跨步隐状态**,跨步记忆完全由 H 步(默认 5)原始动作向量窗口承载。
训练侧是 teacher forcing([dataset.py:112-117](../../actpred/dataset.py#L112-L117)):
`action_history` 取真实历史,`target` 取下一真实动作,单步监督。
### 1.2 由此产生的三个真实痛点
| 痛点 | 根因 | 后果 |
|------|------|------|
| 长程依赖被截断 | 记忆容量 = H 步原始动作 | 超过 5 步的运动模式(起步→加速→匀速的长惯性)在窗口外丢失 |
| 动作不平滑 | 每步独立回归,无惯性先验 | 预测抖动,对物理舵机是磨损/损坏风险 |
| exposure bias | 训练用真实历史、闭环推理用自预测历史 | 分布失配,误差随步数累积,闭环易发散 |
### 1.3 决定性约束:Hailo NPU 部署链
[model.py:94](../../actpred/model.py#L94) 明确"除 batch 外全部维度静态,保证 ONNX/NPU 部署友好";
[export_deploy.py](../../actpred/export_deploy.py) 整套 DFC 改造(图像输入拆帧、AvgPool 替换、
注意力手工展开)都围绕**静态图**。因此**循环算子(GRU/LSTM)是可行性的分水岭**——
DFC 对循环算子的支持通常弱于静态卷积。这一约束直接决定下文各方案的取舍。
## 2. RNN 思想的四个切入点(按部署链冲击排序)
### 方案 C · 残差/惯性先验:预测 Δaction(零参数,立即见效)⭐
把预测目标从绝对动作改为增量:`â_t = a_{t-1} + Δ`,模型只学 `Δ`。
- **本质**:等价于对角权重固定为 1 的线性 RNN(积分器),是 RNN 思想的极简形式。
- **收益**:输出被惯性锚定,天然平滑;训练更易收敛;舵机抖动大减。
- **部署影响**:零(只改 dataset 的 target 构造 + predict 逆变换时加回 `a_{t-1}`)。
- **代价**:极小。**强烈建议无论选哪条路线都先做这条**。
### 方案 B · 训练目标:多步展开 + scheduled sampling(治 exposure bias)
不改模型,只改训练:
- dataset 一次取 K 步连续样本而非单步;
- 第 1 步用真实历史,第 2 步起用模型自己的预测回传(scheduled sampling),loss 对 K 步累加。
- **收益**:直接消除训练/推理分布失配,闭环稳定性大幅提升。
- **部署影响**:零(模型结构不变,已部署 Hailo 推理链不动)。
- **代价**:只改 train.py 训练循环 + dataset 采样逻辑,风险最低。
### 方案 A · 混合架构:动作历史用 GRU 压缩(进阶)
`act_proj` 后不接 H 个独立 token,而是过一层 GRU,取最终隐状态压成 **1 个"动作记忆 token"**,
与 F 个图像 token + PRED 一起进 Transformer:
```
现状: H 个动作 token ──────────────────┐
改进: H 步动作 → GRU → h_final (1 token) ├→ [img×F, mem×1, PRED] → Transformer
```
- **收益**:跨步记忆容量与 H 解耦(GRU 隐状态压缩全部历史),长程惯性可建模。
- **部署影响**:token 序列从 `F+H+1` 变 `F+2`,更短更静态;唯一新增算子是 GRU——
**关键风险点**,需先验证 Hailo DFC 对 GRU 的支持(可用固定 H 步展开的 cell 堆叠规避真循环)。
- **代价**:中等改动(model.py + export_deploy.py 的 GRU 展开)。
### 方案 D · 全 recurrent 编码器(表达力最强,部署风险最高)
图像帧也过 ConvGRU,跨步隐状态贯穿视觉与动作。**但这打破"除 batch 外全静态 shape"的
NPU 部署前提**,需重新设计部署图。不推荐在当前 Hailo 目标下做。
### 切入点评审结论
```
第 1 步(零风险): C 残差预测 ──→ 立即改善平滑性,验证收益
第 2 步(零部署影响): B 多步展开训练 ──→ 治 exposure bias
第 3 步(需验证): A GRU 记忆 token ──→ 先做 Hailo GRU 支持单测
├─ 支持 → 展开 GRU 进部署链
└─ 不支持 → 保持 Transformer,仅用 B+C
```
**C+B 组合是性价比最高的第一步**:不改部署链、不增参数,直接解决"抖动 + exposure bias"
两个最痛的问题。A 留作需要更强长程记忆时的进阶项。
## 3. 整体研究方向:分层演进路线
在 RNN 思想之外,从机器人学习前沿看,两模块的演进空间组织为四层。现实约束:
**纯模仿学习(无奖励信号)、MPU6050 已装未用、数据靠实机 `--record`(稀缺)、Hailo NPU 部署硬约束**。
### Tier 0 · 立足现状(零部署风险,先做)
| 编号 | 方向 | 价值 | 改动 |
|------|------|------|------|
| R1 | 残差预测 + 多步展开训练(C+B) | 治抖动+失配,所有后续工作的地基 | dataset + train |
| R2 | **MPU6050 姿态回流** ⭐ | 给模型"本体感觉",是机器人标准状态量 | pybot 读 IMU + actpred 加输入维 |
| R3 | 数据增强扩充 | 稀缺数据的低成本放大 | dataset 增方法 |
| R4 | **离线评估基准** | 没有基准,后续改进全是盲改 | 新增评估脚本 |
**R2 被低估**:pybot 已有 [mpu6050.py](../../pybot/pybot/hd/mpu6050.py) Kalman 姿态解算,但完全没进
actpred 的状态表征——模型对自身俯仰/横滚/角速度是盲的。接入 IMU 6 轴作为额外 token 或并入
动作向量,既补本体感觉,又为 R9 奖励设计提供信号源。
**R4 是基础设施**:现在只有开环 MSE。需要闭环代理指标——留出 episode 上开环滚动预测,
测多步累积误差、动作平滑度(相邻动作差分方差)、物理可行性(越界率)。
**R3**:当前仅亮度/对比度/饱和度/色调增强([dataset.py:99-102](../../actpred/dataset.py#L99-L102)),
可加时间扭曲(帧率扰动)、动作镜像(左右对称对)、episode 混合拼接。
### Tier 1 · 模型能力(需验证部署兼容)
| 编号 | 方向 | 说明 |
|------|------|------|
| R5 | GRU 记忆 token(方案 A) | 先验 Hailo DFC 循环算子支持 |
| R6 | 多模态状态融合 | 视觉+IMU+本体感觉统一表征(R2 完整版) |
| R7 | 世界模型雏形 | 学"动作→下一帧"预测头,支撑 MPC 规划与 model-based RL |
### Tier 2 · 学习范式跃迁(数据/奖励是瓶颈)
| 编号 | 方向 | 说明 |
|------|------|------|
| R8 | **离线强化学习(CQL/IQL)** | 关键契合点:已有大量录制 episode、无法实机安全探索(舵机会坏),离线 RL 从固定数据集学策略、无需在线交互 |
| R9 | 奖励设计(MPU6050) | 姿态稳定性(姿态角方差小=奖励高)、能耗(动作差分平滑=省能)、任务进度 → 标量奖励;从"模仿"走向"优化"的关键一跃 |
| R10 | 自监督视觉预训练 | MAE/对比学习在相机图像上预训练编码器,缓解数据稀缺(ImageNet 预训练与机器人第一视角差异大) |
**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 出低层动作——
分层控制,打通项目"AI 智能体"与"机器人"两大域。
- **R12 sim2real / 数字孪生**:pybot 的 dry_run 已具备合成帧 + Mock 总线,可演进为轻量仿真环境,
先仿真预训练再迁移真机,解决数据稀缺与安全探索。
- **R13 持续学习**:闭环运行中不断回流新 episode 增量微调,机器人越用越聪明。
## 4. 推荐切入点与关键决策点
**短期(本月)**:**R1 + R4**。先落地"残差+多步训练",同时建评估基准——没有基准,后续改进无法量化对比。
**中期**:**R2(MPU6050 回流)性价比之王**——硬件已装、代码已在、收益明确(本体感觉 + 奖励信号源),
只缺"接一根线"。
**关键决策点**:R5 GRU 是否值得做,取决于先做 **"Hailo DFC 循环算子支持验证"** 这个小实验:
- 支持 → R5/R7 可行,循环路线打开;
- 不支持 → Tier 1 循环类方案全部绕行(用更长静态窗口替代隐状态),精力转向
**R2 多模态 + R8 离线 RL** 这条不依赖循环算子的路线。
## 5. 与本季其他工作的衔接
- 进程内闭环已落地(pybot `run_loop`/`--loop`),P1-2 帧源(守护线程队列)与 P1-1 overrun 告警已修复
——见 [pybot_actpred_AUDIT_20260814.md](../reviews/pybot_actpred_AUDIT_20260814.md)。
- 数据飞轮已通:`--record` 录制 → 训练 → 推理 → `--loop` 闭环,为 R8 离线 RL 与 R13 持续学习
提供数据回路。
- `--record` 微动作与录制设计见 [pybot_micro_action_and_recording_20260813.md](pybot_micro_action_and_recording_20260813.md);
Hailo 部署链详见 [actpred_hailo_hat2_inference_research_20260813.md](actpred_hailo_hat2_inference_research_20260813.md)。
---
*本报告为研究方向调研(advisory),方案 A/R5/R7 的部署可行性标 verify_pending,
落地前需做 Hailo DFC 循环算子支持实测。*