JEPA-Anything: 跨世界预测模型,统一学习原则从视觉到分子到座舱

论文信息

  • 标题: JEPA-Anything: Learning Predictive Models across Different Worlds
  • arXiv: 2609.20800 (2026年9月17日)
  • 作者: Taoyong Cui, Zhongyong Wang, Xinyue Xu, Weiyang Liu 等13人
  • 代码: https://github.com/Gen-Verse/JEPA-Anything
  • 领域: cs.CL (Computation and Language)

核心创新

JEPA-Anything提出域无关的预测框架,基于正交预测分解(OPF),在7个不同领域(视觉、生物、临床轨迹、控制、分子动力学、物理场、天气)使用统一学习原则。核心思想:将预测目标分解为正交补因子,通过专用路径学习后重组。

七大领域验证

领域 任务 性能
视觉 表征学习 ✅ 提升全部10个动力学任务
生物 干预预测 ✅ 实验验证(细胞+类器官+小鼠)
临床 1000+事件预测 ✅ 最低预测误差
控制 干预Pong ✅ 预测误差降低34.8%
分子动力学 100步分子rollout ✅ 4个系统最低误差
物理场 轨道模式 ✅ 恢复开普勒指数(-1.4991)
天气 长期预报 ✅ 有效

正交预测分解 (OPF)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
传统JEPA:
输入x ──→ Encoder ──→ 表征z
│
目标y ──→ Target Encoder ──→ 表征z'
│
预测: z → Predictor → ẑ' ← 对比损失 ← z'

JEPA-Anything (OPF):
输入x ──→ Encoder ──→ 表征z
│
┌───────────┼───────────┐
│ │ │
▼ ▼ ▼
因子1 因子2 因子N
(路径A) (路径B) (路径N)
│ │ │
└───────────┼───────────┘
│
▼
重组(Recombine)
│
▼
预测ẑ' ← 对比损失 ← z'

模型实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
"""
论文:JEPA-Anything: Learning Predictive Models across Different Worlds
arXiv: 2609.20800
代码:https://github.com/Gen-Verse/JEPA-Anything

核心方法:正交预测分解(OPF)的域无关JEPA
"""

import torch
import torch.nn as nn
import torch.nn.functional as F
from typing import List

class OrthogonalPredictiveFactorization(nn.Module):
"""
正交预测分解 (OPF)

将潜在预测目标分解为互补因子,
通过专用路径学习后重组
"""

def __init__(self,
latent_dim: int = 512,
num_factors: int = 4,
hidden_dim: int = 256):
super().__init__()

self.num_factors = num_factors

# 因子分解器:将表征分解为正交因子
self.factorizer = nn.ModuleList([
nn.Sequential(
nn.Linear(latent_dim, hidden_dim),
nn.GELU(),
nn.Linear(hidden_dim, hidden_dim),
nn.GELU(),
nn.Linear(hidden_dim, latent_dim // num_factors)
) for _ in range(num_factors)
])

# 正交约束:确保因子之间正交
self.orthogonal_weight = nn.Parameter(
torch.randn(num_factors, latent_dim // num_factors, latent_dim // num_factors)
)

# 重组器:将因子重组为完整表征
self.recombiner = nn.Sequential(
nn.Linear(latent_dim, hidden_dim),
nn.GELU(),
nn.Linear(hidden_dim, hidden_dim),
nn.GELU(),
nn.Linear(hidden_dim, latent_dim)
)

# 预测器:从输入表征预测目标因子
self.predictors = nn.ModuleList([
nn.GRU(
input_size=latent_dim,
hidden_size=latent_dim // num_factors,
batch_first=True
) for _ in range(num_factors)
])

def factorize(self, z):
"""将表征分解为正交因子"""
factors = []
for i, factorizer in enumerate(self.factorizer):
factor = factorizer(z) # (B, latent_dim // num_factors)
factors.append(factor)

# 正交约束损失
stacked = torch.stack(factors, dim=1) # (B, num_factors, dim)
gram = torch.bmm(stacked, stacked.transpose(1, 2)) # (B, num_factors, num_factors)
identity = torch.eye(self.num_factors, device=z.device).unsqueeze(0)
ortho_loss = F.mse_loss(gram, identity.expand_as(gram))

return factors, ortho_loss

def recombine(self, factors):
"""将因子重组为完整表征"""
concatenated = torch.cat(factors, dim=-1) # (B, latent_dim)
return self.recombiner(concatenated)

def predict(self, z_seq, factors):
"""从输入序列预测目标因子"""
predicted_factors = []
for i, predictor in enumerate(self.predictors):
out, _ = predictor(z_seq) # (B, T, dim//num_factors)
predicted_factors.append(out[:, -1, :]) # 取最后时刻

return predicted_factors

def forward(self, z_input_seq, z_target):
"""
Args:
z_input_seq: (B, T, latent_dim) 输入序列
z_target: (B, latent_dim) 目标表征

Returns:
predicted_z: 预测的目标表征
total_loss: 总损失
"""
# 1. 分解目标
target_factors, ortho_loss = self.factorize(z_target)

# 2. 预测各因子
predicted_factors = self.predict(z_input_seq, target_factors)

# 3. 重组
predicted_z = self.recombine(predicted_factors)

# 4. 预测损失
pred_loss = F.mse_loss(predicted_z, z_target)

# 5. 总损失
total_loss = pred_loss + 0.1 * ortho_loss

return predicted_z, total_loss


# 域适配器:将不同领域数据映射到统一表征空间
class DomainAdapter(nn.Module):
"""域适配器:为不同领域提供统一接口"""

def __init__(self, domain: str, input_dim: int, latent_dim: int = 512):
super().__init__()
self.domain = domain

if domain == "vision":
self.encoder = VisionEncoder(input_dim, latent_dim)
elif domain == "clinical":
self.encoder = ClinicalEncoder(input_dim, latent_dim)
elif domain == "molecular":
self.encoder = MolecularEncoder(input_dim, latent_dim)
elif domain == "cabin": # 座舱领域(本文新增)
self.encoder = CabinEncoder(input_dim, latent_dim)
else:
self.encoder = nn.Linear(input_dim, latent_dim)

def forward(self, x):
return self.encoder(x)


class VisionEncoder(nn.Module):
def __init__(self, input_dim, latent_dim):
super().__init__()
self.conv = nn.Sequential(
nn.Conv2d(input_dim, 64, 3, stride=2, padding=1),
nn.GELU(),
nn.Conv2d(64, 128, 3, stride=2, padding=1),
nn.GELU(),
nn.Conv2d(128, 256, 3, stride=2, padding=1),
nn.GELU(),
nn.AdaptiveAvgPool2d(1),
nn.Flatten(),
nn.Linear(256, latent_dim)
)

def forward(self, x):
return self.conv(x)


class CabinEncoder(nn.Module):
"""座舱领域编码器:编码DMS/OMS多传感器数据"""
def __init__(self, input_dim, latent_dim):
super().__init__()
# 输入: [摄像头特征, 雷达特征, 传感器状态]
self.mlp = nn.Sequential(
nn.Linear(input_dim, 256),
nn.GELU(),
nn.Linear(256, latent_dim)
)

def forward(self, x):
return self.mlp(x)


# 测试
if __name__ == "__main__":
# 模拟跨域预测
B, T, D = 8, 10, 512

# 输入序列 + 目标
z_seq = torch.randn(B, T, D)
z_target = torch.randn(B, D)

# OPF模型
opf = OrthogonalPredictiveFactorization(latent_dim=D, num_factors=4)

# 前向
predicted_z, loss = opf(z_seq, z_target)

print(f"输入序列: {z_seq.shape}")
print(f"目标: {z_target.shape}")
print(f"预测: {predicted_z.shape}")
print(f"损失: {loss.item():.4f}")

# 论文关键结果
print("\n=== 论文实验结果 ===")
print("10/10动力学任务提升")
print("Interventional Pong预测误差降低34.8%")
print("4/4分子系统100步预测最低误差")
print("开普勒指数恢复: -1.4991 (理论值-1.5)")
print("生物干预: 细胞+类器官+肿瘤+小鼠实验验证")

从通用预测到座舱世界模型

JEPA-Anything对IMS的启示

1
2
3
4
5
6
7
8
9
10
11
12
13
通用预测原则 → 座舱世界模型

输入: 当前座舱状态
• 驾驶员面部特征 (摄像头)
• 驾驶员姿态 (3D关键点)
• 乘员状态 (雷达/OMS)
• 车辆状态 (速度/方向/加速度)

预测: 未来座舱状态
• 疲劳发展趋势 (PERCLOS变化)
• 分心行为发生概率
• 乘员姿态变化
• 异常事件预测

座舱预测模型架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 基于OPF的座舱世界模型
class CabinWorldModel(nn.Module):
"""
座舱世界模型:预测未来座舱状态

使用OPF将预测分解为正交因子:
- 因子1: 疲劳发展轨迹
- 因子2: 分心行为模式
- 因子3: 乘员姿态变化
- 因子4: 环境状态变化
"""

def __init__(self, latent_dim=512, num_factors=4):
super().__init__()
# 传感器融合编码器
self.fusion_encoder = DomainAdapter("cabin", input_dim=256, latent_dim=latent_dim)
# OPF预测核心
self.opf = OrthogonalPredictiveFactorization(latent_dim, num_factors)
# 状态解码器
self.decoder = nn.Sequential(
nn.Linear(latent_dim, 256),
nn.GELU(),
nn.Linear(256, 128),
nn.GELU(),
nn.Linear(128, 64)
)

def forward(self, sensor_seq, target_state):
"""
Args:
sensor_seq: (B, T, 256) 多传感器时序
target_state: (B, 512) 目标状态表征
"""
# 编码
z_seq = self.fusion_encoder(sensor_seq) # (B, T, 512)
z_target = self.fusion_encoder(target_state) if target_state.dim() == 2 else self.fusion_encoder(target_state.unsqueeze(1)).squeeze(1)

# OPF预测
predicted_z, loss = self.opf(z_seq, z_target)

# 解码状态
predicted_state = self.decoder(predicted_z)

return predicted_state, loss

座舱预测应用场景

预测目标 因子分解 时间窗 应用
疲劳发展 眼动+PERCLOS+头部姿态 5-30分钟 提前预警
分心发生 视线+手机+姿态 1-5秒 实时干预
乘员异常 姿态+呼吸+雷达 10-60秒 安全联动
紧急事件 全传感器 1-3秒 紧急制动

参考


发布时间: 2026-09-24 23:30
分类: 世界模型 | JEPA | 预测建模 | 座舱 | 论文解读