Files
worldmodel/research/multiply/V-JEPA2深度技术剖析.md
T

345 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 + MilaarXiv:2506.099852025-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 -> 使用(3DRoPE 位置编码
```
### 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 v277.3 top-1**(运动理解的硬骨头,强调时序因果而非静态外观)。
- 协议:冻结编码器,只训 4 层 attentive probe(§4.3)。
### 5.2 动作预判(Anticipation
- **Epic-Kitchens-10039.7 recall@5**,超过此前专用模型。这是"预测人接下来要做什么动作"的 SOTA。
### 5.3 视频问答(对齐 LLM 后)
把 V-JEPA 2 编码器作为视觉编码器对齐到一个 LLM(8B 规模),在多项 VideoQA 上 SOTA
- **PerceptionTest84.0**
- **TempCompass76.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: 030% |
| 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/vjepa2demo: `notebooks/vjepa2_demo.ipynb`
- HuggingFace 文档:huggingface.co/docs/transformers/en/model_doc/vjepa2
- 权重:huggingface.co/facebookvjepa2-vit{l,h,g}-fpc64-* 及 ssv2 微调版)
**关键数字速查**
- 编码器 ViT-g >1B(隐藏维 1408);预训练预测器 ~22M12 层/384);AC 预测器 ~300M24 层/16 头/1024
- tubelet 2×16×163D-RoPE;掩码率 ~90%;训练 90k→252k 迭代;渐进分辨率 8.4× 提速
- 数据:VM22M22M 视频,>1M 小时)+ 1M 图像;AC 数据 Droid <62h / ~23k 轨迹
- SSv2 77.3EK-100 39.7 R@56 任务均值 88.2%PerceptionTest 84.0TempCompass 76.9
- 机器人:Reach 100% / Grasp 65% / Pick-place 80%(杯)16 s/动作 vs Cosmos 4 min/动作