Add multiple research papers in PDF format to the repository, including recent works on AI and physics, with file sizes ranging from 1.7 MB to 32.3 MB.
Sync to site1 / sync (push) Has been cancelled
Sync to site1 / sync (push) Has been cancelled
This commit is contained in:
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Submodule
+1
Submodule JEPA/lejepa-identifiability added at de7503f1b2
@@ -0,0 +1,204 @@
|
|||||||
|
# LeJEPA 相关资源汇总
|
||||||
|
|
||||||
|
> 通过互联网搜索整理,收录时间:2026-06-01
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎬 视频资源
|
||||||
|
|
||||||
|
### 官方演示视频
|
||||||
|
| 标题 | 链接 | 频道 | 时间 | 说明 |
|
||||||
|
|------|------|------|------|------|
|
||||||
|
| **world model video**(官方) | https://youtu.be/EioGDo67ZDs | AI and the Brain | 2026-05-09 | 论文官方配套视频,291次观看,由作者团队发布 |
|
||||||
|
|
||||||
|
> 📌 该视频由 GitHub README 直接链接,是论文的官方配套演示视频。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 论文资源
|
||||||
|
|
||||||
|
### 核心论文
|
||||||
|
|
||||||
|
| 论文 | arXiv | 发表时间 | 说明 |
|
||||||
|
|------|-------|----------|------|
|
||||||
|
| **When Does LeJEPA Learn a World Model?** | [2605.26379](https://arxiv.org/abs/2605.26379) | 2026-05-25 | 本文,可识别性理论 |
|
||||||
|
| **LeJEPA: Provable and Scalable Self-Supervised Learning Without the Heuristics** | [2511.08544](https://arxiv.org/abs/2511.08544) | 2025-11-11 | LeJEPA 原始论文,提出 SIGReg |
|
||||||
|
| **LeWorldModel: Stable End-to-End JEPA from Pixels** | [2603.19312](https://arxiv.org/abs/2603.19312) | 2026-03-13 | LeJEPA 扩展到动作条件控制 |
|
||||||
|
| **V-JEPA 2: Self-Supervised Video Models** | [2506.09985](https://arxiv.org/abs/2506.09985) | 2025 | Meta 的视频 JEPA,理解/预测/规划 |
|
||||||
|
| **Causal-JEPA** | [2602.11389](https://arxiv.org/abs/2602.11389) | 2026 | 通过对象级干预学习世界模型 |
|
||||||
|
|
||||||
|
### LeJEPA 原始论文摘要(arXiv:2511.08544)
|
||||||
|
> Learning manipulable representations of the world and its dynamics is central to AI. Joint-Embedding Predictive Architectures (JEPAs) offer a promising blueprint, but lack of practical guidance and theory has led to ad-hoc R&D. We present a comprehensive theory of JEPAs and instantiate it in **LeJEPA**, a lean, scalable, and theoretically grounded training objective.
|
||||||
|
>
|
||||||
|
> **核心贡献:**
|
||||||
|
> - 识别各向同性高斯分布为 JEPA 嵌入的最优分布
|
||||||
|
> - 提出 SIGReg(Sketched Isotropic Gaussian Regularization)
|
||||||
|
> - 单一超参数、线性时间/内存复杂度、无启发式技巧
|
||||||
|
> - ~50 行代码实现,ViT-H/14 在 ImageNet-1k 达到 79%
|
||||||
|
|
||||||
|
### LeWorldModel 摘要(arXiv:2603.19312)
|
||||||
|
> LeWorldModel (LeWM) 是首个仅用两个损失项(下一嵌入预测 + 高斯正则化)从原始像素端到端稳定训练的 JEPA。
|
||||||
|
>
|
||||||
|
> **亮点:**
|
||||||
|
> - ~15M 参数,单 GPU 数小时可训
|
||||||
|
> - 规划速度比基础模型快 48 倍
|
||||||
|
> - 潜空间编码有意义的物理结构
|
||||||
|
> - 可可靠检测物理上不合理的事件
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌐 官方网站与代码
|
||||||
|
|
||||||
|
### 项目主页
|
||||||
|
- **官方网站:** https://klindtlab.github.io/lejepa-identifiability/
|
||||||
|
- 包含完整摘要、定理说明、实验结果图表
|
||||||
|
- 发布时间:2026-05-27
|
||||||
|
|
||||||
|
### 代码仓库
|
||||||
|
- **可识别性论文代码:** https://github.com/klindtlab/lejepa-identifiability
|
||||||
|
- Lean 4 形式化证明(`lean/` 目录)
|
||||||
|
- 实验代码(`experiments/` 目录)
|
||||||
|
- 支持 2D、Scaling、Gennorm、Grid、Reacher 五类实验
|
||||||
|
|
||||||
|
- **LeJEPA 原始代码:** https://github.com/rbalestr-lab/lejepa
|
||||||
|
- GitHub Stars: 1,170+
|
||||||
|
- 包含完整训练代码
|
||||||
|
|
||||||
|
### 交互演示
|
||||||
|
- **Google Colab Demo(~30秒,T4 GPU):**
|
||||||
|
https://colab.research.google.com/drive/1ozjRk3FfUIDX7WBqlOKvhNcIamy0JxCH?usp=sharing
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤗 HuggingFace 资源
|
||||||
|
|
||||||
|
### 论文页面
|
||||||
|
- **可识别性论文:** https://huggingface.co/papers/2605.26379
|
||||||
|
- AI 生成摘要:LeJEPA demonstrates linear identifiability of latent variables from nonlinear observations under Gaussian distributions, enabling reliable world modeling and planning.
|
||||||
|
|
||||||
|
- **LeJEPA 原始论文:** https://huggingface.co/papers/2511.08544
|
||||||
|
|
||||||
|
### 相关模型(基于 LeJEPA 训练)
|
||||||
|
| 模型 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| [gajeshladhar/core-jepa](https://huggingface.co/gajeshladhar/core-jepa) | 图像特征提取,25次下载 |
|
||||||
|
| [falafel-hockey/lejepa-vit-small-patch8-256-sentinel2-5band](https://huggingface.co/falafel-hockey/lejepa-vit-small-patch8-256-sentinel2-5band) | 遥感图像(Sentinel-2)特征提取 |
|
||||||
|
| [adipanda/lejepa](https://huggingface.co/adipanda/lejepa) | LeJEPA 模型 |
|
||||||
|
| [caiovicentino1/lejepa-v1-tinyimagenet](https://huggingface.co/caiovicentino1/lejepa-v1-tinyimagenet) | TinyImageNet 训练版本 |
|
||||||
|
|
||||||
|
### 相关数据集
|
||||||
|
| 数据集 | 说明 |
|
||||||
|
|--------|------|
|
||||||
|
| [falafel-hockey/sentinel2-lejepa-global-diverse-256](https://huggingface.co/datasets/falafel-hockey/sentinel2-lejepa-global-diverse-256) | Sentinel-2 遥感数据,5k 样本 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 相关背景论文
|
||||||
|
|
||||||
|
### JEPA 系列
|
||||||
|
| 论文 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| LeCun, *A Path Towards Autonomous Machine Intelligence* (2022) | JEPA 原始提案 |
|
||||||
|
| I-JEPA (Assran et al., CVPR 2023) | 图像 JEPA |
|
||||||
|
| V-JEPA (Bardes et al., 2024) | 视频 JEPA |
|
||||||
|
| V-JEPA 2 (Assran et al., 2025) | 视频理解/预测/规划 |
|
||||||
|
|
||||||
|
### 可识别性理论背景
|
||||||
|
| 论文 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| Hyvärinen & Pajunen (1999) | 非线性 ICA 不可识别性 |
|
||||||
|
| Hyvärinen & Morioka (2016, 2017) | 时间对比学习 + 非线性 ICA |
|
||||||
|
| Khemakhem et al. (2020) | VAE + 非线性 ICA 统一框架 |
|
||||||
|
| Sprekeler et al. (2014) | SFA 非线性盲源分离理论 |
|
||||||
|
| Sobal et al. (2022) | JEPA 关注慢特征 |
|
||||||
|
|
||||||
|
### 自监督学习对比
|
||||||
|
| 方法 | 论文 | 与 LeJEPA 关系 |
|
||||||
|
|------|------|----------------|
|
||||||
|
| VICReg | Bardes et al. (2021) | 二阶矩白化,理论上等价 |
|
||||||
|
| InfoNCE | van den Oord et al. (2018) | 隐式高斯化,高维退化 |
|
||||||
|
| BYOL | Grill et al. (2020) | stop-gradient,无理论保证 |
|
||||||
|
| SimSiam | Chen & He (2021) | stop-gradient,无理论保证 |
|
||||||
|
| DINO/DINOv3 | Caron et al. (2021) / 2025 | 自蒸馏 + 特征聚类 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔬 技术要点速查
|
||||||
|
|
||||||
|
### LeJEPA 训练目标
|
||||||
|
```
|
||||||
|
L(h) = λ · L_SIG + (1-λ) · L_inv
|
||||||
|
|
||||||
|
L_inv = E[‖h(z') - h(z)‖²] # 对齐损失(正样本对)
|
||||||
|
L_SIG = SIGReg(h(z), N(0,I)) # 高斯正则化(防坍塌)
|
||||||
|
```
|
||||||
|
|
||||||
|
### SIGReg 实现原理
|
||||||
|
- 通过随机投影(sketching)估计嵌入分布的特征函数
|
||||||
|
- 与标准高斯的特征函数对比,计算偏差
|
||||||
|
- 线性时间复杂度,~50 行代码
|
||||||
|
|
||||||
|
### 关键超参数
|
||||||
|
| 参数 | 推荐范围 | 说明 |
|
||||||
|
|------|----------|------|
|
||||||
|
| `λ`(正则化权重) | `1e-3` ~ `1e-2` | 太大→坍塌,太小→不可识别 |
|
||||||
|
| `ρ`(OU 相关性) | `0.8` ~ `0.95` | 控制正样本对的相似度 |
|
||||||
|
|
||||||
|
### 实验结果摘要
|
||||||
|
| 维度 N | SIGReg R² | VICReg R² | InfoNCE R² |
|
||||||
|
|--------|-----------|-----------|------------|
|
||||||
|
| 2 | 0.999998 | 0.999996 | 0.950961 |
|
||||||
|
| 64 | 0.999966 | 0.999968 | 0.648496 |
|
||||||
|
| 256 | 0.999884 | 0.999889 | 0.696587 |
|
||||||
|
| 1024 | 0.999561 | 0.999582 | 0.720241 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 BibTeX 引用
|
||||||
|
|
||||||
|
```bibtex
|
||||||
|
@article{klindt2026lejepa,
|
||||||
|
author = {Klindt, David and LeCun, Yann and Balestriero, Randall},
|
||||||
|
title = {When Does LeJEPA Learn a World Model?},
|
||||||
|
year = {2026},
|
||||||
|
journal = {arXiv preprint arXiv:2605.26379},
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{balestriero2025lejepa,
|
||||||
|
author = {Balestriero, Randall and LeCun, Yann},
|
||||||
|
title = {LeJEPA: Provable and Scalable Self-Supervised Learning Without the Heuristics},
|
||||||
|
year = {2025},
|
||||||
|
journal = {arXiv preprint arXiv:2511.08544},
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{maes2026leworldmodel,
|
||||||
|
author = {Maes, Lucas and Le Lidec, Quentin and Scieur, Damien and LeCun, Yann and Balestriero, Randall},
|
||||||
|
title = {LeWorldModel: Stable End-to-End Joint-Embedding Predictive Architecture from Pixels},
|
||||||
|
year = {2026},
|
||||||
|
journal = {arXiv preprint arXiv:2603.19312},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗺️ 资源地图
|
||||||
|
|
||||||
|
```
|
||||||
|
LeJEPA 生态系统
|
||||||
|
├── 理论基础
|
||||||
|
│ ├── arXiv:2511.08544 (LeJEPA 原始论文)
|
||||||
|
│ └── arXiv:2605.26379 (可识别性理论,本文)
|
||||||
|
├── 应用扩展
|
||||||
|
│ ├── arXiv:2603.19312 (LeWorldModel,像素控制)
|
||||||
|
│ └── arXiv:2602.11389 (Causal-JEPA,因果干预)
|
||||||
|
├── 代码
|
||||||
|
│ ├── github.com/rbalestr-lab/lejepa (LeJEPA 训练)
|
||||||
|
│ └── github.com/klindtlab/lejepa-identifiability (可识别性实验)
|
||||||
|
├── 演示
|
||||||
|
│ ├── YouTube: youtu.be/EioGDo67ZDs (官方视频)
|
||||||
|
│ ├── 官网: klindtlab.github.io/lejepa-identifiability
|
||||||
|
│ └── Colab: 交互式 2D 演示
|
||||||
|
└── 社区
|
||||||
|
├── HuggingFace: huggingface.co/papers/2605.26379
|
||||||
|
└── HuggingFace: huggingface.co/papers/2511.08544 (1170+ Stars)
|
||||||
|
```
|
||||||
@@ -0,0 +1,550 @@
|
|||||||
|
# 论文阅读笔记:*When Does LeJEPA Learn a World Model?*
|
||||||
|
|
||||||
|
**作者:** David Klindt (CSHL)、Yann LeCun (NYU)、Randall Balestriero (Brown)
|
||||||
|
**发表:** arXiv:2605.26379v1 [stat.ML],2026年5月25日
|
||||||
|
**官网:** https://klindtlab.github.io/lejepa-identifiability/(2026-05-27)
|
||||||
|
**代码:** [`JEPA/lejepa-identifiability/`](JEPA/lejepa-identifiability/)(已本地 clone)
|
||||||
|
**原文:** `research/papers/2605.26379v1.pdf`
|
||||||
|
**视频:** https://youtu.be/EioGDo67ZDs(官方演示,AI and the Brain 频道)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 核心问题
|
||||||
|
|
||||||
|
> **LeJEPA 学到的表示,什么时候才算真正学到了世界模型(World Model)?**
|
||||||
|
|
||||||
|
答案:当且仅当它能**线性恢复**世界的潜在变量(latent variables)时。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 背景与动机
|
||||||
|
|
||||||
|
### 什么是 JEPA?
|
||||||
|
Joint-Embedding Predictive Architecture(JEPA)是 LeCun 提出的自监督学习框架:
|
||||||
|
- 训练编码器 `f` 对同一内容的两个视图产生相似的嵌入
|
||||||
|
- 用正则化器防止表示坍塌(collapse)
|
||||||
|
|
||||||
|
### 什么是 LeJEPA?
|
||||||
|
`LeJEPA` = JEPA + **SIGReg**(Sketched Isotropic Gaussian Regularization):
|
||||||
|
- **对齐损失(Alignment):** 拉近正样本对的嵌入
|
||||||
|
- **高斯正则化(SIGReg):** 强制嵌入分布接近各向同性高斯分布 `h(z) ~ N(0, I_n)`
|
||||||
|
|
||||||
|
### 核心缺口
|
||||||
|
此前没有任何 JEPA 的**可识别性(identifiability)理论**——不知道学到的表示是否真正恢复了世界的潜在结构。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌍 世界模型的数学框架
|
||||||
|
|
||||||
|
### 世界假设(三条)
|
||||||
|
|
||||||
|
| 假设 | 含义 |
|
||||||
|
|------|------|
|
||||||
|
| **独立性** | 潜变量各分量相互独立 |
|
||||||
|
| **平稳性** | 两个视图共享同一边际分布 |
|
||||||
|
| **加性噪声** | `z'_i = m_i(z_i) + η_i`,噪声独立于状态 |
|
||||||
|
|
||||||
|
### 高斯世界(Gaussian World)
|
||||||
|
最大熵选择:`z ~ N(0, I_n)`,转移过程为 **Ornstein-Uhlenbeck(OU)过程**:
|
||||||
|
|
||||||
|
```
|
||||||
|
z' = ρz + √(1-ρ²) η, η ~ N(0, I_n)
|
||||||
|
```
|
||||||
|
|
||||||
|
其中 `ρ ∈ (0,1)` 控制两个视图的相关性。
|
||||||
|
|
||||||
|
### 学习目标
|
||||||
|
|
||||||
|
```
|
||||||
|
min_h E[‖h(z') - h(z)‖²] (对齐损失)
|
||||||
|
s.t. h(z) ~ N(0, I_n) (高斯约束)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 四大定理
|
||||||
|
|
||||||
|
### 定理 1:LeJEPA 线性可识别性(正向)
|
||||||
|
|
||||||
|
> 在高斯世界中,满足 LeJEPA 目标的最优表示 `h` **当且仅当** `h(z) = Qz`,其中 `Q ∈ O(n)` 为正交矩阵。
|
||||||
|
|
||||||
|
**证明核心思路(Hermite 多项式谱分解):**
|
||||||
|
|
||||||
|
1. 任意函数 `h_i(z)` 可展开为 Hermite 多项式:`h_i = Σ c_α H_α(z)`
|
||||||
|
2. OU 转移对 d 阶 Hermite 分量的衰减因子为 `ρ^d`
|
||||||
|
3. 由 Mehler 公式:`E[h_i(z')h_i(z)] = Σ_d w_d · ρ^d ≤ ρ`
|
||||||
|
4. 等号成立 **当且仅当** `w_1 = 1`(即 `h_i` 是线性的)
|
||||||
|
5. 任何非线性扭曲都会**严格降低**正样本对的相关性
|
||||||
|
|
||||||
|
**直觉:** 高斯 OU 过程对高阶非线性成分的衰减更快,因此线性映射是唯一最优解。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 定理 2:高斯分布的唯一性(逆向)
|
||||||
|
|
||||||
|
> 在满足世界假设的所有分布中,**高斯分布是唯一**使 LeJEPA 实现线性可识别性的分布。
|
||||||
|
|
||||||
|
**证明思路(Sturm-Liouville 理论):**
|
||||||
|
|
||||||
|
- 若第一特征函数 `φ_1` 是仿射的(`φ = az + b`),则得分函数 `(log p)'` 必须是线性的
|
||||||
|
- 线性得分函数 → `log p(z) ∝ -(z-μ)²` → 高斯分布
|
||||||
|
|
||||||
|
**意义:** 这与经典 ICA 的结论**完全相反**——在线性 ICA 中,高斯分布是唯一**失败**的情况;在 LeJEPA 的非线性设置中,高斯分布是唯一**成功**的情况。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 定理 3:近似可识别性
|
||||||
|
|
||||||
|
> 当对齐目标和白化约束只近似满足时,恢复误差**优雅降级**:
|
||||||
|
|
||||||
|
```
|
||||||
|
E[‖h(z) - Qz‖²] ≤ D + (ε + D)²
|
||||||
|
```
|
||||||
|
|
||||||
|
其中:
|
||||||
|
- `D = δ / (2ρ(1-ρ))`:对齐间隙的归一化量
|
||||||
|
- `ε = ‖Cov(h(z)) - I‖_F`:白化误差
|
||||||
|
|
||||||
|
**实践含义:** 对齐质量是可识别性的主要瓶颈,白化误差影响较小。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 定理 4:最优潜空间规划
|
||||||
|
|
||||||
|
> 若 `h(z) = Qz`(正交),则在**旋转不变代价函数**下,潜空间中的规划与真实世界中的规划**完全等价**:
|
||||||
|
|
||||||
|
```
|
||||||
|
V̂*(h(z₀)) = V*(z₀) 且 â*_{1:T}(h(z₀)) = a*_{1:T}(z₀)
|
||||||
|
```
|
||||||
|
|
||||||
|
**覆盖的控制问题:**
|
||||||
|
- 目标到达(goal-reaching)
|
||||||
|
- 线性二次调节(LQR)
|
||||||
|
- 任何依赖旋转不变量的代价函数
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔬 实验验证
|
||||||
|
|
||||||
|
### 实验 1:正向可识别性(验证定理 1)
|
||||||
|
- 2D 设置,4种非线性混合函数(螺旋、正弦剪切、抛物线剪切、RealNVP)
|
||||||
|
- LeJEPA 在所有情况下恢复各向同性高斯结构(旋转等价)
|
||||||
|
- 扩展到 **1024 维**:SIGReg 和 VICReg 保持 `R² > 0.999`
|
||||||
|
|
||||||
|
### 实验 2:逆向验证(验证定理 2)
|
||||||
|
- 扫描广义正态分布族(形状参数 α)
|
||||||
|
- `R²` 在 **α=2(高斯)** 时达到峰值,非高斯分布线性可识别性下降
|
||||||
|
|
||||||
|
### 实验 3:近似界验证(验证定理 3)
|
||||||
|
- 所有运行的实际恢复误差均低于理论界
|
||||||
|
- 对齐损失是可识别性的最强预测指标
|
||||||
|
|
||||||
|
### 实验 4:潜空间规划(验证定理 4)
|
||||||
|
- DMC Reacher 环境(像素输入,2D 关节角度潜变量)
|
||||||
|
- 高斯编码器(OU 采样):规划质量与 oracle 无统计显著差异
|
||||||
|
- 轨迹编码器(RL 策略采样,非高斯):规划质量显著下降
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔑 关键洞见
|
||||||
|
|
||||||
|
### 1. 谱分解是核心工具
|
||||||
|
Hermite 多项式将任意函数分解为线性/非线性成分,OU 转移对高阶成分的衰减更强,这使得线性映射成为唯一最优解。
|
||||||
|
|
||||||
|
### 2. 数据分布决定可识别性
|
||||||
|
- **OU 采样(各向同性高斯)** → 满足理论假设 → 高可识别性
|
||||||
|
- **RL 策略轨迹(非高斯、各向异性)** → 违反假设 → 低可识别性
|
||||||
|
|
||||||
|
### 3. 探索策略的重要性
|
||||||
|
对于自监督预训练,**近似各向同性随机游走**的探索策略能保持数据在理论覆盖的范围内。
|
||||||
|
|
||||||
|
### 4. 三种方法的失效模式不同
|
||||||
|
|
||||||
|
| 方法 | 优势 | 失效场景 |
|
||||||
|
|------|------|----------|
|
||||||
|
| SIGReg | 对非高斯潜变量更鲁棒 | 高维时正交误差略增 |
|
||||||
|
| VICReg | 与 SIGReg 性能相当 | 非高斯潜变量时下降更快 |
|
||||||
|
| InfoNCE | 低维时表现好 | 高维时核宽度不匹配导致梯度消失 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 形式化验证(Lean 4)
|
||||||
|
|
||||||
|
所有定理均在 **Lean 4** 定理证明器中形式化验证(零 `sorry` 义务),使用 Mathlib v4.28.0。
|
||||||
|
|
||||||
|
**验证组件概览:**
|
||||||
|
|
||||||
|
| 文件 | 内容 | 状态 |
|
||||||
|
|------|------|------|
|
||||||
|
| `Hermite.lean` | 定理 1(Hermite 多项式路径) | ✅ 已验证 |
|
||||||
|
| `Uniqueness.lean` | 定理 2(高斯唯一性) | ✅ 已验证 |
|
||||||
|
| `Dirichlet.lean` | 附录 E(Dirichlet 能量路径) | ✅ 已验证 |
|
||||||
|
| `Approx.lean` | 定理 3(近似界) | ✅ 已验证 |
|
||||||
|
| `Planning.lean` | 定理 4(规划等价) | ✅ 已验证 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 与慢特征分析(SFA)的关系
|
||||||
|
|
||||||
|
| 维度 | Sprekeler et al. (2014) | 本文 |
|
||||||
|
|------|------------------------|------|
|
||||||
|
| 可识别性类 | 置换等价 | 正交等价 |
|
||||||
|
| 潜变量分布 | 任意独立 | 高斯(或 i.i.d.) |
|
||||||
|
| 转移结构 | 需要不同速率 | 需要各向同性 |
|
||||||
|
| 提取方式 | 顺序(贪心) | 同时 |
|
||||||
|
| 函数空间 | 固定多项式核 | 学习(神经网络) |
|
||||||
|
| 近似界 | 无 | `D + (ε+D)²` |
|
||||||
|
| 实用算法 | xSFA(脆弱,≤6个潜变量) | LeJEPA/SIGReg(可扩展) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 局限性与未来方向
|
||||||
|
|
||||||
|
1. **潜变量是否真的是高斯的?** 宏观任务相关变量可能因中心极限定理趋向高斯,但无法从观测中验证。
|
||||||
|
2. **维度不匹配问题(m ≠ n):** 编码器输出维度与真实潜变量维度不同时的行为尚未理论化。
|
||||||
|
3. **有限样本与优化动态:** 定理 3 是总体层面的结论,样本复杂度和训练动态未涉及。
|
||||||
|
4. **动作条件转移的可识别性:** 本文只处理编码器侧,动作条件转移 `p̂(ẑ'|ẑ,a)` 的可识别性是下一步工作(与因果表示学习相关)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏆 核心贡献总结
|
||||||
|
|
||||||
|
> **LeJEPA 将经典 ICA 的叙事完全颠倒:** 在线性 ICA 中,高斯分布是源分离失败的唯一情况;在 LeJEPA 的非线性设置中,高斯分布恰恰是使线性可识别性成立的唯一分布。
|
||||||
|
|
||||||
|
**五大贡献:**
|
||||||
|
1. **首个 JEPA 可识别性结果**(定理 1)
|
||||||
|
2. **高斯分布唯一性的逆向定理**(定理 2)
|
||||||
|
3. **量化近似可识别性界**(定理 3)
|
||||||
|
4. **各向同性转移是同时提取的必要条件**(附录 F)
|
||||||
|
5. **线性可识别性与最优潜空间规划的等价性**(定理 4)
|
||||||
|
|
||||||
|
线性可识别性使学到的表示成为控制系统的可用状态,任何正交不变代价函数都可以直接在学到的潜空间中使用,无需修改——这是**可证明地学到世界模型**的含义。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 关键参考文献
|
||||||
|
|
||||||
|
- **LeJEPA:** Balestriero & LeCun, arXiv:2511.08544, 2025
|
||||||
|
- **LeWorldModel:** Maes et al., arXiv:2603.19312, 2026
|
||||||
|
- **V-JEPA 2:** Assran et al., arXiv:2506.09985, 2025
|
||||||
|
- **VICReg:** Bardes et al., arXiv:2105.04906, 2021
|
||||||
|
- **SFA 可识别性:** Sprekeler et al., JMLR 15:921-947, 2014
|
||||||
|
- **Causal-JEPA:** Nam et al., arXiv:2602.11389, 2026
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗂️ 代码仓库深度解析
|
||||||
|
|
||||||
|
> 本节基于本地 clone 的 [`JEPA/lejepa-identifiability/`](JEPA/lejepa-identifiability/) 仓库,对核心实现进行逐模块分析。
|
||||||
|
|
||||||
|
### 仓库结构
|
||||||
|
|
||||||
|
```
|
||||||
|
lejepa-identifiability/
|
||||||
|
├── lean/ # Lean 4 形式化证明
|
||||||
|
│ └── LeJEPA/
|
||||||
|
│ ├── Hermite.lean # 定理1(Hermite 多项式路径)
|
||||||
|
│ ├── Uniqueness.lean # 定理2(高斯唯一性,Sturm-Liouville)
|
||||||
|
│ ├── Approx.lean # 定理3(近似可识别性界)
|
||||||
|
│ ├── Dirichlet.lean # 附录E(Dirichlet 能量替代证明)
|
||||||
|
│ └── Planning.lean # 定理4(规划等价)
|
||||||
|
└── experiments/
|
||||||
|
└── lejepa_id/
|
||||||
|
├── losses.py # SIGReg、白化损失、对齐损失、InfoNCE
|
||||||
|
├── models.py # MLP 编码器、MatchedEncoder、CNN 编码器
|
||||||
|
├── data.py # 潜变量采样、OU 增强
|
||||||
|
├── metrics.py # R²、正交误差、近似界量化
|
||||||
|
└── engine.py # 训练循环(warmup + cosine LR)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 核心实现:损失函数([`losses.py`](JEPA/lejepa-identifiability/experiments/lejepa_id/losses.py))
|
||||||
|
|
||||||
|
#### [`SIGReg`](JEPA/lejepa-identifiability/experiments/lejepa_id/losses.py:8)(Sketched Isotropic Gaussian Regularizer)
|
||||||
|
|
||||||
|
```python
|
||||||
|
class SIGReg(nn.Module):
|
||||||
|
def __init__(self, knots=17, n_slices=256, t_max=3.0):
|
||||||
|
# 通过随机投影(sketching)估计特征函数
|
||||||
|
# 与标准高斯 φ(t) = exp(-t²/2) 对比
|
||||||
|
t = torch.linspace(0, t_max, knots)
|
||||||
|
self.phi = torch.exp(-t**2 / 2) # 标准高斯特征函数
|
||||||
|
|
||||||
|
def forward(self, h):
|
||||||
|
# h: (V, B, N) -> scalar
|
||||||
|
A = F.normalize(torch.randn(...), dim=0) # 随机投影方向
|
||||||
|
xt = (flat @ A).unsqueeze(-1) * self.t
|
||||||
|
err = (xt.cos().mean(0) - self.phi)**2 + xt.sin().mean(0)**2
|
||||||
|
return (err @ self.weights).mean() * flat.size(0)
|
||||||
|
```
|
||||||
|
|
||||||
|
**关键设计:**
|
||||||
|
- 用**特征函数**(Fourier 变换)而非矩匹配来度量分布差异
|
||||||
|
- 随机投影将高维问题降为一维切片,线性时间复杂度
|
||||||
|
- `knots=17` 个积分节点,`n_slices=256` 个随机方向
|
||||||
|
|
||||||
|
#### [`alignment_loss`](JEPA/lejepa-identifiability/experiments/lejepa_id/losses.py:39) 与 [`whitening_loss`](JEPA/lejepa-identifiability/experiments/lejepa_id/losses.py:31)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def alignment_loss(h):
|
||||||
|
"""拉近正样本对。h: (V, B, N) -> scalar"""
|
||||||
|
return (h.mean(0) - h).square().mean()
|
||||||
|
|
||||||
|
def whitening_loss(h):
|
||||||
|
"""||Cov(h) - I||²_F(VICReg 风格白化)"""
|
||||||
|
cov = (flat.T @ flat) / (flat.shape[0] - 1)
|
||||||
|
return (cov - torch.eye(...)).square().mean()
|
||||||
|
```
|
||||||
|
|
||||||
|
**训练目标:**
|
||||||
|
```python
|
||||||
|
# LeJEPA 模式
|
||||||
|
loss = lamb * sig + (1 - lamb) * align
|
||||||
|
|
||||||
|
# VICReg 模式(对比用)
|
||||||
|
loss = lamb * wht + (1 - lamb) * align
|
||||||
|
|
||||||
|
# InfoNCE 模式(对比用)
|
||||||
|
loss = infonce_loss(h, sigma)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 核心实现:数据生成([`data.py`](JEPA/lejepa-identifiability/experiments/lejepa_id/data.py))
|
||||||
|
|
||||||
|
#### [`ou_augment`](JEPA/lejepa-identifiability/experiments/lejepa_id/data.py:29)(OU 过程增强)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def ou_augment(z, rho, n_views=2, dist="gaussian", alpha=None):
|
||||||
|
"""z' = ρz + √(1-ρ²)η,η 与 z 同分布
|
||||||
|
返回 (V, B, N) 形状的多视图张量"""
|
||||||
|
fac = (1 - rho ** 2) ** 0.5
|
||||||
|
eta = sample_latents(n_views * D, N, dist=dist, ...)
|
||||||
|
return rho * z.unsqueeze(0) + fac * eta
|
||||||
|
```
|
||||||
|
|
||||||
|
**支持的分布:**
|
||||||
|
- `"gaussian"`:标准正态(理论保证成立)
|
||||||
|
- `"laplace"`:拉普拉斯(理论保证失效,用于消融)
|
||||||
|
- `"gennorm"`:广义正态(扫描形状参数 α,验证定理2)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 核心实现:评估指标([`metrics.py`](JEPA/lejepa-identifiability/experiments/lejepa_id/metrics.py))
|
||||||
|
|
||||||
|
#### [`compute_all_metrics`](JEPA/lejepa-identifiability/experiments/lejepa_id/metrics.py:16)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def compute_all_metrics(z, x, h, h_prime, rho, N):
|
||||||
|
# 双向 R²(线性可识别性的主要指标)
|
||||||
|
r2_zh, r2_hz = bidirectional_r2(z, h)
|
||||||
|
|
||||||
|
# 正交误差(衡量 h = Qz 中 Q 的正交性)
|
||||||
|
A = W[:N].T # 线性回归系数
|
||||||
|
orth_err = ||A^T A - I||_F
|
||||||
|
|
||||||
|
# 近似界量化(验证定理3)
|
||||||
|
delta = max(L_h - 2*(1-rho)*trace_cov, 0)
|
||||||
|
D_bound = delta / (2*rho*(1-rho))
|
||||||
|
approx_bound = D_bound + (epsilon + D_bound)**2
|
||||||
|
|
||||||
|
# Procrustes 距离(最优正交对齐后的误差)
|
||||||
|
M = h^T z / n; U, S, Vt = SVD(M); Q = U @ Vt
|
||||||
|
procrustes_mse = ||h - z @ Q^T||²
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 核心实现:编码器架构([`models.py`](JEPA/lejepa-identifiability/experiments/lejepa_id/models.py))
|
||||||
|
|
||||||
|
| 编码器 | 用途 | 结构 |
|
||||||
|
|--------|------|------|
|
||||||
|
| [`make_mlp_encoder`](JEPA/lejepa-identifiability/experiments/lejepa_id/models.py:8) | 2D 实验 | 4层 MLP + GELU |
|
||||||
|
| [`MatchedEncoder`](JEPA/lejepa-identifiability/experiments/lejepa_id/models.py:17) | 高维 Scaling | 逆 NVP 耦合层(与混合函数匹配) |
|
||||||
|
| [`make_cnn_encoder`](JEPA/lejepa-identifiability/experiments/lejepa_id/models.py:46) | Reacher 像素 | 4层 CNN + BN + AvgPool + 线性头 |
|
||||||
|
|
||||||
|
**MatchedEncoder 设计亮点:**
|
||||||
|
- 与 RealNVP 混合函数**结构对称**(逆耦合层)
|
||||||
|
- 理论上能精确反转混合,验证可识别性上界
|
||||||
|
- 参数:`z2 = z2 - tanh(z1 @ W)`(逆向耦合)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 核心实现:训练引擎([`engine.py`](JEPA/lejepa-identifiability/experiments/lejepa_id/engine.py))
|
||||||
|
|
||||||
|
```python
|
||||||
|
def train_and_evaluate(encoder, mix_fn, *, N, rho, lamb, mode="lejepa", steps=20000, ...):
|
||||||
|
# LR 调度:前半段恒定,后半段 cosine 衰减
|
||||||
|
# 在线数据生成(无需预存数据集)
|
||||||
|
# 每 log_every 步在固定 eval 集上评估所有指标
|
||||||
|
```
|
||||||
|
|
||||||
|
**训练流程:**
|
||||||
|
1. 采样潜变量 `z ~ N(0, I_N)`
|
||||||
|
2. OU 增强得到正样本对 `(z, z')`
|
||||||
|
3. 混合函数 `g` 映射到观测空间 `(x, x') = (g(z), g(z'))`
|
||||||
|
4. 编码器 `h` 映射到嵌入空间
|
||||||
|
5. 计算 `L = λ·SIGReg + (1-λ)·Alignment`
|
||||||
|
6. AdamW 优化
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔬 Lean 4 形式化证明深度解析
|
||||||
|
|
||||||
|
### 定理1证明链([`Hermite.lean`](JEPA/lejepa-identifiability/lean/LeJEPA/Hermite.lean))
|
||||||
|
|
||||||
|
**核心数据结构:**
|
||||||
|
```lean
|
||||||
|
structure SpectralWeights where
|
||||||
|
w : ℕ → ℝ -- Hermite 展开系数
|
||||||
|
nonneg : ∀ d, 0 ≤ w d
|
||||||
|
zero_degree : w 0 = 0 -- 零均值约束
|
||||||
|
total_variance : ∑' d, w d = 1 -- 单位方差
|
||||||
|
```
|
||||||
|
|
||||||
|
**7步验证链:**
|
||||||
|
|
||||||
|
| 步骤 | 定理/引理 | 状态 |
|
||||||
|
|------|-----------|------|
|
||||||
|
| 1 | `mehler_summability`:Mehler 公式可求和性 | 公理化 |
|
||||||
|
| 2 | `correlation_le_rho`:相关性 ≤ ρ | ✅ 已验证 |
|
||||||
|
| 3 | `loss_lower_bound`:损失 ≥ 2(1-ρ)n | ✅ 已验证 |
|
||||||
|
| 4 | 最优性 → 每个 corr_i = ρ(`Finset.sum_lt_sum`) | ✅ 已验证 |
|
||||||
|
| 5 | `equality_forces_degree_one`:corr_i = ρ → w₁ = 1 | ✅ 已验证 |
|
||||||
|
| 6 | `linear_of_degree_one`:w₁ = 1 → h 线性 | 公理化 |
|
||||||
|
| 7 | `orthogonal_of_gaussian_linear`:线性 + 高斯 → 正交 | 公理化 |
|
||||||
|
|
||||||
|
**关键引理(已验证):**
|
||||||
|
```lean
|
||||||
|
-- ρᵈ < ρ 对 d ≥ 2 严格成立(非线性成分被严格惩罚)
|
||||||
|
theorem pow_lt_self_of_ge_two (ρ : ℝ) (hρ0 : 0 < ρ) (hρ1 : ρ < 1)
|
||||||
|
(d : ℕ) (hd : 2 ≤ d) : ρ ^ d < ρ
|
||||||
|
|
||||||
|
-- 等号成立 ⟺ 所有 d ≥ 2 的权重为零(即 h 是线性的)
|
||||||
|
theorem equality_forces_degree_one ...
|
||||||
|
(heq : ∑' d, sw.w d * ρ ^ d = ρ) :
|
||||||
|
∀ d, 2 ≤ d → sw.w d = 0
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 定理2证明链([`Uniqueness.lean`](JEPA/lejepa-identifiability/lean/LeJEPA/Uniqueness.lean))
|
||||||
|
|
||||||
|
**Sturm-Liouville 框架:**
|
||||||
|
```lean
|
||||||
|
structure LatentComponent where
|
||||||
|
K : ℝ -- 扩散系数(K > 0)
|
||||||
|
score : ℝ → ℝ -- (log p)',得分函数
|
||||||
|
ev : ℝ -- 第一非常数特征值 λ₁(ev > 0)
|
||||||
|
```
|
||||||
|
|
||||||
|
**核心代数步骤(已验证):**
|
||||||
|
```lean
|
||||||
|
-- K·score(z)·a = −ev·(az + b),a ≠ 0
|
||||||
|
-- ⟹ score(z) = (−ev/K)z + (−ev·b/(Ka)),斜率 < 0
|
||||||
|
theorem score_affine_of_eigenfunction ...
|
||||||
|
⟹ ∃ α β, α < 0 ∧ score z = α * z + β
|
||||||
|
```
|
||||||
|
|
||||||
|
**双条件定理(已验证):**
|
||||||
|
```lean
|
||||||
|
theorem gaussian_uniqueness (lc : LatentComponent) :
|
||||||
|
(IsGaussianScore → ∃ 仿射特征函数) -- if 方向
|
||||||
|
∧
|
||||||
|
(∀ 仿射特征函数 → IsGaussianScore) -- only-if 方向
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 定理4证明链([`Planning.lean`](JEPA/lejepa-identifiability/lean/LeJEPA/Planning.lean))
|
||||||
|
|
||||||
|
**控制问题结构:**
|
||||||
|
```lean
|
||||||
|
structure ControlProblem (n : ℕ) (Action : Type*) where
|
||||||
|
stage_cost : Latent n → Action → ℝ
|
||||||
|
terminal_cost : Latent n → ℝ
|
||||||
|
|
||||||
|
-- O(n) 不变性:ℓ(Qz, a) = ℓ(z, a)
|
||||||
|
def IsOrthogonalInvariant cp Q : Prop :=
|
||||||
|
(∀ z a, cp.stage_cost (Q z) a = cp.stage_cost z a) ∧
|
||||||
|
(∀ z, cp.terminal_cost (Q z) = cp.terminal_cost z)
|
||||||
|
```
|
||||||
|
|
||||||
|
**规划等价定理(已验证):**
|
||||||
|
```lean
|
||||||
|
-- 对任意动作序列,推前动力学下的总代价 = 原始动力学下的总代价
|
||||||
|
theorem planning_equivalence ... :
|
||||||
|
totalCost cp E_hat a (Q z) = totalCost cp E a z
|
||||||
|
|
||||||
|
-- 最优动作序列在两个空间中完全相同
|
||||||
|
theorem minimizer_equivalence ... :
|
||||||
|
(∀ a', cost_hat a (Q z) ≤ cost_hat a' (Q z)) ↔
|
||||||
|
(∀ a', cost a z ≤ cost a' z)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🖼️ 官方网站图示解读
|
||||||
|
|
||||||
|
> 来源:https://klindtlab.github.io/lejepa-identifiability/(2026-05-27)
|
||||||
|
|
||||||
|
### 核心图示(三面板)
|
||||||
|
|
||||||
|
```
|
||||||
|
[左] 世界的潜变量 [中] 非线性混合 [右] LeJEPA 恢复
|
||||||
|
z ~ N(0, I_n) →→→ x = g(z)(未知) →→→ h(x) = Qz(正交)
|
||||||
|
独立高斯分量 螺旋/香蕉/剪切等 旋转等价恢复
|
||||||
|
```
|
||||||
|
|
||||||
|
**TL;DR(官网原文):**
|
||||||
|
> LeJEPA linearly recovers the world's latent variables — up to rotation — **if and only if** those latents are Gaussian. The forward direction is a spectral argument on Hermite polynomials; the converse rules out every non-Gaussian alternative. All proofs are checked in Lean 4.
|
||||||
|
|
||||||
|
### 实验图示解读
|
||||||
|
|
||||||
|
**图(a):近似界验证(定理3)**
|
||||||
|
- 横轴:理论界 `D + (ε+D)²`
|
||||||
|
- 纵轴:实际恢复误差
|
||||||
|
- 所有运行点均在对角线**下方**(界成立)
|
||||||
|
|
||||||
|
**图(b):高斯唯一性(定理2)**
|
||||||
|
- 横轴:广义正态形状参数 α(α=2 为高斯)
|
||||||
|
- 纵轴:线性可识别性 R²
|
||||||
|
- R² 在 **α=2 处尖锐达到峰值**,两侧均下降
|
||||||
|
|
||||||
|
**图(c):控制代价(定理4)**
|
||||||
|
- 高斯-OU 编码器:与 oracle 统计上无显著差异
|
||||||
|
- 轨迹编码器:代价显著偏高
|
||||||
|
|
||||||
|
**图(d):代价随 R² 单调下降**
|
||||||
|
- 线性可识别性越高 → 规划代价越低
|
||||||
|
- 支持定理4的连续性推论
|
||||||
|
|
||||||
|
### Reacher 规划演示
|
||||||
|
|
||||||
|
```
|
||||||
|
[顶行] Oracle(关节空间直线):平滑弧线轨迹
|
||||||
|
[中行] 高斯-OU 编码器:紧密跟随 oracle
|
||||||
|
[底行] RL 轨迹编码器:明显偏离(不可识别)
|
||||||
|
```
|
||||||
|
|
||||||
|
解码方式:在潜空间中线性插值,用**最近邻检索**解码到像素帧。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 完整实验结果表(官网版)
|
||||||
|
|
||||||
|
| N | 混合 R²(x→z) | SIGReg R²(h→z) | VICReg R²(h→z) | InfoNCE R²(h→z) |
|
||||||
|
|---|-------------|----------------|----------------|-----------------|
|
||||||
|
| 2 | 0.781±2.1e-3 | **0.999998**±3.4e-7 | 0.999996±8.4e-7 | 0.950961±1.6e-3 |
|
||||||
|
| 4 | 0.727±24e-3 | **0.999996**±12e-7 | 0.999987±54e-7 | 0.910871±8.2e-3 |
|
||||||
|
| 8 | 0.728±10e-3 | **0.999993**±9.0e-7 | 0.999988±4.8e-7 | 0.886818±42e-3 |
|
||||||
|
| 16 | 0.734±6.3e-3 | **0.999988**±4.9e-7 | 0.999987±4.6e-7 | 0.999880±0.01e-3 |
|
||||||
|
| 32 | 0.737±2.3e-3 | **0.999981**±7.2e-7 | 0.999981±9.4e-7 | 0.907809±26e-3 |
|
||||||
|
| 64 | 0.737±1.5e-3 | **0.999966**±7.4e-7 | 0.999968±8.1e-7 | 0.648496±3.1e-3 |
|
||||||
|
| 128 | 0.739±0.61e-3 | **0.999938**±3.2e-7 | 0.999942±7.2e-7 | 0.566955±6.6e-3 |
|
||||||
|
| 256 | 0.742±0.49e-3 | **0.999884**±7.9e-7 | 0.999889±7.2e-7 | 0.696587±0.49e-3 |
|
||||||
|
| 512 | 0.749±0.30e-3 | **0.999775**±6.7e-7 | 0.999785±6.9e-7 | 0.704393±0.26e-3 |
|
||||||
|
| 1024 | 0.763±0.17e-3 | **0.999561**±12e-7 | 0.999582±11e-7 | 0.720241±0.20e-3 |
|
||||||
|
|
||||||
|
> 5 个随机种子的均值±标准差。SIGReg 和 VICReg 在所有维度保持 R² > 0.999;InfoNCE 在高维(N ≥ 64)因固定核宽度退化。
|
||||||
@@ -0,0 +1,171 @@
|
|||||||
|
# Topic 1:Hermite 多项式——从直觉到定义
|
||||||
|
|
||||||
|
> **前置知识:** 高中数学(多项式)、基础概率(正态分布)
|
||||||
|
> **目标:** 理解为什么 Hermite 多项式是分析高斯分布下函数的"天然工具"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 核心问题
|
||||||
|
|
||||||
|
LeJEPA 的证明需要回答:**编码器 `h(z)` 中,哪些成分对正样本对的相关性贡献最大?**
|
||||||
|
|
||||||
|
答案需要一套能把任意函数"拆开"的工具——就像傅里叶级数把周期函数拆成正弦/余弦。在高斯分布下,这套工具就是 **Hermite 多项式**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 从傅里叶到 Hermite:类比理解
|
||||||
|
|
||||||
|
| 概念 | 傅里叶级数 | Hermite 展开 |
|
||||||
|
|------|-----------|-------------|
|
||||||
|
| 适用场景 | 周期函数 | 高斯分布下的函数 |
|
||||||
|
| 基函数 | `sin(nx), cos(nx)` | `H₀(z), H₁(z), H₂(z), ...` |
|
||||||
|
| 正交性 | `∫ sin(mx)sin(nx)dx = 0`(m≠n) | `E[Hₘ(z)Hₙ(z)] = 0`(m≠n,z~N(0,1)) |
|
||||||
|
| 展开系数 | 傅里叶系数 | Hermite 系数 |
|
||||||
|
| 完备性 | 任意周期函数可展开 | 任意 L²(γ) 函数可展开 |
|
||||||
|
|
||||||
|
**关键区别:** Hermite 的正交性是在**高斯测度**下定义的,即期望 `E[·]` 是对 `z ~ N(0,1)` 取的。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 Hermite 多项式的定义
|
||||||
|
|
||||||
|
### 物理学家版(概率论中常用)
|
||||||
|
|
||||||
|
前几个 Hermite 多项式(概率论版,`He_n`):
|
||||||
|
|
||||||
|
```
|
||||||
|
He₀(z) = 1
|
||||||
|
He₁(z) = z
|
||||||
|
He₂(z) = z² - 1
|
||||||
|
He₃(z) = z³ - 3z
|
||||||
|
He₄(z) = z⁴ - 6z² + 3
|
||||||
|
He₅(z) = z⁵ - 10z³ + 15z
|
||||||
|
```
|
||||||
|
|
||||||
|
### 递推公式(最容易记忆)
|
||||||
|
|
||||||
|
```
|
||||||
|
He_{n+1}(z) = z · Heₙ(z) - n · He_{n-1}(z)
|
||||||
|
```
|
||||||
|
|
||||||
|
**例子:**
|
||||||
|
- `He₂(z) = z · He₁(z) - 1 · He₀(z) = z·z - 1·1 = z² - 1` ✓
|
||||||
|
- `He₃(z) = z · He₂(z) - 2 · He₁(z) = z(z²-1) - 2z = z³ - 3z` ✓
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔑 最重要的性质:正交性
|
||||||
|
|
||||||
|
当 `z ~ N(0,1)` 时:
|
||||||
|
|
||||||
|
```
|
||||||
|
E[Heₘ(z) · Heₙ(z)] = { n! 如果 m = n
|
||||||
|
{ 0 如果 m ≠ n
|
||||||
|
```
|
||||||
|
|
||||||
|
**直觉:** 不同"频率"(阶数)的 Hermite 多项式在高斯分布下互不干扰,就像不同频率的正弦波互相正交。
|
||||||
|
|
||||||
|
### 验证 He₁ 和 He₂ 的正交性
|
||||||
|
|
||||||
|
```
|
||||||
|
E[He₁(z) · He₂(z)] = E[z · (z² - 1)]
|
||||||
|
= E[z³] - E[z]
|
||||||
|
= 0 - 0 = 0 ✓
|
||||||
|
(高斯分布的奇数阶矩为零)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌊 完备性:任意函数都能展开
|
||||||
|
|
||||||
|
对任意满足 `E[h(z)²] < ∞` 的函数 `h`,可以展开为:
|
||||||
|
|
||||||
|
```
|
||||||
|
h(z) = Σ_{d=0}^{∞} cₐ · Heₐ(z)
|
||||||
|
```
|
||||||
|
|
||||||
|
其中展开系数:
|
||||||
|
```
|
||||||
|
cₐ = E[h(z) · Heₐ(z)] / d!
|
||||||
|
```
|
||||||
|
|
||||||
|
**类比:** 就像任意向量可以用正交基展开,任意"有限能量"的函数可以用 Hermite 多项式展开。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 为什么 Hermite 多项式对 LeJEPA 至关重要?
|
||||||
|
|
||||||
|
### 关键事实:OU 过程对不同阶数的衰减不同
|
||||||
|
|
||||||
|
当 `z' = ρz + √(1-ρ²)η`(OU 过程,`η ~ N(0,1)`)时:
|
||||||
|
|
||||||
|
```
|
||||||
|
E[Heₙ(z') · Heₙ(z)] = ρⁿ · n!
|
||||||
|
```
|
||||||
|
|
||||||
|
**翻译成人话:**
|
||||||
|
- 1阶(线性)成分:相关性 = `ρ¹ = ρ`
|
||||||
|
- 2阶(二次)成分:相关性 = `ρ² < ρ`(因为 `ρ < 1`)
|
||||||
|
- 3阶(三次)成分:相关性 = `ρ³ < ρ²`
|
||||||
|
- d阶成分:相关性 = `ρᵈ`,随 d 增大**指数衰减**
|
||||||
|
|
||||||
|
### 这意味着什么?
|
||||||
|
|
||||||
|
LeJEPA 的对齐损失要**最大化**正样本对的相关性。由于:
|
||||||
|
- 线性成分贡献 `ρ`
|
||||||
|
- 非线性成分贡献 `ρᵈ < ρ`(d ≥ 2)
|
||||||
|
|
||||||
|
**最优策略就是:只保留线性成分,丢弃所有非线性成分!**
|
||||||
|
|
||||||
|
这就是定理1的核心直觉。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎨 可视化:前4个 Hermite 多项式
|
||||||
|
|
||||||
|
```
|
||||||
|
He₀(z) = 1 ──────────────── (常数,被零均值约束排除)
|
||||||
|
He₁(z) = z ╱ (线性,这是我们想要的!)
|
||||||
|
He₂(z) = z²-1 ∪ (二次,被 OU 衰减更多)
|
||||||
|
He₃(z) = z³-3z ∫ (三次,衰减更多)
|
||||||
|
```
|
||||||
|
|
||||||
|
在 `z ~ N(0,1)` 的分布下,大多数概率质量集中在 `[-3, 3]` 区间。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 谱权重的含义
|
||||||
|
|
||||||
|
在 LeJEPA 的证明中,定义**谱权重** `wₐ`:
|
||||||
|
|
||||||
|
```
|
||||||
|
wₐ = (展开系数 cₐ)² · d! / E[h(z)²]
|
||||||
|
```
|
||||||
|
|
||||||
|
满足:
|
||||||
|
- `wₐ ≥ 0`(非负)
|
||||||
|
- `w₀ = 0`(零均值约束)
|
||||||
|
- `Σ wₐ = 1`(单位方差归一化)
|
||||||
|
|
||||||
|
**物理意义:** `wₐ` 是编码器 `h` 中"d阶非线性成分"占总方差的比例。
|
||||||
|
|
||||||
|
| 情况 | 谱权重分布 | 含义 |
|
||||||
|
|------|-----------|------|
|
||||||
|
| 纯线性 `h(z) = az` | `w₁ = 1`,其余为0 | 100% 线性 |
|
||||||
|
| 纯二次 `h(z) = z²-1` | `w₂ = 1`,其余为0 | 100% 二次 |
|
||||||
|
| 混合 `h(z) = z + z²-1` | `w₁, w₂ > 0` | 线性+二次混合 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 小结
|
||||||
|
|
||||||
|
1. **Hermite 多项式** 是高斯分布下函数的"频率分解"工具
|
||||||
|
2. **正交性**:不同阶数的 Hermite 多项式在高斯期望下互不干扰
|
||||||
|
3. **OU 衰减**:d 阶成分的时间相关性为 `ρᵈ`,高阶衰减更快
|
||||||
|
4. **LeJEPA 的核心**:最大化相关性 → 只保留线性(d=1)成分 → 线性可识别性
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ➡️ 下一步
|
||||||
|
|
||||||
|
→ [Topic 2:OU 过程与 Mehler 公式](02_ou_process_mehler.md)——深入理解 `ρᵈ` 衰减的来源
|
||||||
@@ -0,0 +1,224 @@
|
|||||||
|
# Topic 2:Ornstein-Uhlenbeck 过程与 Mehler 公式
|
||||||
|
|
||||||
|
> **前置知识:** [Topic 1:Hermite 多项式](01_hermite_polynomials.md)、基础概率(条件期望)
|
||||||
|
> **目标:** 理解 LeJEPA 中"正样本对"的生成机制,以及为什么 OU 过程对高阶成分衰减更快
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 核心问题
|
||||||
|
|
||||||
|
LeJEPA 训练时需要"正样本对"——同一内容的两个视图 `(z, z')`。这对视图是怎么生成的?为什么这种生成方式会导致高阶 Hermite 成分被更强地惩罚?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌊 什么是 Ornstein-Uhlenbeck(OU)过程?
|
||||||
|
|
||||||
|
### 物理直觉:弹簧上的粒子
|
||||||
|
|
||||||
|
想象一个粒子被弹簧拴在原点,同时受到随机扰动:
|
||||||
|
- **弹簧力**:把粒子拉回原点(均值回归)
|
||||||
|
- **随机扰动**:布朗运动噪声
|
||||||
|
|
||||||
|
这就是 OU 过程的物理图像。
|
||||||
|
|
||||||
|
### 数学定义(连续时间)
|
||||||
|
|
||||||
|
```
|
||||||
|
dz_t = -θ z_t dt + σ dW_t
|
||||||
|
```
|
||||||
|
|
||||||
|
其中:
|
||||||
|
- `θ > 0`:均值回归速率
|
||||||
|
- `σ`:噪声强度
|
||||||
|
- `W_t`:标准布朗运动
|
||||||
|
|
||||||
|
### LeJEPA 中的离散版本
|
||||||
|
|
||||||
|
论文使用的是**离散时间 OU 过程**,一步转移:
|
||||||
|
|
||||||
|
```
|
||||||
|
z' = ρz + √(1-ρ²) η, η ~ N(0, I_n)
|
||||||
|
```
|
||||||
|
|
||||||
|
其中 `ρ ∈ (0, 1)` 是**相关系数**(对应连续时间的 `e^{-θΔt}`)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔑 OU 过程的三个关键性质
|
||||||
|
|
||||||
|
### 性质 1:平稳性(Stationarity)
|
||||||
|
|
||||||
|
如果 `z ~ N(0, I_n)`,那么 `z' ~ N(0, I_n)`。
|
||||||
|
|
||||||
|
**验证:**
|
||||||
|
```
|
||||||
|
E[z'] = ρ·E[z] + √(1-ρ²)·E[η] = 0 + 0 = 0 ✓
|
||||||
|
Var(z') = ρ²·Var(z) + (1-ρ²)·Var(η) = ρ² + (1-ρ²) = 1 ✓
|
||||||
|
```
|
||||||
|
|
||||||
|
**意义:** 正样本对 `(z, z')` 的边际分布相同,满足论文的"平稳性假设"。
|
||||||
|
|
||||||
|
### 性质 2:相关性可控
|
||||||
|
|
||||||
|
```
|
||||||
|
Cov(z', z) = E[z'z^T] = ρ·E[zz^T] = ρ·I_n
|
||||||
|
```
|
||||||
|
|
||||||
|
所以 `ρ` 直接控制两个视图的相似程度:
|
||||||
|
- `ρ → 1`:`z' ≈ z`(几乎相同的视图)
|
||||||
|
- `ρ → 0`:`z'` 与 `z` 独立(完全不同的视图)
|
||||||
|
- 实践中取 `ρ ∈ [0.8, 0.95]`
|
||||||
|
|
||||||
|
### 性质 3:加性噪声(Additive Noise)
|
||||||
|
|
||||||
|
转移可以写成 `z' = m(z) + η`,其中 `m(z) = ρz` 是线性漂移,`η` 是独立噪声。这满足论文的"加性噪声假设"。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 Mehler 公式:OU 过程的谱定理
|
||||||
|
|
||||||
|
### 什么是 Mehler 公式?
|
||||||
|
|
||||||
|
Mehler 公式描述了 OU 过程的**转移核**(transition kernel)在 Hermite 多项式基下的展开:
|
||||||
|
|
||||||
|
```
|
||||||
|
p(z'|z) = φ(z') · Σ_{d=0}^{∞} ρᵈ · Heₐ(z) · Heₐ(z') / d!
|
||||||
|
```
|
||||||
|
|
||||||
|
其中 `φ(z')` 是标准高斯密度。
|
||||||
|
|
||||||
|
### 更直观的形式:相关性公式
|
||||||
|
|
||||||
|
对任意函数 `f, g`,Mehler 公式给出:
|
||||||
|
|
||||||
|
```
|
||||||
|
E[f(z) · g(z')] = Σ_{d=0}^{∞} ρᵈ · ⟨f, Heₐ⟩ · ⟨g, Heₐ⟩ / d!
|
||||||
|
```
|
||||||
|
|
||||||
|
**特别地**,当 `f = g = h_i`(编码器的第 i 个分量)时:
|
||||||
|
|
||||||
|
```
|
||||||
|
E[h_i(z) · h_i(z')] = Σ_{d=0}^{∞} ρᵈ · wₐ
|
||||||
|
```
|
||||||
|
|
||||||
|
其中 `wₐ` 是 `h_i` 在 d 阶 Hermite 多项式上的谱权重。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 核心推论:高阶成分被更强惩罚
|
||||||
|
|
||||||
|
### 推导过程
|
||||||
|
|
||||||
|
设编码器分量 `h_i` 的谱权重为 `{wₐ}`(满足 `Σ wₐ = 1`,`w₀ = 0`)。
|
||||||
|
|
||||||
|
由 Mehler 公式:
|
||||||
|
```
|
||||||
|
corr_i := E[h_i(z') · h_i(z)] = Σ_{d=1}^{∞} wₐ · ρᵈ
|
||||||
|
```
|
||||||
|
|
||||||
|
现在比较这个值与 `ρ`:
|
||||||
|
|
||||||
|
```
|
||||||
|
corr_i = Σ_{d=1}^{∞} wₐ · ρᵈ
|
||||||
|
≤ Σ_{d=1}^{∞} wₐ · ρ (因为 ρᵈ ≤ ρ 对 d ≥ 1)
|
||||||
|
= ρ · Σ_{d=1}^{∞} wₐ
|
||||||
|
= ρ · 1 = ρ
|
||||||
|
```
|
||||||
|
|
||||||
|
**结论:** `corr_i ≤ ρ`,等号成立当且仅当 `w₁ = 1`(即 `h_i` 是纯线性的)。
|
||||||
|
|
||||||
|
### 为什么等号只在线性时成立?
|
||||||
|
|
||||||
|
如果存在某个 `d₀ ≥ 2` 使得 `w_{d₀} > 0`,那么:
|
||||||
|
```
|
||||||
|
w_{d₀} · ρ^{d₀} < w_{d₀} · ρ (严格不等式,因为 ρ^{d₀} < ρ 对 d₀ ≥ 2)
|
||||||
|
```
|
||||||
|
|
||||||
|
所以整个求和严格小于 `ρ`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 数值例子
|
||||||
|
|
||||||
|
设 `ρ = 0.9`,考虑三种编码器:
|
||||||
|
|
||||||
|
| 编码器 | 谱权重 | 相关性 `corr_i` | 与 `ρ=0.9` 的差距 |
|
||||||
|
|--------|--------|----------------|-----------------|
|
||||||
|
| 纯线性 `h(z) = z` | `w₁ = 1` | `0.9¹ = 0.900` | 0(最优!) |
|
||||||
|
| 纯二次 `h(z) = z²-1` | `w₂ = 1` | `0.9² = 0.810` | -0.090 |
|
||||||
|
| 纯三次 `h(z) = z³-3z` | `w₃ = 1` | `0.9³ = 0.729` | -0.171 |
|
||||||
|
| 混合 `w₁=0.5, w₂=0.5` | 各半 | `0.5×0.9 + 0.5×0.81 = 0.855` | -0.045 |
|
||||||
|
|
||||||
|
**结论:** 非线性成分越多,相关性越低,对齐损失越大。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 与 LeJEPA 训练目标的联系
|
||||||
|
|
||||||
|
LeJEPA 的对齐损失:
|
||||||
|
```
|
||||||
|
L_align = E[‖h(z') - h(z)‖²]
|
||||||
|
= 2n - 2 Σᵢ E[h_i(z') · h_i(z)]
|
||||||
|
= 2n - 2 Σᵢ corr_i
|
||||||
|
```
|
||||||
|
|
||||||
|
最小化 `L_align` ⟺ 最大化 `Σᵢ corr_i`。
|
||||||
|
|
||||||
|
由 Mehler 公式,`corr_i ≤ ρ`,所以:
|
||||||
|
```
|
||||||
|
L_align ≥ 2n - 2nρ = 2(1-ρ)n
|
||||||
|
```
|
||||||
|
|
||||||
|
**等号成立当且仅当每个 `h_i` 都是线性的!**
|
||||||
|
|
||||||
|
这就是定理1的核心:**最优编码器必须是线性的**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎨 直觉图示
|
||||||
|
|
||||||
|
```
|
||||||
|
ρ = 0.9 时,不同阶数的衰减:
|
||||||
|
|
||||||
|
d=1 (线性): ρ¹ = 0.900 ████████████████████ ← 最大相关性
|
||||||
|
d=2 (二次): ρ² = 0.810 ██████████████████
|
||||||
|
d=3 (三次): ρ³ = 0.729 ████████████████
|
||||||
|
d=4 (四次): ρ⁴ = 0.656 ██████████████
|
||||||
|
d=5 (五次): ρ⁵ = 0.590 █████████████
|
||||||
|
|
||||||
|
非线性成分的相关性随阶数指数衰减!
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 代码实现
|
||||||
|
|
||||||
|
在 [`data.py`](../lejepa-identifiability/experiments/lejepa_id/data.py:29) 中:
|
||||||
|
|
||||||
|
```python
|
||||||
|
def ou_augment(z, rho, n_views=2, dist="gaussian", alpha=None):
|
||||||
|
"""z' = ρz + √(1-ρ²)η"""
|
||||||
|
fac = (1 - rho ** 2) ** 0.5
|
||||||
|
D, N = z.shape
|
||||||
|
eta = sample_latents(n_views * D, N, dist=dist, ...)
|
||||||
|
eta = eta.reshape(n_views, D, N)
|
||||||
|
return rho * z.unsqueeze(0) + fac * eta
|
||||||
|
```
|
||||||
|
|
||||||
|
实验配置([`configs/2d.yaml`](../lejepa-identifiability/experiments/configs/2d.yaml))中 `rho` 的典型值为 `0.9`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 小结
|
||||||
|
|
||||||
|
1. **OU 过程** 生成正样本对 `(z, z')`,相关性由 `ρ` 控制
|
||||||
|
2. **平稳性**:`z, z'` 有相同的高斯边际分布
|
||||||
|
3. **Mehler 公式**:OU 过程对 d 阶 Hermite 成分的相关性为 `ρᵈ`
|
||||||
|
4. **核心不等式**:`corr_i = Σ wₐ ρᵈ ≤ ρ`,等号 ⟺ 纯线性
|
||||||
|
5. **训练含义**:最小化对齐损失 → 最大化相关性 → 编码器必须是线性的
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ➡️ 下一步
|
||||||
|
|
||||||
|
→ [Topic 3:谱分解与线性可识别性](03_spectral_identifiability.md)——把 Hermite 展开和 OU 衰减组合成完整的定理1证明
|
||||||
@@ -0,0 +1,237 @@
|
|||||||
|
# Topic 3:谱分解与线性可识别性(定理 1 完整证明)
|
||||||
|
|
||||||
|
> **前置知识:** [Topic 1:Hermite 多项式](01_hermite_polynomials.md)、[Topic 2:OU 过程与 Mehler 公式](02_ou_process_mehler.md)
|
||||||
|
> **目标:** 把前两个 topic 的工具组合起来,完整理解定理1的证明逻辑
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 定理 1 的完整陈述
|
||||||
|
|
||||||
|
> **定理 1(线性可识别性):** 在高斯世界中,设编码器 `h : ℝⁿ → ℝⁿ` 满足:
|
||||||
|
> 1. **高斯约束**:`h(z) ~ N(0, Iₙ)`(嵌入分布是各向同性高斯)
|
||||||
|
> 2. **最优对齐**:`h` 最小化对齐损失 `L_align = E[‖h(z') - h(z)‖²]`
|
||||||
|
>
|
||||||
|
> 则 `h(z) = Qz`,其中 `Q ∈ O(n)` 是正交矩阵。
|
||||||
|
|
||||||
|
**白话翻译:** 如果你强制嵌入是高斯的,并且最大化正样本对的相似度,那么编码器**必然**是线性的(且保持距离)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗺️ 证明路线图
|
||||||
|
|
||||||
|
```
|
||||||
|
高斯约束 + 最优对齐
|
||||||
|
↓
|
||||||
|
[步骤1] Hermite 展开:h_i(z) = Σ cₐ Heₐ(z)
|
||||||
|
↓
|
||||||
|
[步骤2] Mehler 公式:corr_i = Σ wₐ ρᵈ
|
||||||
|
↓
|
||||||
|
[步骤3] 关键不等式:corr_i ≤ ρ(等号 ⟺ w₁=1)
|
||||||
|
↓
|
||||||
|
[步骤4] 最优性条件:L_align = 2(1-ρ)n → 每个 corr_i = ρ
|
||||||
|
↓
|
||||||
|
[步骤5] 线性性:每个 h_i 是线性函数
|
||||||
|
↓
|
||||||
|
[步骤6] 正交性:高斯约束 + 线性 → Q ∈ O(n)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 步骤 1:Hermite 展开
|
||||||
|
|
||||||
|
由 Topic 1,任意满足 `E[h_i(z)²] < ∞` 的函数可以展开:
|
||||||
|
|
||||||
|
```
|
||||||
|
h_i(z) = Σ_{α} c_{i,α} He_α(z)
|
||||||
|
```
|
||||||
|
|
||||||
|
其中 `α = (α₁, ..., αₙ)` 是多指标,`|α| = α₁ + ... + αₙ` 是总阶数。
|
||||||
|
|
||||||
|
**高斯约束的含义:**
|
||||||
|
- `E[h_i(z)] = 0` → `c_{i,0} = 0`(零均值,排除常数项)
|
||||||
|
- `E[h_i(z)²] = 1` → `Σ_{|α|≥1} c_{i,α}² |α|! = 1`(单位方差)
|
||||||
|
|
||||||
|
定义**谱权重**:
|
||||||
|
```
|
||||||
|
w_{i,d} = Σ_{|α|=d} c_{i,α}² d! / E[h_i(z)²]
|
||||||
|
```
|
||||||
|
|
||||||
|
则 `w_{i,d} ≥ 0`,`w_{i,0} = 0`,`Σ_d w_{i,d} = 1`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 步骤 2:用 Mehler 公式计算相关性
|
||||||
|
|
||||||
|
由 Topic 2 的 Mehler 公式:
|
||||||
|
|
||||||
|
```
|
||||||
|
corr_i := E[h_i(z') · h_i(z)] = Σ_{d=1}^{∞} w_{i,d} · ρᵈ
|
||||||
|
```
|
||||||
|
|
||||||
|
这是一个**加权平均**:用谱权重 `w_{i,d}` 对 `ρᵈ` 求加权和。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 步骤 3:关键不等式
|
||||||
|
|
||||||
|
**引理(已在 Lean 4 中验证):**
|
||||||
|
|
||||||
|
```
|
||||||
|
corr_i = Σ_{d=1}^{∞} w_{i,d} · ρᵈ ≤ Σ_{d=1}^{∞} w_{i,d} · ρ = ρ
|
||||||
|
```
|
||||||
|
|
||||||
|
**等号成立的条件:**
|
||||||
|
|
||||||
|
等号成立 ⟺ 对所有 `d ≥ 2`,`w_{i,d} · ρᵈ = w_{i,d} · ρ`
|
||||||
|
|
||||||
|
由于 `ρᵈ < ρ`(当 `d ≥ 2, 0 < ρ < 1`),这要求 `w_{i,d} = 0` 对所有 `d ≥ 2`。
|
||||||
|
|
||||||
|
又因为 `Σ_d w_{i,d} = 1` 且 `w_{i,0} = 0`,所以 `w_{i,1} = 1`。
|
||||||
|
|
||||||
|
**结论:** `corr_i = ρ` ⟺ `h_i` 是纯线性函数(只有 d=1 的 Hermite 成分)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 步骤 4:最优性条件
|
||||||
|
|
||||||
|
对齐损失可以写成:
|
||||||
|
|
||||||
|
```
|
||||||
|
L_align = E[‖h(z') - h(z)‖²]
|
||||||
|
= Σᵢ E[(h_i(z') - h_i(z))²]
|
||||||
|
= Σᵢ (E[h_i(z')²] + E[h_i(z)²] - 2E[h_i(z')h_i(z)])
|
||||||
|
= Σᵢ (1 + 1 - 2·corr_i)
|
||||||
|
= 2n - 2 Σᵢ corr_i
|
||||||
|
```
|
||||||
|
|
||||||
|
由步骤3,`corr_i ≤ ρ`,所以:
|
||||||
|
|
||||||
|
```
|
||||||
|
L_align = 2n - 2 Σᵢ corr_i ≥ 2n - 2nρ = 2(1-ρ)n
|
||||||
|
```
|
||||||
|
|
||||||
|
**最优值 `L_align = 2(1-ρ)n` 当且仅当每个 `corr_i = ρ`。**
|
||||||
|
|
||||||
|
由步骤3的等号条件,这要求每个 `h_i` 都是线性的。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 步骤 5:线性性
|
||||||
|
|
||||||
|
每个 `h_i` 只有 d=1 的 Hermite 成分,即:
|
||||||
|
|
||||||
|
```
|
||||||
|
h_i(z) = Σⱼ aᵢⱼ zⱼ
|
||||||
|
```
|
||||||
|
|
||||||
|
写成矩阵形式:`h(z) = Az`,其中 `A ∈ ℝⁿˣⁿ`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 步骤 6:正交性
|
||||||
|
|
||||||
|
现在利用**高斯约束** `h(z) ~ N(0, Iₙ)`:
|
||||||
|
|
||||||
|
如果 `h(z) = Az` 且 `z ~ N(0, Iₙ)`,则:
|
||||||
|
```
|
||||||
|
h(z) ~ N(0, AA^T)
|
||||||
|
```
|
||||||
|
|
||||||
|
要使 `h(z) ~ N(0, Iₙ)`,需要:
|
||||||
|
```
|
||||||
|
AA^T = Iₙ
|
||||||
|
```
|
||||||
|
|
||||||
|
这正是 `A ∈ O(n)`(正交矩阵)的定义!
|
||||||
|
|
||||||
|
**结论:** `h(z) = Qz`,`Q ∈ O(n)`。 □
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 为什么叫"线性可识别性"?
|
||||||
|
|
||||||
|
### 可识别性(Identifiability)的含义
|
||||||
|
|
||||||
|
在表示学习中,"可识别性"指:从观测数据 `x = g(z)` 中,能否恢复出真实的潜变量 `z`?
|
||||||
|
|
||||||
|
- **完全可识别**:`h(x) = z`(精确恢复)
|
||||||
|
- **线性可识别**:`h(x) = Qz`(恢复到正交变换等价)
|
||||||
|
- **置换可识别**:`h(x) = Pz`(恢复到置换等价,ICA 的结果)
|
||||||
|
- **不可识别**:无法从 `h(x)` 恢复 `z` 的任何信息
|
||||||
|
|
||||||
|
### 为什么"正交等价"已经足够?
|
||||||
|
|
||||||
|
正交变换保持:
|
||||||
|
- **距离**:`‖Qz₁ - Qz₂‖ = ‖z₁ - z₂‖`
|
||||||
|
- **内积**:`⟨Qz₁, Qz₂⟩ = ⟨z₁, z₂⟩`
|
||||||
|
- **范数**:`‖Qz‖ = ‖z‖`
|
||||||
|
|
||||||
|
对于**旋转不变的代价函数**(如欧氏距离、LQR),在 `Qz` 空间中规划与在 `z` 空间中规划完全等价(见 Topic 6)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎨 几何直觉
|
||||||
|
|
||||||
|
```
|
||||||
|
真实潜空间 z: 学到的表示 h(z) = Qz:
|
||||||
|
|
||||||
|
z₂ h₂
|
||||||
|
↑ ↑
|
||||||
|
│ ● ● │ ● ●
|
||||||
|
│● ● │ ● ●
|
||||||
|
│ ●● │ ●●
|
||||||
|
└──────→ z₁ └──────→ h₁
|
||||||
|
|
||||||
|
两个空间的点云形状完全相同,只是旋转了角度 θ。
|
||||||
|
所有距离、角度关系都被保留。
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ 证明的假设条件
|
||||||
|
|
||||||
|
定理1成立需要以下条件:
|
||||||
|
|
||||||
|
| 假设 | 含义 | 如果违反? |
|
||||||
|
|------|------|-----------|
|
||||||
|
| 潜变量是高斯的 | `z ~ N(0, I_n)` | 定理2说明:非高斯时线性可识别性失败 |
|
||||||
|
| OU 转移 | `z' = ρz + √(1-ρ²)η` | 其他转移可能不满足 Mehler 公式 |
|
||||||
|
| 高斯约束 | `h(z) ~ N(0, I_n)` | 没有约束则编码器可能坍塌 |
|
||||||
|
| 最优对齐 | `h` 达到全局最优 | 局部最优可能不是线性的 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Lean 4 验证状态
|
||||||
|
|
||||||
|
在 [`Hermite.lean`](../lejepa-identifiability/lean/LeJEPA/Hermite.lean) 中:
|
||||||
|
|
||||||
|
| 步骤 | 对应定理 | 状态 |
|
||||||
|
|------|---------|------|
|
||||||
|
| 步骤3(不等式) | `correlation_le_rho` | ✅ 机器验证 |
|
||||||
|
| 步骤3(等号条件) | `equality_forces_degree_one` | ✅ 机器验证 |
|
||||||
|
| 步骤4(损失下界) | `loss_lower_bound` | ✅ 机器验证 |
|
||||||
|
| 步骤4(最优性) | `hermite_identifiability`(主定理) | ✅ 机器验证 |
|
||||||
|
| 步骤1(Hermite 基) | `mehler_summability` | 公理化(Mathlib 尚未收录) |
|
||||||
|
| 步骤5(线性性) | `linear_of_degree_one` | 公理化 |
|
||||||
|
| 步骤6(正交性) | `orthogonal_of_gaussian_linear` | 公理化 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 小结
|
||||||
|
|
||||||
|
定理1的证明是一个**优化论证**:
|
||||||
|
|
||||||
|
1. 把编码器用 Hermite 多项式展开(谱分解)
|
||||||
|
2. 用 Mehler 公式计算正样本对的相关性
|
||||||
|
3. 证明相关性 ≤ ρ,等号 ⟺ 纯线性
|
||||||
|
4. 最优对齐要求每个分量都达到等号
|
||||||
|
5. 因此编码器必须是线性的
|
||||||
|
6. 高斯约束进一步要求线性映射是正交的
|
||||||
|
|
||||||
|
**核心洞见:** OU 过程对高阶非线性成分的"惩罚"(衰减)比线性成分更强,所以最优编码器会"放弃"所有非线性成分。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ➡️ 下一步
|
||||||
|
|
||||||
|
→ [Topic 4:Sturm-Liouville 理论与高斯唯一性](04_sturm_liouville_uniqueness.md)——为什么只有高斯分布才能保证线性可识别性?
|
||||||
@@ -0,0 +1,257 @@
|
|||||||
|
# Topic 4:Sturm-Liouville 理论与高斯唯一性(定理 2)
|
||||||
|
|
||||||
|
> **前置知识:** [Topic 3:谱分解与线性可识别性](03_spectral_identifiability.md)、基础微积分(微分方程)
|
||||||
|
> **目标:** 理解为什么高斯分布是**唯一**能保证线性可识别性的分布
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 定理 2 的完整陈述
|
||||||
|
|
||||||
|
> **定理 2(高斯唯一性):** 在满足世界假设(独立性、平稳性、加性噪声)的所有分布中,**高斯分布是唯一**使 LeJEPA 实现线性可识别性的分布。
|
||||||
|
|
||||||
|
**白话翻译:** 定理1的结论(线性可识别性)不是对所有分布都成立的——它只对高斯分布成立。换句话说,高斯分布是"恰好合适"的分布。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤔 为什么这个结论令人惊讶?
|
||||||
|
|
||||||
|
### 与经典 ICA 的对比
|
||||||
|
|
||||||
|
在**线性 ICA**(独立成分分析)中,结论恰好相反:
|
||||||
|
|
||||||
|
| 场景 | 高斯分布 | 非高斯分布 |
|
||||||
|
|------|---------|-----------|
|
||||||
|
| 线性 ICA | ❌ **失败**(无法分离) | ✅ 成功 |
|
||||||
|
| LeJEPA(非线性) | ✅ **成功** | ❌ 失败 |
|
||||||
|
|
||||||
|
**LeJEPA 完全颠倒了 ICA 的结论!**
|
||||||
|
|
||||||
|
### 直觉解释
|
||||||
|
|
||||||
|
- **线性 ICA 失败的原因**:高斯分布的旋转不变性使得无法区分不同的旋转方向
|
||||||
|
- **LeJEPA 成功的原因**:正是这种旋转不变性,使得 OU 过程的谱分解(Hermite 多项式)恰好给出线性最优解
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔑 证明的核心工具:Sturm-Liouville 理论
|
||||||
|
|
||||||
|
### 什么是 Sturm-Liouville 问题?
|
||||||
|
|
||||||
|
Sturm-Liouville 问题是一类特殊的微分方程特征值问题:
|
||||||
|
|
||||||
|
```
|
||||||
|
-(p(z) φ'(z))' + q(z) φ(z) = λ w(z) φ(z)
|
||||||
|
```
|
||||||
|
|
||||||
|
其中 `φ` 是特征函数,`λ` 是特征值。
|
||||||
|
|
||||||
|
**在 LeJEPA 的语境中:** 转移算子 `T[f](z) = E[f(z')|z]` 的特征函数满足 Sturm-Liouville 方程。
|
||||||
|
|
||||||
|
### 关键联系
|
||||||
|
|
||||||
|
对于加性噪声转移 `z' = m(z) + η`,转移算子的特征方程为:
|
||||||
|
|
||||||
|
```
|
||||||
|
K · (log p(z))' · φ(z) + K · φ'(z) = -λ₁ · φ(z)
|
||||||
|
```
|
||||||
|
|
||||||
|
其中:
|
||||||
|
- `K`:扩散系数(与噪声方差有关)
|
||||||
|
- `(log p(z))'`:**得分函数**(score function)
|
||||||
|
- `λ₁`:第一非常数特征值
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 证明路线:从仿射特征函数到高斯分布
|
||||||
|
|
||||||
|
### 关键问题
|
||||||
|
|
||||||
|
定理1的证明依赖于"第一特征函数是线性的"(即 `φ₁(z) = z`)。
|
||||||
|
|
||||||
|
定理2要问:**什么分布 `p` 使得第一特征函数是仿射的(`φ₁(z) = az + b`)?**
|
||||||
|
|
||||||
|
### 步骤 1:仿射特征函数 → 仿射得分函数
|
||||||
|
|
||||||
|
设第一特征函数是仿射的:`φ₁(z) = az + b`(`a ≠ 0`)。
|
||||||
|
|
||||||
|
代入特征方程:
|
||||||
|
```
|
||||||
|
K · score(z) · a = -λ₁ · (az + b)
|
||||||
|
```
|
||||||
|
|
||||||
|
解出得分函数:
|
||||||
|
```
|
||||||
|
score(z) = (log p(z))' = -(λ₁/K) · z - (λ₁ b)/(Ka)
|
||||||
|
= α · z + β
|
||||||
|
```
|
||||||
|
|
||||||
|
其中 `α = -λ₁/K < 0`(因为 `λ₁ > 0, K > 0`)。
|
||||||
|
|
||||||
|
**结论:** 仿射特征函数 → 得分函数是线性的(斜率为负)。
|
||||||
|
|
||||||
|
### 步骤 2:仿射得分函数 → 高斯分布
|
||||||
|
|
||||||
|
得分函数 `(log p(z))' = αz + β`,积分得:
|
||||||
|
|
||||||
|
```
|
||||||
|
log p(z) = (α/2) z² + βz + C
|
||||||
|
```
|
||||||
|
|
||||||
|
由于 `α < 0`,这是一个**向下开口的抛物线**,对应:
|
||||||
|
|
||||||
|
```
|
||||||
|
p(z) ∝ exp((α/2) z² + βz) = exp(-(z-μ)²/(2σ²))
|
||||||
|
```
|
||||||
|
|
||||||
|
这正是**高斯分布** `N(μ, σ²)`!
|
||||||
|
|
||||||
|
### 步骤 3:反向(高斯 → 仿射特征函数)
|
||||||
|
|
||||||
|
反过来,如果 `p` 是高斯分布,则其 Sturm-Liouville 特征函数是 Hermite 多项式,第一个非常数特征函数是 `He₁(z) = z`(仿射的)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 完整的双条件定理
|
||||||
|
|
||||||
|
```
|
||||||
|
p 是高斯分布
|
||||||
|
⟺
|
||||||
|
第一特征函数是仿射的
|
||||||
|
⟺
|
||||||
|
LeJEPA 实现线性可识别性
|
||||||
|
```
|
||||||
|
|
||||||
|
**Lean 4 验证([`Uniqueness.lean`](../lejepa-identifiability/lean/LeJEPA/Uniqueness.lean)):**
|
||||||
|
|
||||||
|
```lean
|
||||||
|
theorem gaussian_uniqueness (lc : LatentComponent) :
|
||||||
|
-- if 方向:高斯 → 仿射特征函数
|
||||||
|
(IsGaussianScore lc.score →
|
||||||
|
∃ (a b : ℝ), a ≠ 0 ∧ ∀ z, K·score(z)·a = -(ev·(az+b)))
|
||||||
|
∧
|
||||||
|
-- only-if 方向:仿射特征函数 → 高斯
|
||||||
|
(∀ (a b : ℝ), a ≠ 0 →
|
||||||
|
(∀ z, K·score(z)·a = -(ev·(az+b))) →
|
||||||
|
IsGaussianScore lc.score)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎨 直觉图示:为什么非高斯分布失败?
|
||||||
|
|
||||||
|
### 拉普拉斯分布(α=1)
|
||||||
|
|
||||||
|
```
|
||||||
|
p(z) ∝ exp(-|z|)
|
||||||
|
|
||||||
|
得分函数:(log p)' = -sign(z) (在 z≠0 处)
|
||||||
|
|
||||||
|
这是一个阶跃函数,不是线性的!
|
||||||
|
→ 第一特征函数不是仿射的
|
||||||
|
→ 线性可识别性失败
|
||||||
|
```
|
||||||
|
|
||||||
|
### 均匀分布(α→∞)
|
||||||
|
|
||||||
|
```
|
||||||
|
p(z) = 1/(2a) 在 [-a, a] 上
|
||||||
|
|
||||||
|
得分函数:(log p)' = 0 (在内部)
|
||||||
|
|
||||||
|
这是常数,不是线性的!
|
||||||
|
→ 第一特征函数不是仿射的
|
||||||
|
→ 线性可识别性失败
|
||||||
|
```
|
||||||
|
|
||||||
|
### 高斯分布(α=2)
|
||||||
|
|
||||||
|
```
|
||||||
|
p(z) ∝ exp(-z²/2)
|
||||||
|
|
||||||
|
得分函数:(log p)' = -z (线性!)
|
||||||
|
|
||||||
|
→ 第一特征函数是 He₁(z) = z(仿射)
|
||||||
|
→ 线性可识别性成立 ✓
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 实验验证(广义正态分布族)
|
||||||
|
|
||||||
|
论文用**广义正态分布**(Generalized Normal)扫描形状参数 `α`:
|
||||||
|
|
||||||
|
```
|
||||||
|
p(z; α) ∝ exp(-|z/β|^α)
|
||||||
|
```
|
||||||
|
|
||||||
|
- `α = 1`:拉普拉斯分布
|
||||||
|
- `α = 2`:高斯分布(唯一成功的!)
|
||||||
|
- `α → ∞`:均匀分布
|
||||||
|
|
||||||
|
实验结果([`gennorm.yaml`](../lejepa-identifiability/experiments/configs/gennorm.yaml) 配置):
|
||||||
|
|
||||||
|
```
|
||||||
|
R²(h→z) 随 α 的变化:
|
||||||
|
|
||||||
|
α=0.5 ████░░░░░░░░░░░░░░░░ ~0.5(重尾,失败)
|
||||||
|
α=1.0 ██████░░░░░░░░░░░░░░ ~0.6(拉普拉斯,失败)
|
||||||
|
α=1.5 ████████░░░░░░░░░░░░ ~0.8(接近高斯,部分成功)
|
||||||
|
α=2.0 ████████████████████ ~1.0(高斯,完全成功!)
|
||||||
|
α=3.0 ████████░░░░░░░░░░░░ ~0.8(超高斯,部分失败)
|
||||||
|
α=5.0 ██████░░░░░░░░░░░░░░ ~0.6(接近均匀,失败)
|
||||||
|
```
|
||||||
|
|
||||||
|
**R² 在 α=2(高斯)处尖锐达到峰值**,完美验证定理2。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 与 ICA 理论的深层联系
|
||||||
|
|
||||||
|
### 为什么 ICA 和 LeJEPA 的结论相反?
|
||||||
|
|
||||||
|
| 方法 | 目标 | 高斯的角色 |
|
||||||
|
|------|------|-----------|
|
||||||
|
| 线性 ICA | 最大化非高斯性(kurtosis) | 高斯是"最难分离"的 |
|
||||||
|
| LeJEPA | 最大化 OU 相关性 | 高斯是"最容易识别"的 |
|
||||||
|
|
||||||
|
**根本原因:** ICA 利用高阶统计量(非高斯性)来分离信号;LeJEPA 利用时间结构(OU 相关性)来识别信号。这两种方法对高斯分布的"态度"完全相反。
|
||||||
|
|
||||||
|
### Hyvärinen & Pajunen (1999) 的经典结论
|
||||||
|
|
||||||
|
> 非线性 ICA 在一般情况下是不可识别的。
|
||||||
|
|
||||||
|
LeJEPA 通过**限制分布为高斯**和**使用时间结构**,绕过了这个不可识别性结果。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ 实践含义
|
||||||
|
|
||||||
|
### 什么时候潜变量近似高斯?
|
||||||
|
|
||||||
|
1. **中心极限定理**:如果潜变量是许多独立小因素的叠加,则趋向高斯
|
||||||
|
2. **宏观物理量**:温度、压力等宏观量通常近似高斯
|
||||||
|
3. **主成分**:PCA 后的主成分在许多情况下近似高斯
|
||||||
|
|
||||||
|
### 什么时候不是高斯?
|
||||||
|
|
||||||
|
1. **稀疏信号**:自然图像的小波系数(拉普拉斯分布)
|
||||||
|
2. **有界量**:角度、概率值(均匀或 Beta 分布)
|
||||||
|
3. **多峰分布**:类别标签、离散状态
|
||||||
|
|
||||||
|
**论文的建议:** 对于非高斯潜变量,LeJEPA 仍然有用,但线性可识别性保证不再成立(见 Topic 5 的近似界)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 小结
|
||||||
|
|
||||||
|
1. **定理2** 证明高斯分布是线性可识别性的**唯一**充要条件
|
||||||
|
2. **证明工具**:Sturm-Liouville 特征值理论
|
||||||
|
3. **核心链条**:仿射特征函数 ⟺ 线性得分函数 ⟺ 高斯分布
|
||||||
|
4. **与 ICA 的对比**:LeJEPA 完全颠倒了 ICA 中高斯分布的角色
|
||||||
|
5. **实验验证**:广义正态分布扫描显示 R² 在 α=2 处尖锐达到峰值
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ➡️ 下一步
|
||||||
|
|
||||||
|
→ [Topic 5:近似可识别性界](05_approximate_identifiability.md)——当假设只近似满足时,误差如何优雅降级?
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
# Topic 5:近似可识别性界(定理 3)
|
||||||
|
|
||||||
|
> **前置知识:** [Topic 3:谱分解与线性可识别性](03_spectral_identifiability.md)
|
||||||
|
> **目标:** 理解当理论假设只近似满足时,恢复误差如何被量化和控制
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 定理 3 的完整陈述
|
||||||
|
|
||||||
|
> **定理 3(近似可识别性):** 设编码器 `h` 满足:
|
||||||
|
> - **近似对齐**:`L_align(h) ≤ 2(1-ρ)n + δ`(对齐损失比最优值多 `δ`)
|
||||||
|
> - **近似白化**:`‖Cov(h(z)) - Iₙ‖_F ≤ ε`(协方差矩阵偏离单位阵 `ε`)
|
||||||
|
>
|
||||||
|
> 则存在正交矩阵 `Q ∈ O(n)` 使得:
|
||||||
|
> ```
|
||||||
|
> E[‖h(z) - Qz‖²] ≤ D + (ε + D)²
|
||||||
|
> ```
|
||||||
|
> 其中 `D = δ / (2ρ(1-ρ))`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤔 为什么需要近似版本?
|
||||||
|
|
||||||
|
定理1是**精确**结论:在完美条件下,`h(z) = Qz`。
|
||||||
|
|
||||||
|
但在实践中:
|
||||||
|
1. **优化不完美**:梯度下降不一定找到全局最优
|
||||||
|
2. **有限样本**:用有限数据估计的协方差矩阵有误差
|
||||||
|
3. **模型容量**:神经网络可能无法精确表示线性函数
|
||||||
|
4. **非高斯数据**:真实数据可能不完全满足高斯假设
|
||||||
|
|
||||||
|
定理3告诉我们:**即使条件只近似满足,恢复误差也是有界的,且随误差优雅降级**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 两个误差参数的含义
|
||||||
|
|
||||||
|
### 参数 δ:对齐间隙(Alignment Gap)
|
||||||
|
|
||||||
|
```
|
||||||
|
δ = L_align(h) - 2(1-ρ)n ≥ 0
|
||||||
|
```
|
||||||
|
|
||||||
|
- `δ = 0`:完美对齐(定理1的条件)
|
||||||
|
- `δ > 0`:对齐损失比最优值多 `δ`
|
||||||
|
|
||||||
|
**物理含义:** 正样本对的嵌入有多"不相似"(超出理论最优的部分)。
|
||||||
|
|
||||||
|
### 参数 ε:白化误差(Whitening Error)
|
||||||
|
|
||||||
|
```
|
||||||
|
ε = ‖Cov(h(z)) - Iₙ‖_F
|
||||||
|
```
|
||||||
|
|
||||||
|
- `ε = 0`:完美白化(嵌入是各向同性高斯)
|
||||||
|
- `ε > 0`:协方差矩阵偏离单位阵
|
||||||
|
|
||||||
|
**物理含义:** 嵌入分布有多"不高斯"(协方差矩阵偏离单位阵的程度)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 归一化量 D 的推导
|
||||||
|
|
||||||
|
从 `δ` 到 `D` 的转换:
|
||||||
|
|
||||||
|
```
|
||||||
|
D = δ / (2ρ(1-ρ))
|
||||||
|
```
|
||||||
|
|
||||||
|
**为什么要除以 `2ρ(1-ρ)`?**
|
||||||
|
|
||||||
|
回忆定理1的证明:对齐损失的最优值是 `2(1-ρ)n`,而相关性的"谱间隙"(线性成分 `ρ` 与二次成分 `ρ²` 之差)是:
|
||||||
|
|
||||||
|
```
|
||||||
|
ρ - ρ² = ρ(1-ρ)
|
||||||
|
```
|
||||||
|
|
||||||
|
所以 `2ρ(1-ρ)` 是"每单位非线性成分对对齐损失的贡献"。除以它可以把对齐间隙 `δ` 转换为"非线性成分的总权重"。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 界的推导(简化版)
|
||||||
|
|
||||||
|
### 第一步:从 δ 到非线性权重
|
||||||
|
|
||||||
|
由定理1的证明,对齐损失可以写成:
|
||||||
|
|
||||||
|
```
|
||||||
|
L_align = 2n - 2 Σᵢ corr_i = 2n - 2 Σᵢ Σ_d w_{i,d} ρᵈ
|
||||||
|
```
|
||||||
|
|
||||||
|
最优值是 `2(1-ρ)n`(所有 `w_{i,1} = 1`)。
|
||||||
|
|
||||||
|
对齐间隙 `δ` 对应于非线性成分的总权重:
|
||||||
|
|
||||||
|
```
|
||||||
|
Σᵢ Σ_{d≥2} w_{i,d} ≤ δ / (2ρ(1-ρ)) = D
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第二步:从非线性权重到恢复误差
|
||||||
|
|
||||||
|
非线性成分的总权重 `D` 直接给出恢复误差的一部分:
|
||||||
|
|
||||||
|
```
|
||||||
|
E[‖h(z) - Az‖²] ≤ D
|
||||||
|
```
|
||||||
|
|
||||||
|
其中 `A` 是最优线性近似。
|
||||||
|
|
||||||
|
### 第三步:从线性近似到正交矩阵
|
||||||
|
|
||||||
|
`A` 不一定是正交的(因为白化误差 `ε`)。从 `A` 到最近的正交矩阵 `Q`(Procrustes 问题)引入额外误差:
|
||||||
|
|
||||||
|
```
|
||||||
|
‖A - Q‖_F ≤ ε + D
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第四步:三角不等式组合
|
||||||
|
|
||||||
|
```
|
||||||
|
E[‖h(z) - Qz‖²] ≤ E[‖h(z) - Az‖²] + ‖A - Q‖_F²
|
||||||
|
≤ D + (ε + D)²
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 界的数值感受
|
||||||
|
|
||||||
|
设 `ρ = 0.9`,考虑不同的误差水平:
|
||||||
|
|
||||||
|
| δ(对齐间隙) | ε(白化误差) | D = δ/(2×0.9×0.1) | 界 D + (ε+D)² |
|
||||||
|
|-------------|-------------|-------------------|--------------|
|
||||||
|
| 0 | 0 | 0 | 0(完美!) |
|
||||||
|
| 0.018 | 0 | 0.1 | 0.1 + 0.01 = 0.11 |
|
||||||
|
| 0.018 | 0.1 | 0.1 | 0.1 + 0.04 = 0.14 |
|
||||||
|
| 0.018 | 0.5 | 0.1 | 0.1 + 0.36 = 0.46 |
|
||||||
|
| 0.18 | 0 | 1.0 | 1.0 + 1.0 = 2.0 |
|
||||||
|
|
||||||
|
**观察:**
|
||||||
|
- 对齐间隙 `δ` 是主要误差来源(通过 `D`)
|
||||||
|
- 白化误差 `ε` 的影响是二阶的(`(ε+D)²` 中的 `ε`)
|
||||||
|
- 当 `D` 很小时,`ε` 的影响可以忽略
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 代码中的量化
|
||||||
|
|
||||||
|
在 [`metrics.py`](../lejepa-identifiability/experiments/lejepa_id/metrics.py:16) 中,所有界的量都被计算:
|
||||||
|
|
||||||
|
```python
|
||||||
|
def compute_all_metrics(z, x, h, h_prime, rho, N):
|
||||||
|
# 白化误差 ε
|
||||||
|
cov_h = torch.cov(h.T)
|
||||||
|
epsilon = torch.linalg.norm(cov_h - torch.eye(N), 'fro').item()
|
||||||
|
|
||||||
|
# 对齐损失 L_h
|
||||||
|
L_h = ((h_prime - h) ** 2).sum(dim=1).mean().item()
|
||||||
|
|
||||||
|
# 对齐间隙 δ(与理论最优 2(1-ρ)·trace_cov 的差)
|
||||||
|
delta = max(L_h - 2 * (1 - rho) * trace_cov, 0.0)
|
||||||
|
|
||||||
|
# 归一化量 D
|
||||||
|
spectral_gap = 2 * rho * (1 - rho)
|
||||||
|
D_bound = delta / spectral_gap
|
||||||
|
|
||||||
|
# 近似界
|
||||||
|
approx_bound = D_bound + (epsilon + D_bound) ** 2
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 实验验证
|
||||||
|
|
||||||
|
论文在所有实验运行中验证了定理3:
|
||||||
|
|
||||||
|
**图(a)(官网):** 横轴是理论界 `D + (ε+D)²`,纵轴是实际恢复误差。
|
||||||
|
|
||||||
|
```
|
||||||
|
实际误差
|
||||||
|
↑
|
||||||
|
│ ●
|
||||||
|
│ ●●
|
||||||
|
│ ●●●
|
||||||
|
│ ●●●●
|
||||||
|
│●●●●
|
||||||
|
└──────────────────→ 理论界
|
||||||
|
所有点在对角线下方(界成立)
|
||||||
|
```
|
||||||
|
|
||||||
|
**关键发现:**
|
||||||
|
- 所有运行的实际误差均**低于**理论界(界是有效的)
|
||||||
|
- 对齐损失 `L_h` 是可识别性的**最强预测指标**
|
||||||
|
- 白化误差 `ε` 的影响相对较小
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 实践含义
|
||||||
|
|
||||||
|
### 对训练的指导
|
||||||
|
|
||||||
|
1. **优先优化对齐损失**:`δ` 是主要误差来源,应该尽量减小
|
||||||
|
2. **白化误差是次要的**:`ε` 的影响是二阶的,不需要过度追求完美白化
|
||||||
|
3. **监控 D_bound**:训练时可以用 `D_bound` 作为可识别性的代理指标
|
||||||
|
|
||||||
|
### 对超参数选择的指导
|
||||||
|
|
||||||
|
- **`ρ` 的选择**:`ρ` 越大,`2ρ(1-ρ)` 越小,`D` 越大(对 `δ` 更敏感)
|
||||||
|
- `ρ = 0.5` 时:`2ρ(1-ρ) = 0.5`(最大谱间隙)
|
||||||
|
- `ρ = 0.9` 时:`2ρ(1-ρ) = 0.18`(较小谱间隙)
|
||||||
|
- 实践中 `ρ ∈ [0.8, 0.95]` 是好的选择
|
||||||
|
|
||||||
|
- **`λ` 的选择**:正则化权重影响白化误差 `ε`
|
||||||
|
- `λ` 太小:白化不充分,`ε` 大
|
||||||
|
- `λ` 太大:对齐损失被忽视,`δ` 大
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔬 Lean 4 验证
|
||||||
|
|
||||||
|
在 [`Approx.lean`](../lejepa-identifiability/lean/LeJEPA/Approx.lean) 中形式化验证了定理3的核心不等式链。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 小结
|
||||||
|
|
||||||
|
1. **定理3** 量化了"近似满足条件时"的恢复误差
|
||||||
|
2. **两个误差参数**:对齐间隙 `δ`(主要)和白化误差 `ε`(次要)
|
||||||
|
3. **界的形式**:`D + (ε+D)²`,其中 `D = δ/(2ρ(1-ρ))`
|
||||||
|
4. **优雅降级**:误差随 `δ, ε → 0` 连续趋向零
|
||||||
|
5. **实践指导**:优先减小对齐损失,白化误差是次要的
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ➡️ 下一步
|
||||||
|
|
||||||
|
→ [Topic 6:正交不变性与最优规划](06_planning_equivalence.md)——线性可识别性如何使潜空间规划与真实世界规划等价?
|
||||||
@@ -0,0 +1,272 @@
|
|||||||
|
# Topic 6:正交不变性与最优规划(定理 4)
|
||||||
|
|
||||||
|
> **前置知识:** [Topic 3:谱分解与线性可识别性](03_spectral_identifiability.md)、基础控制理论(可选)
|
||||||
|
> **目标:** 理解为什么线性可识别性足以保证在学到的潜空间中规划与在真实世界中规划完全等价
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 定理 4 的完整陈述
|
||||||
|
|
||||||
|
> **定理 4(最优潜空间规划):** 设 `h(z) = Qz`(`Q ∈ O(n)`,由定理1保证)。对任意有限时域控制问题,若代价函数关于状态是 **O(n)-不变的**,则:
|
||||||
|
>
|
||||||
|
> ```
|
||||||
|
> V̂*(h(z₀)) = V*(z₀) (最优值函数相等)
|
||||||
|
> â*_{1:T}(h(z₀)) = a*_{1:T}(z₀) (最优动作序列相等)
|
||||||
|
> ```
|
||||||
|
|
||||||
|
**白话翻译:** 如果代价函数不区分旋转方向,那么在学到的潜空间 `ĥ = Qz` 中规划,与在真实潜空间 `z` 中规划,得到的最优策略完全相同。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤔 为什么这个结论重要?
|
||||||
|
|
||||||
|
### 世界模型的终极目标
|
||||||
|
|
||||||
|
学习世界模型的目的是**规划**:给定当前状态,找到最优动作序列。
|
||||||
|
|
||||||
|
如果学到的表示 `h(z)` 不能支持正确的规划,那么世界模型就没有实用价值。
|
||||||
|
|
||||||
|
定理4说明:**线性可识别性(正交等价)已经足够支持最优规划**——不需要精确恢复 `z`,只需要恢复到旋转等价。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 关键概念:O(n)-不变代价函数
|
||||||
|
|
||||||
|
### 定义
|
||||||
|
|
||||||
|
代价函数 `ℓ(z, a)` 是 **O(n)-不变的**,如果对所有正交矩阵 `Q ∈ O(n)`:
|
||||||
|
|
||||||
|
```
|
||||||
|
ℓ(Qz, a) = ℓ(z, a) 对所有 z, a
|
||||||
|
```
|
||||||
|
|
||||||
|
**直觉:** 代价函数不依赖于坐标系的旋转方向,只依赖于状态的"本质"(如距离、范数等)。
|
||||||
|
|
||||||
|
### 常见的 O(n)-不变代价函数
|
||||||
|
|
||||||
|
| 代价函数 | 形式 | 不变性 |
|
||||||
|
|---------|------|--------|
|
||||||
|
| 欧氏距离到目标 | `‖z - z_goal‖²` | ✅(若 `z_goal` 也旋转) |
|
||||||
|
| 线性二次调节(LQR) | `z^T P z + a^T R a` | ✅(若 `P = cI`) |
|
||||||
|
| 范数惩罚 | `‖z‖²` | ✅ |
|
||||||
|
| 目标到达 | `𝟙[‖z - z_goal‖ < r]` | ✅ |
|
||||||
|
| 任意旋转不变量 | `f(‖z‖, ‖a‖, ...)` | ✅ |
|
||||||
|
|
||||||
|
### 不满足 O(n)-不变性的代价函数
|
||||||
|
|
||||||
|
| 代价函数 | 形式 | 原因 |
|
||||||
|
|---------|------|------|
|
||||||
|
| 坐标惩罚 | `z₁²`(只惩罚第一维) | ❌ 旋转后变成 `(Qz)₁²` |
|
||||||
|
| 非对称目标 | `‖z - [1,0,...,0]‖²` | ❌ 目标方向固定 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📐 证明的核心思路
|
||||||
|
|
||||||
|
### 关键引理:代价等价
|
||||||
|
|
||||||
|
设 `h(z) = Qz`,`Q ∈ O(n)`。对任意 O(n)-不变代价函数 `ℓ`:
|
||||||
|
|
||||||
|
```
|
||||||
|
ℓ(h(z), a) = ℓ(Qz, a) = ℓ(z, a)
|
||||||
|
```
|
||||||
|
|
||||||
|
**这一步是整个证明的核心!** 正交变换不改变 O(n)-不变代价函数的值。
|
||||||
|
|
||||||
|
### 轨迹推前(Trajectory Pushforward)
|
||||||
|
|
||||||
|
设真实动力学为 `p(z'|z, a)`,学到的潜空间动力学为 `p̂(ẑ'|ẑ, a)`(其中 `ẑ = Qz`)。
|
||||||
|
|
||||||
|
由于 `h(z) = Qz` 是线性双射,学到的动力学是真实动力学的**推前**:
|
||||||
|
|
||||||
|
```
|
||||||
|
p̂(ẑ'|ẑ, a) = p(Q⁻¹ẑ'|Q⁻¹ẑ, a) = p(z'|z, a)
|
||||||
|
```
|
||||||
|
|
||||||
|
(因为 `Q⁻¹ = Q^T` 对正交矩阵成立)
|
||||||
|
|
||||||
|
### 总代价等价
|
||||||
|
|
||||||
|
对任意动作序列 `a_{1:T}`,从初始状态 `z₀` 出发的总期望代价:
|
||||||
|
|
||||||
|
```
|
||||||
|
J(a_{1:T}; ẑ₀) = E[Σ_t ℓ(ẑ_t, a_t) + ℓ_T(ẑ_T) | ẑ₀ = Qz₀]
|
||||||
|
= E[Σ_t ℓ(Qz_t, a_t) + ℓ_T(Qz_T) | z₀]
|
||||||
|
= E[Σ_t ℓ(z_t, a_t) + ℓ_T(z_T) | z₀] (O(n)-不变性)
|
||||||
|
= J(a_{1:T}; z₀)
|
||||||
|
```
|
||||||
|
|
||||||
|
**结论:** 对任意动作序列,两个空间中的总代价完全相同!
|
||||||
|
|
||||||
|
### 最优性等价
|
||||||
|
|
||||||
|
由于对所有 `a_{1:T}` 代价相等,最小化代价的动作序列也相同:
|
||||||
|
|
||||||
|
```
|
||||||
|
a*_{1:T}(ẑ₀) = argmin_a J(a; ẑ₀) = argmin_a J(a; z₀) = a*_{1:T}(z₀)
|
||||||
|
```
|
||||||
|
|
||||||
|
最优值函数也相等:
|
||||||
|
|
||||||
|
```
|
||||||
|
V̂*(ẑ₀) = min_a J(a; ẑ₀) = min_a J(a; z₀) = V*(z₀)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎨 几何直觉
|
||||||
|
|
||||||
|
```
|
||||||
|
真实潜空间 z: 学到的潜空间 ẑ = Qz:
|
||||||
|
|
||||||
|
z₂ ẑ₂
|
||||||
|
↑ ↑
|
||||||
|
│ ●goal │ ●goal'
|
||||||
|
│ │
|
||||||
|
│●start │ ●start'
|
||||||
|
└──────→ z₁ └──────→ ẑ₁
|
||||||
|
|
||||||
|
最优路径(蓝色): 最优路径(蓝色):
|
||||||
|
start → goal start' → goal'
|
||||||
|
(直线,欧氏距离最短) (直线,欧氏距离最短)
|
||||||
|
|
||||||
|
两条路径在旋转意义下完全相同!
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Lean 4 验证([`Planning.lean`](../lejepa-identifiability/lean/LeJEPA/Planning.lean))
|
||||||
|
|
||||||
|
```lean
|
||||||
|
-- 核心:对任意动作序列,两个空间的总代价相等
|
||||||
|
theorem planning_equivalence
|
||||||
|
(cp : ControlProblem n Action) (Q : Latent n → Latent n)
|
||||||
|
(hinv : IsOrthogonalInvariant cp Q)
|
||||||
|
(a : Plan Action T) (z : Latent n) :
|
||||||
|
totalCost cp E_hat a (Q z) = totalCost cp E a z
|
||||||
|
|
||||||
|
-- 推论:最优动作序列相同
|
||||||
|
theorem minimizer_equivalence ... :
|
||||||
|
(∀ a', cost_hat a (Q z) ≤ cost_hat a' (Q z)) ↔
|
||||||
|
(∀ a', cost a z ≤ cost a' z)
|
||||||
|
|
||||||
|
-- 推论:最优值函数相等
|
||||||
|
theorem value_equivalence ... :
|
||||||
|
totalCost cp E a z = V →
|
||||||
|
totalCost cp E_hat a (Q z) = V
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔬 实验验证:DMC Reacher
|
||||||
|
|
||||||
|
### 实验设置
|
||||||
|
|
||||||
|
- **环境**:DeepMind Control Suite 的 Reacher 任务
|
||||||
|
- **输入**:像素图像(64×64 RGB)
|
||||||
|
- **潜变量**:2D 关节角度 `z = (θ₁, θ₂)`
|
||||||
|
- **编码器**:CNN(见 [`models.py`](../lejepa-identifiability/experiments/lejepa_id/models.py:46))
|
||||||
|
- **规划方式**:在潜空间中线性插值,用最近邻检索解码
|
||||||
|
|
||||||
|
### 两种训练数据
|
||||||
|
|
||||||
|
| 数据类型 | 生成方式 | 分布 | 可识别性 |
|
||||||
|
|---------|---------|------|---------|
|
||||||
|
| OU 采样 | `z' = ρz + √(1-ρ²)η` | 各向同性高斯 | ✅ 高(满足定理1) |
|
||||||
|
| RL 轨迹 | 训练好的策略采样 | 非高斯、各向异性 | ❌ 低(违反假设) |
|
||||||
|
|
||||||
|
### 实验结果
|
||||||
|
|
||||||
|
```
|
||||||
|
规划代价(路径长度,越低越好,理想值=1):
|
||||||
|
|
||||||
|
Oracle(关节空间直线): ████░░░░░░ ~1.0(基准)
|
||||||
|
OU 编码器: ████░░░░░░ ~1.0(与 oracle 无统计显著差异)
|
||||||
|
轨迹编码器: ██████░░░░ ~1.5(显著偏高)
|
||||||
|
```
|
||||||
|
|
||||||
|
**结论:** OU 编码器(满足定理1条件)的规划质量与 oracle 相当;轨迹编码器(违反假设)的规划质量显著下降。
|
||||||
|
|
||||||
|
### 可视化
|
||||||
|
|
||||||
|
```
|
||||||
|
[顶行] Oracle:
|
||||||
|
●──────────────────● (关节空间直线,平滑弧线)
|
||||||
|
|
||||||
|
[中行] OU 编码器(可识别):
|
||||||
|
●──────────────────● (紧密跟随 oracle)
|
||||||
|
|
||||||
|
[底行] 轨迹编码器(不可识别):
|
||||||
|
●────╮╰──────────● (偏离,因为潜空间扭曲)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 与世界模型的联系
|
||||||
|
|
||||||
|
### 什么是"可证明地学到世界模型"?
|
||||||
|
|
||||||
|
论文的标题问题:"When Does LeJEPA Learn a World Model?"
|
||||||
|
|
||||||
|
答案(由定理4给出):
|
||||||
|
|
||||||
|
> **LeJEPA 学到世界模型,当且仅当它实现了线性可识别性。**
|
||||||
|
|
||||||
|
因为:
|
||||||
|
- 线性可识别性 → `h(z) = Qz`(正交等价)
|
||||||
|
- 正交等价 → O(n)-不变代价函数下的规划等价(定理4)
|
||||||
|
- 规划等价 → 可以在学到的潜空间中做最优规划
|
||||||
|
- 最优规划 → 学到的表示是"可用的世界模型"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ 定理4的局限性
|
||||||
|
|
||||||
|
### 1. 只覆盖 O(n)-不变代价函数
|
||||||
|
|
||||||
|
如果代价函数依赖于特定坐标方向(如"向北走"),则定理4不适用。
|
||||||
|
|
||||||
|
**实践中:** 大多数物理任务的代价函数(距离、能量、时间)都是旋转不变的。
|
||||||
|
|
||||||
|
### 2. 只处理编码器侧
|
||||||
|
|
||||||
|
定理4假设动力学 `p̂(ẑ'|ẑ, a)` 是真实动力学的推前。但在实践中,还需要学习一个**转移模型**(predictor)。
|
||||||
|
|
||||||
|
**未来工作:** 动作条件转移 `p̂(ẑ'|ẑ, a)` 的可识别性(与因果表示学习相关)。
|
||||||
|
|
||||||
|
### 3. 有限时域
|
||||||
|
|
||||||
|
定理4是有限时域(`T` 步)的结论。无限时域(折扣 MDP)的情况需要额外分析。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 小结
|
||||||
|
|
||||||
|
1. **定理4** 证明线性可识别性足以保证最优规划等价
|
||||||
|
2. **关键条件**:代价函数是 O(n)-不变的(旋转不变)
|
||||||
|
3. **证明核心**:正交变换不改变 O(n)-不变代价函数的值
|
||||||
|
4. **实验验证**:OU 编码器的规划质量与 oracle 相当,轨迹编码器显著下降
|
||||||
|
5. **世界模型含义**:线性可识别性 = 可证明地学到世界模型
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏁 四个定理的完整图景
|
||||||
|
|
||||||
|
```
|
||||||
|
定理1(正向):高斯世界 + LeJEPA → 线性可识别性 h(z) = Qz
|
||||||
|
↕
|
||||||
|
定理2(逆向):高斯是唯一使线性可识别性成立的分布
|
||||||
|
↓
|
||||||
|
定理3(近似):条件近似满足时,误差 ≤ D + (ε+D)²
|
||||||
|
↓
|
||||||
|
定理4(应用):线性可识别性 → 最优潜空间规划
|
||||||
|
```
|
||||||
|
|
||||||
|
**核心信息:** LeJEPA 在高斯世界中可证明地学到世界模型,且这个保证对近似条件优雅降级,并直接支持最优规划。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ➡️ 返回总览
|
||||||
|
|
||||||
|
← [README:数学 Topic 导航](README.md)
|
||||||
|
← [论文完整笔记](../lejepa_world_model_notes.md)
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
# LeJEPA 数学证明分解导航
|
||||||
|
|
||||||
|
> 本目录将论文 *When Does LeJEPA Learn a World Model?* 的数学证明拆分为 6 个独立 topic,每个 topic 专注一个概念,循序渐进。
|
||||||
|
>
|
||||||
|
> **建议阅读顺序:** Topic 1 → 2 → 3 → 4 → 5 → 6
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Topic 列表
|
||||||
|
|
||||||
|
| # | 文件 | 核心概念 | 对应定理 | 难度 |
|
||||||
|
|---|------|---------|---------|------|
|
||||||
|
| 1 | [Hermite 多项式](01_hermite_polynomials.md) | 高斯分布下的函数分解工具 | 定理1基础 | ⭐⭐ |
|
||||||
|
| 2 | [OU 过程与 Mehler 公式](02_ou_process_mehler.md) | 正样本对生成 + 高阶衰减 | 定理1基础 | ⭐⭐ |
|
||||||
|
| 3 | [谱分解与线性可识别性](03_spectral_identifiability.md) | 定理1完整证明 | **定理 1** | ⭐⭐⭐ |
|
||||||
|
| 4 | [Sturm-Liouville 与高斯唯一性](04_sturm_liouville_uniqueness.md) | 为什么只有高斯分布有效 | **定理 2** | ⭐⭐⭐ |
|
||||||
|
| 5 | [近似可识别性界](05_approximate_identifiability.md) | 误差如何优雅降级 | **定理 3** | ⭐⭐ |
|
||||||
|
| 6 | [正交不变性与最优规划](06_planning_equivalence.md) | 潜空间规划等价于真实规划 | **定理 4** | ⭐⭐ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗺️ 知识依赖图
|
||||||
|
|
||||||
|
```
|
||||||
|
Topic 1: Hermite 多项式
|
||||||
|
│
|
||||||
|
↓
|
||||||
|
Topic 2: OU 过程 + Mehler 公式
|
||||||
|
│
|
||||||
|
↓
|
||||||
|
Topic 3: 谱分解 → 线性可识别性(定理1)
|
||||||
|
│ │
|
||||||
|
↓ ↓
|
||||||
|
Topic 4: 高斯唯一性 Topic 5: 近似界 Topic 6: 最优规划
|
||||||
|
(定理2) (定理3) (定理4)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 四大定理速查
|
||||||
|
|
||||||
|
### 定理 1:线性可识别性(正向)
|
||||||
|
> 高斯世界 + LeJEPA 最优 → `h(z) = Qz`(正交矩阵)
|
||||||
|
|
||||||
|
**核心工具:** Hermite 谱分解 + OU 衰减 + 最优性条件
|
||||||
|
|
||||||
|
### 定理 2:高斯唯一性(逆向)
|
||||||
|
> 高斯分布是**唯一**使线性可识别性成立的分布
|
||||||
|
|
||||||
|
**核心工具:** Sturm-Liouville 特征值理论 + 得分函数分析
|
||||||
|
|
||||||
|
### 定理 3:近似可识别性
|
||||||
|
> 条件近似满足时,误差 `≤ D + (ε+D)²`,其中 `D = δ/(2ρ(1-ρ))`
|
||||||
|
|
||||||
|
**核心工具:** 三角不等式 + Procrustes 分析
|
||||||
|
|
||||||
|
### 定理 4:最优潜空间规划
|
||||||
|
> 线性可识别性 → O(n)-不变代价函数下的规划完全等价
|
||||||
|
|
||||||
|
**核心工具:** 正交不变性 + 轨迹推前
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔑 关键公式速查
|
||||||
|
|
||||||
|
### LeJEPA 训练目标
|
||||||
|
```
|
||||||
|
L(h) = λ · L_SIG + (1-λ) · L_align
|
||||||
|
|
||||||
|
L_align = E[‖h(z') - h(z)‖²] # 对齐损失
|
||||||
|
L_SIG = SIGReg(h(z), N(0,I)) # 高斯正则化
|
||||||
|
```
|
||||||
|
|
||||||
|
### OU 过程(正样本对生成)
|
||||||
|
```
|
||||||
|
z' = ρz + √(1-ρ²) η, η ~ N(0, I_n), ρ ∈ (0,1)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mehler 公式(核心不等式)
|
||||||
|
```
|
||||||
|
E[h_i(z') · h_i(z)] = Σ_d w_{i,d} · ρᵈ ≤ ρ
|
||||||
|
等号 ⟺ w_{i,1} = 1(纯线性)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 近似界
|
||||||
|
```
|
||||||
|
E[‖h(z) - Qz‖²] ≤ D + (ε + D)²
|
||||||
|
D = δ / (2ρ(1-ρ))
|
||||||
|
δ = L_align - 2(1-ρ)n(对齐间隙)
|
||||||
|
ε = ‖Cov(h(z)) - I‖_F(白化误差)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 代码对应关系
|
||||||
|
|
||||||
|
| 数学概念 | 代码实现 |
|
||||||
|
|---------|---------|
|
||||||
|
| SIGReg 正则化 | [`losses.py:SIGReg`](../lejepa-identifiability/experiments/lejepa_id/losses.py) |
|
||||||
|
| 对齐损失 | [`losses.py:alignment_loss`](../lejepa-identifiability/experiments/lejepa_id/losses.py) |
|
||||||
|
| OU 增强 | [`data.py:ou_augment`](../lejepa-identifiability/experiments/lejepa_id/data.py) |
|
||||||
|
| R²、正交误差、近似界 | [`metrics.py:compute_all_metrics`](../lejepa-identifiability/experiments/lejepa_id/metrics.py) |
|
||||||
|
| 训练循环 | [`engine.py:train_and_evaluate`](../lejepa-identifiability/experiments/lejepa_id/engine.py) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔬 Lean 4 形式化验证对应
|
||||||
|
|
||||||
|
| 定理 | Lean 文件 | 验证状态 |
|
||||||
|
|------|----------|---------|
|
||||||
|
| 定理1(Hermite 路径) | [`lean/LeJEPA/Hermite.lean`](../lejepa-identifiability/lean/LeJEPA/Hermite.lean) | ✅ 零 sorry |
|
||||||
|
| 定理2(高斯唯一性) | [`lean/LeJEPA/Uniqueness.lean`](../lejepa-identifiability/lean/LeJEPA/Uniqueness.lean) | ✅ 零 sorry |
|
||||||
|
| 定理3(近似界) | [`lean/LeJEPA/Approx.lean`](../lejepa-identifiability/lean/LeJEPA/Approx.lean) | ✅ 零 sorry |
|
||||||
|
| 定理4(规划等价) | [`lean/LeJEPA/Planning.lean`](../lejepa-identifiability/lean/LeJEPA/Planning.lean) | ✅ 零 sorry |
|
||||||
|
| 附录E(Dirichlet 路径) | [`lean/LeJEPA/Dirichlet.lean`](../lejepa-identifiability/lean/LeJEPA/Dirichlet.lean) | ✅ 零 sorry |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 核心洞见(一句话总结)
|
||||||
|
|
||||||
|
> **LeJEPA 将经典 ICA 的叙事完全颠倒:** 在线性 ICA 中,高斯分布是源分离**失败**的唯一情况;在 LeJEPA 的非线性设置中,高斯分布恰恰是使线性可识别性**成立**的唯一分布。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📖 相关文件
|
||||||
|
|
||||||
|
- [论文完整笔记](../lejepa_world_model_notes.md) — 综合分析(含代码实现、官网图示)
|
||||||
|
- [资源汇总](../lejepa_resources.md) — 视频、论文、代码、HuggingFace 模型
|
||||||
|
- [代码仓库](../lejepa-identifiability/) — 本地 clone 的官方实现
|
||||||
Binary file not shown.
@@ -4,12 +4,12 @@ date: 2026-05-20
|
|||||||
draft: false
|
draft: false
|
||||||
tags: ["worldmodel", "index", "目录"]
|
tags: ["worldmodel", "index", "目录"]
|
||||||
categories: ["worldmodel"]
|
categories: ["worldmodel"]
|
||||||
description: "WorldModel 项目全部文档的分类索引,涵盖 PRISM、CrowdRoom、RoomPlan、HotelScene、Camera、研究论文六大方向,共 67 篇文档。"
|
description: "WorldModel 项目全部文档的分类索引,涵盖 PRISM、CrowdRoom、RoomPlan、HotelScene、Camera、GameEngine、研究论文七大方向,共 68 篇文档。"
|
||||||
---
|
---
|
||||||
|
|
||||||
# WorldModel 项目文档总目录
|
# WorldModel 项目文档总目录
|
||||||
|
|
||||||
WorldModel 是一个以**室内物理世界理解**为核心目标的研究型工程项目,以酒店场景作为真实复杂环境的切入点。项目构建从毫米级几何重建、开放词表语义理解,到物理准确交互仿真的完整技术闭环,为具身智能(Embodied AI)在真实场景中的落地提供可验证的技术平台。核心理念是**"先验 + 在线"双流融合**:利用消费级 iPhone(RoomPlan)建立高质量空间先验地图,再通过 ZED 2i 立体相机进行在线感知与增量更新,两路异构数据在统一的空间记忆架构(PRISM)中汇聚。应用场景涵盖酒店服务机器人导航与操作、室内数字孪生建模、具身智能仿真验证平台,以及众包 3D 房间数据共享社区(CrowdRoom)。
|
WorldModel 是一个以**室内物理世界理解**为核心目标的研究型工程项目,以酒店场景作为真实复杂环境的切入点。项目构建从毫米级几何重建、开放词表语义理解,到物理准确交互仿真的完整技术闭环,为具身智能(Embodied AI)在真实场景中的落地提供可验证的技术平台。核心理念是**"先验 + 在线"双流融合**:利用消费级 iPhone(RoomPlan)建立高质量空间先验地图,再通过 ZED 2i 立体相机进行在线感知与增量更新,两路异构数据在统一的空间记忆架构(PRISM)中汇聚。同时引入 3D 游戏引擎作为可交互数字孪生运行时,用于实时可视化、轻量物理沙盒、合成数据生成与人工标注回写。应用场景涵盖酒店服务机器人导航与操作、室内数字孪生建模、具身智能仿真验证平台,以及众包 3D 房间数据共享社区(CrowdRoom)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -18,12 +18,13 @@ WorldModel 是一个以**室内物理世界理解**为核心目标的研究型
|
|||||||
| 分类 | 文件数 | 简介 |
|
| 分类 | 文件数 | 简介 |
|
||||||
|------|--------|------|
|
|------|--------|------|
|
||||||
| 🏨 HotelScene | 6 | 酒店场景室内建模与物理验证项目规划文档 |
|
| 🏨 HotelScene | 6 | 酒店场景室内建模与物理验证项目规划文档 |
|
||||||
|
| 🎮 GameEngine | 1 | 结合 3D 游戏引擎的交互式数字孪生与验证方案 |
|
||||||
| 📷 Camera | 6 | ZED 2i 立体相机采集方案与国产替代调研 |
|
| 📷 Camera | 6 | ZED 2i 立体相机采集方案与国产替代调研 |
|
||||||
| 🏠 CrowdRoom | 13 | 众包 3D 房间共享平台完整设计文档 |
|
| 🏠 CrowdRoom | 13 | 众包 3D 房间共享平台完整设计文档 |
|
||||||
| 🔮 PRISM | 26 | 机器人空间记忆架构(20 章节 + 配套文档) |
|
| 🔮 PRISM | 26 | 机器人空间记忆架构(20 章节 + 配套文档) |
|
||||||
| 📱 RoomPlan | 7 | iPhone 3D 重建方案与数据格式规范 |
|
| 📱 RoomPlan | 7 | iPhone 3D 重建方案与数据格式规范 |
|
||||||
| 🔬 research | 9 | 世界模型、空间记忆、SLAM 等学术调研 |
|
| 🔬 research | 9 | 世界模型、空间记忆、SLAM 等学术调研 |
|
||||||
| **合计** | **67** | |
|
| **合计** | **68** | |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -40,6 +41,14 @@ WorldModel 是一个以**室内物理世界理解**为核心目标的研究型
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 🎮 GameEngine — 3D 游戏引擎交互验证
|
||||||
|
|
||||||
|
在 RoomPlan / ZED 2i / PRISM / 世界模型链路之外,引入 Unity、Unreal Engine 与 Isaac Sim 的分层协作方案。游戏引擎负责实时可视化、交互编辑、轻量物理沙盒、合成数据生成与 episode/patch 回写;Isaac Sim 保留为机器人高可信仿真后端。
|
||||||
|
|
||||||
|
- [结合 3D 游戏引擎的室内世界模型验证方案](plans/game_engine_simulation_plan/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 📷 Camera — 相机采集方案
|
## 📷 Camera — 相机采集方案
|
||||||
|
|
||||||
专注于 ZED 2i 立体相机在室内场景的工程化落地,涵盖综合方案对比、双目+IMU 完整解决方案、迭代开发框架、国产替代调研,以及相关 GitHub 开源项目汇总。
|
专注于 ZED 2i 立体相机在室内场景的工程化落地,涵盖综合方案对比、双目+IMU 完整解决方案、迭代开发框架、国产替代调研,以及相关 GitHub 开源项目汇总。
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ categories: ["HotelScene"]
|
|||||||
### 相关参考文档
|
### 相关参考文档
|
||||||
|
|
||||||
- **[../hotel_model.md](../hotel_model.md)** - 原始项目方案
|
- **[../hotel_model.md](../hotel_model.md)** - 原始项目方案
|
||||||
|
- **[game_engine_simulation_plan.md](game_engine_simulation_plan.md)** - 结合 3D 游戏引擎的室内世界模型验证方案
|
||||||
- **[../understanding_physics_research_plan.md](../understanding_physics_research_plan.md)** - 物理世界理解研究计划
|
- **[../understanding_physics_research_plan.md](../understanding_physics_research_plan.md)** - 物理世界理解研究计划
|
||||||
- **[../world_models_review.md](../world_models_review.md)** - 世界模型技术综述
|
- **[../world_models_review.md](../world_models_review.md)** - 世界模型技术综述
|
||||||
- **[../physics_world_models_review.md](../physics_world_models_review.md)** - 物理世界模型综述
|
- **[../physics_world_models_review.md](../physics_world_models_review.md)** - 物理世界模型综述
|
||||||
@@ -142,6 +143,7 @@ categories: ["HotelScene"]
|
|||||||
|
|
||||||
### 技术产出
|
### 技术产出
|
||||||
- 🏗️ 10个场景的数字孪生模型
|
- 🏗️ 10个场景的数字孪生模型
|
||||||
|
- 🎮 3D 游戏引擎交互验证场景
|
||||||
- 🤖 物理仿真环境(Isaac Sim)
|
- 🤖 物理仿真环境(Isaac Sim)
|
||||||
- 🧠 预训练M-JEPA模型
|
- 🧠 预训练M-JEPA模型
|
||||||
- 📐 CAD模型库
|
- 📐 CAD模型库
|
||||||
|
|||||||
@@ -0,0 +1,590 @@
|
|||||||
|
---
|
||||||
|
title: "结合 3D 游戏引擎的室内世界模型验证方案"
|
||||||
|
date: 2026-05-31
|
||||||
|
draft: false
|
||||||
|
tags: ["规划", "3D游戏引擎", "仿真", "数字孪生", "物理", "机器人"]
|
||||||
|
categories: ["GameEngine"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# 结合 3D 游戏引擎的室内世界模型验证方案
|
||||||
|
|
||||||
|
## 1. 方案定位
|
||||||
|
|
||||||
|
本方案在现有 **RoomPlan / ZED 2i / PRISM / 世界模型** 技术链路之外,引入 3D 游戏引擎作为一个新的工程层:
|
||||||
|
|
||||||
|
> **3D 游戏引擎不是替代 SLAM、PRISM 或 Isaac Sim,而是作为“可交互数字孪生运行时”:负责实时渲染、交互编辑、轻量物理验证、合成数据生成、多人演示与人工标注。**
|
||||||
|
|
||||||
|
它解决现有方案中的三个缺口:
|
||||||
|
|
||||||
|
1. **可视化缺口**:研究系统输出的 mesh、3DGS、场景图、语义层需要一个直观、可交互、可调试的前台。
|
||||||
|
2. **交互缺口**:机器人任务不仅要离线评测,还要让研究员快速拖拽物体、修改材质、设置碰撞体、回放动作。
|
||||||
|
3. **数据缺口**:真实酒店采集成本高,游戏引擎可生成可控扰动、光照变化、遮挡、人流和任务变体。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 总体架构
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TB
|
||||||
|
subgraph CAPTURE["真实世界采集"]
|
||||||
|
IPHONE["iPhone RoomPlan<br/>USDZ / JSON / CAD"]
|
||||||
|
ZED["ZED 2i<br/>RGB-D / VIO / 点云"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph MEMORY["空间记忆与世界模型"]
|
||||||
|
PRISM["PRISM<br/>L1-L4 空间记忆"]
|
||||||
|
WM["World Model<br/>M-JEPA / DreamerV3 / Video WM"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph ASSET["资产转换层"]
|
||||||
|
CLEAN["Mesh 清洗<br/>尺度/坐标/法线/拓扑"]
|
||||||
|
SEM["语义绑定<br/>object_id / affordance / material"]
|
||||||
|
USD["USD / glTF / FBX<br/>统一资产包"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph ENGINE["3D 游戏引擎运行时"]
|
||||||
|
VIEW["实时可视化<br/>PBR / 灯光 / UI"]
|
||||||
|
PHYS["轻量物理沙盒<br/>碰撞 / 约束 / 关节"]
|
||||||
|
SYN["合成数据<br/>RGB / Depth / Seg / Flow"]
|
||||||
|
EDIT["交互编辑<br/>拖拽 / 标注 / Remix"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph ROBOT["机器人与评测"]
|
||||||
|
ROS["ROS 2 Bridge"]
|
||||||
|
TASK["任务脚本<br/>导航 / 抓取 / 推拉"]
|
||||||
|
EVAL["评测指标<br/>成功率 / 偏差 / 鲁棒性"]
|
||||||
|
end
|
||||||
|
|
||||||
|
IPHONE --> CLEAN
|
||||||
|
ZED --> CLEAN
|
||||||
|
CLEAN --> SEM --> USD --> ENGINE
|
||||||
|
PRISM --> SEM
|
||||||
|
ENGINE --> ROS --> TASK --> EVAL
|
||||||
|
ENGINE --> SYN --> WM
|
||||||
|
WM --> PRISM
|
||||||
|
PRISM --> ENGINE
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 引擎选型建议
|
||||||
|
|
||||||
|
| 引擎 | 适合角色 | 优点 | 局限 | 建议定位 |
|
||||||
|
|------|----------|------|------|----------|
|
||||||
|
| **Unreal Engine** | 高保真酒店数字孪生、演示、复杂交互 | 渲染质量强,Chaos Physics 支持刚体、约束、破坏、流体等实时物理能力 | 机器人生态需要自建桥接,工程复杂度高 | **主推荐:视觉与交互前台** |
|
||||||
|
| **Unity** | 快速原型、Web/移动端、CrowdRoom 编辑器 | C# 开发快,生态适合工具型产品,Unity Robotics 有 ROS TCP Connector | 官方 ROS TCP Connector 最近主版本较旧,长期维护风险需评估 | **推荐:MVP 和产品化编辑器** |
|
||||||
|
| **Godot** | 开源轻量工具、内部标注器 | 开源、轻量、部署灵活 | 高保真渲染、机器人仿真生态弱 | **可选:低成本标注/浏览工具** |
|
||||||
|
| **NVIDIA Isaac Sim** | 机器人精确仿真、传感器、合成数据 | 基于 OpenUSD,面向机器人仿真、测试与合成数据,天然适合 URDF/CAD/USD 资产链路 | 不适合作为普通用户产品前台,学习和硬件成本较高 | **保留:严肃机器人仿真后端** |
|
||||||
|
|
||||||
|
推荐采用“双引擎分工”:
|
||||||
|
|
||||||
|
- **Unreal / Unity**:面向人类研究员和产品用户的交互前台。
|
||||||
|
- **Isaac Sim**:面向机器人控制、传感器仿真、强化学习和 sim-to-real 的高可信仿真后端。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 核心管线
|
||||||
|
|
||||||
|
### 4.1 真实扫描到游戏场景
|
||||||
|
|
||||||
|
```text
|
||||||
|
iPhone RoomPlan / ZED 2i
|
||||||
|
→ 坐标系统一:米制、Z-up/Y-up 转换、世界原点锚定
|
||||||
|
→ Mesh 清洗:去噪、补洞、简化、法线修复
|
||||||
|
→ 语义绑定:room_id、object_id、category、bbox、affordance
|
||||||
|
→ 碰撞体生成:墙体 box collider、家具 convex hull、可操作物体 articulated body
|
||||||
|
→ 材质重建:PBR baseColor / roughness / metallic / normal
|
||||||
|
→ 导出:USD 为主,glTF/FBX 为 Web 和通用引擎备选
|
||||||
|
```
|
||||||
|
|
||||||
|
关键原则:
|
||||||
|
|
||||||
|
- **视觉资产和物理资产分离**:高精 mesh 用于渲染,低复杂度 collider 用于物理。
|
||||||
|
- **PRISM ID 贯穿全链路**:游戏引擎中的每个物体都保留 `spatial_node_id`,方便回写空间记忆。
|
||||||
|
- **可编辑但可追溯**:人工在引擎中修正的材质、碰撞体、关节参数,要以 patch 形式回写,而不是覆盖原始扫描。
|
||||||
|
|
||||||
|
### 4.2 游戏引擎到 PRISM
|
||||||
|
|
||||||
|
游戏引擎不是只读 viewer,而是 PRISM 的交互标注和实验入口:
|
||||||
|
|
||||||
|
| 引擎事件 | 回写到 PRISM |
|
||||||
|
|----------|--------------|
|
||||||
|
| 研究员拖动椅子 | `delta/object_pose_changed` |
|
||||||
|
| 修正门的旋转轴 | L4 节点 `joint.axis` / `joint.limit` |
|
||||||
|
| 标注“可抓取”区域 | `affordance.graspable_regions` |
|
||||||
|
| 设置碰撞体 | L2/L4 物理代理属性 |
|
||||||
|
| 回放机器人失败轨迹 | episode memory + anomaly |
|
||||||
|
|
||||||
|
### 4.3 游戏引擎到世界模型
|
||||||
|
|
||||||
|
游戏引擎可生成有控制变量的训练数据:
|
||||||
|
|
||||||
|
| 数据类型 | 用途 |
|
||||||
|
|----------|------|
|
||||||
|
| RGB / Depth / Normal | 训练感知 encoder |
|
||||||
|
| Instance Segmentation | 训练 2D/3D 语义分割 |
|
||||||
|
| Optical Flow | 训练动态预测 |
|
||||||
|
| Action-State Pair | 训练 DreamerV3 / TD-MPC2 |
|
||||||
|
| Counterfactual Rollout | 训练“如果推椅子会怎样”类预测 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 可交互数字孪生运行时详细方案
|
||||||
|
|
||||||
|
本节把“可交互数字孪生运行时”具体化为一个可开发的软件系统。它不是简单的 3D Viewer,而是一个面向研究员、机器人算法工程师和数据标注人员的 **Scene Lab**:能看、能查、能改、能模拟、能回放、能把修改写回 PRISM。
|
||||||
|
|
||||||
|
### 5.1 产品形态
|
||||||
|
|
||||||
|
建议先做桌面端,再做 Web 端:
|
||||||
|
|
||||||
|
| 形态 | 技术路线 | 目标用户 | 适合阶段 |
|
||||||
|
|------|----------|----------|----------|
|
||||||
|
| **桌面 Scene Lab** | Unity Editor Runtime / Unreal Editor Utility | 研究员、算法工程师 | P0 MVP |
|
||||||
|
| **Web Viewer** | Three.js/R3F 或 Unity WebGL | PM、合作酒店、标注人员 | P1 展示与轻编辑 |
|
||||||
|
| **Pixel Streaming 高保真版** | Unreal Pixel Streaming | 远程演示、客户评审 | P1/P2 |
|
||||||
|
|
||||||
|
P0 阶段推荐做 **Unity 桌面 Scene Lab**,原因是迭代快、UI 工具多、和 JSON/glTF/ROS 接口打通成本低。Unreal 分支用于高保真展示,不阻塞 MVP。
|
||||||
|
|
||||||
|
### 5.2 主界面布局
|
||||||
|
|
||||||
|
```text
|
||||||
|
┌──────────────────────────────────────────────────────────────┐
|
||||||
|
│ Top Bar: 场景选择 | 模式切换 | 保存 Patch | 运行任务 | 导出数据 │
|
||||||
|
├───────────────┬──────────────────────────────┬───────────────┤
|
||||||
|
│ Scene Tree │ │ Inspector │
|
||||||
|
│ - room_305 │ 3D Viewport │ object_id │
|
||||||
|
│ - wall_01 │ 轨道相机 / 第一人称 / 机器人视角 │ pose/bbox │
|
||||||
|
│ - bed_01 │ 语义高亮 / 热力图 / 轨迹回放 │ material │
|
||||||
|
│ - chair_01 │ │ physics │
|
||||||
|
├───────────────┴──────────────────────────────┴───────────────┤
|
||||||
|
│ Timeline / Logs: episode 回放 | 事件列表 | PRISM delta diff │
|
||||||
|
└──────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
核心交互模式:
|
||||||
|
|
||||||
|
| 模式 | 快捷操作 | 用途 |
|
||||||
|
|------|----------|------|
|
||||||
|
| `Explore` | orbit / fly / first-person | 浏览房间、走廊、大堂 |
|
||||||
|
| `Inspect` | click object | 查看 PRISM 节点、语义、bbox、来源帧 |
|
||||||
|
| `Edit` | translate / rotate / scale | 修正物体位姿、墙体边界、家具尺寸 |
|
||||||
|
| `Physics` | add collider / set joint / simulate | 设置碰撞体、质量、摩擦、门/抽屉关节 |
|
||||||
|
| `Annotate` | paint / box / polygon | 标注可抓取区域、不可通行区、危险区 |
|
||||||
|
| `Replay` | play / pause / scrub | 回放机器人轨迹和失败 episode |
|
||||||
|
| `Generate` | randomize / capture | 生成合成 RGB-D、分割、扰动样本 |
|
||||||
|
|
||||||
|
### 5.3 模块拆分
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
LOAD["Scene Loader<br/>USD/glTF/JSON"]
|
||||||
|
REG["Registry<br/>object_id ↔ actor"]
|
||||||
|
VIEW["Viewport<br/>render layers"]
|
||||||
|
SEL["Selection<br/>raycast/pick"]
|
||||||
|
EDIT["Edit Tools<br/>transform/material/collider"]
|
||||||
|
PHYS["Physics Sandbox<br/>simulate/reset"]
|
||||||
|
PATCH["Patch Recorder<br/>diff/event log"]
|
||||||
|
BRIDGE["PRISM Bridge<br/>load/save/query"]
|
||||||
|
EXPORT["Export<br/>dataset/episode"]
|
||||||
|
|
||||||
|
LOAD --> REG --> VIEW
|
||||||
|
VIEW --> SEL --> EDIT --> PATCH
|
||||||
|
EDIT --> PHYS --> PATCH
|
||||||
|
PATCH --> BRIDGE
|
||||||
|
VIEW --> EXPORT
|
||||||
|
PHYS --> EXPORT
|
||||||
|
```
|
||||||
|
|
||||||
|
| 模块 | 职责 | P0 要做到 |
|
||||||
|
|------|------|-----------|
|
||||||
|
| Scene Loader | 加载 `scene.glb/usd`、`scene_graph.json`、材质贴图 | 一个客房可稳定加载 |
|
||||||
|
| Object Registry | 建立 `spatial_node_id` 到引擎 actor 的映射 | 点击物体能查 PRISM ID |
|
||||||
|
| Viewport | 多视角浏览、图层开关、语义上色 | 支持 RGB / semantic / collider 三种视图 |
|
||||||
|
| Inspector | 展示和编辑节点属性 | 可改类别、名称、位姿、物理参数 |
|
||||||
|
| Edit Tools | 拖拽、旋转、缩放、吸附、撤销 | 支持家具位姿修正 |
|
||||||
|
| Physics Sandbox | 局部物理仿真与 reset | 支持椅子推动、门旋转、抽屉滑动 |
|
||||||
|
| Patch Recorder | 记录所有人工修改 | 导出 JSON Patch |
|
||||||
|
| PRISM Bridge | 读取/写回 PRISM 数据 | 文件级 API 即可,不要求实时服务 |
|
||||||
|
| Dataset Exporter | 截图、深度、分割、episode log | 导出一组训练样本 |
|
||||||
|
|
||||||
|
### 5.4 数据输入与目录结构
|
||||||
|
|
||||||
|
每个场景打包为一个可版本化目录:
|
||||||
|
|
||||||
|
```text
|
||||||
|
hotel_305_scene/
|
||||||
|
manifest.json
|
||||||
|
assets/
|
||||||
|
room_shell.glb
|
||||||
|
furniture.glb
|
||||||
|
textures/
|
||||||
|
prism/
|
||||||
|
scene_graph.json
|
||||||
|
spatial_nodes.json
|
||||||
|
spatial_edges.json
|
||||||
|
physics/
|
||||||
|
colliders.json
|
||||||
|
joints.json
|
||||||
|
materials.json
|
||||||
|
episodes/
|
||||||
|
nav_fail_001.json
|
||||||
|
patches/
|
||||||
|
2026-05-31_manual_fix.json
|
||||||
|
```
|
||||||
|
|
||||||
|
`manifest.json` 作为运行时入口:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"scene_id": "hotel_305",
|
||||||
|
"unit": "meter",
|
||||||
|
"up_axis": "Y",
|
||||||
|
"origin": "room_center",
|
||||||
|
"render_assets": ["assets/room_shell.glb", "assets/furniture.glb"],
|
||||||
|
"prism_graph": "prism/scene_graph.json",
|
||||||
|
"physics": {
|
||||||
|
"colliders": "physics/colliders.json",
|
||||||
|
"joints": "physics/joints.json",
|
||||||
|
"materials": "physics/materials.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.5 实时可视化能力
|
||||||
|
|
||||||
|
运行时至少提供 6 个可切换视图:
|
||||||
|
|
||||||
|
| 视图 | 显示内容 | 用途 |
|
||||||
|
|------|----------|------|
|
||||||
|
| `Render View` | PBR 材质、灯光、阴影 | 检查视觉真实感 |
|
||||||
|
| `Semantic View` | 不同类别用不同颜色 | 检查语义分割和类别错误 |
|
||||||
|
| `Instance View` | 每个实例独立颜色 | 检查实例切分 |
|
||||||
|
| `Physics View` | collider、joint、mass center | 检查物理代理 |
|
||||||
|
| `Navigation View` | 可通行区域、障碍物、路径 | 调试机器人导航 |
|
||||||
|
| `Memory View` | PRISM L1-L4 图层 | 看空间记忆如何覆盖场景 |
|
||||||
|
|
||||||
|
关键 UI 功能:
|
||||||
|
|
||||||
|
- 点击任意物体,高亮对应 `SpatialNode`,并显示来源:RoomPlan / ZED / 人工修正 / WM 推断。
|
||||||
|
- 支持按类别过滤:只看门、床、桌椅、可移动物、可抓取物、动态障碍。
|
||||||
|
- 支持显示不确定性:低置信度物体用闪烁边框或热力图提示。
|
||||||
|
- 支持对比模式:`真实扫描` vs `人工修正后` vs `世界模型预测后`。
|
||||||
|
|
||||||
|
### 5.6 交互编辑能力
|
||||||
|
|
||||||
|
编辑不是自由建模,而是围绕 PRISM/机器人验证需要设计的受控编辑。
|
||||||
|
|
||||||
|
| 编辑对象 | 可编辑字段 | 保存位置 |
|
||||||
|
|----------|------------|----------|
|
||||||
|
| 房间结构 | 墙体位置、高度、门洞、窗洞 | `patches/*.json` + PRISM L2 |
|
||||||
|
| 家具 | 位姿、尺寸、类别、是否可移动 | PRISM L4 `SpatialNode` |
|
||||||
|
| 材质 | roughness、metallic、friction 映射 | `physics/materials.json` |
|
||||||
|
| 碰撞体 | box/capsule/convex mesh | `physics/colliders.json` |
|
||||||
|
| 关节 | revolute/prismatic、轴向、范围 | `physics/joints.json` |
|
||||||
|
| 导航区域 | walkable、blocked、slow zone | PRISM L2/L3 |
|
||||||
|
| 可供性 | graspable、pushable、openable | PRISM L4 |
|
||||||
|
|
||||||
|
编辑操作必须满足三条规则:
|
||||||
|
|
||||||
|
1. **所有修改都是 patch**:保留原始扫描结果,不直接覆盖。
|
||||||
|
2. **每个 patch 有来源**:记录 `author`、`timestamp`、`tool`、`reason`。
|
||||||
|
3. **可回放和可撤销**:patch 可以按顺序 apply,也可以 rollback。
|
||||||
|
|
||||||
|
示例 patch:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"patch_id": "manual_fix_20260531_001",
|
||||||
|
"scene_id": "hotel_305",
|
||||||
|
"author": "researcher",
|
||||||
|
"ops": [
|
||||||
|
{
|
||||||
|
"op": "replace",
|
||||||
|
"path": "/nodes/chair_305_01/pose_world",
|
||||||
|
"value": [1.42, 0.0, -0.33, 0.0, 0.707, 0.0, 0.707],
|
||||||
|
"reason": "RoomPlan 椅子朝向错误"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"op": "add",
|
||||||
|
"path": "/nodes/drawer_305_02/joint",
|
||||||
|
"value": {
|
||||||
|
"type": "prismatic",
|
||||||
|
"axis": [1, 0, 0],
|
||||||
|
"limit_m": [0.0, 0.42]
|
||||||
|
},
|
||||||
|
"reason": "为床头柜抽屉补充可操作关节"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.7 轻量物理沙盒
|
||||||
|
|
||||||
|
游戏引擎中的物理层只负责快速验证和交互调试,不作为最终物理真值。
|
||||||
|
|
||||||
|
P0 支持:
|
||||||
|
|
||||||
|
- 刚体:椅子、行李箱、垃圾桶、床头柜小物体。
|
||||||
|
- 静态碰撞体:墙、地面、床、柜体、卫生间台面。
|
||||||
|
- 关节:门的旋转关节、抽屉的滑动关节。
|
||||||
|
- 材质参数:摩擦、弹性、质量、重心。
|
||||||
|
- 局部 reset:只重置当前物体或当前房间,不重载全场景。
|
||||||
|
|
||||||
|
P1 再支持:
|
||||||
|
|
||||||
|
- 布料近似:床单、窗帘只做视觉和碰撞近似。
|
||||||
|
- 液体/破碎效果:只做异常事件可视化,不进入机器人控制闭环。
|
||||||
|
- 多人/多机器人:用于拥堵和动态障碍测试。
|
||||||
|
|
||||||
|
### 5.8 与 PRISM 的读写接口
|
||||||
|
|
||||||
|
P0 不需要数据库服务,直接文件接口即可:
|
||||||
|
|
||||||
|
```text
|
||||||
|
load_scene(manifest.json)
|
||||||
|
→ load_assets()
|
||||||
|
→ load_prism_graph()
|
||||||
|
→ bind_actor_to_spatial_node()
|
||||||
|
|
||||||
|
edit_object()
|
||||||
|
→ update_runtime_actor()
|
||||||
|
→ append_patch_op()
|
||||||
|
|
||||||
|
save_patch()
|
||||||
|
→ validate_patch()
|
||||||
|
→ write patches/*.json
|
||||||
|
→ optional: export prism_delta.json
|
||||||
|
```
|
||||||
|
|
||||||
|
P1 可以升级为本地 HTTP 服务:
|
||||||
|
|
||||||
|
| API | 方法 | 用途 |
|
||||||
|
|-----|------|------|
|
||||||
|
| `/scene/:id` | GET | 获取场景 manifest |
|
||||||
|
| `/scene/:id/nodes` | GET | 获取 PRISM 节点 |
|
||||||
|
| `/scene/:id/patches` | POST | 保存人工修正 |
|
||||||
|
| `/scene/:id/query` | POST | 自然语言或类别查询 |
|
||||||
|
| `/scene/:id/episodes` | POST | 上传任务回放 |
|
||||||
|
|
||||||
|
### 5.9 MVP 功能清单
|
||||||
|
|
||||||
|
P0 版本只追求一个客房跑通:
|
||||||
|
|
||||||
|
| 优先级 | 功能 | 验收标准 |
|
||||||
|
|--------|------|----------|
|
||||||
|
| P0 | 加载一个 RoomPlan/ZED 转换后的客房 | 10 秒内打开,尺度正确 |
|
||||||
|
| P0 | Scene Tree + 物体点击选择 | 点击椅子能显示 `chair_305_01` |
|
||||||
|
| P0 | 语义/实例/物理三种视图 | 一键切换,颜色稳定 |
|
||||||
|
| P0 | 家具位姿修正 | 拖动椅子后能保存 patch |
|
||||||
|
| P0 | Collider 可视化与编辑 | 可给椅子生成 box/convex collider |
|
||||||
|
| P0 | 门/抽屉关节编辑 | 可设置轴向和运动范围 |
|
||||||
|
| P0 | 简单物理运行/暂停/reset | 推椅子不穿墙,reset 后回初始状态 |
|
||||||
|
| P0 | episode 回放 | 加载一条机器人轨迹并显示路径 |
|
||||||
|
| P0 | patch 导出 | 输出可被 PRISM 消化的 JSON |
|
||||||
|
|
||||||
|
P1 再做增强:
|
||||||
|
|
||||||
|
- 多房间/走廊拼接;
|
||||||
|
- Web 只读展示;
|
||||||
|
- 合成 RGB-D/Segmentation 数据批量导出;
|
||||||
|
- 自然语言查询:“显示所有可移动椅子”;
|
||||||
|
- 和 ROS 2/Nav2 做在线联调。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 典型应用场景
|
||||||
|
|
||||||
|
### 场景 A:酒店机器人导航调试
|
||||||
|
|
||||||
|
1. PRISM 导出酒店走廊拓扑和局部几何。
|
||||||
|
2. 游戏引擎加载场景,放置机器人 avatar 和动态行人。
|
||||||
|
3. 通过 ROS 2 bridge 接入 Nav2 或自研控制器。
|
||||||
|
4. 在引擎里批量生成拥堵、清洁车占道、门半开等扰动。
|
||||||
|
5. 输出成功率、碰撞次数、路径偏差和重规划次数。
|
||||||
|
|
||||||
|
### 场景 B:客房物体操作验证
|
||||||
|
|
||||||
|
1. RoomPlan/ZED 重建客房,PRISM 生成语义场景图。
|
||||||
|
2. 游戏引擎把床头柜、椅子、抽屉、门转成可交互 actor。
|
||||||
|
3. 研究员人工修正关节轴、摩擦、质量和可抓取区域。
|
||||||
|
4. 世界模型在引擎中做 rollout,预测推、拉、拿、放的结果。
|
||||||
|
5. 高风险动作再交给 Isaac Sim 或真实机器人验证。
|
||||||
|
|
||||||
|
### 场景 C:CrowdRoom Web 编辑器
|
||||||
|
|
||||||
|
1. 用户上传 RoomPlan 房间。
|
||||||
|
2. 后端转成 glTF/meshopt/Draco 轻量包。
|
||||||
|
3. Web 端以 Unity WebGL、Unreal Pixel Streaming 或 Three.js/R3F 展示。
|
||||||
|
4. 用户替换家具、材质、灯光,生成 Remix。
|
||||||
|
5. Remix 的变更以 overlay 形式保存,不复制底层几何。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 技术实现建议
|
||||||
|
|
||||||
|
### 7.1 Unreal 路线
|
||||||
|
|
||||||
|
适合做“酒店数字孪生高保真演示 + 复杂交互调试器”。
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
引擎:
|
||||||
|
- Unreal Engine 5.x
|
||||||
|
核心模块:
|
||||||
|
- USD Stage / Datasmith / glTF Importer
|
||||||
|
- Chaos Physics
|
||||||
|
- Control Rig / Sequencer
|
||||||
|
- Pixel Streaming
|
||||||
|
- Python Editor Script
|
||||||
|
输入:
|
||||||
|
- USD: 主资产格式
|
||||||
|
- glTF/FBX: 轻量备选
|
||||||
|
- JSON: PRISM 场景图和语义属性
|
||||||
|
输出:
|
||||||
|
- episode log
|
||||||
|
- RGB-D/Segmentation 合成数据
|
||||||
|
- PRISM patch
|
||||||
|
```
|
||||||
|
|
||||||
|
适合优先验证:
|
||||||
|
|
||||||
|
- 高保真酒店大堂/走廊渲染;
|
||||||
|
- 门、抽屉、椅子、行李车等刚体交互;
|
||||||
|
- 研究演示和远程评审;
|
||||||
|
- 复杂光照、反射、材质对感知模型的影响。
|
||||||
|
|
||||||
|
### 7.2 Unity 路线
|
||||||
|
|
||||||
|
适合做“MVP 工具 + CrowdRoom 产品化编辑器 + 快速 ROS 原型”。
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
引擎:
|
||||||
|
- Unity LTS
|
||||||
|
核心模块:
|
||||||
|
- URP/HDRP
|
||||||
|
- Addressables
|
||||||
|
- ArticulationBody
|
||||||
|
- ROS TCP Connector
|
||||||
|
- WebGL / iOS / Desktop Build
|
||||||
|
输入:
|
||||||
|
- glTF/FBX/USD 转换资产
|
||||||
|
- PRISM JSON scene graph
|
||||||
|
输出:
|
||||||
|
- 用户编辑 overlay
|
||||||
|
- 标注 patch
|
||||||
|
- 简化 episode log
|
||||||
|
```
|
||||||
|
|
||||||
|
适合优先验证:
|
||||||
|
|
||||||
|
- RoomPlan 房间浏览器;
|
||||||
|
- 家具/材质替换;
|
||||||
|
- 简单移动机器人导航;
|
||||||
|
- 低门槛标注工具。
|
||||||
|
|
||||||
|
### 7.3 Isaac Sim 路线
|
||||||
|
|
||||||
|
适合做“机器人高可信仿真后端”,与游戏引擎形成互补。
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
核心定位:
|
||||||
|
- 机器人传感器仿真
|
||||||
|
- URDF/USD 机器人资产
|
||||||
|
- 合成数据生成
|
||||||
|
- Isaac Lab / RL 训练
|
||||||
|
- ROS 2 联调
|
||||||
|
输入:
|
||||||
|
- USD 场景
|
||||||
|
- URDF / CAD 机器人
|
||||||
|
- PRISM 语义图
|
||||||
|
输出:
|
||||||
|
- 机器人任务评测
|
||||||
|
- 合成传感器数据
|
||||||
|
- sim-to-real 实验记录
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 数据格式扩展
|
||||||
|
|
||||||
|
建议在 PRISM `SpatialNode` 上增加一个可选的 `engine_proxy` 字段:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"spatial_node_id": "chair_305_01",
|
||||||
|
"category": "chair",
|
||||||
|
"pose_world": [0, 0, 0, 1, 0, 0, 0],
|
||||||
|
"bbox": [0.55, 0.58, 0.92],
|
||||||
|
"material": {
|
||||||
|
"base": "fabric",
|
||||||
|
"roughness": 0.75
|
||||||
|
},
|
||||||
|
"affordance": {
|
||||||
|
"movable": true,
|
||||||
|
"sittable": true,
|
||||||
|
"pushable": true
|
||||||
|
},
|
||||||
|
"engine_proxy": {
|
||||||
|
"asset_uri": "assets/hotel_305/chair_305_01.usd",
|
||||||
|
"render_mesh": "chair_305_01_high",
|
||||||
|
"collision_mesh": "chair_305_01_convex",
|
||||||
|
"rigid_body": {
|
||||||
|
"mass_kg": 6.2,
|
||||||
|
"friction": 0.6,
|
||||||
|
"restitution": 0.05
|
||||||
|
},
|
||||||
|
"lod": ["high", "mid", "low"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. MVP 计划:4 周验证闭环
|
||||||
|
|
||||||
|
| 周期 | 目标 | 交付物 | 验收标准 |
|
||||||
|
|------|------|--------|----------|
|
||||||
|
| W1 | 资产链路打通 | RoomPlan/ZED 场景 → glTF/USD → Unity 或 Unreal | 尺度误差 < 2%,坐标轴正确 |
|
||||||
|
| W2 | PRISM 语义绑定 | 场景图 JSON 驱动物体高亮、查询、筛选 | 输入“床头柜”可定位对应 actor |
|
||||||
|
| W3 | 物理代理 | 为门、椅子、抽屉生成 collider/rigid body/joint | 推拉动作无明显穿模 |
|
||||||
|
| W4 | 任务回放 | 机器人轨迹回放 + episode log + PRISM patch | 可复现一次失败案例并回写 delta |
|
||||||
|
|
||||||
|
MVP 只做一个客房或一段走廊,不追求完整酒店。优先证明“真实扫描资产能进入游戏引擎,并与 PRISM 双向通信”。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 风险与对策
|
||||||
|
|
||||||
|
| 风险 | 表现 | 对策 |
|
||||||
|
|------|------|------|
|
||||||
|
| 扫描 mesh 不适合物理 | 面数过高、破洞、碰撞异常 | 渲染 mesh 与 collider 分离;自动 convex decomposition;人工修正工具 |
|
||||||
|
| 坐标系统混乱 | RoomPlan、ROS、Unreal、Unity 轴向不一致 | 定义 `world_frame.md`,所有转换写单元测试 |
|
||||||
|
| 游戏物理不够真实 | 摩擦、接触、关节误差导致 sim-to-real 差 | 游戏引擎只做快速筛选;关键实验进入 Isaac Sim 或真实机器人 |
|
||||||
|
| 资产管线过重 | USD/glTF/FBX 来回转换丢属性 | USD 作为主格式,glTF 只做 Web 分发 |
|
||||||
|
| 双引擎维护成本高 | Unreal、Unity、Isaac Sim 三套工程发散 | MVP 先选一个主前台;共享资产转换脚本和 PRISM schema |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 推荐决策
|
||||||
|
|
||||||
|
短期采用:
|
||||||
|
|
||||||
|
1. **Unity 优先做 MVP**:快速做出 RoomPlan 房间浏览、语义高亮、家具替换、简单物理交互。
|
||||||
|
2. **Unreal 做高保真展示分支**:用于酒店场景演示、复杂光照材质、远程评审。
|
||||||
|
3. **Isaac Sim 保持机器人仿真后端**:用于 ROS 2、传感器、RL 和严肃物理评测。
|
||||||
|
|
||||||
|
中期目标是形成一条统一管线:
|
||||||
|
|
||||||
|
```text
|
||||||
|
真实扫描 → PRISM 空间记忆 → USD/glTF 资产包 → 游戏引擎交互验证 → episode/patch 回写 → 世界模型训练
|
||||||
|
```
|
||||||
|
|
||||||
|
这样 WorldModel 项目会多出一个非常实用的“中间地带”:既不像纯研究代码那样难演示,也不像纯游戏场景那样脱离真实数据,而是把真实室内世界变成可运行、可编辑、可评测的 3D 交互实验场。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 参考资料
|
||||||
|
|
||||||
|
- NVIDIA Isaac Sim 官方介绍:说明 Isaac Sim 基于 Omniverse/OpenUSD,面向机器人仿真、测试、合成数据,并可导入 CAD、URDF 和真实捕获数据。<https://developer.nvidia.com/isaac/sim>
|
||||||
|
- Unreal Engine Physics 官方文档:Chaos Physics 覆盖刚体、约束、破坏、车辆、流体、网络物理等实时物理能力。<https://dev.epicgames.com/documentation/en-us/unreal-engine/physics-in-unreal-engine>
|
||||||
|
- Unreal Engine USD Stage 官方文档:Unreal 支持通过 USD Stage Actor 打开和编辑 USD 场景。<https://dev.epicgames.com/documentation/en-us/unreal-engine/usd-stage-editor-quick-start-in-unreal-engine>
|
||||||
|
- Unity ROS TCP Connector 官方仓库:提供 Unity 与 ROS 收发消息、消息生成、ROSGeometry 等能力。<https://github.com/Unity-Technologies/ROS-TCP-Connector>
|
||||||
@@ -0,0 +1,289 @@
|
|||||||
|
---
|
||||||
|
title: "WorldModel 物理引擎集成方案"
|
||||||
|
date: 2026-05-28
|
||||||
|
draft: false
|
||||||
|
tags: [worldmodel, physics-engine, PRISM, 技术方案]
|
||||||
|
categories: [plans]
|
||||||
|
description: "为WorldModel室内场景添加物理引擎的完整技术方案,包括引擎选型、3D重建网格碰撞准备、PRISM空间记忆融合与实施路线图。"
|
||||||
|
---
|
||||||
|
|
||||||
|
# WorldModel 物理引擎集成方案 (v1.0)
|
||||||
|
|
||||||
|
## 1. 背景与动机
|
||||||
|
|
||||||
|
WorldModel的核心数据流(RoomPlan/ZED2i -> PRISM空间记忆)已覆盖"看见并记住"室内环境。要完成闭环,还需要让机器人在数字环境中能够与物体进行**物理交互验证**。这要求:
|
||||||
|
|
||||||
|
1. **碰撞检测**: 机器人在虚拟酒店房间中运动时,不会穿墙、撞翻物体
|
||||||
|
2. **对象操作模拟**: 开门、推拉椅子等动作可以在仿真环境中验证可行性
|
||||||
|
3. **物理属性学习**: 机器人通过交互获取"这个物体推得动还是推不动"的经验,反哺L4语义记忆
|
||||||
|
4. **合成数据生成**: 为视觉模型/行为克隆策略提供带物理标签的训练样本
|
||||||
|
|
||||||
|
## 2. 引擎选型对比
|
||||||
|
|
||||||
|
| | Bullet / PyBullet | NVIDIA PhysX (Isaac Sim) | Unity Physics (Jolt) | Unreal Engine 5 Chaos | MuJoCo |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| **许可证** | MIT 开源 | Apache-2.0 (PhysX) / NVIDIA专有(EZG) | MIT/Jolt-2.0 | Apache-2.0 (Chaos SDK部分可用) | 开源研究用 |
|
||||||
|
| **GPU加速** | CUDA/OpenCL插件可选 (cuBullet) | 原生硬件级(PhysX GPU) | CPU为主,GPU开发中 | GPU RayTracing/Physics | 纯CPU物理步 |
|
||||||
|
| **ROS集成** | pybullet-ros, ros_control封装成熟 | Isaac ROS生态(需NVIDIA硬件) | 间接(ROS2 Bridge) | ROS2 Bridge存在但较新 | 需自定义wrapper |
|
||||||
|
| **机器人动力学** | KUKA/PR2模型现成,RBD引擎支持全身控制 | Robot Assets库丰富(nvidia-isaac-sim/robots) | 需手动配置 | Skeletal + Rigid body | MPC/整体制动强但仅运动学、无对象操作 |
|
||||||
|
| **网格碰撞精度** | ConcaveMesh(BVH)+Convex Decomposition工具链完整 | USDZ原生支持,ConvNv扩展做convex decomposition | OBJ->FBX需转换、材质丢失风险高 | 支持OBJ/FBX/GLTF但PBR物理参数需手动调 | 仅支持convex primitives(Box/Sphere/Capsule) |
|
||||||
|
| **室内重建网格兼容性** | OBJ/STL直接加载,pymeshlab+pybullet-convex-decomp处理 | 最佳(USDZ是NVIDIA生态标准) | OBJ->FBX需转换,材质丢失风险高 | 支持OBJ/FBX/GLTF但PBR物理参数需手动调 | OBJ->convex approximation(自动)|
|
||||||
|
| **团队熟悉度** | Python为主(Robotics生态已有) | 需学习Isaac Sim专用框架+CUDA工具链 | Unity C#简单但物理系统相对新 | UE5蓝图+CPP双栈,生态庞大 | 研究友好、功能受限(纯刚体)|
|
||||||
|
| **性能(帧率)** | 中等精度~10-30fps@中大型房间 | GPU并行,百万级物体(最快) | ~30fps @中型场景 | 高(GPU加速但需UE5渲染管线) | 最快可达10kHz+物理步,但仅刚体无网格碰撞 |
|
||||||
|
|
||||||
|
### **推荐方案:主从双引擎架构**
|
||||||
|
|
||||||
|
**主引擎: PyBullet + Bullet Physics Server(实时感知与操作层)**
|
||||||
|
理由:
|
||||||
|
- PRISM tools已有Python环境,PyBullet提供纯Python API无缝衔接ROS生态
|
||||||
|
- Mesh碰撞处理工具链最完整(pybullet_convex_decomp, pymeshlab脚本可复用)
|
||||||
|
- 轻量独立,不依赖NVIDIA GPU
|
||||||
|
|
||||||
|
**辅助引擎: NVIDIA Isaac Sim(高保真合成数据层)**
|
||||||
|
理由:
|
||||||
|
- 需要生成带精确物理标签的训练集时(如物体形变、流体交互),Isaac Sim是业界标杆
|
||||||
|
- 与RoomPlan的USDZ格式天然兼容(NVIDIA生态)
|
||||||
|
|
||||||
|
**备选快速验证: MuJoCo + MJCF (原型阶段)**
|
||||||
|
理由:确定PRISM-L4语义层需要哪些物理属性时,MuJoCo可以快速搭建"物体->可操作参数"的原型验证环境
|
||||||
|
|
||||||
|
## 3. PRISM x 物理引擎融合架构
|
||||||
|
|
||||||
|
### 数据层映射:PRISM四层如何承载"物体物理状态"
|
||||||
|
|
||||||
|
| PRISM层级 | 传统内容 | **新增物理字段**
|
||||||
|
---
|
||||||
|
| L1感知缓冲(~30Hz) | ZED2i当前帧点云/图像流 | 实时碰撞体包围盒(BVH)生成、接触力反馈(触觉传感器输入)|
|
||||||
|
| L2度量地图 | 3D体素网格+语义标签 | Mesh碰撞几何(每类家具->Bullet ConvexHull)、静摩擦系数mu_s、动摩擦系数mu_k、质量m |
|
||||||
|
| L3拓扑图 | Graph(Room->Corridor->Room),边权=距离/通行概率 | 边权重加入**物理约束**: "这个门需要开门空间>=0.8m"、通道净宽 |
|
||||||
|
| L4语义场 | Object属性查询("这把椅子是木质的")+LLM可问答性 | 物理交互标签: `"movable": true, "push_force_estimate_N":[15.0, 45.0], "friction":"medium"`;LLM可推理"这个物体重吗?推得动吗?"|
|
||||||
|
|
||||||
|
### 核心模块:Physics-PRISM Bridge (PPB)
|
||||||
|
|
||||||
|
```
|
||||||
|
+-------------+ 碰撞几何 +-----------+
|
||||||
|
RoomPlan/ZED2i --> | Mesh Processor| --------------> |Bullet Server| <-- robot_control_loop
|
||||||
|
(3D重建) +-------------+ ^(pybullet) |
|
||||||
|
^ +-----------+ V|
|
||||||
|
|| 物理属性注入 (10Hz状态更新) |Collision/Force Feedback|
|
||||||
|
|| vPRISM L1写入 +---> PRISM L1
|
||||||
|
PPB |<----------------------------------------------(碰撞事件写入L1缓冲) 物理状态推送|
|
||||||
|
Manager--|---> PRISM L2-L4更新: "椅子被撞了0.3m"
|
||||||
|
(ROS Node)|<---- "这扇门现在半开(角度120度)"
|
||||||
|
+--------+
|
||||||
|
|
|
||||||
|
ROS Topic: /prism/physics_state
|
||||||
|
```
|
||||||
|
|
||||||
|
**PPB 关键职责:**1. **从PRISM L4语义场拉取物体属性** ->为每个对象在Bullet中创建刚体
|
||||||
|
2. **将碰撞检测结果写回PRISM L1/L2** ->实时物理事件进入空间记忆3. **维护"已知交互历史"** ->L4中积累物体操作经验(LLM可查询)
|
||||||
|
|
||||||
|
### 新增PRISM管线:Pipeline E -- "物理巩固"在现有四个管线的第四个(记忆巩固 Pipeline D)之后,追加:
|
||||||
|
|
||||||
|
**Pipeline E: 物理知识巩固 (Physics Consolidation)**
|
||||||
|
- **触发**:每次有意义的物体交互(推门成功/失败、拿取物品)
|
||||||
|
- **数据源**: Bullet仿真 ->实际传感器验证对比差异(仿真到现实 gap度量)
|
||||||
|
- **写入目标**:L4语义场,更新物体的交互标签(摩擦力、重量估计修正)
|
||||||
|
- **频率**:非实时事件驱动,~1Hz或交互后批量写入
|
||||||
|
|
||||||
|
## 4. Mesh -> Physics几何转换管线
|
||||||
|
|
||||||
|
### 流程:3D重建网格 --> Bullet碰撞体RoomPlan USDZ/OBJ ---> OpenUSD/Pymeshlab处理->Convex Decomposition(BVPY/ICME) -> Bullet ConcaveMesh / ConvexHulls (静态几何: 每帧更新+动态刚体:可交互对象)
|
||||||
|
|
||||||
|
### 4.1 RoomPlan USDZ -> OBJ/Ply转换
|
||||||
|
- Apple RoomPlan输出USDZ格式,NVIDIA Omniverse USD Python API可直接解析(pxr.Sdf, usdGeom.Mesh)
|
||||||
|
- 对于非NVIDIA路径:使用opensubdiv + trimesh做 USDZ ->OBJ/Ply导出
|
||||||
|
|
||||||
|
### 4.2 Mesh简化与碰撞体生成- **静态物体**(墙壁、地板): Bullet ConcaveMesh (BVH树) -- 不需要convex decomposition
|
||||||
|
- **可交互物体**(椅子、门把手): Convex Decomposition ->分解为~5-20个convex hulls
|
||||||
|
- **推荐工具**:pybullet_convex_decomp(Bullet官方Python wrapper,支持GPU加速)
|
||||||
|
- **替代**:V-HACD (Virtual Hi-Arcade Convex Decomposition,精度最优但较慢)
|
||||||
|
- **快速方案**:pymeshlab的convex_decomposition filter
|
||||||
|
|
||||||
|
### 4.3 Mesh质量要求- **精度**:静态墙壁/地板<2mm偏差(L1感知缓冲中ZED2i提供)- **性能**:每个可交互对象<10个convex hulls(Bullet BVH查询在~1ms内)
|
||||||
|
- **更新频率**:房间结构(墙壁)只在离线建图时构建一次;家具在"差异检测管线"(PRISM Pipeline C)触发时才重建
|
||||||
|
|
||||||
|
## 5. PRISM L4语义场扩展字段草案 (JSON Schema)在现有L4的"物体属性查询结构"中新增物理交互标签:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{ "object_id": "chair_room_102_A", // L4语义场中的唯一标识
|
||||||
|
"category": ["furniture","seat"], // RoomPlan类别(现有) "physics":{ // NEW: 物理交互标签
|
||||||
|
|
||||||
|
```jsonc
|
||||||
|
{
|
||||||
|
"object_id": "chair_room_102_A", // L4语义场中的唯一标识
|
||||||
|
"category": ["furniture","seat"], // RoomPlan类别(现有)
|
||||||
|
|
||||||
|
"// --- NEW: Physical Interaction Tags --":"",
|
||||||
|
|
||||||
|
"physics":{"mass_estimate_kg":6.2, // kg可由PPB的convex hull+材料估计
|
||||||
|
"friction":{"static":0.45, // mu_s: 静摩擦系数
|
||||||
|
"dynamic":0.32 //mu_k:动摩擦系数 },
|
||||||
|
```
|
||||||
|
"mass_estimate_kg":6.2, // kg可由PPB的convex hull+材料估计
|
||||||
|
"friction":{"static":0.45, // mu_s: 静摩擦系数
|
||||||
|
"dynamic":0.32 }},"movable":true, // 是否可移动(门、椅子为true,墙/地板为false)
|
||||||
|
"movable_method":["push",,"pull"], // 支持的操作类型(推/拉/提)
|
||||||
|
"push_force_range":[15.0, 45.0], // N:推启动力和可接受上限力
|
||||||
|
"stability":{"is_stable_unassisted":true, // 不推就自己不会倒
|
||||||
|
"toppling_force_Nm":12.5 // N·cm:翻倒阈值
|
||||||
|
},
|
||||||
|
|
||||||
|
"interaction_history":[ // LLM可查询的交互经验 { "timestamp":"2026-05-30T14:22",
|
||||||
|
"action":"push", // 操作类型 "object_from_location_xyz":[1.2,-0.5,0.78], // 移动前位置(L2度量坐标)
|
||||||
|
"object_to_location_xyz":[1.8,-0.5,0.78], // 移动后位置
|
||||||
|
"force_applied_N":25.3, //实际施加力
|
||||||
|
"success",true // push成功false=卡住了/推不动 }
|
||||||
|
] "sim2real_gap_stats":{ //PPB仿真与现实对比的统计
|
||||||
|
"position_drift_m":0.023, //平均位置偏差(仿真-->现实) "friction_bias":-0.12, //摩擦系数偏差(仿真比现实高/低多少)
|
||||||
|
"last_updated":"2026-05-31" //最后一次校准时间 }
|
||||||
|
|
||||||
|
"// --- NEW: Interaction History (Pipeline E写入) --":"",
|
||||||
|
|
||||||
|
"interaction_history":[ // LLM可查询的交互经验 { "timestamp":"2026-05-30T14:22", "action":"push", // 操作类型 "object_from_location_xyz":[1.2,-0.5,0.78], // 移动前位置(L2度量坐标)
|
||||||
|
"object_to_location_xyz":[1.8,-0.5,0.78], // 移动后位置
|
||||||
|
"force_applied_N":25.3, //实际施加力 "success",true // push成功 / false=卡住了/推不动 }
|
||||||
|
]
|
||||||
|
|
||||||
|
"// --- NEW: Simulation-Reality Gap (Pipeline E) --":"",
|
||||||
|
|
||||||
|
"sim2real_gap_stats":{ //PPB仿真与现实对比的统计 "position_drift_m":0.023, //平均位置偏差(仿真-->现实) "friction_bias":-0.12, //摩擦系数偏差(仿真比现实高/低多少) "last_updated":"2026-05-31" //最后一次校准时间 }
|
||||||
|
|
||||||
|
"// --- NEW: Interaction History (Pipeline E写入) --":"",
|
||||||
|
|
||||||
|
"interaction_history":[ //LLM可查询的交互经验 { "timestamp":"2026-05-30T14:22", "action":"push", // 操作类型 "object_from_location_xyz":[1.2,-0.5,0.78], // 移动前位置(L2度量坐标) "object_to_location_xyz":[1.8,-0.5,0.78], // 移动后位置
|
||||||
|
"force_applied_N":25.3, //实际施加力 "success",true // push成功 / false=卡住了/推不动 }
|
||||||
|
] "sim2real_gap_stats":{ //PPB仿真与现实对比的统计 "position_drift_m":0.023, //平均位置偏差(仿真-->现实) "friction_bias":-0.12, //摩擦系数偏差(仿真比现实高/低多少)
|
||||||
|
"last_updated":"2026-05-31" //最后一次校准时间
|
||||||
|
}
|
||||||
|
|
||||||
|
},}
|
||||||
|
```## 6. PRISM Pipeline E: "物理巩固"详细设计### 触发条件TRIGGERS= [
|
||||||
|
"碰撞事件": collision.force_magnitude > threshold_N, #有意义的接触(如门撞到墙壁)
|
||||||
|
"物体位移": abs(translation_delta_m)> threshold, #可移动对象被显著推动
|
||||||
|
"交互完成": action.success == true/false, #如开门/关门完成
|
||||||
|
"时间周期": every_30_minutes //定期同步仿真状态与现实(校准)
|
||||||
|
]
|
||||||
|
|
||||||
|
### Pipeline E执行流程:1. **读取**:从 PRISM L4语义场 ->获取该物体的当前物理属性
|
||||||
|
2. **对比**:simulation_position(PyBullet中) vs actual_sensor_position (ZED2i/IMU实际测量位置)
|
||||||
|
3. **校准**:如果 drift > tolerance -->更新L4物理属性(摩擦力、质量估计)
|
||||||
|
4. **日志**:interaction_history追加记录 ->L4语义场永久存储5. **通知**:向L3拓扑发送"通道通行性变更"(如果物体移动导致了新障碍)
|
||||||
|
|
||||||
|
```python
|
||||||
|
class PhysicsConsolidationPipeline: """PRISM Pipeline E:物理知识巩固 触发条件= collision detected / interaction complete/periodic sync """ def trigger(self, event: Union[CollisionEvent] | InteractionComplete]) -> None:
|
||||||
|
self.log(event)
|
||||||
|
prism_l4_object = prisms_semantic_layer.query_by_name(event.object_id))
|
||||||
|
# Step 1: Read L4物理属性(仿真状态) sim_mass = prism_l4_object.physics.mass_estimate_kg friction_estimated=self.estimate_friction_from_force_sensor(event.contact_force)
|
||||||
|
|
||||||
|
# Step 2: Read ZED2i/IMU真实测量(现实状态) actual_position=self.zed_2i_camera.get_object_pose(event.object_id))
|
||||||
|
|
||||||
|
# Step 3: Compute gap(仿真 -->现实) sim_position=self.get_simulated_object_pose(event.object_id))
|
||||||
|
|
||||||
|
# Step 4: Update L4语义场
|
||||||
|
if sim2real_gap> tolerance: self.update_prism_l4_physics(event.object_id,friction_estimated)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. PPB ROS消息定义草案 (prism_msgs/PrismPhysicsState.msg)
|
||||||
|
|
||||||
|
```
|
||||||
|
# 每帧发布: /prism/l1/collision_events (30Hz)std_msgs/Header header
|
||||||
|
# 当前帧碰撞事件列表(可为空CollisionEvent[] collisions
|
||||||
|
|
||||||
|
message CollisionEvent {
|
||||||
|
string object_a # PRISM L4语义名称,如 "chair_01"
|
||||||
|
string object_b # PRISM L4语义名称,如 "wall_kitchen_east"
|
||||||
|
geometry_msgs/Vector3 contact_point # WGS坐标系中的碰撞点(L2度量)
|
||||||
|
geometry_msgs/Vector3 contact_normal #法线方向 float64 penetration_depth #穿透深度(mm), <0表示分离距离
|
||||||
|
geometry_msgs/Wrench contact_force #L1力觉反馈:力和扭矩}
|
||||||
|
|
||||||
|
#每50ms发布: /prism/l2/physics_mesh_state (20Hz)
|
||||||
|
std_msgs/Header header#所有动态刚体的当前位姿(用于L2度量地图中的物体定位)DynamicBodyState[] dynamic_bodies
|
||||||
|
|
||||||
|
message DynamicBodyState {
|
||||||
|
string body_name # PRISM L4语义名称,如 "door_hallway_02" geometry_msgs/Pose pose #6DoF位姿(位置+四元数)
|
||||||
|
float32 mass #kg, L4语义场中的物理属性查询结果}
|
||||||
|
|
||||||
|
#按需请求: /prism/l2/get_physics_properties (ROS Service)
|
||||||
|
---string object_name # 请求: L4语义名称(如 "chair_01")
|
||||||
|
---#响应:该物体的物理属性 (L4语义场中的值)string description #"可推动,木质框架"float32 friction_mu_static #静摩擦系数 mu_s \in [0.1, 1.5]float32 friction_mu_dynamic #动摩擦系数mu_k \in [0.1, 1.2]
|
||||||
|
float32 mass #kg:"中等重量,约5kg" \to 6.0bool is_movable #true/false: "椅子可以被搬走" \to truefloat32 push_force_min #启动推力估计(N)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8. Phase实现路线图(四阶段)### Phase 0:原型验证 (2周) **目标: "PyBullet能跑起一间酒店客房吗?**步骤1产** 产出物0.2读取一个RoomPlan样例(USDZ或OBJ),用trimesh导出为PLYphysics/demo/load_room.py) + screenshot
|
||||||
|
|
||||||
|
```
|
||||||
|
"0.3在PyBullet中加载房间几何为静态刚体,机器人URDF模型进入
|
||||||
|
"0.4加入一个动态物体(椅子),实现简单的推拽交互|Bullet仿真截图 + 操作日志
|
||||||
|
"0.5写一份README记录踩坑和经验教训|/plans/physics_engine_implementation.md#phase0的完成checklist和known issues
|
||||||
|
```
|
||||||
|
|
||||||
|
**交付**: 一个可以在终端跑的Python脚本,加载房间网格+URDF机器人,可视化窗口中可操作
|
||||||
|
|
||||||
|
### Phase 1: Mesh处理管线 (3周) **目标:** "从任意RoomPlan/ZED2i场景自动构建碰撞几何"
|
||||||
|
|
||||||
|
| 步骤 | 内容
|
||||||
|
---### Phase1.2 Mesh简化工具(减少三角面到collision-ready级别)| 使用pyfqmr或gptoolbox做mesh simplification
|
||||||
|
### Phase1.3 Convex Decomposition pipeline: V-HACD + pybullet_convex_decomp| 配置JSON支持自定义convex hull上限参数(每个对象max_hulls=10)
|
||||||
|
### Phase 1.4自动标注"静态 vs 动态"对象(基于RoomPlan语义层)| RoomPlan输出包含category: wall/furniture/door/cabinet标签,自动分类
|
||||||
|
### Phase 1.5集成测试: PRISM Pipeline A的输出(离线3D重建) -> PPB自动创建Bullet世界|端到端Pipeline测试脚本`physics/test_e2e_pipeline.py`+报告
|
||||||
|
|
||||||
|
### Phase 2: PRISM Bridge (4周) **目标:** "物理引擎数据进入PRISM四层记忆,形成闭环"
|
||||||
|
|
||||||
|
| 步骤 | PRISM对接点
|
||||||
|
---### Phase2.1 PPB ROS Node: /prism/physics_state | 定义ROS消息类型`PrismPhysicsState.msg`(包含所有碰撞体位姿)
|
||||||
|
### Phase 2.2 L1写入:将Bullet接触/碰撞事件推送至L1感知缓冲| topic `/prism/l1/collision_events`,格式: `{frame_id, object_a,object_b, contact_force}`
|
||||||
|
### Phase2.3 L4读写:将PPB从PRISM拉取的物体属性+写回的交互经验| ROS service `GetPhysicsProperties` / `UpdateInteractionHistory`,使用prism_ros_bridge的现有topic
|
||||||
|
### Phase2.4差异检测集成: PRISM Pipeline C触发时,对比当前物理状态与L2度量地图中存储的"理想几何"| 输出差异报告: `physics_consolidation_report.json`(哪些物体位置变了、被移动了)
|
||||||
|
### Phase2.5 L3拓扑图更新:物理约束影响通行性评估(半开门导致通道变窄)|L3 edge weight更新: `passability_score=base_passability x(1 - collision_risk_penalty)`### Phase3.2合成数据标注管线:从PyBullet世界随机采样物体位置/光照 -->渲染图像+ground truth标签| `physics/synthesis/generate_episode.py`,输出: RGB图像, depth图, semantic segmentation mask, object bounding boxes
|
||||||
|
### Phase3.3数据格式: ONNX-compatible dataset(与HuggingFace Hub集成)| HFDataset定义 + upload脚本 `physics/synthesis/upload_to_hf.py`
|
||||||
|
### Phase3.4机器人策略验证: PyBullet + ROS Control中的RL agent在仿真中学习"开门/推椅"|集成stable-baselines3(RLlib) + pybullet-ros,训练简单的push/grasp policy
|
||||||
|
### Phase 3.5合成数据质量验证:与真实场景对比分布差异(MMD / Fréchet Inception Distance) | `physics/synthesis/evaluate_fidelity.py`
|
||||||
|
|
||||||
|
## 9. 技术栈清单(新增依赖)### Python核心
|
||||||
|
```textpybullet>=3.2.x #Bullet Physics引擎Python绑定(主物理后端)pymeshlab==2023.12 #网格简化、convex hull计算
|
||||||
|
opensubdiv>=3.6 #OpenUSD/USDZ解析(非NVIDIA路径)pyfqmr #快速网格简化到collision-ready级别
|
||||||
|
trimesh>=4.0 #Mesh格式转换(USDZ/OBJ/PLY/FBX)
|
||||||
|
pybullet_convex_decomp #GPU加速凸分解(需要CUDA 12+)```### ROS生态
|
||||||
|
`textros-noetic-robot-base #URDF/RViz支持(ROS1 Noetic)
|
||||||
|
ros-humble-robot-base # ROS2 Humble对应包(备选/未来路径)
|
||||||
|
pybullet_ros # PyBullet与ROS通信bridge(如可用则集成,否则自建)
|
||||||
|
```### 辅助工具`textopensimplex #合成数据中的随机扰动生成(放置物体位置)huggingface_hub #合成数据集发布到HFDataset Hub```### GPU依赖(可选,Phase 1-2之后评估是否需要)
|
||||||
|
`text# NVIDIA CUDA 12.4+ + cuBLAS/cuSPARSE(用于cuBullet或pybullet_convex_decomp的GPU加速)
|
||||||
|
# Jetson Orin / RTX 4090(桌面测试环境)```
|
||||||
|
|
||||||
|
## 10. PRISM L4语义场LLM查询示例(集成后能力)
|
||||||
|
|
||||||
|
```
|
||||||
|
# 用户/策略模块可以向PRISM L4语义场发起LLM查询:> "房间102中,哪些椅子可以被搬动?"
|
||||||
|
>→从L4语义场返回: "chair_A(可推,mus=0.45), chair_B (固定在地) -->只有一把可以移动"
|
||||||
|
|
||||||
|
> " hallway走廊的通行性怎么样?">PRISM从L3拓扑+ L1最近碰撞事件回答: "当前通行概率72% -- 一把椅子被推到了走廊中央(见L1事件#34),移除后可以恢复95%"
|
||||||
|
|
||||||
|
> "如果我把桌子向右推2米,会撞到门吗?">PRISM调用PyBullet执行虚拟操作: "模拟结果显示不会碰撞。桌子最右边缘与门框距离0.4m(安全)"
|
||||||
|
|
||||||
|
> "这个房间里有哪些物体是半开着的,可能阻碍通行?">L1/L2碰撞检测返回: "门_厨房东(角度=45度), 窗柜抽屉拉出10cm"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Appendix A. PyBullet + PRISM 集成架构代码框架### `physics/engine/bullet_server.py` -- Bullet Server(ROS Node)
|
||||||
|
|
||||||
|
```python
|
||||||
|
import pybullet as pclass PhysicsServer: """PyBullet服务端,作为独立的ROS Node运行"""
|
||||||
|
|
||||||
|
def __init__(self): p.connect(p.GUI) # GUI可选;headless用p.connect(p.DIRECT)
|
||||||
|
p.setGravity(0, 0, -9.81)
|
||||||
|
|
||||||
|
def load_room_mesh(self, room_usdz_path: str): """从RoomPlan/ZED2i的3D重建文件加载房间"""
|
||||||
|
```python
|
||||||
|
|
||||||
|
def load_room_mesh(self, room_usdz_path: str): """从RoomPlan/ZED2i的3D重建文件加载房间"""
|
||||||
|
def load_robot_urdf(self, robot_usdz_path: str): #修正:URDF文件 """加载移动机器人基座(带轮子/机械臂)"""
|
||||||
|
|
||||||
|
def set_object_interactivity(self, object_name: str,movable_bool) -> None): """控制PPB将PyBullet刚体标记为dynamic/static""" def get_collision_events(self) -> List[CollisionEvent]: """读取当前帧所有碰撞检测结果""" def sync_state_to_prism(self, prism_topic: str) -> None """将当前物理状态写入PRISM L1/L2 topic""" ```
|
||||||
|
|
||||||
|
### PRIMS --> PyBullet状态注入当PRISM Pipeline C(在线感知)检测到场景变化时,更新PyBullet中的碰撞体位姿:
|
||||||
|
|
||||||
|
```python
|
||||||
|
def on_prism_perception_update(self, updated_objects: List[PrismL4Object]):
|
||||||
|
"""PRISM感知更新 -->驱动PyBullet刚体状态修改"""
|
||||||
|
```
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
---
|
||||||
|
title: "WorldModel 项目分析"
|
||||||
|
date: 2026-06-01
|
||||||
|
tags: [worldmodel, analysis]
|
||||||
|
---
|
||||||
|
|
||||||
|
# WorldModel 项目分析
|
||||||
|
|
||||||
|
> 生成时间:2026-06-01
|
||||||
|
> 项目路径:`/Users/mac/code/worldmodel`
|
||||||
|
|
||||||
|
## 📐 项目总览
|
||||||
|
|
||||||
|
WorldModel 是一个围绕**室内物理世界理解**(酒店场景切入)的**研究型工程项目**。核心目标是为具身智能提供可验证的技术平台。
|
||||||
|
|
||||||
|
- 216 个源文件(排除 node_modules),3.4 万总文件数
|
||||||
|
- **纯文档驱动型**:绝大部分是 Markdown,只有少量 Python/Shell 脚本做辅助
|
||||||
|
- Git 活跃维护中
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧱 七大模块
|
||||||
|
|
||||||
|
### 1. 🔮 PRISM(核心,~108 文件)
|
||||||
|
**Prior-Registered Integrated Spatial Memory — 机器人空间记忆架构。**
|
||||||
|
|
||||||
|
四层空间记忆:L1感知缓冲 → L2度量地图 → L3拓扑图 → L4语义场。四条管线:离线建图(iPhone)/ 重定位握手 / 在线感知(ZED2i)/ 记忆巩固。已升级到 v2.0,有仿脑升级设计(Lyra 2.0 启发)。这是整个项目的"消化层"。
|
||||||
|
|
||||||
|
### 2. 🏠 CrowdRoom(13 文件)
|
||||||
|
众包 3D 房间共享平台,定位是"RoomPlan版 Sketchfab + Pinterest"。涵盖数据模型、API 契约、iOS/Web端设计、物品替换手册、隐私治理和路线图。
|
||||||
|
|
||||||
|
### 3. 📷 Camera(6 文件)
|
||||||
|
ZED2i立体相机的工程化方案:双目+IMU完整解决方案、数据Pipeline迭代框架、国产替代调研。
|
||||||
|
|
||||||
|
### 4. 📱 RoomPlan(7 文件)
|
||||||
|
iPhone LiDAR + Apple RoomPlan API做消费级室内3D重建。涵盖开源项目调研、数据格式规范(USDZ/OBJ/glTF/点云)、精度分析。
|
||||||
|
|
||||||
|
### 5. 🏨 HotelScene(4-6 文件)
|
||||||
|
以酒店为真实场景执行落地,分三部曲实施方案。
|
||||||
|
|
||||||
|
### 6. 🎮 GameEngine(1文件)
|
||||||
|
引入 Unity/Unreal Engine做实时可视化、轻量物理沙盒和合成数据生成。
|
||||||
|
|
||||||
|
### 7. 🔬 Research(~108文件 + PDF论文)
|
||||||
|
学术调研支撑:世界模型综述、Lyra2精读、人类空间记忆神经科学、SLAM/VIO/JEPA系列论文(含V-JEPA2源码剖析)、MultiPLY多感官感知项目、物理世界理解研究计划。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚙️ 技术架构(核心理念)
|
||||||
|
|
||||||
|
**"先验 + 在线"双流融合:**
|
||||||
|
- 📱 iPhone (RoomPlan) → 一次性高精度先验地图(LiDAR毫米级)
|
||||||
|
- 📷 ZED2i → 持续在线感知与增量更新(立体+IMU)
|
||||||
|
- 🧠 PRISM → 统一空间记忆架构汇聚两路数据
|
||||||
|
- 🎮 GameEngine → 数字孪生运行时(可视化/物理沙盒)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 评价
|
||||||
|
|
||||||
|
**优势:**
|
||||||
|
- 架构设计系统且深入,四层记忆分层有理有据(认知科学+SLAM工程的控制论交集)
|
||||||
|
- 文档体系极其完善,PRISM有20章+配套工具链(LaTeX书构建、自动统计)
|
||||||
|
- 学术调研扎实,覆盖JEPA/Lyra/MultiPLY等前沿方向
|
||||||
|
|
||||||
|
**待推进的(纯文档阶段):**
|
||||||
|
- 目前几乎没有可运行的代码,都是设计文档和论文研究
|
||||||
|
- PRISM tools只有构建脚本(LaTeX/Python),没有核心架构的工程实现
|
||||||
|
- Camera、RoomPlan是方案设计,不是实际采集管线
|
||||||
|
|
||||||
|
简单说:**项目设计完成度极高,但工程实现基本从零起步。** PRISM是真正的核心引擎,CrowdRoom和HotelScene是两个应用场景。
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Submodule
+1
Submodule research/multiply/MultiPLY added at 2888361d39
@@ -0,0 +1,324 @@
|
|||||||
|
# MultiPLY 技术讲解:面向 3D 世界的多感官、以物体为中心的具身大语言模型
|
||||||
|
|
||||||
|
> 论文全称:*MultiPLY: A Multisensory Object-Centric Embodied Large Language Model in 3D World*
|
||||||
|
> 发表会议:CVPR 2024
|
||||||
|
> 机构:UMass Amherst、UCLA、MIT-IBM Watson AI Lab
|
||||||
|
> 作者:Yining Hong, Zishuo Zheng, Peihao Chen, Yian Wang, Junyan Li, Zhenfang Chen, Chuang Gan
|
||||||
|
> arXiv:[2401.08577](https://arxiv.org/abs/2401.08577)(2024-01-16)
|
||||||
|
> 项目主页:<https://vis-www.cs.umass.edu/multiply/>
|
||||||
|
> 代码仓库:<https://github.com/UMass-Embodied-AGI/MultiPLY>
|
||||||
|
|
||||||
|
本讲解面向具身智能 / 多模态大模型方向的研究者,目标是把 MultiPLY 的动机、核心设计、数据构造、模型结构、训练范式与实验结论讲清楚,并对它在技术谱系中的位置与局限做出评估。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 一句话概括
|
||||||
|
|
||||||
|
MultiPLY 是第一批把"**主动交互式多感官感知**"塞进大语言模型的工作之一。它让一个由 LLM 驱动的具身智能体(embodied agent)在 3D 场景里**主动行动**——导航、靠近、敲击、触摸物体——并在每一步把视觉、听觉(撞击声)、触觉、温度等**多感官反馈**重新喂回 LLM,从而在"词语—动作—感知"三者之间建立关联。
|
||||||
|
|
||||||
|
与"被动多模态 LLM"(一次性把所有传感数据当输入塞进去)相比,MultiPLY 的关键差异是:**多感官细节只有在智能体真正去交互时才被"揭示"出来**,这使得感知是按需的、序列化的、可推理的。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 它想解决什么问题
|
||||||
|
|
||||||
|
### 2.1 被动感知的局限
|
||||||
|
|
||||||
|
当下绝大多数多模态 LLM(图文模型、3D-LLM 等)都是**被动吸收**传感数据:图像、点云、音频在推理开始时就被一次性编码为输入 token。这带来两个问题:
|
||||||
|
|
||||||
|
- **缺乏主动性**:模型无法"决定去摸一下这个杯子有多烫"或"敲一下这个箱子是不是空的"。而物体的很多属性(材质、温度、是否中空、软硬)本质上必须通过交互才能获得。
|
||||||
|
- **信息纠缠**:把所有模态一次性融合成单一 embedding,会让细粒度区分(材质 vs 温度 vs 声音)混在一起,难以分步推理。
|
||||||
|
|
||||||
|
### 2.2 整体点云表示的代价
|
||||||
|
|
||||||
|
同组的前作 **3D-LLM**(把整体 3D 点云编码进 LLM)证明了 3D 推理的可行性,但代价是:**训练昂贵、对单个物体的推理效率低**。当任务其实只关心场景里少数几个物体时,编码整张场景的稠密点云是浪费。
|
||||||
|
|
||||||
|
### 2.3 数据稀缺
|
||||||
|
|
||||||
|
要训练一个"会交互的多感官具身 LLM",需要"动作 + 多感官观测 + 语言"三元对齐的数据。这类数据现实中几乎不存在。MultiPLY 的相当一部分贡献其实在于**用仿真 + LLM 自动化地把这套数据造出来**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 核心思想总览
|
||||||
|
|
||||||
|
MultiPLY 把三件事拼在一起:
|
||||||
|
|
||||||
|
1. **以物体为中心的抽象场景表示**(object-centric scene representation)——场景一开始只给"有哪些物体、在哪里"的抽象信息,不给细节感官数据。
|
||||||
|
2. **动作 token(action tokens)**——让 LLM 直接"生成动作",驱动智能体去交互。
|
||||||
|
3. **状态 token(state tokens)**——把交互后获得的多感官观测,编码后**追加回上下文**,供 LLM 生成后续文本或下一个动作。
|
||||||
|
|
||||||
|
这三者构成一个**闭环**:
|
||||||
|
|
||||||
|
```
|
||||||
|
抽象场景表示 → LLM 生成 [动作 token] → 智能体在仿真中执行动作
|
||||||
|
↑ │
|
||||||
|
└──── [状态 token](多感官观测编码回填) ←──────┘
|
||||||
|
│
|
||||||
|
LLM 继续生成文本 / 下一个动作
|
||||||
|
```
|
||||||
|
|
||||||
|
这正是它区别于"一次性塞输入"的被动模型的根本所在:**感知是行动的结果,而行动是 LLM 推理的产物。**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 数据:Multisensory Universe(500k 条交互数据)
|
||||||
|
|
||||||
|
数据是 MultiPLY 的基石,整条生成流水线值得拆开看。
|
||||||
|
|
||||||
|
### 4.1 场景底座:HM3D
|
||||||
|
|
||||||
|
使用 **Habitat-Matterport 3D(HM3D)** 提供的真实室内 3D 场景作为环境底座,在 **Habitat-sim** 仿真器里运行。
|
||||||
|
|
||||||
|
**问题**:HM3D 原生场景里的物体传感信息不足、多样性有限,而且在 Habitat-sim 里**不可交互**。
|
||||||
|
|
||||||
|
### 4.2 注入可交互的多感官物体
|
||||||
|
|
||||||
|
为此作者往场景里**添加新的可交互物体**,来源有两个:
|
||||||
|
|
||||||
|
- **ObjectFolder**:约 1k 个物体网格,其**撞击声(impact sound)以隐式神经场(implicit neural field)形式存储**,并标注了材质信息。这是音频与材质感官的主要来源。
|
||||||
|
- **Objaverse**:约 80 万个 3D 物体的超大物体库,从中筛选适合出现在室内场景的物体,扩充视觉多样性。
|
||||||
|
|
||||||
|
### 4.3 多感官信号怎么来
|
||||||
|
|
||||||
|
不同模态由不同仿真/编码手段生成:
|
||||||
|
|
||||||
|
| 模态 | 信号来源 | 触发动作 |
|
||||||
|
|------|----------|----------|
|
||||||
|
| 视觉 / 点云 | 物体网格渲染 + 以物体为中心的特征 | OBSERVE |
|
||||||
|
| 音频(撞击声) | ObjectFolder 的隐式神经声场 | HIT |
|
||||||
|
| 触觉 | **DiffTactile**(基于 MLS-MPM 仿真刚性 / 弹性 / 弹塑性物体,使用带位置标记点的 bubble gripper) | TOUCH |
|
||||||
|
| 温度(热成像) | 物体逐个标注 / 模拟的温度数据 | TOUCH |
|
||||||
|
|
||||||
|
### 4.4 用 ChatGPT 批量生成任务
|
||||||
|
|
||||||
|
作者用 **ChatGPT** 来"出题":生成各类任务的输入与输出(指令与目标回答),覆盖多感官描述(captioning)、问答(QA)、对话(dialogue)、操作(manipulation)、任务分解(task decomposition)等。随后让一个**具身智能体在仿真环境里真正去探索、交互**,采集这些任务对应的多感官观测,形成"指令 — 动作序列 — 多感官观测 — 回答"的完整训练样本。
|
||||||
|
|
||||||
|
最终得到 **Multisensory Universe:约 50 万条多感官交互数据**。
|
||||||
|
|
||||||
|
> 这套"用 LLM 自动造指令数据 + 仿真采集观测"的思路,是 LLaVA "用 GPT-4 造图文指令数据再做 instruction tuning" 范式向**具身、多感官、3D 交互**的延伸。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 模型架构
|
||||||
|
|
||||||
|
### 5.1 以物体为中心的场景编码
|
||||||
|
|
||||||
|
MultiPLY **不**把整张场景编码成稠密点云,而是构建抽象的、以物体为中心的表示。论文叙述上对标 **ConceptGraphs**(开放词表 3D 场景图、CLIP grounding)的思路:从带位姿的 RGB-D 序列出发,分割出物体区域、用 CLIP 编码并跨多视角融合,得到"3D 物体 + 视觉/语言描述符"的集合。
|
||||||
|
|
||||||
|
不过**公开仓库里 `simulator/semantic_extractor.py` 与 `feature_extractor.py` 的真实实现更直接**:智能体在房间的可导航网格点上逐点"球形扫描"(左转 3 次凑满 360° + 上看 + 下看,共 6 视角),每帧拿 RGB + 深度 + **仿真器给出的 ground-truth 语义分割**;对每个实例 mask 抠图,送入 **LLaVA 的 CLIP 视觉编码器(`LlaVa_Encoder`)** 编码,再对该物体的多视角特征取均值,得到一个 **1024 维**的物体级特征(逐物体存成 `.pt`);点云则由深度图反投影(`Reconstruct3D.depth_map2points`)后下采样得到。也就是说,released 版用**仿真器真值语义掩码**替代了 SAM/检测器这一步,是一种工程上更省事的近似。
|
||||||
|
|
||||||
|
这套表示的两大好处不变:**开放词表/语义丰富** + **稀疏高效**(只保留物体级抽象,而非全场景稠密点云)。在 MultiPLY 里,它的作用是先让 LLM 知道"场景里有哪些物体、大致在哪",而**把每个物体的细节多感官信息留到交互时再揭示**。
|
||||||
|
|
||||||
|
### 5.2 各模态编码器
|
||||||
|
|
||||||
|
每条感官流都被编码成 **1024 维**特征,再通过各自的投影层映射进 LLM 的隐藏维度(hidden size)。从代码(`llava_arch.py`)看,投影层分两套:
|
||||||
|
|
||||||
|
- **场景 / 视觉(`<scene>` / `<visual>`)**:复用 LLaVA 原有的视觉投影器 `mm_projector`(线性或 `mlp2x_gelu`)。特征来源是上文的多视角 CLIP 物体特征。
|
||||||
|
- **触觉(`<tactile>`)**:来自触觉仿真读数(`tactile_reading/marker4.pt`,对应论文里的 **DiffTactile**,基于 MLS-MPM 仿真、bubble gripper 标记点),经一个**新增的 2 层 GELU MLP**(`tactile_projector`)投影。
|
||||||
|
- **声音(`<sound>`)**:来自 ObjectFolder 的撞击声特征(`impact_sound .pt`),或场景环境音的 audioset embedding;经**新增 2 层 GELU MLP**(`sound_projector`)投影。论文层面对应用 **CLAP** 把声音对齐到语言空间。
|
||||||
|
- **温度(`<temperature>`)**:论文中作为第四种感官,但 released `llava_arch.py` 中**没有**对应的 `temperature_projector`,公开训练循环也未真正喂入温度特征——属于代码未完整释出的部分。
|
||||||
|
|
||||||
|
> 关键工程细节:训练时 `del model.model.vision_tower`,即**把 LLaVA 自带的在线 CLIP 视觉塔删掉**——所有感官特征都是**离线预提取**好的 `.pt`,训练时直接加载。这大幅降低了显存与计算开销,但也意味着特征提取与 LLM 训练是解耦的两个阶段。
|
||||||
|
|
||||||
|
### 5.3 LLM 主干与 token 体系
|
||||||
|
|
||||||
|
MultiPLY 构建在 **LLaVA 框架**之上,主干语言模型为 **Vicuna-7B(即 `liuhaotian/llava-v1.5-7b`,源自 LLaMA-2)**,并在其上做指令微调。各感官观测由各自的传感编码器编码,再通过投影层(sensor-to-image adapter)连接进 LLM——即把各模态特征对齐到 LLaVA 原本处理图像特征的接口上。它在 LLM 的词表里通过 `tokenizer.add_tokens(..., special_tokens=True)` + `resize_token_embeddings` 引入了两类**特殊 token**(token 字符串均来自仓库 `dataset.py`,是真实命名):
|
||||||
|
|
||||||
|
- **状态 token(state tokens)**:占位符,前向时其 embedding 会被对应的感官特征**替换**。包括 `<scene>`(场景里各物体的抽象特征)、`<visual>`(观察得到的物体点云/视觉特征)、`<tactile>`(触觉)、`<sound>`(撞击声)、`<temperature>`(温度)、`<ambient>`(环境音)。
|
||||||
|
- **动作 token(action tokens)**:让 LLM"说出"要执行的动作,驱动智能体交互。包括 `<observe>`(观察、取物体点云)、`<touch>`(触摸,取触觉/温度)、`<hit>`(敲击,取撞击声)、`<select>`(选定目标物体)、`<nav>`(导航)、`<pick-up>` / `<pick-down>`(拿起/放下)、`<look-around>`(环视探索)。
|
||||||
|
|
||||||
|
> 注意:论文行文里把动作写成 NAVIGATE / OBSERVE / TOUCH / HIT 等大写名,而**代码里的真实 token 是上面这些尖括号小写形式**。此外,released 训练脚本实际只接入了 `<scene>` / `<visual>` / `<tactile>` / `<sound>` 四类状态特征(见第 7 节),`<temperature>` / `<ambient>` 及部分动作 token 已在词表中定义但未在公开训练循环里完整启用。
|
||||||
|
|
||||||
|
### 5.4 推理时的闭环
|
||||||
|
|
||||||
|
推理时模型与环境形成闭环:
|
||||||
|
|
||||||
|
1. LLM 基于当前上下文(抽象场景 + 已有观测)**生成一个动作 token**;
|
||||||
|
2. 智能体在仿真环境中**执行该动作**,得到下一帧多感官状态观测;
|
||||||
|
3. 观测经对应编码器编码为**状态 token**,**追加回 LLM 上下文**;
|
||||||
|
4. LLM 据此**继续生成文本(回答)或下一个动作 token**,直至完成任务。
|
||||||
|
|
||||||
|
这套"生成动作 → 环境反馈 → 回填状态 → 再生成"的机制,使 LLM 能像人一样**边探索边收集证据、分步推理**,而不是一次性接收全部感官输入。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 训练范式
|
||||||
|
|
||||||
|
- **指令微调(instruction tuning)**:在 Multisensory Universe 数据上做指令微调,把动作 token 与状态 token 一并纳入序列建模。数据以 `Question: ... Answer: ...` 形式组织,**只对答案部分计算语言建模损失**(`fsdp_train.py` 里用分隔符 token id `22550`,即 "Answer" 定位答案起点,之前的 token 全部置为 `-100` 忽略)。
|
||||||
|
- **全参数微调,而非冻结**:与"冻结编码器只训投影层"的直觉不同,released 脚本里 `model.requires_grad_(True)`——**整个 LLM + 各投影层一起训练**(视觉塔已被删除,特征离线预提取)。优化器 AdamW,学习率 **1e-6**,`batch_size=2`,`max_length=2048`。
|
||||||
|
- **双目标损失**(这是代码里最值得注意的设计,论文正文较少强调):
|
||||||
|
- **`loss1`(语言建模)**:标准的下一 token 交叉熵,只在答案 token 上生效。
|
||||||
|
- **`loss2`(物体选择 / grounding)**:用 LLM **最后一层、最后一个位置的 hidden state** 与投影后的场景物体特征做点积(`einsum("abf,acf->abc")`)得到每个物体的"被选中分数",再对二值标签 `prediction`(该物体是否为目标)做 **加权 BCE**(正样本权重 1、负样本 0.2、padding 0,外加 `pos_weight=5`)。
|
||||||
|
- 总损失 `loss = loss1 + loss2`。这把"物体检索/指代消解"显式地变成一个可监督的注意力对齐任务,正是它在物体检索基准上大幅领先的工程原因之一。
|
||||||
|
- **分布式训练**:使用 **FSDP(Fully Sharded Data Parallel)**,`ShardingStrategy.SHARD_GRAD_OP`、fp16 混合精度、按 `LlamaDecoderLayer` 自动 wrap。入口 `fsdp_train.py`,通过 SLURM + `torchrun` 启动(示例:`--folder retrieval_attention3 --num_epochs=1000`,默认 8 卡/节点)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6.5 代码级实现剖析(基于本地仓库精读)
|
||||||
|
|
||||||
|
仓库结构清晰,分三块:`model_release/`(改造版 LLaVA + 训练/数据)、`simulator/`(Habitat-sim 多感官仿真与特征提取)、`utils/`。以下是把"论文概念"对应到"代码事实"的关键点。
|
||||||
|
|
||||||
|
### 6.5.1 多感官特征如何"插入"LLM
|
||||||
|
|
||||||
|
核心在 `llava_arch.py` 的 `prepare_inputs_labels_for_multimodal`:
|
||||||
|
|
||||||
|
1. 先用 `embed_tokens` 把 `input_ids` 正常编码为文本 embedding;
|
||||||
|
2. 把各模态特征过投影层:`scene/visual → mm_projector`,`tactile → tactile_projector`,`sound → sound_projector`;
|
||||||
|
3. 用 `_insert_feature` 按"插入位置"(dataset 里记录的各占位 token 出现处 `*_insert_loc`)**逐位替换** embedding,并把这些位置的 label 设为 `-100`(不计入 LM 损失);
|
||||||
|
4. 之后就是标准 LLaMA 前向 + `lm_head`。
|
||||||
|
|
||||||
|
也就是说,多感官信息是以"**把占位 token 的词向量替换成感官特征向量**"的方式进入 LLM 的——这与 LLaVA 处理图像 patch 的机制同源。
|
||||||
|
|
||||||
|
### 6.5.2 占位符的数量对齐技巧
|
||||||
|
|
||||||
|
`dataset.py` 里有一个巧妙处理:文本中每出现一个 `<scene>`(或 `<tactile>` 等),会被**按特征条数复制**——`text.replace(self.scene_token, self.scene_token*len(scene_feature))`。这样占位 token 的数量正好等于要插入的特征向量数量,使第 6.5.1 步的"逐位替换"严格对齐。场景特征默认形状是 `(256, 1024)`(最多 256 个物体、每个 1024 维)。
|
||||||
|
|
||||||
|
### 6.5.3 数据条目的结构
|
||||||
|
|
||||||
|
每条样本是一个 JSON dict,可能包含:`question` / `answer` / `scene`(场景 id,去 `dataset/feature_dict/<scene>/<obj_id>.pt` 取物体特征)/ `visual` / `tactile_reading` / `impact_sound` / `temperature` / `prediction`(逐物体的目标性标签,用于 `loss2`)。`__getitem__` 用 `try/except` 包裹,取不到特征就回退到上一条——这是研究代码常见的容错写法,也说明数据完整性需要使用者自行保证。
|
||||||
|
|
||||||
|
### 6.5.4 仿真器(`simulator/`)
|
||||||
|
|
||||||
|
`MultisensorySimulator` 继承自 `habitat_sim.Simulator`:
|
||||||
|
|
||||||
|
- **放置可交互物体**:`_place_objs` 把 Objaverse / ObjectFolder 的网格按 bbox 缩放、定位、设材质与质量(动态/静态)后注入 HM3D 场景,并赋予从 10000 起的语义 id(便于和原生物体区分)。
|
||||||
|
- **导航**:`move_agent_to_target` 用 `ShortestPathFollower` 沿最短路径走到目标。
|
||||||
|
- **声学**:`calculate_audio` 用各步的**房间脉冲响应(RIR)**与声源音频做 `fftconvolve` 卷积,生成**双耳(binaural)空间化音频**——这是 SoundSpaces 式的声学仿真。
|
||||||
|
- **特征提取**:`semantic_extractor.py` / `feature_extractor.py` 在网格点球形扫描,借助 GT 语义掩码抠出物体、用 LLaVA CLIP 编码并多视角平均,落盘为物体级 `.pt` 特征与房间点云。
|
||||||
|
|
||||||
|
### 6.5.5 推理评测
|
||||||
|
|
||||||
|
`fsdp_train.py` 的 `eval()` 对短答案 QA 做贪心生成(`do_sample=False, max_new_tokens=10`),与真值字符串精确匹配统计准确率——对应论文里问答类任务的评测方式。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 能做哪些任务
|
||||||
|
|
||||||
|
MultiPLY 是一个**统一**的多任务模型,论文展示了它在以下任务上的能力:
|
||||||
|
|
||||||
|
- 多感官描述(multisensory captioning)
|
||||||
|
- 多感官问答 / 具身问答(multisensory QA / embodied QA)
|
||||||
|
- 对话(dialogue)
|
||||||
|
- 物体检索(object retrieval)——给定多感官线索找到目标物体
|
||||||
|
- 工具使用(tool use)
|
||||||
|
- 任务分解(task decomposition)
|
||||||
|
- 操作与导航(manipulation / navigation)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 实验结论
|
||||||
|
|
||||||
|
论文围绕几个研究问题(RQ)组织实验:物体检索、工具使用、多感官描述、任务分解,以及各感官模态的贡献(消融)。
|
||||||
|
|
||||||
|
### 8.1 物体检索(最具代表性的量化结果)
|
||||||
|
|
||||||
|
| 模型 | 物体检索准确率 |
|
||||||
|
|------|----------------|
|
||||||
|
| **MultiPLY** | **56.7%** |
|
||||||
|
| PointBind-LLM(微调) | 48.9% |
|
||||||
|
| ConceptGraph + CLIP | 18.7% |
|
||||||
|
|
||||||
|
MultiPLY 大幅领先。作者的分析是:**让 LLM 把不同传感数据"解耦、分步推理",而不是融合成单一 embedding**,对于需要细粒度区分(材质、温度等)的检索任务至关重要。
|
||||||
|
|
||||||
|
### 8.2 总体表现与消融
|
||||||
|
|
||||||
|
- 在物体检索、工具使用、多感官描述、任务分解等一系列具身任务上,MultiPLY **大幅超越各类基线**。
|
||||||
|
- 消融实验表明:**逐步叠加感官模态会持续提升性能**,使用视觉 + 音频 + 触觉 + 温度的完整模型取得最高准确率——验证了"多感官交互式感知"这一核心设计的价值。
|
||||||
|
|
||||||
|
> 注:除物体检索的具体数值外,工具使用 / 描述 / 任务分解的完整对比表与逐模态消融的精确数值,建议查阅 [CVPR 2024 论文 PDF](https://openaccess.thecvf.com/content/CVPR2024/papers/Hong_MultiPLY_A_Multisensory_Object-Centric_Embodied_Large_Language_Model_in_3D_CVPR_2024_paper.pdf) 原表。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 在技术谱系中的位置
|
||||||
|
|
||||||
|
MultiPLY 站在几条线索的交叉点上:
|
||||||
|
|
||||||
|
- **LLaVA**(视觉指令微调)→ 提供了"用强 LLM 造指令数据 + 冻结编码器 + 指令微调"的训练范式;MultiPLY 把它从 2D 图文推广到具身多感官 3D 交互。
|
||||||
|
- **3D-LLM**(同组前作,整体点云进 LLM)→ MultiPLY 用**以物体为中心的稀疏表示**替代稠密点云,降低训练/推理成本。
|
||||||
|
- **ConceptGraphs**(开放词表 3D 场景图,CLIP grounding)→ 提供了以物体为中心、开放词表的场景编码骨架。
|
||||||
|
- **ObjectFolder / DiffTactile / CLAP**(多感官仿真与编码)→ 提供视觉之外的声、触、热信号来源与编码手段。
|
||||||
|
|
||||||
|
它的**真正新意**在于把"**动作 token + 状态 token 的交互闭环**"引入 LLM,把感知从"被动输入"变为"主动行动的产物"。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 局限与可讨论之处
|
||||||
|
|
||||||
|
以研究者视角,几个值得关注的点:
|
||||||
|
|
||||||
|
- **强依赖仿真**:多感官信号(撞击声、触觉、温度)主要来自仿真(ObjectFolder 神经声场、DiffTactile、标注温度)。从仿真到真实世界(sim-to-real)的迁移、真实触觉/热传感的噪声与标定,论文未充分覆盖。
|
||||||
|
- **数据由 ChatGPT 生成**:指令与目标回答由 ChatGPT 自动产出,可能继承其偏置或产生与物理不完全一致的"幻觉式"标注;数据质量的系统评估是开放问题。
|
||||||
|
- **动作空间相对受限**:`<nav>` / `<observe>` / `<touch>` / `<hit>` 等是离散、高层的动作原语,距离真实机器人连续控制(力控、抓取轨迹)还有距离。
|
||||||
|
- **以物体为中心的取舍**:抽象表示高效,但会丢失场景级几何/空间关系的细节,对需要精细空间推理的任务可能不利;且 released 特征提取依赖仿真器 GT 语义掩码,迁移到真实场景需换成真正的开放词表分割(如 SAM/ConceptGraphs)。
|
||||||
|
- **复现成本与代码完整度**:FSDP 多卡训练 + 多个仿真器/编码器(Habitat-sim、DiffTactile、SoundSpaces 声学、CLIP 提取)的环境搭建较重;并且**公开代码是研究级、部分释出**——`README` 的 Requirements / Dataset Curation 仍为 TODO,温度模态投影器缺失,`model/feature_encoder.py` 等被引用文件未包含,数据 JSON(`all_questions.json`)与预提取特征需自行准备。把它当作"权威参考实现"而非"开箱即用工程"更稳妥。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 给想上手的研究者的建议路径
|
||||||
|
|
||||||
|
1. 先读 [arXiv 论文](https://arxiv.org/abs/2401.08577) 的 Method 与 Figure(动作/状态 token 闭环、数据流水线图)建立整体直觉。
|
||||||
|
2. 直接读代码三条主线,按这个顺序最省力:
|
||||||
|
- **token 与数据**:`model_release/dataset.py`(特殊 token 定义、占位符复制对齐、各模态特征加载);
|
||||||
|
- **模型如何吃进多感官特征**:`model_release/llava/llava/model/llava_arch.py` 的 `prepare_inputs_labels_for_multimodal` + `multimodal_projector/builder.py`;
|
||||||
|
- **训练目标**:`model_release/fsdp_train.py` 的 `train_one_epoch`(双损失 `loss1`+`loss2`、答案掩码、FSDP 配置)。
|
||||||
|
3. 想搞数据/仿真,再看 `simulator/`:`multisensory_simulator.py`(放物体、导航、RIR 声学)与 `semantic_extractor.py` / `feature_extractor.py`(球形扫描 + 物体级 CLIP 特征落盘)。
|
||||||
|
4. 沿依赖补外部组件背景:**Habitat-sim + HM3D**(环境)、**Objaverse / ObjectFolder**(物体与撞击声)、**DiffTactile**(触觉)、**LLaVA-1.5**(主干)。
|
||||||
|
5. 若关注方法迁移,重点研究"动作/状态 token 闭环 + 物体选择注意力损失"这一组合——它可脱离具体仿真器,迁移到其他需要"模型主动获取信息再决策"的场景(主动视觉、工具调用、检索增强)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 相关工作(10 篇相近方向论文)
|
||||||
|
|
||||||
|
按子方向分组,附 arXiv 链接,并标注与 MultiPLY 的关系。
|
||||||
|
|
||||||
|
### 12.1 3D-LLM 谱系与具身 VLA(与 MultiPLY 最直接相关,多为同组工作)
|
||||||
|
|
||||||
|
1. **3D-LLM: Injecting the 3D World into Large Language Models**(NeurIPS 2023)—— MultiPLY 的直接前作,把整体 3D 点云特征注入 LLM;MultiPLY 用"以物体为中心的稀疏表示"改进了它的训练/推理效率。<https://arxiv.org/abs/2307.12981>
|
||||||
|
2. **3D-VLA: A 3D Vision-Language-Action Generative World Model**(ICML 2024)—— 同组工作,同样在 LLM 词表里加 scene / object / action 特殊 token,并接生成式世界模型;与 MultiPLY 的 token 机制是姊妹设计。<https://arxiv.org/abs/2403.09631>
|
||||||
|
3. **LEO: An Embodied Generalist Agent in 3D World**(ICML 2024)—— 两阶段训练(3D 视觉-语言对齐 + VLA 指令微调)的具身通用智能体,与 MultiPLY 在"3D 具身指令微调"上高度并行。<https://arxiv.org/abs/2311.12871>
|
||||||
|
|
||||||
|
### 12.2 具身多模态大模型(感知—推理—动作)
|
||||||
|
|
||||||
|
4. **PaLM-E: An Embodied Multimodal Language Model**(2023)—— 把连续传感模态直接编码进 LLM,建立"词语—感知"链接,是 MultiPLY"多感官入 LLM"思路的奠基工作之一。<https://arxiv.org/abs/2303.03378>
|
||||||
|
5. **EmbodiedGPT: Vision-Language Pre-Training via Embodied Chain of Thought**(NeurIPS 2023)—— 具身链式思维 + EgoCOT 数据集的端到端具身基础模型。<https://arxiv.org/abs/2305.15021>
|
||||||
|
6. **Matcha: Chat with the Environment — Interactive Multimodal Perception Using LLMs**(IROS 2023)—— 与 MultiPLY"主动交互式感知"最神似:用 LLM 指挥探索性动作,对视觉/声音/触觉/本体感觉反馈做推理与规划。<https://arxiv.org/abs/2303.08268>
|
||||||
|
|
||||||
|
### 12.3 点云 / 物体级 3D LLM(含 MultiPLY 的实际基线)
|
||||||
|
|
||||||
|
7. **PointLLM: Empowering LLMs to Understand Point Clouds**(ECCV 2024)—— 物体级彩色点云理解与描述,3D-LLM 方向代表作。<https://arxiv.org/abs/2308.16911>
|
||||||
|
8. **Point-Bind & Point-LLM: Aligning Point Cloud with Multi-modality**(2023)—— 把点云与多模态对齐;其微调版 **PointBind-LLM 正是 MultiPLY 物体检索实验里的最强基线**(48.9% vs MultiPLY 56.7%)。<https://arxiv.org/abs/2309.00615>
|
||||||
|
|
||||||
|
### 12.4 多感官物体感知与触觉
|
||||||
|
|
||||||
|
9. **The ObjectFolder Benchmark: Multisensory Learning with Neural and Real Objects**(CVPR 2023)—— 视觉/听觉/触觉的物体级多感官数据集与基准,**正是 MultiPLY 撞击声与材质数据的来源**(早期版 <https://arxiv.org/abs/2109.07991>)。<https://arxiv.org/abs/2306.00956>
|
||||||
|
10. **VTV-LLM: Universal Visuo-Tactile Video Understanding for Embodied Interaction**(2025)—— 首个面向"视触觉视频"理解的多模态 LLM,把触觉感知接入语言,延续 MultiPLY 的触觉方向。<https://arxiv.org/abs/2505.22566>
|
||||||
|
|
||||||
|
### 12.5 延伸阅读(3D 场景级 LLM 与综述)
|
||||||
|
|
||||||
|
- **LL3DA: Visual Interactive Instruction Tuning for Omni-3D Understanding**<https://arxiv.org/abs/2311.18651>
|
||||||
|
- **Chat-Scene / Chat-3D v2: Bridging 3D Scene and LLMs with Object Identifiers**<https://arxiv.org/abs/2312.08168>
|
||||||
|
- **Scene-LLM: Extending Language Model for 3D Visual Understanding and Reasoning**<https://arxiv.org/abs/2403.11401>
|
||||||
|
- **综述:Exploring Embodied Multimodal Large Models**<https://arxiv.org/abs/2502.15336>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 来源(Sources)
|
||||||
|
|
||||||
|
- [MultiPLY 论文 arXiv:2401.08577](https://arxiv.org/abs/2401.08577)
|
||||||
|
- [CVPR 2024 Open Access PDF](https://openaccess.thecvf.com/content/CVPR2024/papers/Hong_MultiPLY_A_Multisensory_Object-Centric_Embodied_Large_Language_Model_in_3D_CVPR_2024_paper.pdf)
|
||||||
|
- [项目主页 vis-www.cs.umass.edu/multiply](https://vis-www.cs.umass.edu/multiply/)
|
||||||
|
- [GitHub 代码仓库 UMass-Embodied-AGI/MultiPLY](https://github.com/UMass-Embodied-AGI/MultiPLY)
|
||||||
|
- [CVPR 2024 Poster #29685](https://cvpr.thecvf.com/virtual/2024/poster/29685)
|
||||||
|
- [UMass Embodied AGI 发表列表](https://embodied-agi.cs.umass.edu/publications/)
|
||||||
|
|
||||||
|
相关工作(第 12 节)来源:
|
||||||
|
- [3D-LLM (2307.12981)](https://arxiv.org/abs/2307.12981)
|
||||||
|
- [3D-VLA (2403.09631)](https://arxiv.org/abs/2403.09631)
|
||||||
|
- [LEO (2311.12871)](https://arxiv.org/abs/2311.12871)
|
||||||
|
- [PaLM-E (2303.03378)](https://arxiv.org/abs/2303.03378)
|
||||||
|
- [EmbodiedGPT (2305.15021)](https://arxiv.org/abs/2305.15021)
|
||||||
|
- [Matcha (2303.08268)](https://arxiv.org/abs/2303.08268)
|
||||||
|
- [PointLLM (2308.16911)](https://arxiv.org/abs/2308.16911)
|
||||||
|
- [Point-Bind & Point-LLM (2309.00615)](https://arxiv.org/abs/2309.00615)
|
||||||
|
- [ObjectFolder Benchmark (2306.00956)](https://arxiv.org/abs/2306.00956)
|
||||||
|
- [VTV-LLM (2505.22566)](https://arxiv.org/abs/2505.22566)
|
||||||
@@ -0,0 +1,205 @@
|
|||||||
|
# MultiPLY 训练过程讲解
|
||||||
|
|
||||||
|
> 本文基于 MultiPLY 官方仓库(`model_release/` 下的 `fsdp_train.py`、`dataset.py`、`llava/llava/model/llava_arch.py`、`builder.py`)的**真实代码**,逐步讲清它"怎么训"。
|
||||||
|
> 配套阅读:同目录《MultiPLY技术讲解.md》(含完整架构与代码级剖析)。
|
||||||
|
> 一句话定位:MultiPLY = **在 LLaVA-1.5-7B 上、用预提取的多感官特征做指令微调**,并叠加一个**物体选择(grounding)注意力损失**形成双目标训练。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0. 全局概览
|
||||||
|
|
||||||
|
训练可以拆成"一个离线阶段 + 一个在线阶段":
|
||||||
|
|
||||||
|
```
|
||||||
|
阶段零(离线,仿真器里做) 阶段一(在线,fsdp_train.py 做)
|
||||||
|
仿真采集 → 各模态特征预提取 .pt 加载 LLaVA-1.5-7B → 注入多感官 token
|
||||||
|
视觉/点云 (CLIP) → 删除视觉塔、全参数可训
|
||||||
|
触觉 (DiffTactile) → FSDP 分布式
|
||||||
|
撞击声 (ObjectFolder/CLAP) → 双损失:语言建模 + 物体选择
|
||||||
|
逐物体目标标签 prediction → AdamW / fp16 / 每 epoch 存档
|
||||||
|
```
|
||||||
|
|
||||||
|
关键点先记住三条:
|
||||||
|
|
||||||
|
1. **特征是离线算好的**:训练时不跑视觉塔,直接从 `.pt` 加载各模态特征(省显存/算力)。
|
||||||
|
2. **全参数微调**:不是"冻结编码器只训投影头",而是整个 LLM + 各投影层一起训。
|
||||||
|
3. **双目标损失**:语言建模损失(`loss1`)+ 物体选择损失(`loss2`),两者相加。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 阶段零:离线特征预提取(数据准备)
|
||||||
|
|
||||||
|
训练读的不是原始图像/声音,而是**预先算好的特征张量**。每条样本对应一个 JSON 字典(来自 `all_questions.json`),可能含这些字段:
|
||||||
|
|
||||||
|
| 字段 | 含义 | 训练时如何用 |
|
||||||
|
|------|------|--------------|
|
||||||
|
| `question` / `answer` | 指令与目标回答 | 拼成文本序列 |
|
||||||
|
| `scene` | 场景 id | 去 `dataset/feature_dict/<scene>/<obj_id>.pt` 取**每个物体的 1024 维特征**(CLIP 风格,多视角平均;默认场景特征形状 `(256,1024)`,即最多 256 个物体) |
|
||||||
|
| `visual` | 观察到的物体 | 取该物体的视觉/点云特征 |
|
||||||
|
| `tactile_reading` | 触觉读数路径 | 取 `data5/<...>/marker4.pt` 并按 marker 维取均值(对应 DiffTactile) |
|
||||||
|
| `impact_sound` | 撞击声 | 取 `impact_sound_*/0.pt`;或场景环境音 audioset embedding |
|
||||||
|
| `temperature` | 温度 | 代码中部分实现(投影器在公开版未完整释出) |
|
||||||
|
| `prediction` | **逐物体的目标性二值标签** | 用于 `loss2` 物体选择损失 |
|
||||||
|
|
||||||
|
> 这些特征由 `simulator/` 里的网格扫描 + 各模态仿真器离线生成(详见《MultiPLY技术讲解》第 6.5 节)。训练阶段只管"加载 + 喂进 LLM"。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 训练数据怎么组织(`dataset.py`)
|
||||||
|
|
||||||
|
### 2.1 文本模板与"占位符复制"技巧
|
||||||
|
|
||||||
|
`MultisensoryDataset.__getitem__` 把样本拼成固定模板:
|
||||||
|
|
||||||
|
```
|
||||||
|
Question: {question} Answer: {answer} {eos}
|
||||||
|
```
|
||||||
|
|
||||||
|
其中文本里嵌有特殊**占位 token**(`<scene>` `<visual>` `<tactile>` `<sound>` 等)。关键技巧是:**每个占位 token 会按其特征条数被复制**——
|
||||||
|
|
||||||
|
```python
|
||||||
|
text = text.replace(self.scene_token, self.scene_token * len(scene_feature))
|
||||||
|
.replace(self.tactile_token, self.tactile_token * len(tactile_feature))
|
||||||
|
.replace(self.sound_token, self.sound_token * len(sound_feature))
|
||||||
|
.replace(self.visual_token, self.visual_token * len(visual_feature))
|
||||||
|
```
|
||||||
|
|
||||||
|
这样"占位 token 的数量 == 要插入的特征向量数量",保证后面逐位替换严格对齐(见 §3)。
|
||||||
|
|
||||||
|
### 2.2 tokenize 与插入位置
|
||||||
|
|
||||||
|
文本经 tokenizer(`max_length=2048`,padding 到最大长度)后:
|
||||||
|
|
||||||
|
- 记录每类占位 token 在序列里的下标 `*_insert_loc`(`scene_insert_loc` / `visual_insert_loc` / `tactile_insert_loc` / `sound_insert_loc`);
|
||||||
|
- 各模态特征按插入位置数量截断对齐;
|
||||||
|
- `prediction` 转成 0/1 浮点张量(`>0` 的置 1),作为物体选择监督。
|
||||||
|
|
||||||
|
### 2.3 collate(成 batch)
|
||||||
|
|
||||||
|
`collate_wrapper` 把一个 batch 拼起来:场景特征 zero-pad 到 batch 内最大物体数,记录 `max_scene_length`,并把各 `insert_loc` 改写成 `[batch_idx, 位置]` 的形式,便于跨 batch 定位。`batch_size=2`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 模型怎么"吃"多感官特征(`llava_arch.py`)
|
||||||
|
|
||||||
|
前向第一步是 `prepare_inputs_labels_for_multimodal`,核心是**把占位 token 的词向量替换成感官特征向量**:
|
||||||
|
|
||||||
|
1. 先正常 `embed_tokens(input_ids)` 得到文本 embedding;
|
||||||
|
2. 把各模态特征过投影层对齐到 LLM 隐藏维:
|
||||||
|
- `scene` / `visual` → 复用 LLaVA 的 **`mm_projector`**
|
||||||
|
- `tactile` → 新增的 **`tactile_projector`**(2 层 GELU MLP)
|
||||||
|
- `sound` → 新增的 **`sound_projector`**(2 层 GELU MLP)
|
||||||
|
3. `_insert_feature` 按 `*_insert_loc` **逐位把占位 token 的 embedding 覆盖成对应特征**,同时把这些位置的 label 设为 `-100`(不计入语言建模损失);
|
||||||
|
4. 之后就是标准 LLaMA 前向 + `lm_head`。
|
||||||
|
|
||||||
|
> 这与 LLaVA 处理图像 patch 的机制同源——多感官信息以"替换占位词向量"的方式进入 LLM。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 训练主循环(`fsdp_train.py`)
|
||||||
|
|
||||||
|
### 4.1 模型加载与可训设置(`main`)
|
||||||
|
|
||||||
|
```python
|
||||||
|
model_path = "liuhaotian/llava-v1.5-7b"
|
||||||
|
tokenizer, model, image_processor, context_len = load_pretrained_model(
|
||||||
|
model_path, None, model_name, device_map=None, add_multisensory_token=True)
|
||||||
|
```
|
||||||
|
|
||||||
|
- `add_multisensory_token=True`:在 `builder.py` 里把 `<scene>/<visual>/<tactile>/<sound>/<observe>/<touch>/<hit>` 等加进 tokenizer 并 `resize_token_embeddings`(扩词表)。
|
||||||
|
- `model.requires_grad_(True)`:**全参数可训**(整 LLM + 投影层)。
|
||||||
|
- `del model.model.vision_tower`:**删掉 LLaVA 自带的在线 CLIP 视觉塔**(特征已离线预提取,省显存)。
|
||||||
|
|
||||||
|
### 4.2 分布式与优化器
|
||||||
|
|
||||||
|
- **FSDP**(Fully Sharded Data Parallel):
|
||||||
|
- `auto_wrap_policy` 按 `LlamaDecoderLayer` 自动 wrap;
|
||||||
|
- `MixedPrecision` 全 fp16(param/reduce/buffer);
|
||||||
|
- `ShardingStrategy.SHARD_GRAD_OP`(分片梯度与优化器状态)。
|
||||||
|
- 优化器:**AdamW,lr = 1e-6**。
|
||||||
|
- 数据:`DistributedSampler` + `DataLoader(batch_size=2, num_workers=4)`。
|
||||||
|
- 训练 `num_epochs` 轮,每轮 `train_one_epoch` 后 `save_checkpoint`(FSDP `FULL_STATE_DICT`,rank0 存 `checkpoint_{epoch}.pt`)。
|
||||||
|
|
||||||
|
### 4.3 单步训练(`train_one_epoch`)—— 这是核心
|
||||||
|
|
||||||
|
```python
|
||||||
|
labels = input_ids.clone()
|
||||||
|
answer_indices = torch.where(labels == 22550)[1] # 22550 = "Answer" 分隔符
|
||||||
|
for j, answer_idx in enumerate(answer_indices):
|
||||||
|
labels[j, :answer_idx+2] = -100 # 只对"答案"部分算语言损失
|
||||||
|
labels[labels == tokenizer.pad_token_id] = -100 # padding 不算损失
|
||||||
|
|
||||||
|
with torch.autocast(device_type="cuda"):
|
||||||
|
outputs = llava_model(input_ids, attention_mask, labels=labels,
|
||||||
|
feature_dict=feature_dict, output_hidden_states=True)
|
||||||
|
# —— loss2:物体选择(grounding)——
|
||||||
|
hidden_state = outputs['hidden_states'][-1][:, -1, :].unsqueeze(1) # 最后层、最后位置
|
||||||
|
scene_feature = llava_model.model.mm_projector(sample.scene_feature) # 投影后的物体特征
|
||||||
|
attention = torch.einsum("abf,acf->abc", scene_feature, hidden_state).squeeze(-1)
|
||||||
|
# 加权 BCE:正样本权重1、负样本0.2、忽略0;pos_weight=5
|
||||||
|
loss2 = F.binary_cross_entropy_with_logits(attention, prediction,
|
||||||
|
weight=weights, pos_weight=pos_weight)
|
||||||
|
|
||||||
|
loss = outputs.loss + loss2 # loss1 + loss2
|
||||||
|
loss.backward(); optimizer.step()
|
||||||
|
```
|
||||||
|
|
||||||
|
**要点拆解**:
|
||||||
|
|
||||||
|
- **标签掩码**:用 token id `22550`(LLaMA 分词下的 "Answer")定位答案起点,把它之前的 token 全置 `-100`——即**只在"答案"部分计算语言建模损失**(问题、占位符、padding 都不算)。
|
||||||
|
- **loss1(语言建模)**:标准下一 token 交叉熵(在 `llava_llama.py` 的 forward 里算好,移位后 `CrossEntropyLoss`)。
|
||||||
|
- **loss2(物体选择 / grounding)**:用 LLM **最后一层、最后一个位置的 hidden state** 与投影后的场景物体特征做点积(`einsum`),得到每个物体的"被选中分数",再对二值标签 `prediction` 做**加权 BCE**:
|
||||||
|
- 权重 `weights`:目标物体(pred==1)权重 1,非目标(pred==0)权重 0.2,忽略(pred==-1)权重 0;超过 `max_scene_length` 的 padding 物体权重 0;
|
||||||
|
- 额外 `pos_weight=5` 缓解正负样本不平衡。
|
||||||
|
- **总损失**:`loss = loss1 + loss2`,一起反传。
|
||||||
|
|
||||||
|
> 这个 `loss2` 把"物体检索/指代消解"显式变成可监督的注意力对齐任务——正是 MultiPLY 在物体检索基准上大幅领先(56.7% vs 次优 48.9%)的工程原因之一。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 推理 / 评测(`eval`)
|
||||||
|
|
||||||
|
评测对短答案 QA 做贪心生成并与真值精确匹配:
|
||||||
|
|
||||||
|
```python
|
||||||
|
output_ids = model.generate(input_ids, feature_dict=feature_dict,
|
||||||
|
do_sample=False, max_new_tokens=10)
|
||||||
|
# 解码后与 ground-truth 字符串 .lower().strip() 精确匹配,统计准确率
|
||||||
|
```
|
||||||
|
|
||||||
|
推理时同样先把多感官特征注入占位 token,再自回归生成;在完整的具身设定下,模型还会**生成动作 token**(`<observe>/<touch>/<hit>` 等)驱动智能体交互、把新观测作为状态 token 回填——形成"动作→反馈→再生成"的闭环(详见架构文档)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 关键超参数 / 配置一览
|
||||||
|
|
||||||
|
| 项 | 取值 | 出处 |
|
||||||
|
|----|------|------|
|
||||||
|
| 主干 | `liuhaotian/llava-v1.5-7b`(Vicuna-7B / LLaMA-2 系) | `fsdp_train.py` |
|
||||||
|
| 可训范围 | 全参数(`requires_grad_(True)`),删除视觉塔 | `fsdp_train.py` |
|
||||||
|
| 优化器 / 学习率 | AdamW / **1e-6** | `fsdp_train.py` |
|
||||||
|
| batch size | 2 | `fsdp_train.py` |
|
||||||
|
| 序列长度 | 2048 | `dataset.py` |
|
||||||
|
| 分布式 | FSDP,`SHARD_GRAD_OP`,fp16 混合精度 | `fsdp_train.py` |
|
||||||
|
| 损失 | `loss1`(LM CE) + `loss2`(物体选择加权 BCE, pos_weight=5) | `train_one_epoch` |
|
||||||
|
| 答案分隔符 | token id `22550`("Answer") | `train_one_epoch` |
|
||||||
|
| 特征维度 | 各模态 1024 维 → 投影到 LLM 隐藏维 | `dataset.py` / `llava_arch.py` |
|
||||||
|
| 投影层 | scene/visual→`mm_projector`;tactile/sound→各自 2 层 GELU MLP | `llava_arch.py` |
|
||||||
|
| 存档 | 每 epoch,FSDP FULL_STATE_DICT,rank0 保存 | `save_checkpoint` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 与论文叙述的差异 / 注意点
|
||||||
|
|
||||||
|
- **"冻结"误区**:直觉上 LLaVA 式训练常冻结编码器,但 MultiPLY released 脚本是**全参数微调**(视觉塔已删、特征离线)。
|
||||||
|
- **双损失少被强调**:论文正文偏重"动作/状态 token 闭环",但代码里 `loss2`(物体选择)对检索类任务很关键。
|
||||||
|
- **温度模态未完整**:`<temperature>` 在词表/数据里出现,但 `llava_arch.py` 没有对应投影器、公开训练循环也未真正喂入——属于部分释出。
|
||||||
|
- **研究级代码**:`all_questions.json`、预提取特征、`requirements` 等需自行准备;`__getitem__` 用 `try/except` 容错,数据完整性需使用者保证。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 小结:MultiPLY 训练的三句话
|
||||||
|
|
||||||
|
1. **离线**把视/触/听等多感官信号各自编码成 1024 维特征 `.pt`;
|
||||||
|
2. **在线**在 LLaVA-1.5-7B 上做全参数指令微调,用"占位 token 替换成特征向量"的方式把多感官喂进 LLM,只在答案上算语言损失;
|
||||||
|
3. 叠加一个**物体选择注意力损失**(hidden state × 物体特征 的加权 BCE),让模型学会"挑出目标物体",与语言损失一起用 FSDP/AdamW/fp16 训练。
|
||||||
@@ -0,0 +1,344 @@
|
|||||||
|
---
|
||||||
|
title: "V-JEPA 2 深度技术剖析:从自监督视频表征到零样本机器人规划"
|
||||||
|
date: 2026-05-24
|
||||||
|
draft: false
|
||||||
|
tags: ["V-JEPA 2", "JEPA", "Meta", "world-model", "self-supervised", "video", "robotics", "action-conditioned", "MPC"]
|
||||||
|
categories: ["JEPA"]
|
||||||
|
description: "论文(arXiv:2506.09985)+ 官方代码(facebookresearch/vjepa2)结合的 V-JEPA 2 深度技术剖析:逐模块讲解编码器/预测器架构、四支柱 scaling 策略、动作条件世界模型 V-JEPA 2-AC,以及基于 MPC + CEM 的零样本机器人规划。"
|
||||||
|
---
|
||||||
|
|
||||||
|
> 本文聚焦 **V-JEPA 2**(Assran, Bardes, Fan, Garrido, LeCun 等,FAIR @ Meta + Mila,arXiv:2506.09985,2025-06),采用"论文 + 代码"双线讲解:先讲清论文里的设计动机与方法,再对照官方仓库 `facebookresearch/vjepa2` 与 HuggingFace `transformers` 集成讲实现细节。它是 [JEPA 系列综述](index.md) 中 V-JEPA 2 一节的展开深挖版。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 一、一句话定位与三大能力
|
||||||
|
|
||||||
|
V-JEPA 2 把一个核心论断推到了规模化的极致:**在表示空间(latent space)中做预测,而不是在像素空间里重建**,配合互联网级视频数据,可以让一个自监督模型同时具备三种能力——
|
||||||
|
|
||||||
|
1. **理解(Understanding)**:作为冻结视觉编码器,在运动理解、动作识别上达到 SOTA。
|
||||||
|
2. **预测 / 预判(Prediction / Anticipation)**:预测未来表示,在人类动作预判(Epic-Kitchens-100)上超过专用模型。
|
||||||
|
3. **规划(Planning)**:在少量机器人交互数据上后训练出 **V-JEPA 2-AC**(action-conditioned),用世界模型做模型预测控制(MPC),在两个全新实验室的 Franka 机械臂上**零样本**完成抓取与放置。
|
||||||
|
|
||||||
|
它与两条主流路线的区别构成了全文的方法论主线:
|
||||||
|
|
||||||
|
- **vs 纯交互式学习(RL / 行为克隆)**:那类方法依赖昂贵的真机交互数据。V-JEPA 2 用互联网视频学习"世界如何演化"——视频里有状态序列但**没有显式动作标签**,自监督正好能利用这种"无动作"数据。
|
||||||
|
- **vs 视频生成式世界模型(如扩散类 Cosmos)**:生成式目标逼迫模型刻画像素级的不可预测细节(纹理、光影)。JEPA 只预测**可预测的语义部分**(如运动物体的轨迹),主动忽略不可预测细节,因此表示更紧凑、规划更快。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 二、设计哲学:为什么是 latent prediction + 两阶段
|
||||||
|
|
||||||
|
JEPA 的基本计算图(沿用自 LeCun 2022 与 I-JEPA / V-JEPA):
|
||||||
|
|
||||||
|
```
|
||||||
|
上下文块 x_ctx ──► 编码器 E_θ ──► z_ctx
|
||||||
|
目标块 x_tgt ──► 目标编码器 E_θ̄(EMA) ──► z_tgt (stop-gradient)
|
||||||
|
预测器 P_φ(z_ctx, mask_tokens) ──► ẑ_tgt
|
||||||
|
损失 L = || ẑ_tgt − z_tgt || (仅在被掩码 patch 上计算)
|
||||||
|
```
|
||||||
|
|
||||||
|
两个关键稳定性设计:
|
||||||
|
|
||||||
|
- **目标编码器用 EMA(指数移动平均)更新**,而非反向传播,避免表示坍塌(representation collapse)。
|
||||||
|
- **stop-gradient** 切断目标分支梯度,防止编码器把所有输入映射到常数这种平凡解。
|
||||||
|
|
||||||
|
V-JEPA 2 在此之上做的最大结构决策是**两阶段解耦**:
|
||||||
|
|
||||||
|
- **阶段一(动作无关预训练)**:在 100 万+ 小时互联网视频上学"世界的动态",得到通用视觉表示 + 一个动作无关的预测器。这一步完全不需要动作标签。
|
||||||
|
- **阶段二(动作条件后训练,V-JEPA 2-AC)**:**冻结**阶段一编码器,只在 <62 小时的无标注机器人视频(Droid)上训练一个**新的、动作条件的预测器**。
|
||||||
|
|
||||||
|
这种解耦的好处:把"昂贵但稀缺"的真机数据只用在很小的预测器上,把"廉价且海量"的网络视频用在大编码器上——这正是它能用极少机器人数据做零样本规划的根因。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 三、阶段一:动作无关自监督预训练
|
||||||
|
|
||||||
|
### 3.1 数据 —— VideoMix22M (VM22M)
|
||||||
|
|
||||||
|
- 规模:**超过 100 万小时**互联网视频 + 约 100 万张图像。
|
||||||
|
- 视频条数从 V-JEPA(一代)的约 200 万条扩大到 **2200 万条**。
|
||||||
|
- 组成:SSv2、Kinetics、HowTo100M、ImageNet,叠加一个经过筛选的 YT-Temporal-1B 子集。
|
||||||
|
- 数据扩量是后面所有性能提升的基础"燃料"。
|
||||||
|
|
||||||
|
### 3.2 输入 tokenization 与 3D-RoPE
|
||||||
|
|
||||||
|
- 视频切成 **tubelet(时空管元)**,尺寸 `2 × 16 × 16`(T × H × W),即每 2 帧 × 16×16 像素打成一个 token。
|
||||||
|
- 位置编码采用 **3D-RoPE(三维旋转位置编码)**:把特征维度近似三等分,分别对应**时间 / 高 / 宽**三个轴,各自施加 1D 旋转。
|
||||||
|
- 动机是**大模型训练稳定性**:论文发现在十亿参数规模下,用 3D-RoPE 取代绝对 sincos 位置编码能显著稳住训练。这是 scaling 到 ViT-g 的关键一招。
|
||||||
|
|
||||||
|
### 3.3 编码器:ViT-g(>1B)
|
||||||
|
|
||||||
|
- 从 V-JEPA 的 **ViT-L(约 300M)** 扩到 **ViT-g(>1B)**。
|
||||||
|
- ViT-g 的隐藏维度 `embed_dim = 1408`(这一点在代码里直接可见,见 §4.3)。
|
||||||
|
- 编码器承担"把视频/图像编码成语义表示"的全部重活。
|
||||||
|
|
||||||
|
### 3.4 预测器:刻意做小
|
||||||
|
|
||||||
|
- 阶段一的预测器是一个**轻量 Transformer**:约 **12 层、宽度 384、约 22M 参数**(ViT-S 量级)。
|
||||||
|
- 设计意图:预测器只负责"在表示空间里补全被掩码区域",不需要很大;把容量集中给编码器。
|
||||||
|
|
||||||
|
### 3.5 掩码策略
|
||||||
|
|
||||||
|
- **Multi-block 时空掩码**:混合短程与长程块,整体**掩码率逼近 90%**。
|
||||||
|
- 空间尺度 0.15–0.7,时间维掩码率 ≈ 1.0(即被选中的空间区域在整段时间上都被遮)。
|
||||||
|
- **损失只在被掩码 patch 的预测上计算**——逼模型真正去"想象"看不见的部分,而不是抄可见区域。
|
||||||
|
|
||||||
|
### 3.6 四支柱 Scaling 策略(论文最实用的工程经验)
|
||||||
|
|
||||||
|
V-JEPA 2 把"如何把 V-JEPA 放大"拆成四条同时发力的轴:
|
||||||
|
|
||||||
|
| 支柱 | 一代 V-JEPA | V-JEPA 2 |
|
||||||
|
|------|------------|----------|
|
||||||
|
| **数据** | ~2M 视频 | ~22M 视频(VM22M,>1M 小时) |
|
||||||
|
| **模型** | ViT-L 300M | ViT-g >1B(+3D-RoPE 稳定) |
|
||||||
|
| **分辨率/时长** | 固定 | **渐进式分辨率**(progressive resolution) |
|
||||||
|
| **训练时长** | 90k 迭代 | **252k 迭代**(warmup-constant-decay) |
|
||||||
|
|
||||||
|
其中**渐进式分辨率训练**最值得单独说:
|
||||||
|
|
||||||
|
- 训练大部分时间跑在**低分辨率、短时长**(16 帧 @256×256)的 warmup/constant 阶段;
|
||||||
|
- 仅在末尾 cooldown 阶段切到**高分辨率、长时长**(64 帧 @384×384)。
|
||||||
|
- 相比全程高分辨率,**最高约 8.4× 加速**,同时几乎不损失(甚至提升)性能。
|
||||||
|
|
||||||
|
综合这四支柱,冻结编码器在 6 个运动/外观分类任务(SSv2、Diving-48、Jester、Kinetics、COIN、ImageNet)上取得 **88.2% 平均准确率**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 四、代码剖析:官方仓库 + HuggingFace 集成
|
||||||
|
|
||||||
|
> 官方仓库:`facebookresearch/vjepa2`("PyTorch code and models for VJEPA2 self-supervised learning from video")。本节路径/类名均来自官方仓库与 HF `transformers` 文档;建议在本地 `git clone` 后对照阅读。
|
||||||
|
|
||||||
|
### 4.1 顶层目录结构
|
||||||
|
|
||||||
|
```
|
||||||
|
vjepa2/
|
||||||
|
├── app/ # 训练 loop(按用途分子目录)
|
||||||
|
│ ├── vjepa/ # V-JEPA 2 预训练
|
||||||
|
│ ├── vjepa_2_1/ # V-JEPA 2.1 预训练(后续版本)
|
||||||
|
│ ├── vjepa_droid/ # 动作条件模型(V-JEPA 2-AC)训练,train.py
|
||||||
|
│ ├── main.py # 本地启动入口
|
||||||
|
│ └── main_distributed.py # SLURM 集群启动入口
|
||||||
|
├── configs/ # 全部实验超参(YAML)
|
||||||
|
│ ├── train/ # 预训练 phase1 + cooldown phase2 + 动作条件
|
||||||
|
│ ├── train_2_1/ # V-JEPA 2.1
|
||||||
|
│ └── eval/ (含 inference/) # 冻结评测 / 仅推理
|
||||||
|
├── evals/ # 基于冻结骨干的 attentive probe 评测
|
||||||
|
│ ├── video_classification_frozen/
|
||||||
|
│ ├── image_classification_frozen/
|
||||||
|
│ ├── action_anticipation_frozen/ # 动作预判 eval.py
|
||||||
|
│ ├── main.py / main_distributed.py
|
||||||
|
├── src/ # 核心包
|
||||||
|
│ ├── datasets/ # 数据集与 data loader
|
||||||
|
│ └── models/ # 模型定义(编码器 + probe)
|
||||||
|
└── notebooks/
|
||||||
|
└── vjepa2_demo.ipynb # 最小可跑 demo
|
||||||
|
```
|
||||||
|
|
||||||
|
设计上职责清晰:`app/` 放训练循环、`evals/` 放探针评测、`src/` 放核心模型、`configs/` 放所有超参。
|
||||||
|
|
||||||
|
### 4.2 编码器入口:`src/models/vision_transformer.py`
|
||||||
|
|
||||||
|
demo 里加载 ViT-g 编码器的关键调用:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from src.models.vision_transformer import vit_giant_xformers_rope
|
||||||
|
# 函数名直接揭示三件事:
|
||||||
|
# giant -> ViT-g(十亿级)
|
||||||
|
# xformers -> 用 xFormers 做高效注意力
|
||||||
|
# rope -> 使用(3D)RoPE 位置编码
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 注意力探针:`src/models/attentive_pooler.py`
|
||||||
|
|
||||||
|
冻结评测不是简单的线性探针,而是一个 **4 层注意力探针(attentive probe)**:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from src.models.attentive_pooler import AttentiveClassifier
|
||||||
|
|
||||||
|
# 以 Something-Something v2 为例(174 类)
|
||||||
|
classifier = AttentiveClassifier(
|
||||||
|
embed_dim=1408, # 对应 ViT-g 的隐藏维度
|
||||||
|
num_heads=16,
|
||||||
|
depth=4, # 4 个 transformer block
|
||||||
|
num_classes=174,
|
||||||
|
).cuda().eval()
|
||||||
|
# 权重从 checkpoint 的 ["classifiers"][0] 取
|
||||||
|
```
|
||||||
|
|
||||||
|
探针结构要点:4 个 transformer block,**最后一个 block 用 cross-attention + 一个可学习 query token** 取代标准 self-attention,把整段视频 token 聚合成分类特征。推理时从一段视频里采多个 clip,logits 跨 clip 取平均。
|
||||||
|
|
||||||
|
### 4.4 训练与评测的运行方式
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 本地预训练(ViT-L 配置示例)
|
||||||
|
python -m app.main \
|
||||||
|
--fname configs/train/vitl16/pretrain-256px-16f.yaml --devices cuda:0
|
||||||
|
|
||||||
|
# SLURM 分布式
|
||||||
|
python -m app.main_distributed \
|
||||||
|
--fname configs/train/vitl16/pretrain-256px-16f.yaml \
|
||||||
|
--time 6000 --account my_account --qos my_qos
|
||||||
|
```
|
||||||
|
|
||||||
|
- **预训练 phase1 与 cooldown phase2 用同一条命令、不同 config**(cooldown / 动作条件的 config 与初始训练放在同一目录)。
|
||||||
|
- 动作条件模型走 `app/vjepa_droid/train.py`,用 teacher-forcing + 自回归 rollout 双目标。
|
||||||
|
- 评测:在冻结骨干上训 attentive probe;官方放出了 SSv2、Diving48 和 EK-100 三个任务的探针 checkpoint(`wget .../vjepa2/evals/ssv2-vitg-384-64x2x3.pt`),可直接跑 `configs/inference/` 做推理。
|
||||||
|
|
||||||
|
### 4.5 HuggingFace `transformers` 集成(最易上手的路径)
|
||||||
|
|
||||||
|
`transformers` 已原生支持 V-JEPA 2(`VJEPA2Model` / `VJEPA2ForVideoClassification` / `VJEPA2Config`)。
|
||||||
|
|
||||||
|
**(a) 抽取视频特征:**
|
||||||
|
|
||||||
|
```python
|
||||||
|
from transformers import AutoVideoProcessor, AutoModel
|
||||||
|
|
||||||
|
hf_repo = "facebook/vjepa2-vitl-fpc64-256" # fpc64 = 64 帧/clip
|
||||||
|
model = AutoModel.from_pretrained(hf_repo)
|
||||||
|
processor = AutoVideoProcessor.from_pretrained(hf_repo)
|
||||||
|
|
||||||
|
# 采 64 帧(要与模型的 fpc 对齐),过 processor,再前向
|
||||||
|
video = processor(frames, return_tensors="pt")
|
||||||
|
with torch.no_grad():
|
||||||
|
embeds = model.get_vision_features(**video)
|
||||||
|
```
|
||||||
|
|
||||||
|
完整前向 `outputs = model(**video)` 会同时给出:
|
||||||
|
- `outputs.last_hidden_state` —— 编码器输出(等价 `get_vision_features()`);
|
||||||
|
- `outputs.predictor_output.last_hidden_state` —— 预测器输出。
|
||||||
|
|
||||||
|
**(b) 视频分类(SSv2 微调版):**
|
||||||
|
|
||||||
|
```python
|
||||||
|
from transformers import AutoVideoProcessor, AutoModelForVideoClassification
|
||||||
|
|
||||||
|
hf_repo = "facebook/vjepa2-vitl-fpc16-256-ssv2"
|
||||||
|
model = AutoModelForVideoClassification.from_pretrained(hf_repo).to("cuda").eval()
|
||||||
|
processor = AutoVideoProcessor.from_pretrained(hf_repo)
|
||||||
|
# 输入 pixel_values_videos: [B, T, C, H, W];分类头 = attentive pooler 上接一个线性层
|
||||||
|
```
|
||||||
|
|
||||||
|
**关键超参 `NUM_FRAMES`**:必须匹配 checkpoint——`fpc64` 用 64 帧,`fpc16` 用 16 帧。单图嵌入则把一帧 `repeat` 成 16/64 帧再喂进去。
|
||||||
|
|
||||||
|
**可用预训练权重**(编码器):`facebook/vjepa2-vitl-fpc64-256`、`-vith-fpc64-256`、`-vitg-fpc64-256`、`-vitg-fpc64-384`;分类微调版:`-vitl-fpc16-256-ssv2`、`-vitg-fpc64-384-ssv2`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 五、理解与预测能力:评测数字
|
||||||
|
|
||||||
|
### 5.1 冻结探针(运动 / 外观理解)
|
||||||
|
|
||||||
|
- **6 任务平均 88.2%**(SSv2 / Diving-48 / Jester / Kinetics / COIN / ImageNet)。
|
||||||
|
- **Something-Something v2:77.3 top-1**(运动理解的硬骨头,强调时序因果而非静态外观)。
|
||||||
|
- 协议:冻结编码器,只训 4 层 attentive probe(§4.3)。
|
||||||
|
|
||||||
|
### 5.2 动作预判(Anticipation)
|
||||||
|
|
||||||
|
- **Epic-Kitchens-100:39.7 recall@5**,超过此前专用模型。这是"预测人接下来要做什么动作"的 SOTA。
|
||||||
|
|
||||||
|
### 5.3 视频问答(对齐 LLM 后)
|
||||||
|
|
||||||
|
把 V-JEPA 2 编码器作为视觉编码器对齐到一个 LLM(8B 规模),在多项 VideoQA 上 SOTA:
|
||||||
|
|
||||||
|
- **PerceptionTest:84.0**
|
||||||
|
- **TempCompass:76.9**
|
||||||
|
- 一个值得注意的发现:即便 V-JEPA 2 预训练时**没有任何语言监督**,对齐后的 VideoQA 表现依然很强——说明纯视频自监督学到的表示对语言对齐是友好的。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 六、阶段二:V-JEPA 2-AC 动作条件世界模型
|
||||||
|
|
||||||
|
### 6.1 架构与"块因果"注意力
|
||||||
|
|
||||||
|
- 一个 **约 300M 参数** 的 Transformer 预测器 `P_φ`:**24 层、16 头、隐藏 1024、GELU**。
|
||||||
|
- 训练时**冻结**阶段一的 ViT-g 编码器,只学这个新预测器。
|
||||||
|
- 核心机制 **block-causal attention(块因果注意力)**:在某个时间步上,每个 patch 特征可以注意到——**同一时间步的动作、末端执行器状态(end-effector state)、其他 patch**,以及**所有更早时间步**的对应内容;但不能看未来。由此自回归地预测"下一帧的表示"。
|
||||||
|
- 位置编码:视频 patch 用 3D-RoPE,动作与位姿用**时间维 RoPE**,再叠加块因果掩码刻画时间上的因果依赖。
|
||||||
|
|
||||||
|
### 6.2 训练数据与目标
|
||||||
|
|
||||||
|
- 数据:**Droid** 数据集的无标注机器人视频,**< 62 小时 / 约 23k 条轨迹**(含成功与失败,来自遥操作的 Franka Emika Panda)。
|
||||||
|
- 目标:**teacher-forcing 损失**(预测下一帧表示)+ **rollout 损失**(多步自回归预测)联合优化。后者是让模型在"想象多步未来"时不漂移的关键。
|
||||||
|
|
||||||
|
### 6.3 规划:MPC + 交叉熵法(CEM)
|
||||||
|
|
||||||
|
V-JEPA 2-AC **不学固定策略**,而是把预测器当世界模型,在**模型预测控制(MPC)**回路里在线优化动作:
|
||||||
|
|
||||||
|
```
|
||||||
|
给定当前观测 x_k 与目标图像 x_g:
|
||||||
|
1. 编码:x_k, x_g ──► 表示空间
|
||||||
|
2. 对候选动作序列 a_{k:k+T},用预测器想象未来状态 ẑ
|
||||||
|
3. 能量函数 E = || ẑ_future − z_goal ||_1 (latent 空间 L1 距离)
|
||||||
|
4. 用交叉熵法(CEM)采样-评估-更新,找使 E 最小的动作序列
|
||||||
|
5. 只执行第一个动作,然后重新规划(receding horizon,滚动时域)
|
||||||
|
```
|
||||||
|
|
||||||
|
实现细节:
|
||||||
|
- **能量 = 想象未来表示与目标表示在 latent 空间的 L1 距离**(goal-conditioned energy function)。论文报告该能量地形**平滑且局部凸**,因此 CEM 能高效收敛。
|
||||||
|
- 动作被约束在 **L1 球、半径 0.075** 内(约对应末端执行器单步位移 ≤ 13 cm),因为大动作对模型而言偏离分布。
|
||||||
|
- 多阶段任务(pick-and-place)用**多子目标**:先对"抓住"子目标优化 4 步 → 切到"举起"子目标 10 步 → 最后"放置"子目标 4 步。
|
||||||
|
|
||||||
|
### 6.4 机器人实验结果(零样本、跨实验室)
|
||||||
|
|
||||||
|
部署条件极具挑战:同一套权重与推理代码,部署到**两个不同实验室**、**Droid 里没出现过**的 Franka + RobotiQ 夹爪,仅靠一个**未标定的低分辨率单目 RGB 相机**,**无奖励、无任务特定数据**。
|
||||||
|
|
||||||
|
| 任务 | V-JEPA 2-AC | 对比基线 |
|
||||||
|
|------|-------------|----------|
|
||||||
|
| Reach(到达目标位姿,无物体) | **100%** | Cosmos: 80% |
|
||||||
|
| Grasp(抓杯/盒) | 65%(杯)/ 25%(盒),均值 65% | Octo: 15%;Cosmos: 0–30% |
|
||||||
|
| Reach w/ Object(持物到位) | 75%(杯)/ 75%(盒) | — |
|
||||||
|
| Pick-and-Place(取放,多阶段) | 80%(杯)/ 65%(盒) | — |
|
||||||
|
| **单步规划耗时** | **~16 秒/动作** | Cosmos: ~4 分钟/动作 |
|
||||||
|
|
||||||
|
- 单目标到达可把位置误差**稳定压到 4 cm 以内**。
|
||||||
|
- 两个对比基线都被"降维打击":**Octo**(行为克隆 VLA,且在 100 万+ 轨迹的 Open-X 上预训练、又在整个 Droid 上微调,数据量远超 V-JEPA 2-AC)物体交互均值仅 ~15%;**Cosmos**(扩散式视频生成世界模型,用同样的能量规划框架)reach 还行(80%)但物体交互很弱,且**单步规划要 4 分钟**——一次完整取放要超过 1 小时机器人执行时间。
|
||||||
|
- 核心结论:**把"学观测"与"学动作条件"解耦**,让大编码器吃海量被动视频、小预测器吃少量真机数据,就能换来零样本可迁移的规划能力。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 七、局限与后续方向
|
||||||
|
|
||||||
|
论文与社区讨论中提到的主要局限:
|
||||||
|
|
||||||
|
- **目标图像依赖**:规划需要"目标图像"来定义能量,长程或语言指定的目标还不够自然(后续 TC-JEPA 这类文本条件方向正是补这一块)。
|
||||||
|
- **相机/视角敏感**:对相机位置较敏感,长时域规划仍可能漂移。
|
||||||
|
- **空间任务为主**:当前机器人评测集中在桌面抓取/取放等准静态任务。
|
||||||
|
|
||||||
|
后续演进(仅作指路,细节以各自原始来源为准):
|
||||||
|
|
||||||
|
- **V-JEPA 2.1**:官方仓库已含 `app/vjepa_2_1/` 与 `configs/train_2_1/`,社区报道其主打"解锁稠密特征(dense features)",是 V-JEPA 2 的升级版。
|
||||||
|
- **JEPA 世界模型规划研究**:`facebookresearch/jepa-wms`("What drives success in physical planning with JEPA World Models?")。
|
||||||
|
- **物理推理新基准**:Meta 随 V-JEPA 2 发布了 IntPhys 2 / MVPBench / CausalVQA 等物理常识评测,用于衡量世界模型的"直觉物理"。
|
||||||
|
|
||||||
|
> 上述 2026 年的后续工作请以各自论文/仓库的一手来源核实再引用,本文不对其细节数字背书。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 八、与本项目(world model / 具身智能)的对接
|
||||||
|
|
||||||
|
结合 [JEPA 系列综述](index.md) 中已记录的关联,V-JEPA 2 对你正在做的方向有几处直接可借鉴:
|
||||||
|
|
||||||
|
1. **两阶段解耦的工程范式**:大编码器吃海量被动数据、小预测器吃少量交互数据——这套"廉价感知 + 稀缺动作"的配比,对任何"先建感知再加控制"的具身系统都成立。
|
||||||
|
2. **latent 能量规划(MPC + CEM)**:用"想象未来表示与目标表示的 L1 距离"作能量、滚动时域优化动作,是一个**不需要奖励、不需要策略网络**的轻量规划骨架,适合作为 imagination-based planning 的基线实现。
|
||||||
|
3. **渐进式分辨率训练**:若你也要 scaling 视频/多感官编码器,这条 8.4× 提速的 recipe 很值钱。
|
||||||
|
4. **冻结骨干 + 注意力探针**:作为下游任务(分类/检索/对齐 LLM)的标准评测协议,便于公平比较表征质量。
|
||||||
|
|
||||||
|
> 提示:要做"语言指定目标"的规划,V-JEPA 2 原生的"目标图像"接口需要替换为文本条件能量——这正是文本条件 JEPA 路线要解决的缺口。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 九、参考与资源
|
||||||
|
|
||||||
|
**论文 / 官方**
|
||||||
|
- V-JEPA 2 论文:arXiv:2506.09985("Self-Supervised Video Models Enable Understanding, Prediction and Planning",FAIR @ Meta + Mila)
|
||||||
|
- Meta 官方介绍:ai.meta.com/research/vjepa/ 与 ai.meta.com/blog/v-jepa-2-world-model-benchmarks/
|
||||||
|
- 官方代码:github.com/facebookresearch/vjepa2(demo: `notebooks/vjepa2_demo.ipynb`)
|
||||||
|
- HuggingFace 文档:huggingface.co/docs/transformers/en/model_doc/vjepa2
|
||||||
|
- 权重:huggingface.co/facebook(vjepa2-vit{l,h,g}-fpc64-* 及 ssv2 微调版)
|
||||||
|
|
||||||
|
**关键数字速查**
|
||||||
|
- 编码器 ViT-g >1B(隐藏维 1408);预训练预测器 ~22M(12 层/384);AC 预测器 ~300M(24 层/16 头/1024)
|
||||||
|
- tubelet 2×16×16;3D-RoPE;掩码率 ~90%;训练 90k→252k 迭代;渐进分辨率 8.4× 提速
|
||||||
|
- 数据:VM22M(22M 视频,>1M 小时)+ 1M 图像;AC 数据 Droid <62h / ~23k 轨迹
|
||||||
|
- SSv2 77.3;EK-100 39.7 R@5;6 任务均值 88.2%;PerceptionTest 84.0;TempCompass 76.9
|
||||||
|
- 机器人:Reach 100% / Grasp 65% / Pick-place 80%(杯);16 s/动作 vs Cosmos 4 min/动作
|
||||||
@@ -0,0 +1,542 @@
|
|||||||
|
---
|
||||||
|
title: "V-JEPA 2 源码逐模块剖析(代码篇)"
|
||||||
|
date: 2026-05-24
|
||||||
|
draft: false
|
||||||
|
tags: ["V-JEPA 2", "JEPA", "源码", "code-walkthrough", "self-supervised", "RoPE", "masking", "world-model", "robotics"]
|
||||||
|
categories: ["JEPA"]
|
||||||
|
description: "基于 facebookresearch/vjepa2 本地源码的逐模块剖析:multi-block tube 掩码采样、编码器(3D-RoPE/apply_masks)、动作无关预测器、V-JEPA 2-AC 块因果预测器,以及自监督训练全链路闭环。是《V-JEPA 2 深度技术剖析》的代码篇配套。"
|
||||||
|
---
|
||||||
|
|
||||||
|
> 本文是 [《V-JEPA 2 深度技术剖析》](V-JEPA2深度技术剖析.md) 的**代码篇配套**,全部基于本地 clone 的官方仓库 `facebookresearch/vjepa2`(MIT License)逐行阅读整理。行号与文件路径以仓库 `main` 分支为准,升级版本可能略有变动。
|
||||||
|
>
|
||||||
|
> 阅读主线(数据流顺序):**掩码采样 → 编码器 → 动作无关预测器 → AC 预测器 → 训练闭环**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 〇、文件地图与真实配置速查
|
||||||
|
|
||||||
|
| 模块 | 文件 | 关键类/函数 |
|
||||||
|
|------|------|-------------|
|
||||||
|
| 掩码采样 | `src/masks/multiseq_multiblock3d.py` | `MaskCollator` / `_MaskGenerator` |
|
||||||
|
| 取 token 工具 | `src/masks/utils.py` | `apply_masks` |
|
||||||
|
| 编码器 | `src/models/vision_transformer.py` | `VisionTransformer` / `vit_giant_xformers_rope` |
|
||||||
|
| tubelet 切分 | `src/models/utils/patch_embed.py` | `PatchEmbed3D` |
|
||||||
|
| 注意力 / RoPE | `src/models/utils/modules.py` | `RoPEAttention` / `ACRoPEAttention` / `rotate_queries_or_keys` / `build_action_block_causal_attention_mask` |
|
||||||
|
| 动作无关预测器 | `src/models/predictor.py` | `VisionTransformerPredictor` |
|
||||||
|
| AC 预测器 | `src/models/ac_predictor.py` | `VisionTransformerPredictorAC` |
|
||||||
|
| 预训练循环 | `app/vjepa/train.py` | `train_step` / `forward_context` / `forward_target` / `loss_fn` |
|
||||||
|
| AC 训练循环 | `app/vjepa_droid/train.py` | teacher-forcing + rollout |
|
||||||
|
| AC 推理/规划桥接 | `notebooks/utils/world_model_wrapper.py` | `WorldModel`(encode / infer_next_action) |
|
||||||
|
| CEM + 能量函数 | `notebooks/utils/mpc_utils.py` | `cem` / `l1` / `compute_new_pose` |
|
||||||
|
|
||||||
|
**编码器 ViT-g**(`vit_giant_xformers_rope`):`embed_dim=1408, depth=40, num_heads=22, mlp_ratio=48/11, use_rope=True`。
|
||||||
|
|
||||||
|
**动作无关预测器**(`pretrain-256px-16f.yaml`):`pred_embed_dim=384, pred_depth=12, pred_num_heads=12, use_mask_tokens=True`(≈22M,刻意做小)。
|
||||||
|
|
||||||
|
**AC 预测器**(`configs/train/vitg16/droid-256px-8f.yaml`):`pred_embed_dim=1024, pred_depth=24, pred_num_heads=16, pred_is_frame_causal=True, use_extrinsics=False, use_rope=True`(≈300M);`context_encoder_key=target_encoder`(直接拿 EMA target encoder 当冻结编码器)。
|
||||||
|
|
||||||
|
**掩码**(`pretrain-256px-16f.yaml`,两套并行):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
mask:
|
||||||
|
- num_blocks: 8 # 短程:8 个小块
|
||||||
|
spatial_scale: [0.15, 0.15] # 每块覆盖 15% 空间
|
||||||
|
temporal_scale: [1.0, 1.0] # 时间贯穿整段(tube)
|
||||||
|
aspect_ratio: [0.75, 1.5]
|
||||||
|
- num_blocks: 2 # 长程:2 个大块
|
||||||
|
spatial_scale: [0.7, 0.7]
|
||||||
|
temporal_scale: [1.0, 1.0]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 一、掩码采样:`multiseq_multiblock3d.py`
|
||||||
|
|
||||||
|
整条 JEPA 管线的起点。`masks_enc`(上下文下标)/ `masks_pred`(目标下标)都在这里生产。
|
||||||
|
|
||||||
|
### 1.1 两层结构:调度 vs 采样
|
||||||
|
|
||||||
|
`MaskCollator` 是 DataLoader 的 `collate_fn`,本身不采样,只负责调度:按 frames-per-clip(fpc) 分桶(不同帧数 token 网格大小不同,不能混),再对每套掩码配置各调一次生成器:
|
||||||
|
|
||||||
|
```python
|
||||||
|
for i, mask_generator in enumerate(self.mask_generators[fpc]):
|
||||||
|
masks_enc, masks_pred = mask_generator(batch_size)
|
||||||
|
collated_masks_enc.append(masks_enc)
|
||||||
|
collated_masks_pred.append(masks_pred)
|
||||||
|
```
|
||||||
|
|
||||||
|
所以 `masks_enc` / `masks_pred` 是 **list**(每套配置一项)——这解释了编码器里 `for m in masks:` 和 `torch.cat(masks, dim=0)` 为什么要遍历。
|
||||||
|
|
||||||
|
### 1.2 种子心机:块"大小"同步,块"位置"随机
|
||||||
|
|
||||||
|
```python
|
||||||
|
seed = self.step() # 跨 worker 共享计数器
|
||||||
|
g = torch.Generator(); g.manual_seed(seed)
|
||||||
|
p_size = self._sample_block_size(generator=g, ...) # 用种子 → 块大小确定
|
||||||
|
```
|
||||||
|
|
||||||
|
块**尺寸 (t,h,w) 用种子采样**,保证所有数据并行 worker/GPU 采到相同大小(token 序列等长,可凑规整 batch);块**位置**用不带种子的 `torch.randint`,每个样本各自随机。同步大小 + 随机位置 = 既能 batch 又有多样性。
|
||||||
|
|
||||||
|
### 1.3 一个块怎么采
|
||||||
|
|
||||||
|
定大小(scale + 长宽比反解):
|
||||||
|
|
||||||
|
```python
|
||||||
|
t = max(1, int(self.duration * temporal_mask_scale)) # temporal_scale=1.0 → t=duration(贯穿全部帧)
|
||||||
|
spatial_num_keep = int(self.height * self.width * spatial_mask_scale)
|
||||||
|
h = round(sqrt(spatial_num_keep * aspect_ratio))
|
||||||
|
w = round(sqrt(spatial_num_keep / aspect_ratio))
|
||||||
|
```
|
||||||
|
|
||||||
|
`temporal_scale=1.0` ⇒ `t=duration`,块在时间上**贯穿整段** = 一根"时空管(tube)"。这是要点:把同一空间位置在所有帧上一起遮掉,**模型无法靠抄相邻帧作弊,只能真正学运动**。
|
||||||
|
|
||||||
|
定位置并标 0(`0=待预测,1=上下文`):
|
||||||
|
|
||||||
|
```python
|
||||||
|
mask = torch.ones((duration, height, width))
|
||||||
|
mask[start:start+t, top:top+h, left:left+w] = 0
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.4 多块取并集,切出两组下标
|
||||||
|
|
||||||
|
```python
|
||||||
|
mask_e = torch.ones((duration, height, width))
|
||||||
|
for _ in range(self.npred): # npred = num_blocks,如 8
|
||||||
|
mask_e *= self._sample_block_mask(p_size) # 连乘 = 并集
|
||||||
|
mask_e = mask_e.flatten()
|
||||||
|
|
||||||
|
mask_p = torch.argwhere(mask_e == 0).squeeze() # 目标(被遮)下标
|
||||||
|
mask_e = torch.nonzero(mask_e).squeeze() # 上下文(保留)下标
|
||||||
|
```
|
||||||
|
|
||||||
|
`mask_e *= block` 连乘是精髓:patch 只有**落在所有块之外**才保持 1,落进任意块就被乘成 0。`npred` 个块取**并集**,两套配置(8×15% + 2×70%)叠加后被遮区逼近 ~90%。`argwhere(==0)` 出目标下标、`nonzero` 出上下文下标,二者是同一 token 网格上互补的索引集合。
|
||||||
|
|
||||||
|
`empty_context` while 守卫:若某次把所有 patch 都遮了就重采,保证编码器有输入。
|
||||||
|
|
||||||
|
### 1.5 截断到 min_keep(为了 stack)
|
||||||
|
|
||||||
|
每样本被遮数不同 → 下标长度不齐 → 没法堆张量。于是全 batch 取最短并截断:
|
||||||
|
|
||||||
|
```python
|
||||||
|
collated_masks_enc = [cm[:min_keep_enc] for cm in collated_masks_enc]
|
||||||
|
collated_masks_pred = [cm[:min_keep_pred] for cm in collated_masks_pred]
|
||||||
|
collated_masks_enc = torch.utils.data.default_collate(collated_masks_enc)
|
||||||
|
```
|
||||||
|
|
||||||
|
这就是 `apply_masks` 拿到的 `masks` 为规整 `[B, K]` 张量的原因。
|
||||||
|
|
||||||
|
### 1.6 几个开关
|
||||||
|
|
||||||
|
- `full_complement`:预测掩码 = 编码掩码的精确补集(集合差)。
|
||||||
|
- `pred_full_complement`:反向,编码掩码 = 预测掩码补集。
|
||||||
|
- `inv_block`:交换返回 `return masks_pred, masks_enc`(用块预测上下文的反向任务)。默认 `return masks_enc, masks_pred`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 二、取 token 工具:`apply_masks`(`src/masks/utils.py`)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def apply_masks(x, masks, concat=True):
|
||||||
|
# x: [B, N, D]; masks: list of [B, K] 下标
|
||||||
|
all_x = []
|
||||||
|
for m in masks:
|
||||||
|
mask_keep = m.unsqueeze(-1).repeat(1, 1, x.size(-1)) # [B, K, D]
|
||||||
|
all_x += [torch.gather(x, dim=1, index=mask_keep)] # 按下标取 token
|
||||||
|
return torch.cat(all_x, dim=0)
|
||||||
|
```
|
||||||
|
|
||||||
|
核心是 `torch.gather`:沿 token 维按下标取出需要的 token。多块掩码沿 batch 维(dim=0)堆叠,相当于把一个样本的多种掩码当成更大 batch 一起算。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 三、编码器:`VisionTransformer.forward`(`vision_transformer.py:161`)
|
||||||
|
|
||||||
|
> 关键认知:代码里**没有"裁一块图"**。整段视频先切成全部 token,再用下标 `gather` 出上下文 token。被遮 token 不是置零,而是**直接删除、不参与计算**。
|
||||||
|
|
||||||
|
```python
|
||||||
|
def forward(self, x, masks=None):
|
||||||
|
# (a) 切 token:3D 卷积;use_rope 时不加绝对位置
|
||||||
|
if not self.use_rope:
|
||||||
|
pos_embed = self.interpolate_pos_encoding(x, self.pos_embed)
|
||||||
|
x = self.patch_embed(x); x += pos_embed
|
||||||
|
else:
|
||||||
|
x = self.patch_embed(x) # ViT-g 走这条
|
||||||
|
|
||||||
|
# (b) 挑出上下文 token
|
||||||
|
if masks is not None:
|
||||||
|
x = apply_masks(x, masks) # 丢掉被遮 token
|
||||||
|
masks = torch.cat(masks, dim=0) # 下标继续往下传(给 RoPE 还原位置)
|
||||||
|
|
||||||
|
# (c) Transformer 编码
|
||||||
|
for blk in self.blocks:
|
||||||
|
x = blk(x, mask=masks, attn_mask=None, T=T, H_patches=H_patches, W_patches=W_patches)
|
||||||
|
x = self.norm(x)
|
||||||
|
return x
|
||||||
|
```
|
||||||
|
|
||||||
|
`apply_masks` 在 tokenize 之后、进 Transformer 之前 → ~90% token 在进注意力前就丢了,这是高掩码率下省算力的根因。
|
||||||
|
|
||||||
|
### 3.1 tubelet 切分:`PatchEmbed3D`
|
||||||
|
|
||||||
|
```python
|
||||||
|
self.proj = nn.Conv3d(
|
||||||
|
in_channels=3, out_channels=embed_dim,
|
||||||
|
kernel_size=(tubelet_size, patch_size, patch_size), # (2, 16, 16)
|
||||||
|
stride=(tubelet_size, patch_size, patch_size), # 不重叠
|
||||||
|
)
|
||||||
|
def forward(self, x): # x: [B, C, T, H, W]
|
||||||
|
return self.proj(x).flatten(2).transpose(1, 2) # -> [B, N, embed_dim]
|
||||||
|
```
|
||||||
|
|
||||||
|
一个 `2×16×16` 时空管元 → 一个向量。
|
||||||
|
|
||||||
|
### 3.2 删了 token,位置靠"下标"续命:`RoPEAttention`(`modules.py:266`)
|
||||||
|
|
||||||
|
token 被删一大半、顺序也乱,模型怎么知道每个上下文块原来的位置?答案在传下来的下标:
|
||||||
|
|
||||||
|
```python
|
||||||
|
if mask is not None:
|
||||||
|
mask = mask.unsqueeze(1).repeat(1, self.num_heads, 1)
|
||||||
|
d_mask, h_mask, w_mask = self.separate_positions(mask, H_patches, W_patches)
|
||||||
|
```
|
||||||
|
|
||||||
|
`separate_positions` 把一维下标反解成 (帧, 高, 宽) 三个坐标:
|
||||||
|
|
||||||
|
```python
|
||||||
|
frame_ids = ids // tokens_per_frame
|
||||||
|
height_ids = (ids - 帧分量) // tokens_per_row
|
||||||
|
width_ids = ids - 帧分量 - 高分量
|
||||||
|
```
|
||||||
|
|
||||||
|
再把每个 head 的特征维三等分,按 t/h/w 各自旋转:
|
||||||
|
|
||||||
|
```python
|
||||||
|
qd = rotate_queries_or_keys(q[..., s:s+self.d_dim], pos=d_mask) # 时间
|
||||||
|
qh = rotate_queries_or_keys(q[..., s:s+self.h_dim], pos=h_mask) # 高
|
||||||
|
qw = rotate_queries_or_keys(q[..., s:s+self.w_dim], pos=w_mask) # 宽
|
||||||
|
q = torch.cat([qd, qh, qw, qr], dim=-1) # qr 是不旋转的余数维
|
||||||
|
```
|
||||||
|
|
||||||
|
**要点:位置不靠 token 在序列里的顺序,而靠它的原始下标算出来**——所以哪怕 token 删得七零八落,每个块仍带着真实 (t,h,w)。
|
||||||
|
|
||||||
|
### 3.3 RoPE 旋转真身 + 一个官方标注的 bug:`rotate_queries_or_keys`(`modules.py:26`)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def rotate_queries_or_keys(x, pos):
|
||||||
|
B, num_heads, N, D = x.size()
|
||||||
|
omega = torch.arange(D // 2) / (D / 2.0)
|
||||||
|
omega = 1.0 / 10000**omega # 角速度 ω_i
|
||||||
|
freq = torch.einsum("..., f -> ... f", pos, omega) # 角度 = 位置 × ω
|
||||||
|
emb_sin, emb_cos = freq.sin(), freq.cos()
|
||||||
|
|
||||||
|
# ↓↓↓ 官方注释:这里有个 subtle bug,频率在配对维上被错误复制
|
||||||
|
emb_sin = emb_sin.squeeze(-1).repeat(1, 1, 1, 2) # 实际用的(有 bug)
|
||||||
|
emb_cos = emb_cos.squeeze(-1).repeat(1, 1, 1, 2)
|
||||||
|
# emb_sin = emb_sin.repeat_interleave(2, dim=-1) # 正确写法(被注释掉)
|
||||||
|
# emb_cos = emb_cos.repeat_interleave(2, dim=-1)
|
||||||
|
|
||||||
|
y = x.unflatten(-1, (-1, 2))
|
||||||
|
y1, y2 = y.unbind(dim=-1)
|
||||||
|
y = torch.stack((-y2, y1), dim=-1).flatten(-2) # (y1,y2)->(-y2,y1)
|
||||||
|
return (x * emb_cos) + (y * emb_sin)
|
||||||
|
```
|
||||||
|
|
||||||
|
RoPE 思想:不是"加"位置向量,而是按位置把特征在每个二维平面里**旋转一个角度**;两 token 点积时旋转角之差只取决于**相对位置** → 天然编码相对距离、可外推到没见过的分辨率/长度(这正是论文用 3D-RoPE 稳住大模型 + 支持渐进分辨率的底层依据)。
|
||||||
|
|
||||||
|
**那个 bug 的工程教训**:标准 RoPE 频率应与相邻配对 `(y1,y2)` 用 `repeat_interleave(2)`(`[a,b,c]→[a,a,b,b,c,c]`)对齐;代码用了 `repeat(...,2)`(`[a,b,c]→[a,b,c,a,b,c]`),频率与配对维错位。官方明说:发布的预训练权重就是在这个"错"的实现上训出来的,**改对反而和 checkpoint 不兼容**,故保留原样、正确版注释旁边。加载官方权重做下游必须沿用 bug 版;只有从头自训才该切正确版。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 四、动作无关预测器:`VisionTransformerPredictor.forward`(`predictor.py:174`)
|
||||||
|
|
||||||
|
任务:拿编码器给的上下文表示 `z_ctx`,在**目标位置**把表示补出来。
|
||||||
|
|
||||||
|
```python
|
||||||
|
def forward(self, x, masks_x, masks_y, ...):
|
||||||
|
# x: 上下文表示(z_ctx);masks_x: 上下文下标;masks_y: 目标下标
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.1 先降维("预测器很轻"的代码证据)
|
||||||
|
|
||||||
|
```python
|
||||||
|
x = self.predictor_embed(x) # Linear: 1408 -> 384
|
||||||
|
```
|
||||||
|
|
||||||
|
进门就压到 384 维,整个预测器在窄空间算,算完再投影回去。
|
||||||
|
|
||||||
|
### 4.2 给目标位置造可学习占位符
|
||||||
|
|
||||||
|
```python
|
||||||
|
pred_tokens = self.mask_tokens[mask_index] # 一个可学习 [MASK] 向量
|
||||||
|
pred_tokens = pred_tokens.repeat(B, self.num_patches, 1)
|
||||||
|
pred_tokens = apply_masks(pred_tokens, masks_y) # 只在目标位置放占位符
|
||||||
|
```
|
||||||
|
|
||||||
|
目标位置**不喂内容**(内容正是要预测的),只放一个所有目标位置共享的可学习 mask token,信息全靠位置编码注入。
|
||||||
|
|
||||||
|
### 4.3 拼接 + 排序
|
||||||
|
|
||||||
|
```python
|
||||||
|
x = torch.cat([x, pred_tokens], dim=1) # [上下文表示 | 目标占位符]
|
||||||
|
masks = torch.cat([masks_x, masks_y], dim=1) # 每个 token 的原始下标
|
||||||
|
argsort = torch.argsort(masks, dim=1) # 按原始位置排序
|
||||||
|
x = ...[argsort]; masks = ...[argsort]
|
||||||
|
```
|
||||||
|
|
||||||
|
拼起来的序列空间上是乱的,按原始下标排序恢复成 (t,h,w) 顺序,再把 `masks` 传进 `blk(x, mask=masks)` 让 RoPE 还原坐标。
|
||||||
|
|
||||||
|
### 4.4 过 Transformer,抠回目标、升回维
|
||||||
|
|
||||||
|
```python
|
||||||
|
for blk in self.predictor_blocks:
|
||||||
|
x = blk(x, mask=masks, attn_mask=None)
|
||||||
|
x = self.predictor_norm(x)
|
||||||
|
reverse_argsort = torch.argsort(argsort, dim=1)
|
||||||
|
x = ...[reverse_argsort]; x = x[:, N_ctxt:] # 复原排序,只取目标位置
|
||||||
|
x = self.predictor_proj(x) # Linear: 384 -> 1408
|
||||||
|
return x # ẑ_tgt
|
||||||
|
```
|
||||||
|
|
||||||
|
整条链路 **1408 → 压到 384 算 → 升回 1408** 就是"轻量预测器"的全部秘密。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 五、AC 预测器:`VisionTransformerPredictorAC`(`ac_predictor.py`)
|
||||||
|
|
||||||
|
把"被遮 patch"换成"未来帧","mask token"换成"动作/状态 token + 块因果掩码",复用同一套 latent 预测骨架做规划。
|
||||||
|
|
||||||
|
### 5.1 四个编码器:把"看的"和"做的"统一进 1024 维
|
||||||
|
|
||||||
|
```python
|
||||||
|
self.predictor_embed = nn.Linear(embed_dim, 1024) # 1408 -> 1024(图像 patch)
|
||||||
|
self.action_encoder = nn.Linear(action_embed_dim, 1024) # 7 -> 1024(动作)
|
||||||
|
self.state_encoder = nn.Linear(action_embed_dim, 1024) # 7 -> 1024(末端位姿/本体感知)
|
||||||
|
self.extrinsics_encoder = nn.Linear(action_embed_dim-1, 1024) # 6 -> 1024(相机外参,droid 关闭)
|
||||||
|
```
|
||||||
|
|
||||||
|
`action_embed_dim=7`:Franka 动作/状态正好 7 维(末端 6-DoF 位姿增量 + 1 维夹爪)。动作/位姿各过一个线性层变成与 patch 同维的 token——这是"注入"的第一层含义。
|
||||||
|
|
||||||
|
### 5.2 注入方式:把动作/状态插进每帧开头
|
||||||
|
|
||||||
|
```python
|
||||||
|
s = self.state_encoder(states).unsqueeze(2) # [B, T, 1, D]
|
||||||
|
a = self.action_encoder(actions).unsqueeze(2) # [B, T, 1, D]
|
||||||
|
x = x.view(B, T, H*W, D)
|
||||||
|
x = torch.cat([a, s, x], dim=2).flatten(1, 2) # [B, T*(H*W+2), D]
|
||||||
|
```
|
||||||
|
|
||||||
|
序列按帧分块:`[ a₁ s₁ p₁... | a₂ s₂ p₂... | ... ]`。`cond_tokens=2`(开 extrinsics 则 3)。这对应论文"每个 patch 能注意到同一时间步的动作、末端状态和其他 patch"。
|
||||||
|
|
||||||
|
### 5.3 块因果掩码:`build_action_block_causal_attention_mask`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def build_action_block_causal_attention_mask(T, H, W, add_tokens=1):
|
||||||
|
N_T = add_tokens + (H * W) # 每帧 block 的 token 数
|
||||||
|
mask = torch.zeros(T*N_T, T*N_T).bool()
|
||||||
|
mask_block = torch.ones(N_T, N_T).bool() # 帧内:全连接
|
||||||
|
local_window_time = T # 看全部历史
|
||||||
|
for t1 in range(T):
|
||||||
|
for t2 in range(max(0, t1 - local_window_time + 1), t1 + 1): # t2 <= t1
|
||||||
|
mask[t1*N_T:(t1+1)*N_T, t2*N_T:(t2+1)*N_T] = mask_block
|
||||||
|
return mask
|
||||||
|
```
|
||||||
|
|
||||||
|
- `mask_block=ones`:**帧内部全连接**(同一时刻动作/状态/所有 patch 互看)。
|
||||||
|
- `t2` 只到 `t1`:**只能 attend 过去帧,禁看未来**。
|
||||||
|
- 即"**块**因果":帧粒度因果、块内全连接(不希望同帧后一个 patch 看不到前一个,只希望整帧看不到下一帧)。
|
||||||
|
- 布尔约定:直接喂 `F.scaled_dot_product_attention(attn_mask=mask)`,`True=允许 attend`。
|
||||||
|
|
||||||
|
**`is_causal` 怎么生效**:真正的因果性靠这个**显式 attn_mask** 实现,**不是** SDPA 的 `is_causal` flag(那是逐 token 下三角,对块结构是错的)。config 的 `pred_is_frame_causal: true` 控制的是"造不造并用这个块因果矩阵"(构造函数里 `if self.is_frame_causal: attn_mask = build_...`),而非把 SDPA 的 `is_causal` 设 True。
|
||||||
|
|
||||||
|
### 5.4 动作 token 与 patch 的 RoPE 不同(`ACRoPEAttention`)
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 动作/状态 token:只在时间维(depth)旋转,位置=帧号
|
||||||
|
qd = rotate_queries_or_keys(q[..., :self.d_dim], pos=torch.arange(T))
|
||||||
|
qr = q[..., self.d_dim:] # 其余维不旋转
|
||||||
|
```
|
||||||
|
|
||||||
|
patch token 走完整 3D-RoPE。对应论文"动作和位姿用时间维 rotary,视频 patch 用 3D-RoPE"——动作没有空间行列,只有"第几帧"。另有分辨率归一化:`h_mask *= grid_size/H; w_mask *= grid_size/W`(换分辨率时位置编码一致)。
|
||||||
|
|
||||||
|
### 5.5 出口:只要 patch 预测
|
||||||
|
|
||||||
|
```python
|
||||||
|
x = x.view(B, T, cond_tokens + H*W, D)
|
||||||
|
x = x[:, :, cond_tokens:, :].flatten(1, 2) # 丢掉动作/状态 token
|
||||||
|
x = self.predictor_norm(x)
|
||||||
|
x = self.predictor_proj(x) # 1024 -> 1408
|
||||||
|
return x
|
||||||
|
```
|
||||||
|
|
||||||
|
动作/状态只是条件输入、不需预测;输出只取 patch、投影回 1408,得到"给定历史帧 + 当前动作,下一帧每个 patch 的预测表示"。
|
||||||
|
|
||||||
|
> 注:`ac_predictor.py` 里 `from src.models.utils.modules import ACBlock as Block`,块内部用的是 `ACBlock`(其 `forward` 接收 `action_tokens` 参数)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 六、预训练训练循环:`app/vjepa/train.py:424`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def forward_target(c):
|
||||||
|
with torch.no_grad(): # stop-grad
|
||||||
|
h = target_encoder(c) # 喂【完整视频】,不传 masks
|
||||||
|
h = [F.layer_norm(hi, (hi.size(-1),)) for hi in h]
|
||||||
|
return h
|
||||||
|
|
||||||
|
def forward_context(c):
|
||||||
|
z = encoder(c, masks_enc) # 只看上下文 → z_ctx
|
||||||
|
z = predictor(z, masks_enc, masks_pred) # 补目标位置 → ẑ_tgt
|
||||||
|
return z
|
||||||
|
|
||||||
|
def loss_fn(z, h):
|
||||||
|
h = [apply_masks(hi, mi, concat=False) for hi, mi in zip(h, masks_pred)] # 此处才取目标块
|
||||||
|
loss = torch.mean(torch.abs(zij - hij) ** loss_exp) / loss_exp # loss_exp=1 → L1
|
||||||
|
```
|
||||||
|
|
||||||
|
两条编码路径的对比是关键:
|
||||||
|
|
||||||
|
- **上下文分支**:`encoder(c, masks_enc)` —— 只看上下文、可训练。
|
||||||
|
- **目标分支**:`target_encoder(c)` —— 看完整视频、是 encoder 的 **EMA 副本**、`no_grad`;直到 `loss_fn` 才用 `masks_pred` 抠出目标块当真值。
|
||||||
|
|
||||||
|
损失 `|z − h|`(`loss_exp=1` 即 L1),只在被遮 token 上算——与论文"表示空间 L1、仅在 masked patch"一致。EMA + stop-grad 即防坍塌机制。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 七、AC 推理:CEM + 能量函数规划(`notebooks/utils/`)
|
||||||
|
|
||||||
|
> 定位提醒:`app/vjepa_droid/` 是**训练侧**;真正"跑起来"的规划在 `notebooks/utils/mpc_utils.py`(CEM)与 `world_model_wrapper.py`(桥接)。二者与训练侧的 rollout 是同一机制的"推理版/训练版"。
|
||||||
|
|
||||||
|
### 7.1 桥接层 `WorldModel`(`world_model_wrapper.py`)
|
||||||
|
|
||||||
|
把"编码器 + AC 预测器"包成可被规划器调用的世界模型。默认 MPC 超参:
|
||||||
|
|
||||||
|
```python
|
||||||
|
mpc_args = {"rollout": 2, "samples": 400, "topk": 10, "cem_steps": 10,
|
||||||
|
"momentum_mean": 0.15, "momentum_std": 0.15, "maxnorm": 0.05}
|
||||||
|
```
|
||||||
|
|
||||||
|
`encode(image)`:单帧得先复制成 2 帧(tubelet 时间核=2)再编码,且**必须 layer_norm**(与训练目标同一归一化空间,能量尺度才对齐):
|
||||||
|
|
||||||
|
```python
|
||||||
|
clip = clip.permute(...).flatten(0,1).unsqueeze(2).repeat(1, 1, 2, 1, 1) # 单帧 → 2 帧
|
||||||
|
h = self.encoder(clip)
|
||||||
|
if self.normalize_reps: h = F.layer_norm(h, (h.size(-1),))
|
||||||
|
```
|
||||||
|
|
||||||
|
`infer_next_action`:定义"走一步"的闭包交给 `cem`。要点——**视觉表示靠 AC 预测器"想象",本体位姿靠运动学硬算**:
|
||||||
|
|
||||||
|
```python
|
||||||
|
def step_predictor(reps, actions, poses):
|
||||||
|
next_rep = self.predictor(reps, actions, poses)[:, -self.tokens_per_frame:] # 取最后一帧预测
|
||||||
|
if self.normalize_reps: next_rep = F.layer_norm(next_rep, (next_rep.size(-1),))
|
||||||
|
next_pose = compute_new_pose(poses[:, -1:], actions[:, -1:]) # 运动学积分,非网络预测
|
||||||
|
return next_rep, next_pose
|
||||||
|
mpc_action = cem(context_frame=rep, context_pose=pose, goal_frame=goal_rep,
|
||||||
|
world_model=step_predictor, **self.mpc_args)[0]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 能量函数就是 latent L1(`mpc_utils.py`)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def l1(a, b):
|
||||||
|
return torch.mean(torch.abs(a - b), dim=-1) # 想象状态 vs 目标状态,逐元素 L1
|
||||||
|
```
|
||||||
|
|
||||||
|
论文的 goal-conditioned energy function,落到代码就这一行。
|
||||||
|
|
||||||
|
### 7.3 只优化"平移 + 夹爪",旋转冻结为 0(读源码才见的简化)
|
||||||
|
|
||||||
|
动作名义 7 维,分布只建在 4 维(xyz + gripper)上;采样时旋转 3 维恒填 0:
|
||||||
|
|
||||||
|
```python
|
||||||
|
std = cat([ones((rollout,3)) * maxnorm, ones((rollout,1))], dim=-1) # xyz 的 std=maxnorm
|
||||||
|
action_samples = randn(samples, 4) * std[h] + mean[h]
|
||||||
|
action_samples[:, :3] = clip(action_samples[:, :3], -maxnorm, maxnorm) # ← L1 球动作约束
|
||||||
|
action_samples = cat([action_samples[:, :3], zeros((len,3)), action_samples[:, -1:]], -1) # 旋转恒 0
|
||||||
|
```
|
||||||
|
|
||||||
|
`clip(±maxnorm)` 即论文"每步动作约束在 L1 球内"(默认 `maxnorm=0.05`;论文桌面实验报半径 0.075≈13cm,数量级一致,实验脚本可覆盖默认值),理由是大动作 out-of-distribution。
|
||||||
|
|
||||||
|
### 7.4 想象 rollout + 选精英 + 动量更新
|
||||||
|
|
||||||
|
```python
|
||||||
|
for h in range(rollout): # 400 条候选同时在 latent 里播放 rollout 步
|
||||||
|
next_frame, next_pose = world_model(frame_traj, action_traj, pose_traj)
|
||||||
|
...
|
||||||
|
sims = l1(final_state.flatten(1), goal_state.flatten(1)) # 只比【最终想象帧】vs 目标
|
||||||
|
idx = sims.topk(topk, largest=False).indices # 取能量最小的 topk 精英
|
||||||
|
mean = mean_selected * (1 - momentum_mean) + mean * momentum_mean # 带动量更新分布
|
||||||
|
std = std_selected * (1 - momentum_std) + std * momentum_std
|
||||||
|
```
|
||||||
|
|
||||||
|
全程不解码回像素——预测/比较/打分都在表示空间,这是比扩散式 Cosmos 快一个数量级(16s vs 4min)的根因。迭代 `cem_steps` 轮后返回分布均值作动作。标准 CEM:采样 → 评估 → 留精英 → 更新分布,纯采样无梯度,单卡可跑。
|
||||||
|
|
||||||
|
### 7.5 受控时域(receding horizon)
|
||||||
|
|
||||||
|
`cem` 返回 `[1, rollout, 7]` 整条轨迹,但外层执行循环**只落地第一个动作,再重新编码当前观测、重新规划**。`rollout=2` = 每次做 2 步前瞻、只执行 1 步,用前瞻避免短视。
|
||||||
|
|
||||||
|
### 7.6 位姿用确定性运动学:`compute_new_pose`
|
||||||
|
|
||||||
|
```python
|
||||||
|
new_xyz = pose[:, :3] + action[:, :3] # 平移相加
|
||||||
|
angle_diff = [dm @ m for dm, m in zip(delta_matrices, matrices)] # 旋转矩阵相乘复合
|
||||||
|
new_closedness = np.clip(pose[:, -1:] + action[:, -1:], 0, 1) # 夹爪裁剪
|
||||||
|
```
|
||||||
|
|
||||||
|
位姿用真实运动学递推(平移加、旋转复合、夹爪裁剪),不让网络在低维本体状态上犯错。`poses_to_diff` 是逆运算(从当前位姿→目标位姿反解动作)。
|
||||||
|
|
||||||
|
### 7.7 训练侧为何配套:teacher-forcing + rollout 双损失(`app/vjepa_droid/train.py:417`)
|
||||||
|
|
||||||
|
推理要多步 rollout,训练就必须同时练单步和多步,否则误差累积漂移:
|
||||||
|
|
||||||
|
```python
|
||||||
|
z_tf = _step_predictor(z[:, :-tokens_per_frame], actions, states[:,:-1], extrinsics[:,:-1]) # teacher forcing
|
||||||
|
_z = cat([z[:, :tokens_per_frame], z_tf[:, :tokens_per_frame]], dim=1)
|
||||||
|
for n in range(1, auto_steps): # 用自己的预测往后滚
|
||||||
|
_z_nxt = _step_predictor(_z, actions[:, :n+1], states[:, :n+1], extrinsics[:, :n+1])[:, -tokens_per_frame:]
|
||||||
|
_z = cat([_z, _z_nxt], dim=1)
|
||||||
|
z_ar = _z[:, tokens_per_frame:]
|
||||||
|
loss = loss_fn(z_tf, h) + loss_fn(z_ar, h) # 单步 L1 + 多步 rollout L1
|
||||||
|
```
|
||||||
|
|
||||||
|
`sloss`(rollout 项)让预测器在"喂自己预测"时也不漂,**推理时 CEM 的 latent rollout 才可信**——训练 rollout 与推理 CEM rollout 是配套设计。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 八、全链路闭环
|
||||||
|
|
||||||
|
```
|
||||||
|
MaskCollator(_MaskGenerator):多块连乘取并集
|
||||||
|
→ (masks_enc 上下文下标, masks_pred 目标下标) §一
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
encoder(clips, masks_enc) → 只编码上下文 → z_ctx §三
|
||||||
|
predictor(z_ctx, masks_enc, masks_pred) → 在目标位置补出 ẑ_tgt §四
|
||||||
|
target_encoder(clips) + apply_masks(masks_pred) → 目标真值 h(EMA, stop-grad)
|
||||||
|
loss = |ẑ_tgt − h|(仅 masks_pred 上, L1) §六
|
||||||
|
```
|
||||||
|
|
||||||
|
AC 阶段(§五):把"被遮 patch"换成"未来帧","mask token"换成"动作/状态 token + 块因果掩码",复用同一 latent 预测骨架;推理时反过来用——给目标图像编码成 `z_goal`,枚举动作让模型在 latent 里 rollout,以 `‖ẑ_future − z_goal‖₁` 为能量,CEM 搜最优动作、执行第一步再重规划(receding horizon)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 九、两条值得记住的设计要点
|
||||||
|
|
||||||
|
1. **multi-block tube 掩码**:① 时间贯穿的 tube(`temporal_scale=1.0`)逼模型学运动而非抄帧;② 块大小同步、位置随机 + 多块并集,在可批处理前提下做出 ~90% 高难度掩码。
|
||||||
|
2. **下标即位置**:掩码通过"删 token + 传下标"实现,位置信息全程由下标 → 3D-RoPE 还原,而非依赖序列顺序。这套机制同时服务于编码器、动作无关预测器和 AC 预测器。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 十、工程备忘
|
||||||
|
|
||||||
|
- **RoPE bug 不可贸然修**:`rotate_queries_or_keys` 的频率展开有已知 bug,但权重与之绑定。加载官方 checkpoint 必须沿用 bug 版;从头自训可切注释里的 `repeat_interleave(2)` 正确版。
|
||||||
|
- **块因果 ≠ is_causal**:AC 的时间因果由显式 `attn_mask` 实现,`pred_is_frame_causal` 控制是否构造该矩阵;勿与 SDPA 的逐 token `is_causal` 混淆。
|
||||||
|
- **min_keep 截断有信息损失**:为可批处理,全 batch 下标截到最短,会丢掉少量 patch;高 batch 多样性下影响小。
|
||||||
|
- **AC 复用 EMA 编码器**:`context_encoder_key=target_encoder`,AC 阶段冻结的是预训练的 EMA target encoder,不是在线 encoder。
|
||||||
|
- **规划默认不搜旋转**:`cem` 默认只优化平移 + 夹爪,旋转 3 维恒为 0(`axis` 可手动钉死其他维);大幅缩小搜索空间。
|
||||||
|
- **能量尺度靠 layer_norm 对齐**:编码、预测、目标三处都 layer_norm,规划能量(latent L1)才在同一尺度;推理侧 `normalize_reps` 必须与训练一致。
|
||||||
|
- **训练 rollout ↔ 推理 CEM rollout 配套**:缺了训练侧的 `sloss`(autoregressive rollout 损失),推理时多步 latent rollout 会漂移、CEM 失准。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> 配套阅读:方法/数字/机器人结果见 [《V-JEPA 2 深度技术剖析》](V-JEPA2深度技术剖析.md);系列脉络见 [《Meta JEPA 系列全面调研》](index.md)。
|
||||||
@@ -0,0 +1,542 @@
|
|||||||
|
# 多感官物体感知与触觉:方向综述
|
||||||
|
|
||||||
|
> 子方向:Multisensory Object Perception & Tactile Sensing
|
||||||
|
> 锚点论文:**ObjectFolder 系列**(CoRL 2021 / CVPR 2022 / CVPR 2023)与 **VTV-LLM**(NeurIPS 2025)
|
||||||
|
> 定位:本综述以 MultiPLY 为出发点,系统梳理"让机器同时用视觉、听觉、触觉(乃至温度)感知物体"这一方向的传感器、仿真、数据集、表示学习、与大模型结合、以及机器人操作应用,面向研究者。
|
||||||
|
> 配套阅读:同目录《MultiPLY技术讲解.md》
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 这个方向是什么,为什么重要
|
||||||
|
|
||||||
|
人类认识一个物体,从来不是只靠"看"。判断牛油果熟没熟要捏一捏(触觉硬度),判断杯子是空是满可以敲一敲(撞击声),判断锅烫不烫要靠温度。这些**只有交互才能获得**的物理属性,正是纯视觉模型的盲区——视觉能告诉你"这是个杯子",但说不准它的材质、软硬、温度、是否中空。
|
||||||
|
|
||||||
|
"多感官物体感知与触觉"这个方向,研究的就是如何让机器获得、表示并推理这些**视觉之外的物体物理属性**,核心模态是:
|
||||||
|
|
||||||
|
- **触觉(tactile)**:接触面的微观几何、纹理、软硬、滑动/形变——最难也最关键的一环;
|
||||||
|
- **听觉(audio / impact sound)**:敲击声携带材质、结构(实心/中空)、尺寸信息;
|
||||||
|
- **温度(thermal)**:材质导热性的代理信号;
|
||||||
|
- 它们与**视觉、语言**的对齐与融合。
|
||||||
|
|
||||||
|
这与 MultiPLY 的关系非常直接:**MultiPLY 是"具身体 + 多感官 + LLM"的集成系统,而本方向提供它赖以成立的全部底层积木**——MultiPLY 的撞击声与材质来自 **ObjectFolder**,触觉来自 **DiffTactile**,而把触觉/多感官接进语言模型的范式(Octopi、TVL、VTV-LLM)则是它的同代与后继。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 方向地图(Taxonomy)
|
||||||
|
|
||||||
|
可以从五个正交维度理解这个方向的所有工作:
|
||||||
|
|
||||||
|
1. **模态组合**:触觉单模态 / 视-触 / 视-触-语 / 视-听-触 / 视-听-触-温。
|
||||||
|
2. **数据来源**:仿真(ObjectFolder、TACTO、Taxim、DiffTactile)vs 真实采集(Touch and Go、SSVTP、ObjectFolder Real)。
|
||||||
|
3. **表示与监督**:自监督跨模态对比(SSVTP、Touch and Go)/ 绑定到视觉锚点(UniTouch,ImageBind 式)/ 三模态成对对比(TVL)/ 隐式神经场(ObjectFolder)。
|
||||||
|
4. **与语言/LLM 的结合度**:无语言(纯表示)→ 触觉-语言对齐(Touch100k、TLV)→ 触觉接入 LLM 做推理(Octopi、VTV-LLM)→ 接入动作(Tactile-VLA、MultiPLY)。
|
||||||
|
5. **下游任务**:材质/属性识别、跨模态检索、接触定位、抓取稳定性预测、形状重建、物理推理问答、操作控制。
|
||||||
|
|
||||||
|
下面先深入两条锚点线,再横向铺开传感器、仿真、数据集、表示学习、LLM 结合与机器人操作。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 锚点一:ObjectFolder 系列——多感官物体的"隐式神经数据库"
|
||||||
|
|
||||||
|
ObjectFolder 由斯坦福 / CMU(Ruohan Gao、Jiajun Wu、Li Fei-Fei、Wenzhen Yuan 等)推动,三代演进,是整个方向最具影响力的数据基座。
|
||||||
|
|
||||||
|
### 3.1 核心思想:Object File 与隐式神经表示
|
||||||
|
|
||||||
|
它借用认知科学的 **"Object File"** 概念(Kahneman)——一个物体在某位置上被接收到的全部感官信息。ObjectFolder 把每个物体建模成一个**紧凑的隐式神经网络**,内含三个子网络:
|
||||||
|
|
||||||
|
- **VisionNet**:给定相机视角/光照,渲染外观;
|
||||||
|
- **AudioNet**:给定敲击位置/力度,给出撞击声;
|
||||||
|
- **TouchNet**:给定接触位置/凝胶形变,给出触觉读数(按 DIGIT 传感器建模)。
|
||||||
|
|
||||||
|
关键设计是 **"intrinsic(物体内禀)/ extrinsic(查询参数)分离"**:物体的内禀属性固化在网络权重里,用外参(视角、敲击点、接触点)去"查询"就能得到对应模态的感官信号。这让数据集既紧凑又灵活——存的是网络,不是海量渲染结果。
|
||||||
|
|
||||||
|
### 3.2 三代演进
|
||||||
|
|
||||||
|
| 代次 | 会议 | 物体数 | 关键进展 |
|
||||||
|
|------|------|--------|----------|
|
||||||
|
| **ObjectFolder 1.0** | CoRL 2021 | 100(虚拟) | 首次把视/听/触统一进隐式神经表示;4 个基准任务:实例识别、跨模态检索、3D 重建、机器人抓取 |
|
||||||
|
| **ObjectFolder 2.0** | CVPR 2022 | 1000(虚拟) | 规模 ×10、渲染快几个数量级、质量大幅提升;**首次实现 sim2real**(尺度估计、接触定位、形状重建三任务从虚拟物体迁移到真实物体) |
|
||||||
|
| **ObjectFolder Benchmark + ObjectFolder Real** | CVPR 2023 | +100(真实) | 10 个标准化任务(围绕识别、重建、操作);用 Franka 机械臂 + GelSight 采集 100 个真实家用物体的网格、视频、撞击声、触觉,建立 neural↔real 对照基准 |
|
||||||
|
|
||||||
|
### 3.3 它为什么对 MultiPLY 至关重要
|
||||||
|
|
||||||
|
MultiPLY 的数据流水线里,**ObjectFolder 提供了 1k 物体网格 + 以隐式神经场存储的撞击声 + 材质标注**——智能体"敲击"(`<hit>`)一个物体时听到的声音,正是查询 AudioNet 得到的。可以说没有 ObjectFolder 这类"可查询的多感官物体库",MultiPLY 的"主动交互取声"就无从谈起。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 锚点二:VTV-LLM——把触觉"视频"接进大语言模型
|
||||||
|
|
||||||
|
**VTV-LLM: Universal Visuo-Tactile Video Understanding for Embodied Interaction**(NeurIPS 2025,Yifan Xie 等)是首个面向**通用视触觉视频(Visuo-Tactile Video)理解**的多模态大语言模型,把触觉感知正式当作"跨模态推理"问题——让触觉视频与语言描述对齐,从而对物理属性做复杂推理。
|
||||||
|
|
||||||
|
### 4.1 为什么是"视频"而非"图像"
|
||||||
|
|
||||||
|
视触觉传感器(GelSight/DIGIT 等)本质是相机,但它的输出与自然图像差异巨大,且**触觉本身是时序过程**:按压、滑动、形变都在时间维度展开,存在帧间相关与时间冗余。所以 VTV-LLM 强调对触觉**视频**做鲁棒的时序表示,而非把它当静态图。
|
||||||
|
|
||||||
|
### 4.2 VTV150K 数据集
|
||||||
|
|
||||||
|
- **规模**:150,000 视频帧,来自 **100 个物体**;
|
||||||
|
- **跨传感器**:横跨 **GelSight Mini、DIGIT、Tac3D** 三种传感器(这点很重要——跨传感器泛化是触觉领域的老大难);
|
||||||
|
- **属性标注**:四个基础触觉属性——**硬度(hardness)、凸起(protrusion)、弹性(elasticity)、摩擦(friction)**;
|
||||||
|
- **问答构造**:用结构化模板 + 比较算子(more/less/most/least)+ 属性选择器,生成约 **10,000 条 QA 对**,支持比较分析、场景决策等。
|
||||||
|
|
||||||
|
### 4.3 三阶段训练范式
|
||||||
|
|
||||||
|
1. **VTV enhancement**:学习鲁棒的视触觉表示(针对触觉视频的特性做专门微调);
|
||||||
|
2. **VTV-text alignment**:建立视触觉与语言的跨模态对应;
|
||||||
|
3. **text prompt finetuning**:让模型用自然语言生成回答。
|
||||||
|
|
||||||
|
最终能做触觉特征评估、表面特征区分、触觉场景分析等具身交互任务。
|
||||||
|
|
||||||
|
### 4.4 它在谱系中的位置
|
||||||
|
|
||||||
|
VTV-LLM 与 MultiPLY 是互补的:MultiPLY 把触觉作为"多感官之一"塞进具身 LLM、强调主动交互闭环;VTV-LLM 则**专攻触觉这一条模态的深度理解**(时序、跨传感器、细粒度属性、可比较推理)。两者合起来勾勒了"触觉 + 语言"的两种走法:广度集成 vs 深度专精。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 传感器基础:触觉与听觉怎么"采"
|
||||||
|
|
||||||
|
### 5.1 视触觉(vision-based tactile)传感器
|
||||||
|
|
||||||
|
这是当前触觉学习的主流硬件,原理是用一块**可形变弹性体(凝胶)**做接触介质,背后一个**微型相机**拍下凝胶被压出的形变,从而把"触觉"转化为"图像"——于是所有计算机视觉/深度学习算法都能直接用。
|
||||||
|
|
||||||
|
- **GelSight**(MIT 起源):高分辨率,能估计接触几何与受力;很多变体(GelSlim 等)。
|
||||||
|
- **DIGIT**(Meta AI × GelSight,2020/2021):小型化、低成本、可装在多指手上,是机器学习社区用得最多的型号;2024 年推出 **Digit 360**(>18 种感知特征)。
|
||||||
|
- **Tac3D** 等:提供三维形变/力场估计。
|
||||||
|
|
||||||
|
视触觉传感器的优点是"信息密度高、可直接复用视觉模型",缺点是**各家输出不标准化**——这正是 UniTouch、TLV-CoRe 等要解决的"跨传感器泛化"问题。
|
||||||
|
|
||||||
|
### 5.2 听觉:接触式麦克风与撞击声
|
||||||
|
|
||||||
|
撞击声携带材质、结构、尺寸信息,且**极具判别性**且能捕捉"视觉看不到的瞬时事件"。采集上常用**接触式麦克风(contact microphone)**(如 See Hear Feel),物理上则可由声学仿真(如 ObjectFolder 的 AudioNet、SoundSpaces 的房间脉冲响应)合成。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 仿真与数据生成:触觉/声音"造数据"
|
||||||
|
|
||||||
|
真实触觉数据采集昂贵(要机械臂逐点接触),所以仿真是这个方向的命脉。视触觉仿真有一条清晰的演进线:
|
||||||
|
|
||||||
|
| 仿真器 | 年份/会议 | 类型 | 关键特点 |
|
||||||
|
|--------|-----------|------|----------|
|
||||||
|
| **TACTO** | 2020(RAL/IROS) | 渲染式 | 高速渲染 DIGIT/OmniTact 触觉图像(数百 FPS),接触动力学交给 PyBullet 等外部物理引擎 |
|
||||||
|
| **Taxim** | 2021(RAL 2022) | 示例式/数据驱动 | 用多项式查找表建模光学响应 + 弹性叠加原理建模 marker 运动;**<100 个真实标定点**即可,CPU 可跑 |
|
||||||
|
| **DiffTactile** | ICLR 2024 | 物理式**可微** | FEM 软体模型 + 多材质仿真(刚/弹/弹塑性);可微性支持梯度优化做 sim2real 标定与技能学习 |
|
||||||
|
|
||||||
|
值得注意的是 **DiffTactile 正是 MultiPLY 触觉信号的来源**,且其作者(Zilin Si)也是 Taxim 的主导者,呈现清晰的研究传承;DiffTactile 隶属 Genesis-Embodied-AI 生态。更新的 **DOT-Sim** 进一步用 MPM(物质点法)建模软体传感器,提升物理精度。
|
||||||
|
|
||||||
|
声学方面,撞击声可由 ObjectFolder 的隐式声场查询得到,环境/空间化音频则可用 SoundSpaces 式的**房间脉冲响应(RIR)卷积**生成(MultiPLY 仿真器即如此)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 数据集谱系(一张表看懂)
|
||||||
|
|
||||||
|
| 数据集 | 年份/会议 | 模态 | 规模 | 传感器/来源 | 特点 |
|
||||||
|
|--------|-----------|------|------|-------------|------|
|
||||||
|
| **ObjectFolder 1.0** | CoRL 2021 | 视/听/触 | 100 虚拟物体 | DIGIT(触觉) | 隐式神经 Object File |
|
||||||
|
| **ObjectFolder 2.0** | CVPR 2022 | 视/听/触 | 1000 虚拟物体 | 仿真 | 实时渲染、sim2real |
|
||||||
|
| **ObjectFolder Real** | CVPR 2023 | 视/听/触 | 100 真实物体 | Franka + GelSight | 真实多感官测量、10 任务基准 |
|
||||||
|
| **SSVTP** | RSS 2023 | 视-触 | ~4.5k 对齐对 | UR5 + DIGIT | 机器人自采、空间对齐 |
|
||||||
|
| **Touch and Go (TAG)** | NeurIPS 2022 | 视-触 | in-the-wild | 人采 + GelSight | 自然场景、真实物体 |
|
||||||
|
| **VisGel** | (早期) | 视-触 | ~大规模 | GelSight | 后续多个语言数据集的视触来源 |
|
||||||
|
| **PhysiCLeAR**(Octopi) | RSS 2024 | 触-语 | 408 视频/74 物体 | GelSight | 硬度/粗糙/凹凸属性标注 |
|
||||||
|
| **TVL** | ICML 2024 | 触-视-语 | 44K 对 | SSVTP+HCT;GPT-4V 伪标注 | 三模态对齐 |
|
||||||
|
| **TLV** | 2024 | 触-语-视 | ~19.8k 条 | VisGel + 人机协作标注 | 句级描述 |
|
||||||
|
| **Touch100k** | 2024(Inf. Fusion) | 触-语-视 | ~100k 条 | TAG+VisGel;GPT-4V | 多粒度触觉描述 |
|
||||||
|
| **VTV150K**(VTV-LLM) | NeurIPS 2025 | 视-触(视频)-语 | 150k 帧/100 物体 | GelSight Mini/DIGIT/Tac3D | 跨传感器、4 属性、QA |
|
||||||
|
|
||||||
|
一个清晰的趋势:**从"视-触成对"→"加上语言"→"视频化、跨传感器、问答化"**,数据正在朝"能直接训练触觉大模型"的方向演进。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 表示学习:把触觉对齐到视觉与语言
|
||||||
|
|
||||||
|
核心问题:触觉信号怎么学到一个**能和视觉、语言互通**的表示?四种代表性思路:
|
||||||
|
|
||||||
|
- **自监督跨模态对比(机器人自采)——SSVTP**(RSS 2023):让机器人自动采集**空间对齐**的视-触图像对,用跨模态对比损失学共享隐空间,免人工标注;下游 5 个定位/跟随任务取得 73–100% 成功率。
|
||||||
|
- **自然场景视-触学习——Touch and Go**(NeurIPS 2022):人手持 GelSight 在真实世界探物 + 录第一视角视频,做自监督视触特征、触觉驱动图像风格化、触觉未来帧预测。
|
||||||
|
- **绑定到视觉锚点——UniTouch**(CVPR 2024,"Binding Touch to Everything"):把触觉 embedding 对齐到**已与多模态关联的预训练图像 embedding**(ImageBind 式),并用**可学习的"传感器特定 token"**同时吃多种异构传感器;从而零样本做材质识别、抓取稳定性预测、触觉图像问答,还能接 diffusion 做触觉→图像生成。
|
||||||
|
- **三模态成对对比 + 生成——TVL**(ICML 2024,UC Berkeley/Meta):不把一切绑到视觉,而是在**触/视/语三模态间两两对比**;用 44K 对(10% 人工 + 90% GPT-4V 伪标注)训练触觉编码器,再微调 **LLaMA2-7B** 生成触觉描述;分类 +29%,触视理解超 GPT-4V +12%。
|
||||||
|
|
||||||
|
延伸:**Touch100k / TLV-Link** 用课程学习把触-语-视对齐做到 100k 规模;**TLV-CoRe**(2026)提出 Sensor-Aware Modulator 统一不同传感器特征,专攻跨传感器鲁棒性。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 触觉/多感官接入语言与 LLM
|
||||||
|
|
||||||
|
这是与 MultiPLY 最近的一圈,可按"理解 → 推理 → 动作"排列:
|
||||||
|
|
||||||
|
- **触觉物理属性推理——Octopi**(RSS 2024):用 GelSight 触觉视频 + VLM,最小语言微调即可预测并推理物体物理属性(硬度/粗糙/凹凸)。经典例子:摸两个牛油果,结合触觉(更软)+ 常识(更软=更熟)选出更熟的那个——展示了"触觉 + 常识推理"的闭环。
|
||||||
|
- **触觉视频大模型——VTV-LLM**(NeurIPS 2025):见第 4 节,跨传感器、时序、可比较推理。
|
||||||
|
- **触觉生成式语言模型——TVL**:见第 8 节,LLaMA2 生成触觉描述。
|
||||||
|
- **触觉进入 VLA(动作)——Tactile-VLA / VTLA**:把触觉接入"视觉-语言-动作"模型,用混合位置-力控制器 + 触觉反馈推理,做插入等接触密集型操作。
|
||||||
|
- **集大成的具身多感官 LLM——MultiPLY**:把视/听/触/温作为状态 token、配动作 token,形成主动交互闭环(详见配套文档)。
|
||||||
|
|
||||||
|
**一句话对比**:Octopi/VTV-LLM 专注"触觉→语言理解与推理";TVL 专注"触觉表示 + 描述生成";Tactile-VLA 把触觉接到动作;MultiPLY 把它们整合进具身 3D 智能体。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 多感官机器人操作:为什么需要不止一种感官
|
||||||
|
|
||||||
|
回到机器人本身——多感官的价值在操作任务上最直观:
|
||||||
|
|
||||||
|
- **See, Hear, and Feel**(CoRL 2022,Hao Li 等):用相机(看)+ 接触式麦克风(听)+ 视触觉传感器(触),自注意力融合三模态。在**密集装填(dense packing)**与**倒水(pouring)**两个难任务上验证:视觉给全局但易遮挡,**音频给关键时刻的即时反馈(甚至是看不见的)**,触觉给精确局部几何——三者缺一不可。
|
||||||
|
- **MidasTouch**(CoRL 2022):**纯触觉**全局定位——传感器在物体表面滑动,用粒子滤波 + 触觉码网络估计位姿分布,无需视觉先验;并发布 YCB-Slide 数据集。说明触觉单模态也能解决"我现在摸到的是物体哪个部位"。
|
||||||
|
- **声音引导探索**:如"Impact Makes a Sound"指出声音高度判别且常被忽视;AuRL 用接触麦克风的声音做自监督学习动态操作。
|
||||||
|
|
||||||
|
这些工作共同说明:**遮挡、瞬时事件、精细局部几何**这三类信息分别由视觉、听觉、触觉最擅长覆盖,多感官融合不是锦上添花而是任务刚需。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 开放问题与趋势
|
||||||
|
|
||||||
|
- **跨传感器泛化**:GelSight / DIGIT / Tac3D 输出不标准,模型换个传感器就掉点。UniTouch 的传感器 token、TLV-CoRe 的 Sensor-Aware Modulator、VTV150K 的跨传感器数据都是尝试,但远未解决。
|
||||||
|
- **Sim2Real**:触觉/声学仿真与真实的差距仍大;DiffTactile 的可微标定、ObjectFolder 的 neural↔real 基准是方向,但真实触觉的噪声、磨损、标定漂移仍棘手。
|
||||||
|
- **数据稀缺与标注**:触觉天然缺语言标签,目前大量依赖 GPT-4V 伪标注(TVL、Touch100k),质量与偏置存疑。
|
||||||
|
- **时序与动态**:多数工作仍偏静态接触;VTV-LLM 强调视频时序是重要一步,但动态滑动/力控的建模仍欠缺。
|
||||||
|
- **温度等"长尾模态"**:温度、本体感觉等被 MultiPLY 列入但少有专门数据与模型(MultiPLY 代码里温度模态甚至未完整释出)。
|
||||||
|
- **从理解到动作的闭环**:Tactile-VLA、MultiPLY 起步,但"主动决定去摸哪、摸完怎么改计划"的交互式策略仍是前沿。
|
||||||
|
- **统一的多感官基础模型**:把视/听/触/温 + 语言 + 动作统一在一个模型里(MultiPLY 的愿景),数据、表示、训练范式都还在早期。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 与 MultiPLY 的呼应
|
||||||
|
|
||||||
|
把本方向的积木对回 MultiPLY,就能看清它"站在巨人肩上"的具体位置:
|
||||||
|
|
||||||
|
- **数据底座** ← ObjectFolder(撞击声 + 材质 + 物体库);
|
||||||
|
- **触觉信号** ← DiffTactile(可微触觉仿真);
|
||||||
|
- **声学空间化** ← SoundSpaces 式 RIR 卷积;
|
||||||
|
- **触觉/多感官 + 语言范式** ← Octopi / TVL / VTV-LLM 的同代探索;
|
||||||
|
- **多感官操作动机** ← See Hear Feel 证明的"三感官互补";
|
||||||
|
- **MultiPLY 的增量** = 把这些整合进**具身 3D 智能体 + 主动交互闭环(动作 token / 状态 token)+ LLM**。
|
||||||
|
|
||||||
|
换句话说,本方向回答的是"**每一种感官怎么采、怎么表示、怎么对齐语言**",而 MultiPLY 回答的是"**如何让一个 LLM 智能体主动调度这些感官去完成任务**"。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. 论文与资源清单
|
||||||
|
|
||||||
|
### 锚点
|
||||||
|
- ObjectFolder 1.0(CoRL 2021)<https://arxiv.org/abs/2109.07991>
|
||||||
|
- ObjectFolder 2.0(CVPR 2022)<https://arxiv.org/abs/2204.02389>
|
||||||
|
- ObjectFolder Benchmark / Real(CVPR 2023)<https://arxiv.org/abs/2306.00956>
|
||||||
|
- VTV-LLM(NeurIPS 2025)<https://arxiv.org/abs/2505.22566>
|
||||||
|
|
||||||
|
### 触觉/多感官 + 语言与 LLM
|
||||||
|
- Octopi(RSS 2024)<https://arxiv.org/abs/2405.02794>
|
||||||
|
- TVL: Touch-Vision-Language Dataset(ICML 2024)<https://arxiv.org/abs/2402.13232>
|
||||||
|
- UniTouch: Binding Touch to Everything(CVPR 2024)<https://arxiv.org/abs/2401.18084>
|
||||||
|
- TLV: Touch-Language-Vision Dataset(2024)<https://arxiv.org/abs/2403.09813>
|
||||||
|
- Touch100k(2024)<https://arxiv.org/abs/2406.03813>
|
||||||
|
- TLV-CoRe(2026)<https://arxiv.org/abs/2511.11512>
|
||||||
|
- Tactile-VLA(2025)<https://arxiv.org/abs/2507.09160>
|
||||||
|
|
||||||
|
### 视触觉表示学习与数据集
|
||||||
|
- SSVTP(RSS 2023)<https://arxiv.org/abs/2209.13042>
|
||||||
|
- Touch and Go(NeurIPS 2022)<https://arxiv.org/abs/2211.12498>
|
||||||
|
|
||||||
|
### 传感器与仿真
|
||||||
|
- TACTO 仿真器<https://arxiv.org/abs/2012.08456>
|
||||||
|
- Taxim 仿真器(GelSight)<https://arxiv.org/abs/2109.04027>
|
||||||
|
- DiffTactile(ICLR 2024,MultiPLY 触觉来源)<https://arxiv.org/abs/2403.08716>
|
||||||
|
|
||||||
|
### 多感官机器人操作
|
||||||
|
- See, Hear, and Feel(CoRL 2022)<https://arxiv.org/abs/2212.03858>
|
||||||
|
- MidasTouch(CoRL 2022)<https://arxiv.org/abs/2210.14210>
|
||||||
|
- Impact Makes a Sound(2022)<https://arxiv.org/abs/2208.02680>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. 硬件方案:多感官数据采集设备选型(国际主流 vs 中国平替)
|
||||||
|
|
||||||
|
> 目标场景:搭建一套能采集**视觉 / 深度 / 触觉 / 撞击声 / 温度**的物体级多感官数据采集装置(对标 ObjectFolder Real、TVL、VTV150K 的数据规格)。
|
||||||
|
> 选型基调:**性能 / 生态优先**——主推社区成熟、论文复现友好的国际主流器件,同时为每一类给出**中国平替**,便于成本敏感时替换。
|
||||||
|
> 价格为公开渠道的大致参考,会随时间与汇率波动,仅供量级判断。
|
||||||
|
|
||||||
|
### 14.0 一套采集装置需要哪些"感官硬件"
|
||||||
|
|
||||||
|
把多感官数据采集拆成"感官通道 + 交互执行 + 同步"三部分:
|
||||||
|
|
||||||
|
- **感官通道**:① 视触觉/触觉传感器(触)② RGB-D 相机(视 + 点云)③ 接触式麦克风 + 麦克风(听,尤其撞击声)④ 热成像/温度(温)。
|
||||||
|
- **交互执行**("主动采集"的关键,对标 ObjectFolder Real 用 Franka + GelSight 逐点接触):⑤ 机械臂 ⑥ 夹爪/灵巧手 ⑦ 六维力/力矩传感器(控制接触力、保护传感器)。
|
||||||
|
- **同步与底座**:转台、标定板、统一时间戳采集(硬件触发或 ROS 时间同步)。
|
||||||
|
|
||||||
|
下面逐类给出选型。
|
||||||
|
|
||||||
|
### 14.1 视触觉(光学)触觉传感器——"触觉相机"
|
||||||
|
|
||||||
|
把凝胶形变拍成图像,可直接复用视觉模型,是当前触觉学习数据采集的首选。**强烈建议数据采集主力选 GelSight Mini 或 DIGIT**——因为 ObjectFolder、Touch and Go、TVL、PhysiCLeAR、VTV150K 等数据集大多基于它们,复现/迁移最顺。
|
||||||
|
|
||||||
|
| 型号 | 厂商/产地 | 关键规格 | 参考价 | 备注 |
|
||||||
|
|------|-----------|----------|--------|------|
|
||||||
|
| **GelSight Mini** | GelSight(美) | 超人类分辨率 2D/3D,浏览器即插即用,提供 ROS/Python | ~$499 | 生态最成熟、采集首选 |
|
||||||
|
| **DIGIT** | Meta×GelSight(美) | 小型化、USB-3、可装多指手,开源(digit.ml) | 低成本/开源 | 论文用得最多、适合上手 |
|
||||||
|
| **Digit 360** | Meta×GelSight(美) | 指尖形、~830 万 taxel、可测 1mN、含振动/热/气味 | 科研早期申请 | 最前沿、面向多模态触觉研究 |
|
||||||
|
| **DM-Tac W / F** | 戴盟 Daimon(深圳) | 多维高分辨率视触觉、CE/FCC、>500 万次按压寿命 | 询价 | 中国平替,主打高频高分辨率 |
|
||||||
|
| **GF225** | 纬钛 WTac(中国) | 10µm 级分辨率、可同测法向/切向力 | 询价 | 中国平替,分辨率高 |
|
||||||
|
|
||||||
|
### 14.2 多维力阵列 / 电子皮肤 / 仿生触觉
|
||||||
|
|
||||||
|
当需要**法向+切向力、温度、振动**等更"物理量化"的触觉(而非纯图像),用阵列式/仿生传感器。这一类**中国厂商已相当强**(人形机器人热潮推动),可大胆用国产。
|
||||||
|
|
||||||
|
| 型号 | 厂商/产地 | 原理 | 关键规格 | 备注 |
|
||||||
|
|------|-----------|------|----------|------|
|
||||||
|
| **BioTac** | SynTouch(美) | 液阻 + 热敏 + 水听器 | 测法向/切向力、振动、温度梯度,仿人指尖 | 经典仿生、多模态 |
|
||||||
|
| **uSkin** | XELA Robotics(日) | 霍尔阵列 + 磁体 | 3 轴力分布阵列,可贴/拧到手指手掌 | 分布式多点 |
|
||||||
|
| **ReSkin** | Meta/学术(美) | 磁性软皮肤 | <$30、2–3mm 薄、400Hz、1mm 空间分辨、可更换 | 极低成本、自采友好 |
|
||||||
|
| **PX 多维触觉 / DexH** | 帕西尼 PaXini(深圳) | 6D 霍尔阵列 | 第三代 15 维感知,单价降至数千元;曾用于英伟达 CES 展示机器人 | 中国平替,多维+灵巧手生态 |
|
||||||
|
| **TS 指尖触觉** | 他山 TASHAN(中国) | 电容 + 触觉 AI 芯片 | 0.01N 力分辨,含接近觉/三维力/纹理;自研类脑触觉芯片 | 中国平替,边缘智能 |
|
||||||
|
| **柔性触觉芯片** | 钛深 TacSense(深圳) | 柔性离电子(Iontronic) | 薄膜分布式压力、高灵敏;与优必选/大疆合作 | 中国平替,柔性大面积 |
|
||||||
|
|
||||||
|
### 14.3 RGB-D / 深度相机——视觉与点云
|
||||||
|
|
||||||
|
提供外观图像 + 深度点云(对标 ObjectFolder 的 VisionNet、3D 重建)。**注意:Intel 已停止 RealSense 新品研发**,长周期项目建议把 Orbbec(奥比中光)作为"未来可持续"的首选之一——它自研深度芯片、生态接近、价格更低。
|
||||||
|
|
||||||
|
| 型号 | 厂商/产地 | 原理 | 关键规格 | 参考价 |
|
||||||
|
|------|-----------|------|----------|--------|
|
||||||
|
| **RealSense D405 / D435i / D455** | Intel(美) | 主动红外双目 | D405 近距操作首选;D455 FOV 90×65、0.6–6m;板载算深度 | ~$250–400(已停研,渠道库存) |
|
||||||
|
| **Azure Kinect DK** | Microsoft(美) | ToF | 大 FOV、高彩色分辨、30fps、3m 内骨架追踪佳 | ~$400 |
|
||||||
|
| **ZED 2 / ZED X** | Stereolabs(美) | 被动双目 + GPU 神经深度 | 户外可用、最远 ~20m,需 CUDA GPU | ~$450+ |
|
||||||
|
| **Gemini 335 / Femto Bolt** | Orbbec 奥比中光(深圳) | 主动双目 / ToF | Gemini 335 户外/复杂场景优于 D435i,FOV 更大;Femto Bolt 兼容 Azure Kinect SDK | ~¥1950 / ~$250 |
|
||||||
|
| **Percipio 系列** | 图漾 PercipioXYZ(上海) | 主动双目 + 结构光辅助 | 工业级、环境适应性强 | 询价 |
|
||||||
|
|
||||||
|
### 14.4 热成像 / 温度——第四感官
|
||||||
|
|
||||||
|
温度是材质导热性的代理信号(MultiPLY 列为第四模态)。FLIR 的 Lepton/Boson 是集成生态标杆;但**中国厂商在出货量上已全球领先**,性价比高,平替力度可大。
|
||||||
|
|
||||||
|
| 型号 | 厂商/产地 | 关键规格 | 备注 |
|
||||||
|
|------|-----------|----------|------|
|
||||||
|
| **FLIR Lepton** | Teledyne FLIR(美) | 微型 LWIR 模组,160×120 / 80×60,可辐射测温 | 集成生态最佳(多平台 SDK) |
|
||||||
|
| **FLIR Boson** | Teledyne FLIR(美) | 12µm 非制冷、640 分辨率,性能参考级 | 高端核心 |
|
||||||
|
| **艾睿 / Micro III 等模组** | 睿创微纳 InfiRay/Raytron(烟台) | 模组/机芯齐全,独立测评对比 FLIR 表现接近 | 中国平替,出货量大 |
|
||||||
|
| **HIKMICRO 模组** | 海康微影(杭州) | MEMS 自研,探测器/机芯/模组全栈 | 中国平替,供应链完整 |
|
||||||
|
| **Guide 高德** | 高德红外/高德智感(武汉) | 中国最大、全球第二大红外探测器企业 | 中国平替,自研探测器 |
|
||||||
|
|
||||||
|
> 提示:高端探测器精度上国产仍略逊 FLIR,但对"物体相对温度/材质区分"这类数据采集足够。
|
||||||
|
|
||||||
|
### 14.5 音频——撞击声与环境声
|
||||||
|
|
||||||
|
对标 ObjectFolder 的 AudioNet(撞击声)。两类麦克风互补:**接触式麦克风(压电 piezo)采"敲击/接触的结构声"**,**麦克风阵列采"空间环境声 + 声源定位"**。
|
||||||
|
|
||||||
|
- **接触式麦克风(撞击声主力)**:压电片把表面振动转成电信号,能隔离空气噪声、专捕接触/撞击声。注意 piezo 频响非线性、有谐振着色,采集时需做阻抗匹配/滤波。国际可选 DPA、Shure 等专业贴片式;低成本可用通用压电片 + 前置放大。
|
||||||
|
- **麦克风阵列(环境声/定位)**:如 8 麦阵列可做声源到达方向估计(DoA)。开源生态常用 **ReSpeaker** 系列阵列(带 ROS 接口)。采集时遵循"stop-perceive-act"(采集瞬间停住)以减少自运动噪声。
|
||||||
|
|
||||||
|
### 14.6 机械臂——"主动接触"的执行主体
|
||||||
|
|
||||||
|
ObjectFolder Real 用 **Franka + GelSight 逐点接触**采集真实触觉。研究级采集强烈建议选**带关节力矩、1kHz 低层控制、ROS2 生态好**的臂——这对"力控接触不压坏触觉传感器"至关重要。
|
||||||
|
|
||||||
|
| 型号 | 厂商/产地 | 关键规格 | 参考价 | 备注 |
|
||||||
|
|------|-----------|----------|--------|------|
|
||||||
|
| **Franka Research 3** | Franka(德) | 7-DOF、每关节力矩、1kHz、低层接口 | ~$25–30K | 学术操作研究事实标准 |
|
||||||
|
| **Kinova Gen3** | Kinova(加) | 7-DOF、每关节力矩、ROS2、30 分钟上手 | ~$28K | 研究级、轻量便携 |
|
||||||
|
| **UR5e** | Universal Robots(丹麦) | 5kg/850mm、工业可靠性标杆 | ~$35K | 标配无关节力矩 |
|
||||||
|
| **RealMan RM65-B** | 睿尔曼(北京) | 6-DOF、整臂 7.2kg、负载 5kg(峰值 9kg)、610mm、ROS | 显著更低 | 中国平替,国内具身/模仿学习常用 |
|
||||||
|
| **JAKA / AUBO / Dobot** | 节卡/遨博/越疆(中国) | 协作臂,±0.02–0.1mm,负载/易用性强 | 较低 | 中国平替,工业生态成熟 |
|
||||||
|
|
||||||
|
> 取舍:Franka/Kinova 强在**低层力矩控制 + 开放研究接口**;多数国产协作臂历史上偏工业易用/负载/价格,研究级力控 API 稍弱,但 RealMan 等已专攻具身研究位。
|
||||||
|
|
||||||
|
### 14.7 末端执行器——夹爪与灵巧手
|
||||||
|
|
||||||
|
采集时用来"持握触觉传感器去接触物体"或"做抓取交互"。若只为给传感器做接触,二指夹爪足矣;若要采集灵巧操作数据,再上灵巧手。
|
||||||
|
|
||||||
|
| 型号 | 厂商/产地 | 关键规格 | 参考价 | 备注 |
|
||||||
|
|------|-----------|----------|--------|------|
|
||||||
|
| **Robotiq 2F-85** | Robotiq(加) | 二指自适应、行程 85mm、握力 30–100N、负载 5kg、即插即用 | 中端 | 接触采集够用、最省心 |
|
||||||
|
| **Allegro Hand** | Wonik(韩) | 直驱四指研究标准、原生兼容 DIGIT | ~$16K | 研究常用,连续负载易过热 |
|
||||||
|
| **Shadow Hand** | Shadow Robot(英) | 24-DOF、>100 传感器、1kHz,最仿人 | >$100K | 最高保真,贵且维护重 |
|
||||||
|
| **因时 Inspire RH56** | 因时机器人(北京) | 6-DOF/12 关节、内置 6 路力传感、力位混合控制 | 较低 | 中国平替,已规模出货 |
|
||||||
|
| **LinkerHand L20/L30** | 灵心巧手 Linkerbot(北京) | 21/22-DOF(研究版至 42-DOF),多传动 | ~¥5–10 万 | 中国平替,高自由度领先 |
|
||||||
|
| **BrainCo Revo 2** | 强脑(杭州) | 11-DOF、383g、握力 50N、含 3D 触觉 | 较低 | 中国平替,超轻+触觉 |
|
||||||
|
|
||||||
|
### 14.8 六维力/力矩传感器——接触力闭环
|
||||||
|
|
||||||
|
装在臂腕与末端之间,用于**控制接触力、保护脆弱的触觉凝胶、并把力觉作为一路数据**。这一类**国产成熟度高、性价比突出**,坤维已可对标 ATI。
|
||||||
|
|
||||||
|
| 型号 | 厂商/产地 | 关键规格 | 参考价 | 备注 |
|
||||||
|
|------|-----------|----------|--------|------|
|
||||||
|
| **ATI Nano 系列** | ATI(美) | 0.5% 精度、硅应变片,计量级 | 可达 ~¥10 万/个 | 行业龙头、最高精度 |
|
||||||
|
| **Robotiq FT 300** | Robotiq(加) | 电容式、±300N/±30N·m、全数字 | 中端 | 高重复性而非高精度,UR 即插即用 |
|
||||||
|
| **坤维 Kunwei** | 坤维科技(中国) | 0.5% 精度对标 ATI,协作机器人市占率 >80% | ~¥2 万+ | 中国平替首选 |
|
||||||
|
| **宇立 SRI** | 宇立仪器(中国) | 9mm 全球最薄、汽车碰撞测试级 | 询价 | 中国平替,超薄/磨抛 |
|
||||||
|
| **鑫精诚 Forsentek/XJC** | 鑫精诚(中国) | 结构解耦、3C 起家、高性价比 | 较低 | 中国平替,成本敏感 |
|
||||||
|
|
||||||
|
### 14.9 推荐配置(面向多感官数据采集)
|
||||||
|
|
||||||
|
**配置 A —— 性能/生态优先(论文复现友好,推荐)**
|
||||||
|
|
||||||
|
- 触觉:**GelSight Mini ×1–2**(主力)+ 选配 **DIGIT** 装夹爪指尖
|
||||||
|
- 视觉/点云:**Intel RealSense D435i/D405**(近距)或 **ZED 2**(大场景)
|
||||||
|
- 温度:**FLIR Lepton/Boson** 模组
|
||||||
|
- 音频:专业**接触式麦克风**(撞击声)+ **ReSpeaker 麦阵**(环境声)
|
||||||
|
- 机械臂:**Franka Research 3**(关节力矩 + 1kHz 力控)
|
||||||
|
- 末端:**Robotiq 2F-85**(接触采集)或 **Allegro Hand**(灵巧采集)
|
||||||
|
- 力觉:**ATI Nano** 或 **坤维**(力控闭环保护触觉传感器)
|
||||||
|
- 同步:转台 + 标定板 + ROS2 时间同步/硬件触发
|
||||||
|
|
||||||
|
**配置 B —— 中国平替优先(成本可控,国产生态)**
|
||||||
|
|
||||||
|
- 触觉:**戴盟 DM-Tac / 纬钛 GF225**(视触觉)+ **帕西尼 / 他山**(多维力阵列)
|
||||||
|
- 视觉/点云:**Orbbec Gemini 335 / Femto Bolt**
|
||||||
|
- 温度:**艾睿 InfiRay / 海康微影 / 高德** 模组
|
||||||
|
- 音频:通用压电接触片 + 前置放大 + 国产麦阵
|
||||||
|
- 机械臂:**睿尔曼 RM65-B** 或 **JAKA/遨博**
|
||||||
|
- 末端:**因时 RH56 / LinkerHand / BrainCo Revo 2**
|
||||||
|
- 力觉:**坤维 / 宇立 / 鑫精诚**
|
||||||
|
|
||||||
|
### 14.10 采集与工程注意事项
|
||||||
|
|
||||||
|
- **力控保护**:视触觉凝胶易磨损(DM-Tac 标称 >500 万次按压),务必用力矩臂或六维力传感器限制接触力。
|
||||||
|
- **跨传感器一致性**:不同触觉传感器输出不可直接混用(VTV150K 跨 GelSight Mini/DIGIT/Tac3D 正是为此);若混采,需记录传感器型号并考虑 UniTouch/TLV-CoRe 式的跨传感器对齐。
|
||||||
|
- **多模态时间同步**:撞击声是**瞬时事件**,必须与触觉/视觉精确对齐(硬件触发优于软件时间戳)。
|
||||||
|
- **标定**:RGB-D 内外参、热像与可见光配准(MSX 式)、力传感器零偏,采集前都要标定。
|
||||||
|
- **数据规格对标**:想直接对接现有工作,可参考 ObjectFolder Real(网格+视频+撞击声+触觉)、TVL(视-触成对 + 语言标注)、VTV150K(视触觉视频 + 4 属性 + QA)的字段组织。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 15. 超声感知:测距与材质/厚度检测
|
||||||
|
|
||||||
|
> 本章把**超声(ultrasound)**作为一种独立的物体感知模态纳入综述。它的独特定位是:**主动发射声波、非接触、且能"穿透"到次表面**——正好补上视觉(怕遮挡/透明/暗光)与触觉(必须接触)的盲区,介于"被动听撞击声"和"主动接触"之间。
|
||||||
|
> 两个核心能力:① **测距(ranging)**——隔空测物体距离/轮廓;② **测厚与材质识别**——靠声速、声阻抗、回波结构反推材料厚度与种类。
|
||||||
|
|
||||||
|
### 15.0 为什么超声值得纳入多感官物体感知
|
||||||
|
|
||||||
|
- **非接触 + 不怕光**:超声靠声波而非光,全黑、强光、烟尘下都能工作,且**不受物体颜色/透明度影响**(玻璃、透明塑料这些视觉/红外的"硬骨头",超声照测不误)。
|
||||||
|
- **可探次表面**:声波能进入材料内部,从回波里读出**厚度、分层、内部缺陷**——这是纯表面模态(视觉、视触觉)做不到的。
|
||||||
|
- **材质判别的物理基础**:不同材质的**声速**和**声阻抗 Z=ρc**(密度×声速)不同,回波的到达时间与幅度因此携带材质信息。
|
||||||
|
- 与本综述其他模态互补:视觉给外观、触觉给接触面微观几何、撞击声给"敲击后"的材质线索,而**超声能在"接触之前"就隔空给出距离 + 材质预判**。
|
||||||
|
|
||||||
|
### 15.1 测距:脉冲回波 / 飞行时间(ToF)
|
||||||
|
|
||||||
|
原理极简:发射一个超声脉冲,测它碰到目标反射回来的**飞行时间(Time-of-Flight, ToF)**,距离 = 声速 × ToF ÷ 2。工程上常用**互相关(cross-correlation)**而非简单阈值来精确估计 ToF。
|
||||||
|
|
||||||
|
**传感器从"大块头"走向 MEMS 化**。传统压电换能器体积大、与空气声阻抗不匹配(需匹配层)。新一代 **MEMS 微机械超声换能器**有两类:
|
||||||
|
|
||||||
|
- **PMUT(压电式)**:低驱动电压、低功耗、与空气声阻抗匹配好、工艺成本低——是**空气中小型测距的主流**;缺点是窄带,空气中高分辨 3D 测距能力有限。
|
||||||
|
- **CMUT(电容式)**:带宽更好,但需要高 DC 偏压和亚微米间隙,限制了声功率与测距应用。
|
||||||
|
|
||||||
|
**商用代表:TDK Chirp(PMUT)**。把 PMUT + 超低功耗 SoC 封进 3.5×3.5mm 的微型封装:
|
||||||
|
|
||||||
|
- **CH101**:量程约 1.2m;**CH201**:量程达 5m;新一代 **ICU-10201/20201** 量程 5m、FOV 可配置。
|
||||||
|
- 亮点:毫米级精度、**不受光照/颜色/透明度影响**、大视场、**功耗约 15µA(比红外 ToF 低约 500 倍)**,片上自主运算可让主控休眠。非常适合**机器人避障、接近觉、液位检测**。
|
||||||
|
- 局限:PMUT 窄带、空气衰减限制远距离(小型超声一般 ≤5m),多径/连续波在极近距离误差大(可用多频脉冲 MFPW 缓解),盲区需靠宽带设计压缩(已有把盲区降到 ~4.4mm、±0.3mm 误差的研究)。
|
||||||
|
|
||||||
|
### 15.2 测厚与材质识别
|
||||||
|
|
||||||
|
#### 测厚(thickness gauging)
|
||||||
|
|
||||||
|
同样是 ToF:脉冲在材料里来回一趟,**厚度 = 声速 × ToF ÷ 2**。探头有三种主流形态:
|
||||||
|
|
||||||
|
- **单晶探头 + 延迟线(delay line)**:测**薄/高精度**材料;延迟线拉开发射与回波的时间间隔,避免太薄时回波分不开。
|
||||||
|
- **双晶探头(dual element,pitch-and-catch)**:一发一收成"V"形路径,对**腐蚀、粗糙面**信噪比更好,是腐蚀测厚主力。
|
||||||
|
- **回波-回波(echo-to-echo)/ 穿透涂层(THRU-COAT)**:用两次背壁回波的时间差测厚,从而**忽略涂层只测基材**;多层结构可用**去卷积(deconvolution)**分离各层厚度。
|
||||||
|
|
||||||
|
**EMAT(电磁声换能器)——免耦合剂的特殊路线**:靠线圈涡流 + 磁场在金属/铁磁体内**直接激发超声**(洛伦兹力或磁致伸缩),天然产生**水平剪切波(SH 波)**。优点是**无需耦合剂、可隔着油漆/氧化层/空气层、耐高温**(锅炉管在 >800°C 氧化层下仍可测),适合粗糙/高温/涂覆表面;缺点是频率低、对极薄/细分层分辨率受限、只能单晶、对点蚀检测弱、仪器更贵。
|
||||||
|
|
||||||
|
#### 材质识别(material characterization)
|
||||||
|
|
||||||
|
物理上:回波幅度由**界面两侧声阻抗失配**决定,声速因材质而异——把回波信号喂给模型即可分类材质。
|
||||||
|
|
||||||
|
### 15.3 前沿:超声 + 机器学习
|
||||||
|
|
||||||
|
非接触超声 + ML 做材质识别正成为视觉的有力补充(不怕暗光/烟尘):
|
||||||
|
|
||||||
|
- **经典 ML**:用经验模态分解(EMD)从回波提 16 维特征,喂 KNN / 决策树 / SVM,并配声学理论模型——显著提升机器人在黑暗/粉尘/危险环境下的材质识别。
|
||||||
|
- **深度学习**:如 **AE-CS-TCN** 直接从原始回波联合学习空间/时序/多尺度特征(含空间注意力 + 时序卷积 + 跨尺度融合 + 交叉注意力),在机器人平台上做可复现的材质识别。
|
||||||
|
- **双模态 / 实时**:一种同时测**接近距离 + 材质**的双模态超声系统对 13 种工业材料达 **98% 分类准确率**、测距误差 **<3mm**、毫秒级响应;也有**柔性超声传感阵列**兼顾接近觉与材质识别用于机器人安全控制。
|
||||||
|
- **多传感器数据集**:**MatSense2025**(超声 + 毫米波)面向材质分类、无损检测与传感器融合研究。
|
||||||
|
|
||||||
|
> 深入阅读:本节有一份独立深度子专题《超声+ML材质识别_深度子专题.md》,详细展开物理可分性、信号特征、模型方法谱系、机器人 pre-touch 应用、数据流水线与核心挑战(距离/角度/温度/跨传感器泛化)。
|
||||||
|
|
||||||
|
### 15.4 与多感官框架 / MultiPLY 的关系
|
||||||
|
|
||||||
|
把超声放进本综述的模态地图,它是一种**"主动声学探测"模态**:
|
||||||
|
|
||||||
|
- 与"听"(被动撞击声,ObjectFolder 的 AudioNet)相比,超声是**主动发射 + 接收**,可控、可隔空、可探内部;
|
||||||
|
- 与"触"相比,超声**无需接触**就能给出距离与材质预判,可作为接触前的"预探测",降低碰坏脆弱触觉凝胶的风险;
|
||||||
|
- 在 MultiPLY 式的具身 LLM 框架里,超声天然可成为一个新的**动作 token(如 `<probe>` 超声探测)+ 状态 token(回波/距离/材质特征)**,让智能体"先隔空扫一下再决定要不要去摸/敲"。
|
||||||
|
- 在数据采集装置里(见第 14 章),超声可作为**第五路传感通道**,尤其适合采集"透明/暗色/内部结构"这类视觉与视触觉都吃力的样本。
|
||||||
|
|
||||||
|
### 15.5 硬件选型:国际主流 vs 中国平替
|
||||||
|
|
||||||
|
超声硬件分两条线:**消费/机器人测距传感器**(避障、接近觉)与**工业测厚/无损检测(NDT)设备**。
|
||||||
|
|
||||||
|
**A. 测距 / 接近觉传感器(含 MEMS 超声 ToF)**
|
||||||
|
|
||||||
|
| 型号/品牌 | 厂商/产地 | 特点 | 备注 |
|
||||||
|
|-----------|-----------|------|------|
|
||||||
|
| **Chirp CH101 / CH201 / ICU 系列** | TDK(美/日) | PMUT MEMS ToF,3.5×3.5mm,1.2–5m,mm 级,15µA 超低功耗 | 机器人/无人机首选,生态新 |
|
||||||
|
| **车规/工业超声雷达** | Murata 村田(日) | 车载超声龙头,倒车雷达/避障 | 车规生态成熟 |
|
||||||
|
| **MB 系列** | MaxBotix(美) | 测距/液位/接近,OEM 友好 | 模块化易集成 |
|
||||||
|
| **UC/RU 系列** | Pepperl+Fuchs、SICK、Banner(欧美) | 工业级、IO-Link、可调声束 | 工业自动化标杆 |
|
||||||
|
| **AK2 超声雷达 / 材质识别 / 水下测距传感器** | 奥迪威 Audiowell(广东) | 国产超声传感器龙头,**已量产"材质识别传感器"与"水下测距传感器"**,车载与机器人布局 | 中国平替首选,与本主题高度契合 |
|
||||||
|
|
||||||
|
**B. 测厚仪 / 无损检测(NDT)设备与探头**
|
||||||
|
|
||||||
|
| 型号/品牌 | 厂商/产地 | 特点 | 备注 |
|
||||||
|
|-----------|-----------|------|------|
|
||||||
|
| **38DL PLUS / 39DL PLUS** | Evident(原 Olympus,日/美) | 测厚 0.08–635mm,单/双晶、THRU-COAT/回波-回波、高分辨 0.001mm | 行业标杆(39DL 为新款,含 Wi-Fi/蓝牙) |
|
||||||
|
| **便携测厚仪 / 探伤仪** | Dakota、Elcometer、Baker Hughes(欧美) | 腐蚀测厚、涂层穿透 | 工业常用 |
|
||||||
|
| **CTS 系列探伤仪 / CTS-409 EMAT 测厚** | 汕头超声 ST-NDT(广东) | "中国超声第一家",相控阵/3D 全聚焦/EMAT,免耦合剂电磁超声测厚 | 中国平替,NDT 全线 |
|
||||||
|
| **HS 系列探伤 / HS F91 EMAT 测厚 / HS P9s 笔式测厚** | 武汉中科创新(汉威 HS) | 数字探伤、电磁超声测厚、应力检测、自动化检测系统 | 中国平替,产品线全 |
|
||||||
|
|
||||||
|
### 15.6 局限与工程注意事项
|
||||||
|
|
||||||
|
- **耦合剂**:接触式压电测厚通常需耦合剂(凝胶/水);要免耦合剂选 EMAT(但分辨率、成本有代价)。
|
||||||
|
- **空气衰减与距离**:空气中高频超声衰减快,小型 MEMS 测距一般 ≤5m;测厚则是贴合/近场。
|
||||||
|
- **分辨率与盲区**:窄带 PMUT 分辨率有限,近距有盲区,需宽带设计或多频脉冲缓解。
|
||||||
|
- **难测目标**:强吸声(海绵/泡沫)、镜面斜反射、极薄涂层等会削弱回波。
|
||||||
|
- **温度影响声速**:声速随温度/介质变化,精密测距/测厚需做温度补偿与零点标定。
|
||||||
|
- **多径与串扰**:复杂场景多径反射会污染 ToF,阵列/编码波形/互相关可改善。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 来源(Sources)
|
||||||
|
|
||||||
|
- [ObjectFolder 1.0 (2109.07991)](https://arxiv.org/abs/2109.07991)
|
||||||
|
- [ObjectFolder 2.0 (2204.02389)](https://arxiv.org/abs/2204.02389)
|
||||||
|
- [ObjectFolder Benchmark/Real (2306.00956)](https://arxiv.org/abs/2306.00956)
|
||||||
|
- [VTV-LLM (2505.22566)](https://arxiv.org/abs/2505.22566)
|
||||||
|
- [Octopi (2405.02794)](https://arxiv.org/abs/2405.02794)
|
||||||
|
- [TVL (2402.13232)](https://arxiv.org/abs/2402.13232)
|
||||||
|
- [UniTouch (2401.18084)](https://arxiv.org/abs/2401.18084)
|
||||||
|
- [TLV (2403.09813)](https://arxiv.org/abs/2403.09813)
|
||||||
|
- [Touch100k (2406.03813)](https://arxiv.org/abs/2406.03813)
|
||||||
|
- [TLV-CoRe (2511.11512)](https://arxiv.org/abs/2511.11512)
|
||||||
|
- [Tactile-VLA (2507.09160)](https://arxiv.org/abs/2507.09160)
|
||||||
|
- [SSVTP (2209.13042)](https://arxiv.org/abs/2209.13042)
|
||||||
|
- [Touch and Go (2211.12498)](https://arxiv.org/abs/2211.12498)
|
||||||
|
- [TACTO (2012.08456)](https://arxiv.org/abs/2012.08456)
|
||||||
|
- [Taxim (2109.04027)](https://arxiv.org/abs/2109.04027)
|
||||||
|
- [DiffTactile (2403.08716)](https://arxiv.org/abs/2403.08716)
|
||||||
|
- [See, Hear, and Feel (2212.03858)](https://arxiv.org/abs/2212.03858)
|
||||||
|
- [MidasTouch (2210.14210)](https://arxiv.org/abs/2210.14210)
|
||||||
|
- [Impact Makes a Sound (2208.02680)](https://arxiv.org/abs/2208.02680)
|
||||||
|
|
||||||
|
硬件方案(第 14 节)来源:
|
||||||
|
- [GelSight Mini / DIGIT / Digit 360 官方](https://www.gelsight.com/)
|
||||||
|
- [Meta DIGIT 开源平台](https://digit.ml/)
|
||||||
|
- [ReSkin (2111.00071)](https://arxiv.org/abs/2111.00071)
|
||||||
|
- [XELA Robotics uSkin](https://www.xelarobotics.com/tactile-sensors)
|
||||||
|
- [帕西尼 PaXini 官网](https://paxini.com/)
|
||||||
|
- [因时机器人 Inspire-Robots 官网](https://www.inspire-robots.com/)
|
||||||
|
- [人形机器人触觉传感器国内供应商盘点(艾邦机器人)](https://www.aibangbots.com/a/4289)
|
||||||
|
- [深度相机选型(RealSense/ZED/Orbbec, SVRC 2026)](https://www.roboticscenter.ai/blog/best-depth-cameras-robotics)
|
||||||
|
- [Teledyne FLIR Lepton OEM 模组](https://oem.flir.com/products/lepton/)
|
||||||
|
- [InfiRay/FLIR/Seek 热像对比(Yole)](https://www.yolegroup.com/press-release/infiray-teledyne-flir-seek-thermal-the-ultimate-thermal-camera-comparison/)
|
||||||
|
- [Franka Research 3 官网](https://franka.de/franka-research-3)
|
||||||
|
- [机器人臂价格指南 2026(SVRC)](https://www.roboticscenter.ai/learn/robot-arm-pricing-2026)
|
||||||
|
- [Robotiq FT-300 力矩传感器](https://robotiq.com/products/ft-300-force-torque-sensor)
|
||||||
|
- [六维力传感器国产替代深度报告(东方财富)](https://pdf.dfcfw.com/pdf/H3_AP202404151630231635_1.pdf)
|
||||||
|
|
||||||
|
超声感知(第 15 节)来源:
|
||||||
|
- [TDK Chirp CH101 超声 ToF 传感器](https://invensense.tdk.com/en-us/news-media/press/tdk-announces-worldwide-availability-chirp-ch101-ultrasonic-tof-sensor-platform)
|
||||||
|
- [TDK SmartSonic 超声 ToF 产品总览](https://product.tdk.com/en/techlibrary/productoverview/smart-sonic-products.html)
|
||||||
|
- [PMUT 测距综述(PMC)](https://pmc.ncbi.nlm.nih.gov/articles/PMC9961946/)
|
||||||
|
- [超声测厚原理(Elcometer)](https://www.elcometer.com/en/how-do-ultrasonic-ndt-thickness-gauges-work)
|
||||||
|
- [EMAT 电磁超声测厚(Evident)](https://ims.evidentscientific.com/en/applications/thickness-boiler-tubes-emat-transducers)
|
||||||
|
- [Evident/Olympus 38DL PLUS 测厚仪](https://ims.evidentscientific.com/en/insights/the-38dl-plus-ultrasonic-thickness-gauge-is-an-asset-to-asset-reliability-inspections)
|
||||||
|
- [非接触超声回波 + 深度学习材质分类(ScienceDirect)](https://www.sciencedirect.com/science/article/pii/S1877050924007361)
|
||||||
|
- [机器人超声材质识别(Wiley)](https://onlinelibrary.wiley.com/doi/10.1155/2023/1998218)
|
||||||
|
- [双功能柔性超声阵列:接近觉+材质识别(Wiley)](https://onlinelibrary.wiley.com/doi/10.1002/rob.70225)
|
||||||
|
- [奥迪威 Audiowell 官网(含材质识别/水下测距传感器)](https://www.audiowell.net/)
|
||||||
|
- [汕头超声 ST-NDT 官网](https://www.st-ndt.com/)
|
||||||
|
- [武汉中科创新(汉威)官网](https://www.zkcx.com/)
|
||||||
@@ -0,0 +1,210 @@
|
|||||||
|
# 超声 + 机器学习 材质识别:深度子专题
|
||||||
|
|
||||||
|
> 定位:本篇是《多感官物体感知与触觉_方向综述.md》第 15 章"超声感知"的深化子专题,专注一个问题——**如何用超声回波 + 机器学习判别物体材质**。
|
||||||
|
> 面向研究者,覆盖:物理可分性来源 → 信号与特征 → 模型方法谱系 → 机器人/具身应用 → 数据与流水线 → 核心挑战 → 与多感官框架的关系 → 未来方向。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 问题定义与范围
|
||||||
|
|
||||||
|
**任务**:给定超声换能器对目标物体发射脉冲并接收回波(或穿透信号),用模型推断该物体的**材质类别**(金属/塑料/木头/玻璃/海绵/布料……)或**材质物理属性**(声阻抗、弹性模量、黏弹性、厚度、分层)。
|
||||||
|
|
||||||
|
按耦合方式与几何分三种典型设置:
|
||||||
|
|
||||||
|
- **接触式脉冲回波**:探头贴合(需耦合剂),信噪比高,常见于 NDT 测厚/探伤,可顺带材质表征。
|
||||||
|
- **非接触/空气耦合(air-coupled)脉冲回波**:探头隔空发射,最贴近"机器人隔空识材"的场景,但有严重阻抗失配(见 §2)。
|
||||||
|
- **穿透 / 隔容器(through-transmission / through-container)**:一发一收夹住样品,或贴在容器外壁识别内部液体。
|
||||||
|
|
||||||
|
本篇重点是**用 ML 把回波里的材质信息解码出来**,尤其是非接触场景(与机器人/具身最相关)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 为什么超声能区分材质:物理可分性来源
|
||||||
|
|
||||||
|
材质识别不是"黑盒玄学",它有清晰的物理基础。三个材质相关量决定了回波长什么样:
|
||||||
|
|
||||||
|
### 2.1 声阻抗 Z = ρc 与反射/透射
|
||||||
|
|
||||||
|
声阻抗 `Z = 密度 ρ × 声速 c`。声波在两种介质界面上,**反射比例由两侧声阻抗失配决定**:失配越大,反射越强、透射越少。所以**回波幅度直接编码了"目标相对周围介质的声阻抗"**——金属(高 Z)和塑料(低 Z)的回波强度天然不同。
|
||||||
|
|
||||||
|
### 2.2 声速 c 因材质而异
|
||||||
|
|
||||||
|
声速取决于材料的弹性模量与密度(`c ≈ √(模量/ρ)`)。这使得**飞行时间(ToF)/到达时刻**携带材质信息,也是测厚(厚度=c·ToF/2)的基础。声速与"储能模量"相关。
|
||||||
|
|
||||||
|
### 2.3 频率相关衰减(attenuation)
|
||||||
|
|
||||||
|
材料对超声的吸收/散射随频率上升而增大,且**不同材质衰减差异显著**:塑料/复合材料衰减远高于金属(例:聚丙烯、PVDF 在 300kHz 约 2 dB/cm、500kHz 约 5 dB/cm)。衰减与"能量耗散和散射"相关——于是**回波的频谱形状、包络衰减速率**成为强判别特征。
|
||||||
|
|
||||||
|
### 2.4 空气耦合的"双刃剑"
|
||||||
|
|
||||||
|
非接触时空气声阻抗极低,固/气界面**只透射约 1% 能量**,整条路径相比水耦合可多损耗约 100 dB。坏处是信噪比差;**好处是这个损耗本身强烈依赖材质**(金属比塑料损耗更高),反而成了判别线索。空气在 ~2MHz 以上吸收急剧上升,故空气耦合换能器多在该频率以下工作。导波(如 A0 Lamb 模态)的频散(速度随频率变化)则提供额外的材质指纹。
|
||||||
|
|
||||||
|
> 小结:**幅度(声阻抗)、到达时间(声速)、频谱/衰减(吸收散射)、频散(导波)**——这四类物理量就是 ML 模型要从回波里"读"出来的可分性来源。理解它们,才能设计对的特征与不变性。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 测什么信号 / 信号形态
|
||||||
|
|
||||||
|
最原始的单通道回波叫 **A-scan**(幅度 vs 时间)。从中可提三类表征:
|
||||||
|
|
||||||
|
- **时域**:ToF、首回波幅度、**包络(Hilbert 变换取 envelope)**、多次回波间隔、衰减速率。
|
||||||
|
- **频域**:功率谱、**衰减谱**(不同频率的损耗)、共振峰、谱质心。
|
||||||
|
- **时频域**:STFT 频谱图(spectrogram)、**小波/小波包系数**——兼顾"何时"与"何频",适合非平稳回波。
|
||||||
|
|
||||||
|
采集模式:脉冲回波(同侧)、穿透法(两侧)、隔容器(贴外壁,靠"壁后是否有液体改变反射系数"判别液体)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 特征工程 vs 端到端:两条技术路线
|
||||||
|
|
||||||
|
### 4.1 手工特征 + 经典 ML
|
||||||
|
|
||||||
|
传统做法是先用信号处理提特征,再喂经典分类器:
|
||||||
|
|
||||||
|
- **EMD/IMF 特征**:经验模态分解得本征模态函数,提 16 维特征向量,喂 KNN/决策树/SVM;并配声学理论模型。显著提升机器人在**黑暗/粉尘/危险环境**下的材质识别能力。
|
||||||
|
- **小波/小波包**:对非平稳回波提时频特征;衰减相关的连续小波变换(CWT)可区分不同热处理/硬度的钢。
|
||||||
|
- **FFT + PCA 降维**:在频域提特征再降维,维持精度。
|
||||||
|
- **统计/谱特征**:均值、方差、谱质心、过零率等。
|
||||||
|
|
||||||
|
经典分类器:**SVM(含 wavelet+SVM、EMD+SVM)、KNN、随机森林、决策树、Fuzzy ARTMAP**。
|
||||||
|
|
||||||
|
### 4.2 端到端深度学习
|
||||||
|
|
||||||
|
直接吃原始回波(或包络/频谱图),让网络自动学特征。**已被证明优于手工特征**:一项工作把 FFT/小波手工特征与 CNN 自动特征对比,CNN 端到端达 **0.982** 准确率,超过手工特征分类器。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 模型方法谱系与代表结果
|
||||||
|
|
||||||
|
| 方法 | 输入 | 任务/材料 | 结果 | 出处 |
|
||||||
|
|------|------|-----------|------|------|
|
||||||
|
| **1D-CNN**(Hilbert 包络) | 原始回波包络 | 玻璃/木/金属/海绵/布 5 类 | 准确率 96%、F1 95% | 非接触超声回波材质分类(Procedia CS 2024) |
|
||||||
|
| **CNN vs 手工特征** | 原始信号 / FFT / 小波 | 超声信号分类 | CNN 端到端 0.982,胜手工特征 | Automated Classification via CNN(MDPI 2022) |
|
||||||
|
| **DCNN + 小波 + SVM 顶层** | 小波系数 | 复合材料超声信号 | 紧凑表示 + 线性 SVM 分类 | Composite materials via DCNN(Neurocomputing 2017) |
|
||||||
|
| **AE-CS-TCN**(注意力+时序卷积+跨尺度融合+交叉注意力) | 原始回波 | 机器人材质识别 | 联合学空间/时序/多尺度特征,机器人平台验证 | 非接触超声回波+DL(Signal Processing 2025) |
|
||||||
|
| **EMD + SVM/KNN/决策树** | 16 维 IMF 特征 | 多材质 | 提升暗/尘/危险环境识别 | EMD+经典 ML |
|
||||||
|
| **双模态超声系统** | 接近 + 材质 | 13 种工业材料 | **98% 分类、测距误差 <3mm**、毫秒级 | 双模态接近+材质 |
|
||||||
|
| **柔性超声阵列** | 阵列回波 | 接近觉 + 材质 | 机器人安全控制 | 双功能柔性超声阵列(J. Field Robotics) |
|
||||||
|
| **NN on 脉冲回波 / TOFD** | A-scan | 缺陷/状态分类 | 脉冲回波 72.5%、TOFD 77.5%,预处理后 TOFD→97.5% | ML 综述(J. Mech. Eng. 2025) |
|
||||||
|
|
||||||
|
**趋势**:从"手工特征 + SVM" → "1D-CNN 端到端" → "时序卷积 / 多尺度 / 注意力(TCN、AE-CS-TCN)",并向**多模态融合**(超声 + 毫米波 + 视觉)演进。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 机器人与具身应用:把"识材"用起来
|
||||||
|
|
||||||
|
材质识别在机器人里最有价值的位置是 **pre-touch(预触觉)**——比远距视觉近、比接触触觉远,在"接触前的最后几厘米"给出几何 + 材质信息,避免接触触觉碰飞轻物、避免视觉对透明/暗光失效。
|
||||||
|
|
||||||
|
代表性工作(声学/超声 + 机器人):
|
||||||
|
|
||||||
|
- **非接触超声回波 + DL 预触识材**:在配自研超声模块的机器人平台上,直接从原始回波联合学空间/时序/多尺度特征,做接触前材质识别(AE-CS-TCN)。
|
||||||
|
- **Active Acoustic Sensing for Robot Manipulation**([2308.01600](https://arxiv.org/abs/2308.01600)):振动作动器 + 压电麦克风,利用**物体共振**(与材质/形状/内部结构/接触状态相关)感知;**对光照与自遮挡不敏感**,把局部接触与全局状态(形状、材质、抓取点、内部变化、外部接触)联系起来。
|
||||||
|
- **SonicSense**([2406.17932](https://arxiv.org/abs/2406.17932)):从**手内声学振动**做物体感知(材质/几何),展示接触式声学感知的丰富信息。
|
||||||
|
- **Acoustic Sensing for Universal Jamming Grippers**([2603.00351](https://arxiv.org/abs/2603.00351)):把声学感知用于颗粒阻塞夹爪。
|
||||||
|
- **预抓取光谱夹爪**([2207.00942](https://arxiv.org/abs/2207.00942)):非超声但同思路——夹爪集成光谱,递归 SVM 在接近过程中逐步提升材质判别置信度。
|
||||||
|
- **"海螺效应" pre-touch**:检测手指接近物体时**环境声共振频率漂移**,兼具测距与材质选择性。
|
||||||
|
|
||||||
|
工业/场景应用:
|
||||||
|
|
||||||
|
- **NDT**:缺陷探测 + 材质/微结构表征(热处理、硬度、焊缝)。
|
||||||
|
- **隔容器液体识别**:贴容器外壁,靠**声速、衰减、密度、频率相关吸收**与"壁后反射系数"识别内部液体/混合状态(蜂蜜-水、面糊混合的"是否混匀"分类)。
|
||||||
|
- **油气测井**:CNN 把声阻抗信号翻译成套管环空类型。
|
||||||
|
- **分拣/回收、农业、食品**:非接触识材用于不透明系统的实时在线检测。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 数据与实验流水线
|
||||||
|
|
||||||
|
一条可复现的"超声 + ML 识材"流水线:
|
||||||
|
|
||||||
|
1. **硬件**(呼应综述第 14/15 章):空气耦合换能器 / MEMS PMUT(如 TDK Chirp)/ 压电探头;可加阵列或多频。匹配层(气凝胶、PVDF、1-3 复合压电)对空气耦合信噪比至关重要。
|
||||||
|
2. **数据采集**:**严格控制并记录距离、入射角、表面朝向、温度**(这些都会混入回波——见 §8);用转台/导轨系统化扫描;每材质多样本多姿态。
|
||||||
|
3. **预处理**:时间门控(gating)截取目标回波、去噪、**Hilbert 取包络**、幅度/能量归一化(抑制距离影响)。
|
||||||
|
4. **特征 / 输入**:原始 A-scan、包络、频谱、或频谱图/小波系数(喂 2D-CNN)。
|
||||||
|
5. **数据增强**:加噪、时移、幅度扰动、距离/角度合成。
|
||||||
|
6. **模型与评估**:经典(SVM/RF)做基线,DL(1D-CNN/TCN/2D-CNN-spectrogram)做主力;务必做**留一材质/留一距离/留一传感器**的泛化评估,而非随机划分。
|
||||||
|
7. **数据集**:公开的 **MatSense2025**(超声 + 毫米波多传感器,面向材质分类/NDT/传感器融合)可作起点;多数工作仍自采,缺乏统一基准。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 核心挑战(这是"更深"的关键)
|
||||||
|
|
||||||
|
超声识材在论文里准确率漂亮,但落地难,难在**回波把材质和一堆干扰因素纠缠在一起**:
|
||||||
|
|
||||||
|
- **距离依赖**:回波幅度随传播距离衰减,模型容易把"距离"误学成"材质"。需幅度归一化、距离不变特征或显式建模距离。
|
||||||
|
- **角度/朝向/形状混淆**:曲面、斜入射改变回波结构,**几何与材质强耦合**——同一材质不同形状回波差异可能大于不同材质。
|
||||||
|
- **表面粗糙度散射**:粗糙面散射使回波弥散,干扰频谱特征。
|
||||||
|
- **温度漂移**:声速随温度变化,精密任务需温度补偿。
|
||||||
|
- **跨传感器/跨频率泛化**:不同换能器、频率、带宽输出不可直接迁移(与触觉领域"跨传感器泛化"难题同源)。
|
||||||
|
- **难测材质**:强吸声(海绵/泡沫)回波弱、镜面斜反射丢信号、极薄/多层结构难分辨。
|
||||||
|
- **空气耦合低信噪比**:~1% 透射 + 空气高频吸收,远距更糟。
|
||||||
|
- **对未见材质泛化与可解释性**:闭集分类易、开集/未见材质难;模型决策与物理量(Z、衰减)的对应需可解释性支撑。
|
||||||
|
- **数据稀缺与缺基准**:公开数据集少、采集条件不统一,难横向比较;sim2real(声学仿真到真实)尚不成熟。
|
||||||
|
|
||||||
|
> 一句话:**让模型学"材质本身"而非"采集条件",是这个方向真正的难点。** 距离/角度/温度/传感器不变的表示学习,是落地的关键。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 与多感官框架 / MultiPLY 的关系
|
||||||
|
|
||||||
|
- **互补定位**:超声识材是**接触前、非接触、可探次表面**的声学模态,补视觉(透明/暗光/遮挡)与触觉(须接触)的盲区,且比被动撞击声更可控(主动发射)。
|
||||||
|
- **作为 pre-touch 决策**:在 MultiPLY 式具身 LLM 里,可设 `<probe>`(超声探测)动作 token 与"回波/距离/材质"状态 token,让智能体"先隔空扫一下材质,再决定要不要去摸/敲/抓"。
|
||||||
|
- **多模态融合**:超声(材质/距离)+ 毫米波(穿透/距离)+ 视觉(外观)+ 视触觉(接触面)+ 撞击声(敲击后材质)天然互补;MatSense2025 的"超声+毫米波"即此思路。
|
||||||
|
- **表示学习借鉴**:可借鉴触觉领域 UniTouch/TLV 的"跨传感器对齐"与"绑定到视觉/语言",做**声学材质表示 → 对齐视觉/语言**,从而零样本识材或用语言描述材质。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 未来方向
|
||||||
|
|
||||||
|
- **跨距离/跨角度/跨传感器不变表示**:用对比学习/域泛化把"材质本质"与"采集条件"解耦。
|
||||||
|
- **声学材质基础模型**:大规模多材质、多传感器、多距离数据上自监督预训练,做可迁移的超声材质 encoder。
|
||||||
|
- **多模态融合与对齐**:超声 + 毫米波 + 视觉 + 触觉 + 语言的统一材质表示。
|
||||||
|
- **可微声学仿真 + sim2real**:用可微/物理仿真造数据并做真实标定,缓解数据稀缺。
|
||||||
|
- **面向具身的 pre-touch 策略**:把"何时探、探哪里、探完怎么决策"做成可学习的主动感知策略(接入 VLA/具身 LLM)。
|
||||||
|
- **开集与可解释**:开放材质识别 + 把模型决策映射回声阻抗/衰减等物理量。
|
||||||
|
- **统一基准**:建立公开、标准化、含干扰因素标注的超声材质识别 benchmark。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 参考与资源
|
||||||
|
|
||||||
|
### 机器人 / 具身声学感知
|
||||||
|
- Active Acoustic Sensing for Robot Manipulation<https://arxiv.org/abs/2308.01600>
|
||||||
|
- SonicSense: Object Perception from In-Hand Acoustic Vibration<https://arxiv.org/abs/2406.17932>
|
||||||
|
- Acoustic Sensing for Universal Jamming Grippers<https://arxiv.org/abs/2603.00351>
|
||||||
|
- Pregrasp Object Material Classification with Integrated Spectroscopy<https://arxiv.org/abs/2207.00942>
|
||||||
|
|
||||||
|
### 超声回波 + ML 材质/信号分类
|
||||||
|
- Material Classification based on Non-contact Ultrasonic Echo Signal Using Deep Learning (1D-CNN, 96%)<https://www.sciencedirect.com/science/article/pii/S1877050924007361>
|
||||||
|
- A non-contact material recognition method using ultrasonic echo signals and deep learning (AE-CS-TCN, 2025)<https://www.sciencedirect.com/science/article/abs/pii/S0165168425005249>
|
||||||
|
- Automated Classification of Ultrasonic Signal via CNN (0.982, MDPI 2022)<https://www.mdpi.com/2076-3417/12/9/4179>
|
||||||
|
- Ultrasonic signal classification for composite materials via deep CNN (Neurocomputing 2017)<https://www.sciencedirect.com/science/article/abs/pii/S0925231217301522>
|
||||||
|
- Surrounding Object Material Detection and Identification for Robots Based on Ultrasonic Echo (Wiley 2023)<https://onlinelibrary.wiley.com/doi/10.1155/2023/1998218>
|
||||||
|
- Dual-Functional Flexible Ultrasonic Sensor Array: Proximity + Material Recognition (J. Field Robotics)<https://onlinelibrary.wiley.com/doi/10.1002/rob.70225>
|
||||||
|
- Machine learning in ultrasonics-based defect detection and material characterization: a review (2025)<https://journals.sagepub.com/doi/10.1177/16878132251347390>
|
||||||
|
|
||||||
|
### 物理与空气耦合
|
||||||
|
- Review of air-coupled ultrasonic materials characterization (Ultrasonics)<https://www.sciencedirect.com/science/article/abs/pii/S0041624X14000377>
|
||||||
|
- Air-coupled Ultrasound – A Millennial Review<https://www.ndt.net/article/wcndt00/papers/idn507/idn507.htm>
|
||||||
|
|
||||||
|
### 数据集
|
||||||
|
- MatSense2025: Multi-Sensor Dataset of Ultrasonic and mmWave for Material Classification<https://ieee-dataport.org/documents/multi-sensor-dataset-ultrasonic-and-mmwave-material-classification-matsense2025>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 来源(Sources)
|
||||||
|
|
||||||
|
- [非接触超声回波 1D-CNN 材质分类 (Procedia CS 2024)](https://www.sciencedirect.com/science/article/pii/S1877050924007361)
|
||||||
|
- [超声回波 + 深度学习材质识别 AE-CS-TCN (Signal Processing 2025)](https://www.sciencedirect.com/science/article/abs/pii/S0165168425005249)
|
||||||
|
- [CNN 自动分类超声信号 0.982 (MDPI Applied Sciences 2022)](https://www.mdpi.com/2076-3417/12/9/4179)
|
||||||
|
- [复合材料超声信号 DCNN (Neurocomputing 2017)](https://www.sciencedirect.com/science/article/abs/pii/S0925231217301522)
|
||||||
|
- [机器人超声回波材质识别 (Wiley 2023)](https://onlinelibrary.wiley.com/doi/10.1155/2023/1998218)
|
||||||
|
- [双功能柔性超声阵列:接近+材质 (Wiley J. Field Robotics)](https://onlinelibrary.wiley.com/doi/10.1002/rob.70225)
|
||||||
|
- [超声 ML 缺陷检测与材质表征综述 (2025)](https://journals.sagepub.com/doi/10.1177/16878132251347390)
|
||||||
|
- [Active Acoustic Sensing for Robot Manipulation (2308.01600)](https://arxiv.org/abs/2308.01600)
|
||||||
|
- [SonicSense (2406.17932)](https://arxiv.org/abs/2406.17932)
|
||||||
|
- [Acoustic Sensing for Universal Jamming Grippers (2603.00351)](https://arxiv.org/abs/2603.00351)
|
||||||
|
- [Pregrasp Material Classification with Spectroscopy (2207.00942)](https://arxiv.org/abs/2207.00942)
|
||||||
|
- [空气耦合超声材质表征综述 (Ultrasonics)](https://www.sciencedirect.com/science/article/abs/pii/S0041624X14000377)
|
||||||
|
- [Air-coupled Ultrasound 综述 (NDT.net)](https://www.ndt.net/article/wcndt00/papers/idn507/idn507.htm)
|
||||||
|
- [MatSense2025 数据集 (IEEE DataPort)](https://ieee-dataport.org/documents/multi-sensor-dataset-ultrasonic-and-mmwave-material-classification-matsense2025)
|
||||||
@@ -0,0 +1,203 @@
|
|||||||
|
# 连续(非 Token)模型:面向空间与时间的模型与理论
|
||||||
|
|
||||||
|
> 主题:不把世界切成离散 token / 网格,而是用**连续函数 / 连续动力学**来建模——尤其针对**空间**与**时间**。
|
||||||
|
> 覆盖四大家族:① 连续空间表示(神经场)② 连续时间动力学(Neural ODE 族)③ 算子学习 / 物理时空(Neural Operator)④ 非 Token 预测架构 / 世界模型(JEPA 族)。
|
||||||
|
> 面向研究者;与本目录 world-model / 具身 / 多感官研究相呼应。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 动机:为什么要"非 Token、连续"
|
||||||
|
|
||||||
|
主流大模型(Transformer/LLM)的范式是**离散化**:把图像切 patch、把序列切 token、把空间切体素网格,再在离散符号上做注意力。这种"tokenization"在语言上极成功,但对**连续的物理世界(空间几何、时间演化)**有几处先天不适:
|
||||||
|
|
||||||
|
- **分辨率受限 / 网格伪影**:体素/像素网格的精度被离散步长锁死,内存随分辨率立方增长。
|
||||||
|
- **丢失连续性与导数**:物理信号常以微分方程定义,token 化难以表达"在任意点的值及其空间/时间导数"。
|
||||||
|
- **不规则采样难处理**:真实传感器是异步、非均匀采样的,离散步进模型(RNN/Transformer)天然假设等间隔。
|
||||||
|
- **重建无关细节的浪费**:像素级生成式模型被迫预测大量与任务无关的高频细节。
|
||||||
|
|
||||||
|
**连续模型**的共同主张:**用一个神经网络去参数化一个连续对象**——空间上的场 `f(x)`、时间上的轨迹 `dz/dt = f(z,t)`、函数空间之间的算子 `G: a(·)↦u(·)`、或抽象潜在空间里的预测。由此获得**分辨率无关、可微(可取导数)、能处理不规则采样、可嵌入物理先验**等好处。
|
||||||
|
|
||||||
|
> 一句话:**Token 把世界离散成符号;连续模型把世界参数化成函数与流。**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 总览:四大家族一张图
|
||||||
|
|
||||||
|
```
|
||||||
|
"用神经网络参数化一个连续对象"
|
||||||
|
┌──────────────┬───────────────┬────────────────┬──────────────────┐
|
||||||
|
│ ① 连续空间 │ ② 连续时间 │ ③ 算子学习 │ ④ 非Token预测 │
|
||||||
|
│ 神经场 │ 动力学 │ /物理时空 │ /世界模型 │
|
||||||
|
│ f(x)=值 │ dz/dt=f(z,t) │ G:a(·)↦u(·) │ 在潜在空间预测 │
|
||||||
|
│ NeRF/SIREN │ Neural ODE │ FNO/DeepONet │ JEPA/V-JEPA2 │
|
||||||
|
│ DeepSDF/GS │ CDE/SDE/LTC │ PINN/算子 │ DINO-WM │
|
||||||
|
│ 空间连续 │ 时间连续 │ 函数空间连续 │ 表示空间连续 │
|
||||||
|
└──────────────┴───────────────┴────────────────┴──────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
四者的"连续"作用在不同对象上:①空间坐标 → ②时间 → ③整个函数(输入/输出都是函数)→ ④抽象表示空间。下面逐一展开。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 家族一:连续空间表示 / 神经场(Neural Fields / INR)
|
||||||
|
|
||||||
|
**核心思想**:用一个 MLP 把**连续坐标**映射到**信号值**——`f_θ(x, y, z, [方向/时间]) → (颜色/密度/占据/距离…)`。物体/场景不再存成网格,而是存成"网络权重",可在任意分辨率查询。
|
||||||
|
|
||||||
|
代表工作:
|
||||||
|
|
||||||
|
- **Occupancy Networks**(CVPR 2019,[1812.03828](https://arxiv.org/abs/1812.03828)):把形状表示为连续**占据概率函数** `o(x)∈[0,1]`,无限分辨率、内存友好。
|
||||||
|
- **DeepSDF**(CVPR 2019,[1901.05103](https://arxiv.org/abs/1901.05103)):学习连续**有符号距离函数(SDF)**,零等值面即表面;用 latent code 表示一整类形状。
|
||||||
|
- **SIREN**(NeurIPS 2020,[2006.09661](https://arxiv.org/abs/2006.09661)):用**周期激活函数(sin)**的 MLP 表示连续可微信号,关键性质是**任意阶导数仍是 SIREN**(sin 的导数是 cos),因此特别适合表示信号的空间/时间导数、求解 Eikonal/Poisson/Helmholtz/波动等 PDE。
|
||||||
|
- **NeRF**(ECCV 2020,[2003.08934](https://arxiv.org/abs/2003.08934)):把 3D 场景表示为连续**辐射场** `(x,方向)→(颜色,密度)`,配可微体渲染做新视角合成;引爆了"神经场"研究。
|
||||||
|
- **3D Gaussian Splatting**(SIGGRAPH 2023,[2308.04079](https://arxiv.org/abs/2308.04079)):把场景表示为一堆各向异性 3D 高斯(显式、可栅格化),实时渲染。它**保留了连续体积辐射场的优良性质,却用显式基元规避空白区计算**——是"连续 vs 显式"张力的代表性折中。
|
||||||
|
- **动态/4D 扩展**:把空间场再加时间轴。如 **D-NeRF**([2011.13961](https://arxiv.org/abs/2011.13961))用形变场建模动态场景;**NeRFPlayer**([2210.15947](https://arxiv.org/abs/2210.15947))按静态/形变/新增区域分解 4D 时空;**4D Gaussian Splatting**(CVPR 2024)把 3DGS 扩到动态。
|
||||||
|
|
||||||
|
> 与本目录研究的连接:**ObjectFolder**(多感官物体数据集,见《多感官…综述》)正是用**隐式神经场**(VisionNet/AudioNet/TouchNet)表示视/听/触——它就是"神经场 + 多感官"的典范。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 家族二:连续时间动力学(Neural ODE 族)
|
||||||
|
|
||||||
|
**核心思想**:不再堆叠离散层 / 离散时间步,而是把隐状态的**演化**写成微分方程,用 ODE 求解器积分——**深度/时间变成连续变量**。
|
||||||
|
|
||||||
|
代表工作:
|
||||||
|
|
||||||
|
- **Neural ODE**(NeurIPS 2018,[1806.07366](https://arxiv.org/abs/1806.07366)):把隐状态导数参数化为网络 `dh/dt = f_θ(h,t)`,用黑盒 ODE 求解器前向、**伴随法(adjoint)**反传;常数内存、可在精度与速度间权衡。是"连续深度"的奠基。
|
||||||
|
- **Latent ODE / ODE-RNN**(NeurIPS 2019,[1907.03907](https://arxiv.org/abs/1907.03907)):编码器(RNN/GRU)得初始潜状态,再用 Neural ODE 在潜空间演化——**天然处理不规则采样时间序列**,可在任意时刻插值/预测。
|
||||||
|
- **Neural CDE**(NeurIPS 2020,[2005.08926](https://arxiv.org/abs/2005.08926)):Neural ODE 的解只由初值决定、无法吸收后续观测;CDE 用"受控微分方程"让轨迹**持续响应到来的数据流**,是"连续时间 RNN",擅长部分观测/不规则多元时间序列。
|
||||||
|
- **Neural SDE**:加入随机项,做生成式建模与不确定性量化。
|
||||||
|
- **Liquid Time-Constant Networks(LTC)**(AAAI 2021,[2006.04439](https://arxiv.org/abs/2006.04439)):连续时间、时间常数可变的 ODE-RNN,稳定有界、表达力强,时间序列预测表现好。
|
||||||
|
- **CfC(Closed-form Continuous-time)**([2106.13898](https://arxiv.org/abs/2106.13898)):给出 LTC 的**闭式解**,**无需 ODE 求解器**即可推理,大幅提速;训练好的 LTC 可"编译"为 CfC。
|
||||||
|
- **S4 / 结构化状态空间**(ICLR 2022,[2111.00396](https://arxiv.org/abs/2111.00396)):底层是**连续时间状态空间模型** `dx/dt=Ax+Bu, y=Cx+Du`,再离散化;以低秩修正稳定对角化高效计算,擅长超长程依赖(首个攻克 Path-X 16k)。其后继 **Mamba** 引入选择性机制——可视为"连续时间 SSM"到现代序列模型的桥梁。
|
||||||
|
|
||||||
|
> 直觉:ResNet 是 Neural ODE 的离散欧拉近似;RNN 是连续时间动力学的离散采样。连续时间模型把这些"步数"还给了微积分。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 家族三:算子学习 / 物理时空(Neural Operators)
|
||||||
|
|
||||||
|
**核心思想**:前两家族学的是"函数"(坐标→值)或"轨迹",而算子学习直接学**函数到函数的映射**(无穷维 → 无穷维),即 PDE 的**解算子** `G: 参数/初值/边界函数 a(·) ↦ 解函数 u(·)`。关键性质是**离散无关(mesh-independent)**:训练后可在任意网格/分辨率上评估,零样本超分辨。
|
||||||
|
|
||||||
|
代表工作:
|
||||||
|
|
||||||
|
- **PINN(物理信息神经网络)**(Raissi 等 2017,[1711.10561](https://arxiv.org/abs/1711.10561);JCP 2019):把 PDE 残差作为损失约束,让网络在满足数据的同时**遵守物理定律**;分连续时间与离散时间两类。局限:换参数/初值要重训(学的是"某一个解"而非"算子")。
|
||||||
|
- **DeepONet**([1910.03193](https://arxiv.org/abs/1910.03193);Nature MI 2021):基于**算子万能逼近定理**,用 **branch 网(编码输入函数在传感点的采样)+ trunk 网(编码输出位置)**学非线性算子;可一次学一族 PDE。
|
||||||
|
- **FNO(傅里叶神经算子)**(ICLR 2021,[2010.08895](https://arxiv.org/abs/2010.08895)):把积分核**直接在傅里叶空间参数化**(FFT→低频模态线性变换→逆 FFT),高效捕捉非局部相关;首个零样本超分辨建模湍流,比传统求解器快达三个数量级。FNO-3D 直接在"空间×时间"上做卷积。
|
||||||
|
- **变体生态**:Geo-FNO([2207.05209](https://arxiv.org/abs/2207.05209),复杂几何)、Graph/Multipole Neural Operator、L-DeepONet(潜空间)、通用 Neural Operator 理论框架等。
|
||||||
|
|
||||||
|
> 与本目录的连接:算子学习是**可微物理仿真 / 世界模型的"物理引擎"候选**——比如把流体/接触动力学学成一个快速可微算子,正好契合具身世界模型对"快而准的动力学预测"的需求。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 家族四:非 Token 预测架构 / 世界模型(JEPA 族)
|
||||||
|
|
||||||
|
**核心思想**:不在像素/token 层面重建,而是**在抽象表示(潜在)空间里做预测**——预测"被遮挡/未来部分的表示",从而聚焦高层本质、忽略不可预测的无关细节。这是 LeCun 对"自主机器智能"的核心主张。
|
||||||
|
|
||||||
|
代表工作:
|
||||||
|
|
||||||
|
- **LeCun《A Path Towards Autonomous Machine Intelligence》**(2022,立场论文):提出以**世界模型**为核心的认知架构蓝图,JEPA 作为其世界模型模块;理论上可视为在**表示空间上的能量模型(EBM)**。
|
||||||
|
- **I-JEPA**(CVPR 2023,[2301.08243](https://arxiv.org/abs/2301.08243)):图像版——从可见 patch 的表示预测被遮挡区域的**表示**(而非像素);高效且表征强(632M ViT,16×A100,<72h,ImageNet 低样本 SOTA)。
|
||||||
|
- **V-JEPA**(2024):视频版,特征预测学习视频表示。
|
||||||
|
- **V-JEPA 2**(2025,[2506.09985](https://arxiv.org/abs/2506.09985)):在 >100 万小时视频上自监督预训练**动作无关**的视频世界模型,再用极少机器人交互数据(<62h Droid)训练**动作条件预测器 V-JEPA 2-AC**,在 MPC 框架下做**零样本机器人规划**(抓取/搬运成功率显著超过 VLA 基线 Octo)。这是 JEPA 从"表示学习"走向"可规划世界模型"的关键一步。
|
||||||
|
- **DINO-WM**(ICML 2025,[2411.04983](https://arxiv.org/abs/2411.04983)):在 **DINOv2 预训练 patch 特征**的连续潜空间里建模动态、预测未来潜表示(不重建像素),用 CEM 做零样本规划;在迷宫/推物等任务零样本求解。
|
||||||
|
- **seq-JEPA**([2505.03176](https://arxiv.org/abs/2505.03176)):把 JEPA 与序列处理归纳偏置结合,同时学等变与不变表示。
|
||||||
|
|
||||||
|
> 注意:JEPA 的"连续"指的是**在连续/稠密的表示空间里预测**(非离散 token、非像素重建),与前三家族的"空间/时间连续"是不同维度上的"非 Token"。它与具身世界模型(V-JEPA 2、DINO-WM)直接相关。
|
||||||
|
|
||||||
|
**相关的连续生成线**:**Flow Matching**(ICLR 2023,[2210.02747](https://arxiv.org/abs/2210.02747))用连续归一化流(CNF)学连续概率路径的向量场,是扩散的连续时间推广——常作为连续潜在世界模型/生成式动力学的训练工具。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 理论主线:四家族其实在说同一件事
|
||||||
|
|
||||||
|
把四者放在一起,能看到一条统一线索——**把"离散堆叠/网格"替换为"连续数学对象 + 神经参数化"**:
|
||||||
|
|
||||||
|
- **微分方程视角**:ResNet ≈ Neural ODE 的离散欧拉步;RNN ≈ 连续时间动力学的采样;S4/Mamba 底层是连续时间 SSM 的离散化。**深度与时间都可连续化**。
|
||||||
|
- **函数 / 场视角**:神经场把"信号"看成坐标的连续函数;算子学习把"映射"看成函数空间之间的连续算子。SIREN 既是神经场又能解 PDE,**正好是家族①与③的交汇**。
|
||||||
|
- **物理先验视角**:PINN 把 PDE 写进损失;FNO/DeepONet 把 PDE 解算子学出来;SIREN/神经场天然可微以满足 PDE——三者都在**让网络尊重连续物理**。
|
||||||
|
- **预测目标视角**:JEPA 把"预测"从像素/token 移到连续表示空间——**用连续表示而非离散符号做世界建模**。
|
||||||
|
- **可微性这条暗线**:连续 ⇒ 可取导数 ⇒ 可做梯度规划、可嵌物理约束、可微仿真。这是它们对**世界模型 / 控制 / 科学计算**特别有吸引力的根本原因。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 与你的研究(world model / 具身 / 多感官)的关系
|
||||||
|
|
||||||
|
- **连续世界模型已成主流候选**:V-JEPA 2、DINO-WM 证明"在连续潜空间预测 + 规划"可做零样本机器人控制——这正是 MultiPLY 式具身智能体可借鉴的"非 token、可规划"路线。
|
||||||
|
- **神经场 = 多感官物体的连续容器**:ObjectFolder 的隐式神经表示就是神经场;超声/触觉/声场都可用连续场建模(连续而非逐点采样)。
|
||||||
|
- **连续时间 = 多模态异步融合的天然工具**:视/触/听/超声采样率不同、异步到达,Neural CDE/Latent ODE 能在连续时间轴上对齐与融合不规则采样的多感官流。
|
||||||
|
- **算子学习 = 具身世界模型的物理引擎**:接触动力学、声波传播(超声/撞击声)都可学成可微算子,用于快速预测与规划。
|
||||||
|
- **可微贯穿全栈**:连续表示让"感知→预测→规划"可端到端求导,契合具身闭环。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 连续 vs Token:权衡与开放问题
|
||||||
|
|
||||||
|
**连续模型的优势**:分辨率无关、可微、可取导数、处理不规则采样、嵌入物理先验、表示紧凑、避免重建无关细节。
|
||||||
|
|
||||||
|
**代价与开放问题**:
|
||||||
|
|
||||||
|
- **训练/推理成本**:ODE 求解器慢(CfC 用闭式解缓解);神经场逐场景优化慢(GS 用显式基元加速)。
|
||||||
|
- **可扩展性与工程生态**:Token/Transformer 有成熟的硬件与扩展规律(scaling laws),连续模型的大规模扩展与稳定训练仍在早期(JEPA 易表示坍塌、需 EMA/复杂损失)。
|
||||||
|
- **离散 vs 连续的回摆**:3D Gaussian Splatting(显式)反超 NeRF(隐式连续)、Mamba(离散选择性)源自连续 SSM——说明"纯连续"并非总最优,**混合(连续性质 + 显式/离散效率)**往往胜出。
|
||||||
|
- **理论保证**:算子学习有逼近定理,但连续世界模型的可规划性、泛化、稳定性理论仍不完善。
|
||||||
|
- **统一框架缺失**:四家族目前各自为政,缺一个把"空间连续 + 时间连续 + 函数空间 + 表示预测"统一起来的框架。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 论文与资源清单
|
||||||
|
|
||||||
|
### ① 连续空间表示 / 神经场
|
||||||
|
- Occupancy Networks(CVPR 2019)<https://arxiv.org/abs/1812.03828>
|
||||||
|
- DeepSDF(CVPR 2019)<https://arxiv.org/abs/1901.05103>
|
||||||
|
- SIREN(NeurIPS 2020)<https://arxiv.org/abs/2006.09661>
|
||||||
|
- NeRF(ECCV 2020)<https://arxiv.org/abs/2003.08934>
|
||||||
|
- 3D Gaussian Splatting(SIGGRAPH 2023)<https://arxiv.org/abs/2308.04079>
|
||||||
|
- D-NeRF(动态)<https://arxiv.org/abs/2011.13961> / NeRFPlayer(4D)<https://arxiv.org/abs/2210.15947>
|
||||||
|
|
||||||
|
### ② 连续时间动力学
|
||||||
|
- Neural ODE(NeurIPS 2018)<https://arxiv.org/abs/1806.07366>
|
||||||
|
- Latent ODE / ODE-RNN(NeurIPS 2019)<https://arxiv.org/abs/1907.03907>
|
||||||
|
- Neural CDE(NeurIPS 2020)<https://arxiv.org/abs/2005.08926>
|
||||||
|
- Liquid Time-Constant Networks(AAAI 2021)<https://arxiv.org/abs/2006.04439>
|
||||||
|
- CfC 闭式连续时间网络<https://arxiv.org/abs/2106.13898>
|
||||||
|
- S4 结构化状态空间(ICLR 2022)<https://arxiv.org/abs/2111.00396>
|
||||||
|
|
||||||
|
### ③ 算子学习 / 物理时空
|
||||||
|
- PINN(2017)<https://arxiv.org/abs/1711.10561>
|
||||||
|
- DeepONet(2019)<https://arxiv.org/abs/1910.03193>
|
||||||
|
- FNO 傅里叶神经算子(ICLR 2021)<https://arxiv.org/abs/2010.08895>
|
||||||
|
- Geo-FNO(复杂几何)<https://arxiv.org/abs/2207.05209>
|
||||||
|
|
||||||
|
### ④ 非 Token 预测架构 / 世界模型
|
||||||
|
- I-JEPA(CVPR 2023)<https://arxiv.org/abs/2301.08243>
|
||||||
|
- V-JEPA 2(2025,机器人世界模型)<https://arxiv.org/abs/2506.09985>
|
||||||
|
- DINO-WM(ICML 2025)<https://arxiv.org/abs/2411.04983>
|
||||||
|
- seq-JEPA<https://arxiv.org/abs/2505.03176>
|
||||||
|
- Flow Matching(ICLR 2023,连续生成)<https://arxiv.org/abs/2210.02747>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 来源(Sources)
|
||||||
|
|
||||||
|
- [Occupancy Networks (1812.03828)](https://arxiv.org/abs/1812.03828)
|
||||||
|
- [DeepSDF (1901.05103)](https://arxiv.org/abs/1901.05103)
|
||||||
|
- [SIREN (2006.09661)](https://arxiv.org/abs/2006.09661)
|
||||||
|
- [NeRF (2003.08934)](https://arxiv.org/abs/2003.08934)
|
||||||
|
- [3D Gaussian Splatting (2308.04079)](https://arxiv.org/abs/2308.04079)
|
||||||
|
- [D-NeRF (2011.13961)](https://arxiv.org/abs/2011.13961)
|
||||||
|
- [NeRFPlayer (2210.15947)](https://arxiv.org/abs/2210.15947)
|
||||||
|
- [Neural ODE (1806.07366)](https://arxiv.org/abs/1806.07366)
|
||||||
|
- [Latent ODE / ODE-RNN (1907.03907)](https://arxiv.org/abs/1907.03907)
|
||||||
|
- [Neural CDE (2005.08926)](https://arxiv.org/abs/2005.08926)
|
||||||
|
- [Liquid Time-Constant Networks (2006.04439)](https://arxiv.org/abs/2006.04439)
|
||||||
|
- [CfC (2106.13898)](https://arxiv.org/abs/2106.13898)
|
||||||
|
- [S4 (2111.00396)](https://arxiv.org/abs/2111.00396)
|
||||||
|
- [PINN (1711.10561)](https://arxiv.org/abs/1711.10561)
|
||||||
|
- [DeepONet (1910.03193)](https://arxiv.org/abs/1910.03193)
|
||||||
|
- [FNO (2010.08895)](https://arxiv.org/abs/2010.08895)
|
||||||
|
- [Geo-FNO (2207.05209)](https://arxiv.org/abs/2207.05209)
|
||||||
|
- [I-JEPA (2301.08243)](https://arxiv.org/abs/2301.08243)
|
||||||
|
- [V-JEPA 2 (2506.09985)](https://arxiv.org/abs/2506.09985)
|
||||||
|
- [DINO-WM (2411.04983)](https://arxiv.org/abs/2411.04983)
|
||||||
|
- [seq-JEPA (2505.03176)](https://arxiv.org/abs/2505.03176)
|
||||||
|
- [Flow Matching (2210.02747)](https://arxiv.org/abs/2210.02747)
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 700 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user