JEPA4Japan · 教程

第 26 章——在自己的视频上做冻结评估

1,309字 4分钟阅读 #LeVJEPA#JEPA#视频自监督学习#SIGReg

建立线性探针、attentive probe、检索与密集特征检查,并使用防止数据泄漏的切分。

课程进度 课程大纲 已发布 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. 冻住 encoder只读,不改
  3. 训练小探针量表征可读性
  4. 做负对照排除作弊
  5. 报告协议平均值、方差、失败例
冻结评估只训练新的阅卷尺;编码器这位学生在考试期间不再补课。

把同一场长视频切成许多相邻片段,再随机分进训练和测试,成绩往往漂亮得不真实。原因很简单:测试题可能只是训练题的下一秒,人物、墙面和水印都没有换。先按原视频、场景、人物或拍摄日期分组,再在各组里切 clip,才能真正隔开相似来源。

四种问题,各用一把尺

先固定 preprocessing(预处理)、模型 revision 与帧率。对 [B,3,16,224,224] 输入,冻结 encoder,并验证所有参数 requires_grad=False。最小 **linear probe(线性探针)**用 [CLS] 的 [B,1024] 特征训练一个线性层;除 accuracy 外,类别不平衡时再报告 balanced accuracy 或 macro-F1。论文的 **attentive probe(注意力探针)**让一枚可学习 query 交叉注意全部 3,137 tokens,再将结果与 query 作残差相加,经过两层 MLP、GELU、LayerNorm 和线性分类器。它的容量更大,因此与 linear probe 的名称和分数都要分开记。

检索时先对 [CLS] 做 L2 归一化,以 cosine similarity 排名,报告 Recall@1/5 与 mAP。密集任务应去掉 [CLS],把 out.last_hidden_state[:,1:] reshape 为 [B,16,14,14,1024];可做 query-patch 相似度、轻量分割头或跟踪头,并报告 mIoU、J&F 或点跟踪误差。注意:块因果约束属于逐帧 patch token;汇总 [CLS] 看完整个 clip,不能拿它冒充任意时刻的在线状态。

一个可复用的特征函数是:

@torch.inference_mode()
def features(model, raw_bcthw):
    mean = raw_bcthw.new_tensor([.485,.456,.406])[None,:,None,None,None]
    std = raw_bcthw.new_tensor([.229,.224,.225])[None,:,None,None,None]
    out = model(pixel_values=(raw_bcthw - mean) / std)
    cls = torch.nn.functional.normalize(out.pooler_output, dim=-1)
    patches = out.last_hidden_state[:, 1:].reshape(-1, 16, 14, 14, 1024)
    return cls.cpu(), patches.cpu()

这里假定 raw_bcthw 已在 [0,1] 且裁成 224;其他输入要先显式转换。

来源先隔离,窗口随后再抽

先按 source group(同源组)切 train/validation/test,再在各 split 内抽窗口。标准化器和类别权重只从 train 拟合或计算,超参数由 train/validation 选择,test 全程封存。至少加入三项负对照:打乱训练标签后应回到机会水平;重复单帧可以测试模型是否只靠外观;倒序或打乱帧则检查指标对时间是否敏感。还应与随机初始化的同架构模型,或简单颜色/运动基线比较。

最小 linear probe 可把所有 train 特征先落盘,再只优化 torch.nn.Linear(1024, n_classes);每轮都断言 encoder 的参数摘要不变。超参数在 validation 选定后,只对 test 运行一次。至少跑三个 seed,报告均值、标准差、每类样本数和混淆矩阵;小测试集可加 bootstrap(自助重采样)置信区间。若同一主体重复出现,应使用 group split 而非普通 stratified split;类别平衡解决不了身份泄漏。

让捷径自己暴露出来

时间任务再做“外观配对”检查:让正反顺序包含完全相同的帧,只改变排列;若 probe 仍不能胜过机会水平,它可能只读物体外观。检索任务要从 gallery 移除同源近邻,密集评估要在预先固定的标注帧上计分,而不是挑 PCA 看起来最漂亮的片段。将帧率、窗口秒数、crop、probe 参数和模型 revision 一并写入结果表。

论文的 69.5、55.0 是作者在特定 frozen attentive-probing 协议下的报告。换了自己的数据、切分或 probe,做的便是新实验;它可以很有价值,却不能自动称为超过或复现这两个数字。

评估协议的原始出处

一次干净评估应留下什么

  1. 先按原视频、人物或场景切分,再切 clip,才能挡住近邻泄漏。
  2. linear、attentive、检索和密集 probe 回答不同问题。
  3. [CLS] 汇总整段;因果逐帧状态要看对应 patch tokens。

查一遍有没有泄漏

  1. 为什么不能把相邻两秒窗口随机分到 train 与 test?
  2. 打乱标签仍远高于机会水平说明什么?
  3. [B,3137,1024] 去掉 [CLS] 后如何恢复时空网格?
泄漏从哪里进来
  1. 它们几乎重复,会泄漏背景、人物和运动。
  2. 切分、缓存或评估管线很可能泄漏。
  3. reshape 为 [B,16,14,14,1024]。