JEPA4Japan · 教程

附录 D——复现与审阅检查清单

2,863字 8分钟阅读 #LeVJEPA#JEPA#视频自监督学习#SIGReg

保存代码哈希、环境、数据、预算、随机种子、指标、失败案例、许可证和主张等级。

课程进度 课程大纲 已发布 34/34 课

第 0 部分——先拿到地图

  1. 01 第 0 章——开始之前:这门课承诺什么 已发布
  2. 02 第 1 章——同一段视频,两扇不同的窗 已发布
  3. 03 第 2 章——沿着 Yann LeCun 的科研路线走一遍 已发布
  4. 04 第 3 章——别被名字绕晕:JEPA 家族树 已发布

第 1 部分——为什么简单目标会学会看视频

  1. 05 第 4 章——视频可以自己出题 已发布
  2. 06 第 5 章——保留意思,不重画每个像素 已发布
  3. 07 第 6 章——两张卡要相同,但不能全变成白纸 已发布
  4. 08 第 7 章——SIGReg:从许多影子检查一团点云 已发布
  5. 09 第 8 章——只用一行目标函数读懂 LeVJEPA 已发布

第 2 部分——把一段视频送进单编码器

  1. 10 第 9 章——全局视图与局部视图怎样配对 已发布
  2. 11 第 10 章——把视频切成时空小方块 已发布
  3. 12 第 11 章——一台编码器、一个投影头、一张摘要卡 已发布
  4. 13 第 12 章——一次完整前向传播 已发布
  5. 14 第 13 章——为什么扔掉 95% 反而更会看 已发布
  6. 15 第 14 章——块因果注意力:同一帧互看,未来不能偷看 已发布
  7. 16 第 15 章——RoPE、逐帧 token 与意外长出的密集特征 已发布

第 3 部分——会读实验,才算读懂论文

  1. 17 第 16 章——四组消融究竟回答了什么 已发布
  2. 18 第 17 章——相同轮数不等于相同花费 已发布
  3. 19 第 18 章——ImageNet、K400、SSv2 各考什么 已发布
  4. 20 第 19 章——把论文结果记成一本账 已发布
  5. 21 第 20 章——哪些结论现在还不能说 已发布

第 4 部分——从官方仓库到自己的实验

  1. 22 第 21 章——官方仓库地图 已发布
  2. 23 第 22 章——Walking Tours:十段长视频怎样变成训练数据 已发布
  3. 24 第 23 章——读懂默认配置并启动训练 已发布
  4. 25 第 24 章——先跑一个不会骗人的冒烟测试 已发布
  5. 26 第 25 章——不用训练:加载公开权重提取特征 已发布
  6. 27 第 26 章——在自己的视频上做冻结评估 已发布

第 5 部分——把表征接回世界模型路线

  1. 28 第 27 章——重要边界:LeVJEPA 不是规划器 已发布
  2. 29 第 28 章——怎样把 LeVJEPA 接到下一代世界模型 已发布
  3. 30 第 29 章——十个从入门到论文级的研究项目 已发布

附录——随用随查的技术背包

  1. 31 附录 A——最低限度数学工具箱 已发布
  2. 32 附录 B——完整张量形状表 已发布
  3. 33 附录 C——术语表与论文时间线 已发布
  4. 34 附录 D——复现与审阅检查清单 当前课程

留下足够脚印,别人才能再走一遍

  1. 身份论文版本 + 代码哈希
  2. 数据来源 + 切分 + 指纹
  3. 训练配置 + 预算 + 随机种子
  4. 评估协议 + 基线 + 失败样本
  5. 收据日志 + 权重 + 限定语句
“我跑通了”只是一句话;复现凭据要让另一位读者知道你究竟跑了什么。

两个人都说自己做了“番茄汤”。一个用了罐头、慢火两小时;另一个用了鲜番茄、微波炉五分钟。菜名相同,配方、成本与结果都不同。

“训练了 LeVJEPA”也不够精确。你可能运行官方 Walking Tours 默认配置、论文中的 20% K710 受控比较、notebook 的千步教学实验,或只加载公开权重。它们都合法,但支持的主张完全不同。

下面这张清单从下载一路走到写结论。暂时没测的格子就留空;一个看得见的 TODO,比填进去的猜测更有用。

A. 身份与版本

  • 记录论文标题、arXiv ID、版本与下载日期:2608.27395v1,而不是只写“最新版”。
  • 记录项目页与代码仓库 URL。
  • 固定完整 40 位 Git commit;本系列审阅快照是 3ea0dda16030bc0fd6472bf809fc0a0ad836a812(2026-09-02)。
  • 保存 git status --short;有本地补丁时导出 diff,并给实验起不同名字。
  • 记录公开 checkpoint 的仓库、revision 与文件哈希。
  • 分别确认仓库 MIT 许可和由 V-JEPA 改编的 module.py / 权重 CC BY-NC 4.0 限制;商业用途应另请合适的许可审查,而非只凭教程判断。

最小版本收据:

git rev-parse HEAD
git status --short
uv --version
uv run python - <<'PY'
import platform, torch
print(platform.platform())
print(torch.__version__, torch.version.cuda)
print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else "no CUDA")
PY

B. 环境与硬件

  • 保存操作系统、Python、PyTorch、CUDA、驱动和 uv.lock 哈希。
  • 记录 GPU 型号、数量、显存、CPU 核数、RAM 与存储介质。
  • 记录精度模式(例如 bf16-mixed)和分布式策略。
  • 记录实际峰值显存、平均 step 时间、数据等待时间与总墙钟时间。
  • 若比较 FLOPs,同时报告 FLOPs 的计算工具、输入形状和是否计入 target/predictor/探针。

作者在 RTX 5080 上报告的 12 小时结果不能直接预测另一张 16 GB 卡的时间。芯片、软件栈和数据 I/O 都会改变墙钟速度。

C. 数据收据

  • 记录数据集名称、版本、许可、原始 URL 清单与下载日期。
  • 对原始视频或清单计算哈希;若远程视频后来被替换或删除,要能发现。
  • 记录解码分辨率、帧率、JPEG 质量、episode 长度和 Lance 构建命令。
  • 记录有效 episode 数、每个 episode 帧数、被过滤的短片段数和总字节数。
  • 明确 T=16、存储 15 fps、frame_stride=2,所以训练采样约 7.5 fps、覆盖约 2.1 秒。
  • 按原始视频、人物或场景等独立 source group 划分训练/验证/测试,不能先切 clip 再随机分;只有 episode 本身独立且不存在同源近邻时,才可把 episode 当切分单位。
  • 保存全局与局部视图的第一批 contact sheet,人工检查它们确实共享同一时间窗口。
  • 记录颜色空间、归一化均值/标准差、随机裁剪范围和光度增强。

推荐为处理后的数据写一张摘要:

source videos: 10
stored fps: 15
episodes: ...
frames: ...
train/val/test split unit: source-video
Lance bytes: ...
manifest sha256: ...

省略号表示尚未测量,不是默认值。

D. 模型与目标

  • 写明 ViT 大小、patch_size=16、tubelet_size=1、num_frames=16。
  • 写明全局 224、局部 96、局部视图数量 V 和各裁剪尺度。
  • 写明 token_drop_rate=0.95 与 attn_mode=block_causal。
  • 写明 projector D→2048→256、BatchNorm 和 GELU。
  • 写明 L = L_inv + 0.02·L_SIGReg、17 个节点、1024 个随机方向,以及固定版本的默认值 normalize_by_n=false。
  • 确认全局与局部分支均有梯度;若实验加入 detach,将它明确记录为方法改动。
  • 确认没有训练用 target encoder 或 predictor。
  • 若保存 Polyak/EMA 权重,记录 decay、更新间隔与评估时使用 raw 还是 EMA;明确它不参与 loss。

E. 优化与预算

  • 记录每设备 batch、设备数、节点数、梯度累积与实际有效 batch。
  • 记录 optimizer、学习率、betas、weight decay、bias/norm 排除规则。
  • 记录 warmup 的 optimizer-step 数与之后是 flat 还是 decay。
  • 同时报告 epoch、optimizer steps、看过的 clip 数、每步 token 数、估计总 FLOPs 与墙钟时间。
  • 固定并报告数据采样、视图增强、token dropping、模型初始化和 probe 的随机种子。
  • 至少运行三个训练种子,或明确标记为单次运行;一次最好结果本身不足以说明稳定性。
  • 保存完整解析后的 Hydra 配置,而不是只保存命令行覆盖项。

仓库默认注释中的 3072 来自:

2 nodes × 8 GPUs × 96 clips/device × 2 gradient accumulation = 3072

若本地只用一张 GPU、batch 8、无累积,有效 batch 就是 8。这是冒烟测试,不是论文配方复现。

F. 训练过程的最低仪表盘

每个 run 至少保存:

  • pred_loss、未加权及乘以 0.02 后的 sigreg_loss,以及最终 total loss;
  • CLS 每维均值、标准差、协方差谱、最小/最大特征方差与有效秩;
  • 全局—局部正配对距离,以及打乱 batch 后的负对照距离;
  • raw encoder 与 EMA checkpoint 的相同验证探针;
  • 梯度范数、学习率、weight decay、吞吐与峰值显存;
  • 至少一批随机保留 token 的时空分布图;
  • block-causal 泄漏单元测试:改变未来帧不得改变较早 patch token;
  • NaN/Inf、全零梯度、重复样本和数据等待警报。

仅看 total loss 会隐藏“预测项下降、SIGReg 爆炸”或相反情况。损失必须拆开记。

G. 逐级验证:先修好脚下这一级

  1. **接口级:**一段假输入能完成前向;shape 与 dtype 全部断言。
  2. **目标级:**常量嵌入使 invariance 低但 SIGReg 高;打乱配对会抬高 invariance。
  3. **因果级:**只修改未来帧,过去 patch 输出保持不变;CLS 可以改变。
  4. **小数据级:**在极小数据上观察可解释的过拟合,同时监控坍塌。
  5. **教学级:**运行官方 workshop,并保存图像、曲线与配置。
  6. **单卡级:**按资源缩小模型或 batch,明确这不是论文复现。
  7. **配方级:**只有数据、预算、有效 batch、模型和评估协议对齐后,才比较论文数字。

每一级失败时停下修复。大规模训练不会自动治好轴顺序错误或未来泄漏。

H. 评估时让对手站在同一起跑线

  • 冻结 encoder;只训练预先声明的 linear 或 attentive probe。
  • 对所有方法使用同一数据切分、输入帧/时间槽、probe 容量、优化预算和视图采样。
  • 分开报告 ImageNet-1K、K400、SSv2,因为它们偏重不同信息。
  • 报告均值、标准差、种子数、置信区间或原始每种子结果。
  • 报告 epoch-matched 与 FLOP-matched 时分别固定了什么;两类比较应分开下结论。
  • 若用自己的数据,至少加入随机初始化、监督预训练或同预算替代方法之一作为基线。
  • 保存预测、检索或特征图的成功和失败案例;只展示最好看的 PCA 会遗漏方法边界。
  • 探针可解码性只证明信息可由该探针取出,不证明世界模型会使用它。

I. 给准备发表的每句话定级

发表前逐句贴标签:

[方法事实] 论文或固定代码直接定义
[作者报告] 原论文在指定协议下报告
[本次观察] 本 run 的日志或产物直接显示
[受假设理论] 只在列出的假设内成立
[推断] 多项证据支持但未直接测试
[假设] 等待实验推翻或支持

例如:

  • [方法事实] 公开实现训练时均匀随机丢弃 95% patch token。
  • [作者报告] 在其 ImageNet 消融中,丢弃率从 0 提至 0.95 时准确率从 33.9 提至 47.6。
  • [假设] 在高速细粒度动作数据上,保留跨帧对应的采样会优于完全随机丢弃。

这三句话的证据强度完全不同。

把这张实验收据和日志放在一起

experiment: levjepa-walkingtours-smoke-001
paper: arxiv:2608.27395v1
code_commit: 3ea0dda16030bc0fd6472bf809fc0a0ad836a812
local_diff_sha256: null
data:
  name: walking_tours
  manifest_sha256: TODO
  split_unit: source_video
model:
  name: vit_tiny
  frames: 16
  patch: 16
  tubelet: 1
  token_drop: 0.95
  attention: block_causal
objective:
  sigreg_weight: 0.02
  projections: 1024
  knots: 17
budget:
  devices: 1
  batch_per_device: 8
  accumulation: 1
  optimizer_steps: 100
seeds: [0]
status: smoke_test_not_paper_reproduction
artifacts:
  resolved_config: TODO
  metrics_log: TODO
  checkpoint_sha256: TODO

TODO 留在收据中,正好告诉下一位读者还有什么尚未测量。

最后一道门:这个结果可以叫“复现”吗

只有全部回答“是”,才把结果称作复现:

  1. 方法版本和代码哈希是否精确?
  2. 数据与切分是否可追踪且无泄漏?
  3. 模型、目标、有效 batch、steps 与预算是否对齐?
  4. probe 与基线协议是否公平?
  5. 多种子和原始产物是否可取回?
  6. 数字是否在预先声明的容差内?
  7. 结论是否只覆盖真正重复的范围?

否则使用更窄的名称:“安装验证”“前向冒烟测试”“教学级重跑”“部分复现”或“作者 checkpoint 的下游评估”。

清单所依据的记录

官方仓库固定快照定义安装、数据、训练与许可证边界;conf/config.yaml定义公开默认配方;LeVJEPA arXiv v1定义论文实验协议;固定版本的模型卡定义公开权重接口。清单中的审计层级是本教程的复现建议,不是论文声称的认证标准。

只在收据支持的地方签名

  1. “跑通”“重跑作者权重”和“独立复现论文结果”不是同义词。
  2. 配置之外还要保存数据指纹、有效 batch、预算、日志和失败案例。
  3. 复现的最后一步不是得到数字,而是把结论缩到证据真正覆盖的范围。

发布前的最后三问

  1. 单卡 batch 8 跑 100 步可以称为论文配方复现吗?
  2. 为什么训练/测试应按独立 source group 切分,而不是随机 clip 或 Walking Tours 的相邻 episode?
  3. 公开代码和权重都存在,为什么仍不能说已有独立复现?
决定该用哪个名称
  1. 不能;它是很有价值的冒烟测试,但数据、有效 batch、步数和预算都没有对齐论文协议。
  2. 相邻 clip 可能共享几乎相同的帧;Walking Tours 的相邻 episode 也来自同一长视频和场景。两种拆分都可能把近重复内容泄漏到测试集。
  3. 它们都由原作者团队发布,提高了可检查性,却没有提供独立团队重复实验的证据。