Joint Embedding Predictive Architectures Focus on Slow Features

Paper: arXiv:2211.10831 Code: vladisai/JEPA_SSL_NeurIPS_2022 Code reference: main @ 03eb1730 (2022-10-27)

1. Motivation (研究动机)

这篇短论文讨论的是一个非常具体但对 world model 很关键的问题:如果我们不用像 Dreamer / PlaNet / RSSM 那样重建像素,而是用 Joint Embedding Predictive Architecture (JEPA) 在 latent space 里预测下一步表示,模型到底会优先学什么?作者的结论不是“JEPA 总是更语义”这种乐观叙事,而是指出一种反直觉失败模式:在 reward-free offline setting 中,VICReg-JEPA 和 SimCLR-JEPA 很容易把容量用在时间上最稳定、最容易预测的慢变化特征上;如果这些 slow features 恰好是静态背景噪声,模型可以把动态主体完全忽略。

当前 pixel-based world model 的常见路线是 generative/reconstruction objective:模型从观测 和动作 学 latent dynamics,再用 decoder 重建 或整段未来图像。这类目标的优点是监督信号密集,但缺点也直接来自像素级重建:目标函数并不知道哪些像素与控制、规划、奖励有关。若背景、纹理、照明、噪声占据大量像素,reconstruction loss 会推动模型花容量解释这些视觉细节,出现 object-vanishing,即小而关键的可控物体在 latent representation 中被大面积背景压过。JEPA 被提出为一种 reconstruction-free 替代方案:不在 input space 复原像素,而是在 embedding space 预测未来/目标表示,希望 latent prediction 自动过滤掉不可预测或无关的细节。

本文要解决的不是 JEPA 的工程扩展问题,而是 JEPA 的归纳偏置问题:当只给一批离线的 observation-action sequences、没有 reward、没有 downstream task label、也没有 image augmentation 时,JEPA objective 是否真的会保留“对未来动态有用”的状态信息?更窄地说,若图像里同时存在一个 action-controlled moving dot 和若干 background distractors,编码器 与 forward model 是否能保留 dot location,使 frozen representation 之后能被 linear probe 读出?这个 probe 目标在训练 world model 时不可见,因此它测试的是预训练表示自身的信息含量,而不是 end-to-end supervised fitting。

这个问题值得研究的原因在于它击中了 JEPA/world-model 作为通用预训练方法的假设边界。现实场景中有大量慢变化、可预测、但任务无关的因素:dash-cam 里的云层、道路纹理、摄像头污渍,机器人视频里的桌面背景、固定家具、光照模式。如果 JEPA 的 latent prediction objective 天然偏向这些 slow features,那么单纯从像素序列做 reward-free pretraining 可能得到一个“预测得很好但不会控制”的 latent model。反过来,如果能明确这个失败条件,后续设计就可以加入 hierarchy、object-centric bottleneck、difference/optical-flow input、bisimulation constraint 或 task-aware auxiliary loss,避免把最容易预测误认为最重要。

2. Idea (核心思想)

核心洞察可以压缩成一句话:JEPA 的预测目标会偏好时间上稳定且容易对齐的特征,而“稳定”不等于“有用”;当最慢的特征来自固定背景噪声时,VICReg/SimCLR 的防 collapse 机制仍然允许一个零预测误差、非坍缩但任务无关的解。论文的新意在于把这个偏置用一个极简 moving-dot 环境和一个可写出 loss 为零的理论构造展示出来,而不是只报告某个复杂 benchmark 的失败。

方法层面的创新是把 JEPA、reconstruction、IDM、supervised/random/center baselines 放在同一个 offline sequence setup 中,用同一套 frozen representation probing 协议比较它们保留 dot location 的能力。JEPA 部分分别用 VICReg 的 variance/covariance regularization 和 SimCLR 的 InfoNCE objective 防止 trivial collapse;实验再系统改变 distractor 的类型:uniform vs. CIFAR-10 structured noise,以及时间属性:每帧变化 vs. episode 内固定。

它与既有 world model/reconstruction 方法的根本差异在于优化目标的“可预测对象”不同。Reconstruction 要解释像素,因此只要 dot 仍然影响像素误差,它通常会保留 dot;但它也会被大量无关像素牵制。JEPA 不重建像素,理论上应更容易忽略不可预测噪声;本文证明它确实能忽略每帧变化的噪声,但它也会过度拥抱固定噪声。IDM 则走另一个极端:只关注能解释动作的因素,因此 action-controlled dot 表现很好,但 stationary dot 这种有信息却与动作无关的因素会被忽略。

3. Method (方法)

3.1 Overall framework: offline latent dynamics + probing

Figure 1 解读:左图是 VICReg-based JEPA,encoder 把每个 observation 编成 ,forward model 根据 和动作 预测 ;预测表示与真实下一帧 encoder output 对齐,同时对表示施加 variance/covariance regularization。右图是 SimCLR-based JEPA,同样预测下一步 embedding,但用 InfoNCE 把同一时间步的 prediction/encoding 作为 positive pair,把 batch 内其它样本作为 negatives。两者都不解码像素,因此图中没有 pixel reconstruction branch;这正是论文想测试的 reconstruction-free 优势与风险。

论文形式化为一个 MDP 是 observation space,在实验中是 图像; 是 action space; 是 transition probability; 是 reward function。但训练时没有直接访问 MDP,也没有 reward,只给定离线序列 。目标是学习 encoder 与 forward model: 给定初始 observation 和动作序列 ,模型先得到 ,然后自回归展开: 测试时冻结 encoder/predictor,只训练一个线性 probe 去恢复状态属性;本文的 ,即 dot 的二维位置。这个 protocol 很重要:如果 probe 失败,说明 latent sequence 中没有足够线性可读的位置状态,而不是下游头太弱或训练没 end-to-end 对齐。

直觉上,JEPA 的吸引力来自“只预测 latent 中可预测的结构”。对于每帧重新采样的随机/structured noise,背景在时间上没有稳定对应关系,forward model 很难从 推出下一帧背景,因此 JEPA 有动机忽略它。危险也来自同一逻辑:若背景在 episode 内固定,它就是最容易预测的未来信息;编码器只复制固定噪声,predictor 学 identity,就能把 latent prediction objective 做得很好,同时 completely miss action-controlled dot。

3.2 VICReg-JEPA objective

VICReg adaptation 把每个时间步的 encoder output 或 projector output 作为 regularized representation,同时用 prediction loss 对齐 forward model output 和真实下一步 embedding。论文 appendix 给出的损失为: 预测项是跨时间的 MSE: variance 项要求每个维度的 batch std 不低于阈值 ,避免所有样本 collapse 到同一点: covariance 项惩罚不同维度之间的 off-diagonal covariance,让表示维度不要冗余: released code 中对应实现位于 vicreg.pyVICRegPredMultistep.forward 先把所有帧 flatten 后过 backbone,再用 models.RNNPredictor.predict_sequence 从第一帧 encoding 和 action sequence 自回归预测未来 encoding。若 repr_loss_after_projector=true,MSE 对齐 projector space;若为 false,则直接对齐 encoder space。实际 best configs 对 VICReg 多数使用 projector: idpredictor: rnnarch: menet5embedding_size: 512skip_first_step_vc: true,这说明实验最终采用的是较直接的 latent MSE + VC regularization,而不是固定的 paper-default projector 设置。

def vicreg_jepa_step(backbone, projector, predictor, states, actions, cfg):
    # states: [T + 1, batch, C, H, W], actions: [T, batch, 2]
    enc = backbone(states.flatten(0, 1)).view(states.shape[0], states.shape[1], -1)
    proj = projector(enc.flatten(0, 1)).view(enc.shape[0], enc.shape[1], -1)
 
    current = enc[0]
    pred_encs = predictor.predict_sequence(enc=current, actions=actions, h=None)
 
    repr_loss = 0.0
    pred_projs = []
    for t, pred in enumerate(pred_encs):
        pred_proj = projector(pred)
        pred_projs.append(pred_proj)
        target = proj[t + 1] if cfg.repr_loss_after_projector else enc[t + 1]
        source = pred_proj if cfg.repr_loss_after_projector else pred
        repr_loss = repr_loss + F.mse_loss(source, target)
    repr_loss = repr_loss / len(pred_encs)
 
    vc_targets = proj[1:] if cfg.skip_first_step_vc else proj
    std_loss, cov_loss = 0.0, 0.0
    for z in vc_targets:
        z = z - z.mean(dim=0)
        std = torch.sqrt(z.var(dim=0) + 1e-4)
        std_loss = std_loss + F.relu(1.0 - std).mean()
        cov = (z.T @ z) / (z.shape[0] - 1)
        cov_loss = cov_loss + off_diagonal(cov).pow(2).sum() / z.shape[1]
 
    return cfg.sim_coeff * repr_loss + cfg.std_coeff * std_loss + cfg.cov_coeff * cov_loss

3.3 SimCLR-JEPA objective

SimCLR adaptation 保持同一个 encoder/predictor 框架,但把 predicted embedding 和 target embedding 当成两种 view,使用 InfoNCE。论文中定义: 对于同一时间步的 ,positive pair 是同一个 batch index 的 target/prediction,其它 index 是 negative。总体损失对两个方向求平均: code 中 simclr.py:SimCLR.info_nce_simclr 的实现更接近标准 SimCLR:先 torch.cat([pred, encs], dim=0) 形成 个 features,用相同 sample id 构造 label matrix,去掉主对角线后把 paired view 放进 positives,其余放入 negatives,再做 cross entropy。SimCLR.forward 对每个未来步 states_proj[i+1]pred_proj 累加 info_nce_simclr,最后除以 。如果 normalize_z=true 才显式 normalize;实际 best config 示例中 normalize_z: false,温度 loss_temp 会随噪声设置调参,例如 fixed structured 的 SimCLR config 使用 loss_temp: 0.25,changing structured 使用 loss_temp: 16.0

def simclr_jepa_step(backbone, projector, predictor, states, actions, cfg):
    enc = backbone(states.flatten(0, 1)).view(states.shape[0], states.shape[1], -1)
    proj = projector(enc.flatten(0, 1)).view(enc.shape[0], enc.shape[1], -1)
    pred_encs = predictor.predict_sequence(enc=enc[0], actions=actions, h=None)
 
    loss = 0.0
    for t, pred_enc in enumerate(pred_encs):
        pred_proj = projector(pred_enc)
        target_proj = proj[t + 1]
        features = torch.cat([pred_proj, target_proj], dim=0)
        if cfg.normalize_z:
            features = F.normalize(features, dim=-1)
        sim = features @ features.T / cfg.loss_temp
        labels = torch.arange(pred_proj.shape[0], device=pred_proj.device).repeat(2)
        positive_mask = labels[:, None].eq(labels[None, :])
        positive_mask.fill_diagonal_(False)
        logits, targets = build_simclr_logits(sim, positive_mask)
        loss = loss + F.cross_entropy(logits, targets)
    return loss / len(pred_encs)

3.4 Spurious correlation / slow-feature failure construction

论文最关键的理论解释是一个“看似正常但任务无关”的零损失解。假设输入中有 episode 内固定的高斯 distractor noise。编码器可以直接复制这个噪声: 因为噪声在同一个 episode 内不变,。如果 forward model 收敛到 identity,,则 prediction loss 为零: 如果 足够大,variance loss 也为零: 由于不同 episode 的噪声变量彼此独立,off-diagonal covariance 也可为零: 这说明 VICReg 的 anti-collapse 只保证 batch 内表示有方差、维度不冗余,并不保证表示与 action-controlled state 有关。SimCLR 同样受影响:若 positive pairs 完全对齐,并且 encoder output 在单位球面上足够 uniform,InfoNCE 在 infinite negatives 极限下被最小化;固定噪声复制解满足“同一 episode 前后帧 aligned”和“跨 episode noise diverse”这两个条件。因此 JEPA 不是简单忽略所有背景,而是偏向最容易被未来预测的背景。

3.5 Dataset generation and probing protocol

Figure 4 解读:数据生成先采样初始位置 与动作序列 ,再递推得到 ,最后把连续坐标渲染成带 Gaussian blur 的小图像。这个设计让 ground-truth dot location 完全可知,但预训练不使用它;只有 probe 阶段用它检查 latent 是否保留状态。

单点环境的 square side length 为 1,dot 坐标 ,每一维在 内。动作 是位置增量,范数受最大步长 限制;论文实验中 。状态更新为 clipping 后的连续运动: 动作方向不是独立 uniform,而是先采样一个 episode-level 方向 ,再用 Von Mises distribution 采样方向 ,最后乘以 得到 。这样 dot 在一个 episode 内有连续运动趋势,不会因为完全随机方向而在期望上停在原地。渲染时对 dot 图像做 的 Gaussian blur,分辨率为

Figure 2 解读:左侧展示 noise brightness coefficient 从 0 到 3 时,背景相对 dot 的强度变化;右侧展示 structured noise 的 changing/fixed 两种时间属性。Changing noise 每帧重新采样,因此对 forward prediction 是不可预测背景;fixed noise 在一个 episode 内保持不变,但跨 episode 重新采样,因此既能提供 batch diversity,又能被 identity predictor 轻松对齐。

released code 的 data/single.py:ContinuousMotionDataset 与论文描述一致:generate_actions 使用 torch.distributions.VonMises 采样方向,并用 self.max_step 缩放;generate_static_overlay 把同一张 random/CIFAR overlay repeat 到所有 time steps;generate_rnd_overlay 则每个 time step stack 新图。data/multiple.py:create_three_datasets 复用三个 ContinuousMotionDataset,第三个用 max_step=0 生成 stationary dot。

def generate_single_dot_episode(batch_size, n_steps=17, max_step=0.14, alpha=1.0, mode="fixed_structured"):
    direction_center = torch.rand(batch_size) * 2 * torch.pi
    von_mises = torch.distributions.VonMises(direction_center, torch.ones_like(direction_center) * 1.3)
    angles = von_mises.sample((n_steps - 1,)).T
    step_size = torch.rand(batch_size, n_steps - 1, 1) * max_step
    actions = torch.stack([torch.cos(angles), torch.sin(angles)], dim=-1) * step_size
 
    loc = sample_initial_location(batch_size)
    locations = [loc]
    for t in range(n_steps - 1):
        loc = torch.clamp(loc + actions[:, t], min=0.0, max=1.0)
        locations.append(loc)
    dot_images = gaussian_render(torch.stack(locations, dim=1), image_size=28, sigma=0.05)
 
    if mode.startswith("fixed"):
        overlay = sample_noise(batch_size, structured="structured" in mode).unsqueeze(1).repeat(1, n_steps, 1, 1, 1)
    else:
        overlay = torch.stack([sample_noise(batch_size, structured="structured" in mode) for _ in range(n_steps)], dim=1)
    return dot_images + alpha * overlay, torch.stack(locations, dim=1), actions

probe 的目标是训练一个线性层 ,从自回归预测出的 latent sequence 恢复 dot location: code 中 probing.py:probe_pred_position 冻结 backbone/predictor(除非 full_finetune=true),只优化 models.Prober;evaluation 中用 dataset.unnormalize_mse 还原到原始坐标尺度,再报告 RMSE。这一点让 Figure 3 和 Table 1 的 RMSE 可以解释为位置恢复误差,而不是 normalized latent loss。

3.6 Baselines and released-code gaps

Reconstruction baseline 在论文正文中描述为 decoder MSE: IDM baseline 加入 inverse dynamics head 论文公式与 released code 实现差异:论文 appendix A.3.4 写明 reconstruction implementation 不使用 latent variable,只是对称 decoder 做 MSE;但 rssm.py:RSSMPredMultistep.forwardmain@03eb1730 中实际构造 Normal(prior_mu, prior_var)Posteriorkl_divergence(z, post_z),并把 KL 与 reconstruction MSE 一起放进 loss。

因此本文笔记把 paper 中的 baseline 称为 Reconstruction/RSSM-family,并在解释 code 时按 released code 的 stochastic prior/posterior 路径处理。另一个实现差异是数据量:论文 §3 写 pretraining 用 1,000,000 sequences、prober 用 300,000 sequences、evaluation 用 10,000 sequences;

released reproduce_configs/*.best.yamlval_dataset_size: 10000epochs: 100train.py:init_dataset 的 generator 长度组合确实给预训练约 generated samples,但 probing.py:ProbingConfig.epochs=3 对同一个 10,000-size generator 只对应约 30,000 probe samples per validation call,未直接体现 300,000 这个数字。

def rssm_reconstruction_step(backbone, predictor, posterior, decoder, states, actions, cfg):
    enc = backbone(states.flatten(0, 1)).view(states.shape[0], states.shape[1], -1)
    belief = enc[0]
    prior_mu = predictor.prior_mu_net(belief)
    prior_var = F.softplus(predictor.prior_var_net(belief))
    z = torch.distributions.Normal(prior_mu, prior_var).sample()
    loss = F.mse_loss(decoder(z, belief), states[0])
 
    for t in range(states.shape[0] - 1):
        belief, prior_mu, prior_var = predictor(z, actions[t], belief)
        prior = torch.distributions.Normal(prior_mu, F.softplus(prior_var) + cfg.min_var)
        z_prior = prior.sample()
        post_mu, post_var = posterior(enc[t + 1], belief)
        post = torch.distributions.Normal(post_mu, F.softplus(post_var) + cfg.min_var)
        kl = torch.distributions.kl_divergence(prior, post).mean().clamp_min(3.0)
        recon = decoder(z_prior, belief)
        loss = loss + kl + F.mse_loss(recon, states[t + 1])
        z = post.sample()
    return loss / (states.shape[0] - 1)
def idm_step(backbone, predictor, action_head, states, actions, cfg):
    enc = backbone(states.flatten(0, 1)).view(states.shape[0], states.shape[1], -1)
    pred_encs = predictor.predict_sequence(enc=enc[0], actions=actions, h=None)
    prediction_loss, action_loss = 0.0, 0.0
    for t, pred in enumerate(pred_encs):
        prediction_loss = prediction_loss + F.mse_loss(pred, enc[t + 1])
        pred_action = action_head(enc[t], enc[t + 1])
        action_loss = action_loss + F.mse_loss(pred_action, actions[t])
    return prediction_loss / len(pred_encs) + cfg.action_coeff * action_loss / len(pred_encs)

Code reference: main @ 03eb1730 (2022-10-27) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class/Function
CLI/config parsing and training looptrain.py, configs.pyTrainConfig, Trainer.init_dataset, Trainer.train, Trainer.validate
Single moving-dot dataset with fixed/changing noisedata/single.pyContinuousMotionDataset.generate_actions, generate_static_overlay, generate_rnd_overlay, generate_multistep_sample
Three-dot diagnostic datasetdata/multiple.pycreate_three_datasets, MultiDotDataset.__getitem__
VICReg-JEPAvicreg.py, models.pyVICRegConfig, VICRegPredMultistep.forward, get_cov_std_loss, RNNPredictor.predict_sequence
SimCLR-JEPAsimclr.py, models.pySimCLR.info_nce_simclr, SimCLR.forward, Projector
Reconstruction/RSSM-family baselinerssm.py, models.pyRSSMPredMultistep.forward, RSSMPredictor, Posterior, MeNet5Decoder
Linear probingprobing.py, models.pyprobe_pred_position, probe_enc_position, Prober, location_losses
Best hyperparameter configsreproduce_configs/*.best.yamlper-noise/per-method YAML files such as sweep_fixed_structured.(1).vicreg.best.yaml

4. Experimental Setup (实验设置)

4.1 Datasets and scale

主实验是 single moving dot dataset。每个 sequence 长度为 17 frames,对应 16 actions;图像分辨率 ,dot 是 Gaussian-blurred point,位置坐标在 unit square 中。训练世界模型时论文报告使用 1,000,000 generated sequences;训练 linear probe 时论文报告使用 300,000 sequences;evaluation 使用 10,000 sequences。背景 distractor 有两类:uniform random noise,以及从 CIFAR-10 裁剪/overlay 得到的 structured noise。每类 noise 又分为 changing 与 fixed:changing 每帧重采样,fixed 在 episode 内不变但跨 sequence 重采样。亮度系数 控制 noise peak 相对 dot peak 的强度,Figure 2 展示了 的视觉效果。

补充实验是 3-dots dataset:图像有三个 channel,红色 channel 是 action-controlled dot,绿色 channel 是 uncontrollable random moving dot,蓝色 channel 是 stationary dot。目标不是只恢复 agent dot,而是学习能捕获 action-controlled 与 stationary dot、忽略 random dot 的 representation。这个 dataset 用来说明 IDM 的局限:它只会保留能预测 action 的因素,对 stationary 但可观测的信息不敏感。

4.2 Compared baselines and metrics

比较方法包括 VICReg-JEPA、SimCLR-JEPA、Reconstruction/RSSM-family、Inverse Dynamics Modeling (IDM)、Supervised、Random、Center。Supervised 是 end-to-end 传播 probe error 到 encoder/predictor 的 lower-bound error;Random 固定随机 encoder/predictor,只训练 probe;Center 永远预测 dot 在中心位置,是上界式的 naive baseline。指标是 dot location RMSE,Figure 3/5 中 dots 表示 17 time steps 平均 RMSE,shaded area 是 3 random seeds 的 standard deviation;Table 1 报告 3-dots dataset 上 Average / Action / Random / Stationary 四个 RMSE。

4.3 Training configs and hardware

实验口径:best configs 而非默认值

训练细节不能只看 code default,因为每个 noise type/level 和每个 method 都单独调参。released repo 中 reproduce_configs/ 提供 144 个 *.best.yaml。所有这些 best configs 的 epochs 都是 100;n_stepsval_n_steps 都是 17;val_dataset_size 是 10,000;dataset_normalize: true。由于 train.py:init_dataset 使用 val_dataset_size // dataset_batch_size 作为 generator 长度,100 epochs 对应约 1,000,000 generated pretraining samples。

VICReg config 范围

实际 config 范围来自 reproduce_configs/*.best.yaml:VICReg configs 共 28 个,dataset_batch_size 在 32/64/128/256/512 中变化,embedding_size=512base_lr 范围为 4.452906512659173e-053.783005893585235

SimCLR config 范围

SimCLR configs 共 56 个,batch size 为 64/128/256/512,embedding_size 在 2/32/64/128/256/512/1024 中变化,base_lr 范围为 0.000251750775822980533.892307395784348;RSSM configs 共 32 个,batch size 为 64/128/256/512,embedding_size=512learning_rate 范围为 7.289764181769937e-050.003673679181439055

IDM-like config 范围

IDM-like configs 在 code 中表现为 model_type: VICRegaction_coeff>0sim_coeff=std_coeff=cov_coeff=0,共 28 个,base_lr 范围为 0.125271338260864459.561615845868983

具体 config 样例

几个具体 config 例子:reproduce_configs/sweep_changing_structured.(1).vicreg.best.yaml 使用 dataset_noise: 1.0dataset_structured_noise: truedataset_batch_size: 256vicreg.projector: idvicreg.predictor: rnnvicreg.arch: menet5vicreg.embedding_size: 512vicreg.base_lr: 0.84878357903525sim_coeff: 4.692709866259136std_coeff: 1.332571312091042cov_coeff: 1.0

sweep_fixed_structured.(1).vicreg.best.yaml 改为 dataset_static_noise: 1.0dataset_batch_size: 64base_lr: 0.18902825366389228sim_coeff: 0.10538301983832848std_coeff: 0.9930085150161816

sweep_changing_structured.(1).simclr.best.yaml 使用 simclr.projector: idsimclr.predictor: rnnembedding_size: 512base_lr: 0.3039359882655922loss_temp: 16.0;而 sweep_fixed_structured.(1).simclr.best.yaml 使用 dataset_batch_size: 128base_lr: 0.008377498284938412loss_temp: 0.25

sweep_changing_uniform.(1).rssm.best.yaml 使用 rssm.arch: menet5rssm.embedding_size: 512rssm.learning_rate: 0.0003205588547535079rssm.min_var: 0.05

模型结构与硬件环境

模型结构在 appendix 与 code 中基本一致:encoder 是 3 层 convolution + ReLU + BatchNorm,末尾 average pooling 和 linear layer;released best configs 多用 models.MeNet5,其 conv channels 为 16*width_factor -> 32*width_factor -> 32*width_factor,再接 nn.Linear(9*32*width_factor, output_dim)。predictor 是单层 GRU,action input dimension 为 2,hidden/embedding 通常为 512。论文报告所有实验在 AMD MI50 或 Nvidia RTX 8000 GPUs 上运行;每个 noise type/level 运行 100 个随机 hyperparameter settings,选最佳后再跑 3 seeds;单个 experiment 少于 1 小时 GPU time。

5. Experimental Results (实验结果)

5.1 Main single-dot results

Figure 3 解读:这是每个 method、noise type、noise level 都单独调参后的主结果。没有 distractor 时所有方法都能恢复 dot location;当 noise 每帧变化时,VICReg-JEPA 与 SimCLR-JEPA 能保持较低 RMSE,说明 latent prediction 确实能过滤不可预测背景;但当 noise 在 episode 内固定时,两种 JEPA 都迅速退化,且 structured/fixed 和 uniform/fixed 都出现类似失败。Reconstruction 在 的各设置中仍较稳健,IDM 在单点任务中几乎总是很好,因为 dot movement 正好是 action 解释对象。

主图没有在 paper text 中提供每个曲线点的数值表,因此不在笔记中臆造具体坐标;可确切陈述的是 caption 指定的统计方式:dots 是 17 steps mean RMSE,shaded area 是 3 random seeds standard deviation。论文正文给出的定性结论是:all methods 在无噪声时表现好;Reconstruction 在 表现好;JEPA-based methods 在 fixed structured/uniform noise 下失败;所有方法在 changing noise 下表现好;JEPA methods 在 changing noise 上不太需要重新调参,而 reconstruction 若不调参会明显变差。

5.2 Untuned hyperparameter robustness

Figure 5 解读:这里固定使用 no-noise setting 选出的 hyperparameters,不再针对每种 noise level/type 单独调参。对比 Figure 3 可以看到,VICReg/SimCLR 在 fixed noise 下依旧失败,并且在更低 noise level 就可能退化;但在 changing noise 下,JEPA 仍相对稳健。Reconstruction 的相反问题更明显:不调参时它在 changing uniform noise 上明显恶化,说明 pixel reconstruction 对背景强度与分布更敏感。

这个结果支持论文的核心区分:JEPA 的优势不是“所有噪声都好”,而是对不可预测的、每帧变化的 distractor 更自然地忽略;它的缺陷也不是普通过拟合,而是 objective 对 episode-level stable features 的偏好。调参可以改变退化发生的 noise level,但不能消除 fixed slow-feature 的基本风险。

5.3 Three-dot diagnostic results

Figure 6 解读:红点是 action-controlled dot,绿色点随机运动但动作未知,蓝点 stationary。这个环境把“可控动态信息”和“慢但有用的信息”分开:好的通用 representation 应该保留红点和蓝点,忽略不可预测绿点;只看 inverse dynamics 的 representation 会偏向红点,只看 slow feature 的 JEPA 会偏向蓝点。

Table 1 的精确 RMSE 如下,所有数值均为 17 steps 上的 RMSE,3 seeds 给出 standard deviation:

MethodAverageActionRandomStationary
VICReg0.229±0.0310.277±0.0410.273±0.0440.066±0.026
SimCLR0.158±0.0010.193±0.0010.193±0.0020.025±0.001
IDM0.234±0.0010.035±0.0000.298±0.0020.272±0.000
Supervised0.104±0.0000.010±0.0010.180±0.0010.005±0.000
Reconstruction0.107±0.0000.021±0.0010.182±0.0000.026±0.002
Random0.260±0.0010.235±0.0020.278±0.0020.265±0.004
Center0.299±0.0000.304±0.0000.304±0.0000.289±0.000

这个表给出比主图更清楚的分解。VICReg 和 SimCLR 对 stationary dot 的 RMSE 很低,分别为 0.066±0.0260.025±0.001,但 action dot 分别高到 0.277±0.0410.193±0.001,说明它们把表示容量投向最慢的蓝点。IDM 的 action dot RMSE 是 0.035±0.000,非常好,但 stationary dot 是 0.272±0.000,几乎忽略了与动作无关的慢特征。Reconstruction 同时保留 action dot (0.021±0.001) 和 stationary dot (0.026±0.002),Average 0.107±0.000 接近 Supervised 0.104±0.000;不过 random dot 因为动作未知,本来就难以预测,Supervised 与 Reconstruction 也分别只有 0.180±0.0010.182±0.000

5.4 Limitations and takeaways

作者明确承认两类限制。第一,实验是 toy dataset,只有 moving dot 和人工构造的 distractor;虽然它精准暴露 objective bias,但不能直接证明复杂视频、大模型、真实 control setting 中失败程度相同。第二,JEPA objectives 只测试了 VICReg 和 SimCLR,未覆盖 BYOL、Barlow Twins、HJEPA 或后续 V-JEPA/I-JEPA 风格的 masking/predictor choices。因此这篇 paper 的结论应理解为“JEPA family 存在 slow-feature risk 的反例与机制”,而不是对所有 joint-embedding 方法的最终否定。

总体结论是:JEPA 的 reconstruction-free latent prediction 确实能在 changing distractors 下比 pixel reconstruction 更自然地忽略不可预测噪声;但同一个 objective 会偏好固定、缓慢、易预测的背景特征。对 world model 来说,预测性本身不是充分条件,因为最可预测的因素可能与 control/reward 无关。若要把 JEPA 用于复杂 agents,必须额外约束 representation:例如引入 hierarchy 来同时表示 fast/slow features,加入 object/action relevance,使用 image differences or optical flow 降低静态背景吸引力,或采用能够区分 controllable state 与 nuisance slow variables 的 objective。