最近在梳理无监督视频表征学习这个方向的时候读到了VidSage这篇工作。它把图卷积网络GCN引入无监督视频表征学习用图结构来建模视频内部的关系而不是像大部分工作那样单纯走时序对比学习的路线。这篇笔记我写得比较细把我读论文时拆解的建模思路、训练目标的逻辑、实验设计的用意以及我自己复现时踩过的坑都记下来了适合正在做视频表征学习、或者想了解GCN在图视频数据上怎么用的读者参考。1. 视频表征学习这件事难在哪里我在刚接触视频表征学习的时候第一反应是这不就是给图像加了个时间轴吗后来才发现事情没那么简单。图像表示学习要解决的核心问题是这张图里有什么而视频表示学习要解决的却是这一段时间里发生了什么、物体怎么运动、事件怎么演变。这个差异直接决定了方法设计上的分水岭。1.1 视频相比图像多出来的麻烦视频的时序维度带来了三个层面的难题第一个是计算和存储压力。随便一段10秒的视频按25帧每秒算就是250帧哪怕做均匀采样降到16帧表达的信息量也远超单张图像。早期直接拿3D CNN在原始帧上硬算的做法参数量和显存占用都很不友好。第二个是时间维度的语义粒度问题。图像里的语义基本在一帧内就能确定而视频里一个人从走到跑这种状态变化需要跨越多个帧才能看出来。这就导致模型不能只在帧级别做特征提取还得有跨时间聚合的能力。第三个是标签的获取成本。图像分类的数据集打标已经很贵了视频动作识别要标注从第几秒到第几秒、谁在做什么动作成本翻好几倍。更现实的问题是很多真实场景视频根本没法提前定义好类别标签体系本身就不成立。正因为标签这条路走不通无监督学习在视频领域是刚需不是锦上添花。这也是我关注VidSage的根本原因——它试图在没有人工标签的前提下让模型从视频本身的结构里学到有用的表征。1.2 记忆点从预测未来到关系建模在VidSage之前主流无监督视频表征学习基本分成两派。一派是时序预测派核心思想是把视频当成句子让模型预测下一帧或者未来片段学到的特征自然包含时序信息。另一派是对比学习派把同一视频的不同裁剪视图当成正样本对拉近它们的表征同时推开不同视频的表征。这两派都有成效但我读论文的时候注意到它们的共同短板它们把视频当成帧的序列来建模默认信息只沿时间方向流动。可视频里的关系比这复杂得多——不同片段之间可能在内容上高度相关比如都在拍同一个人也可能在语义上形成对比比如前后景象完全不同。这些关系不是单纯的前后顺序能表达的。VidSage换了个视角把视频当成一组相互关联的片段集合片段之间的关联用图来描述再用图卷积网络在这个图上做信息聚合。这样一来模型能同时利用时序关系和非时序的语义关系而不是只沿着时间轴单方向看。1.3 为什么偏偏是图卷积网络在这里合适我最初也问过这个问题Transformer不是也能建模关系吗为什么选GCN结合论文里的表述和我自己做实验的体会来看有几点很实际GCN天然适配邻居聚合语义。视频表征学习里一个片段的高质量表示应当从它相关的其他片段中获取上下文。图卷积做的事情就是迭代地聚合邻居信息从机制上就和这个需求匹配。计算开销相对可控。视频片段数量通常不会特别多在一段视频内部建图节点规模一般也就十几到几十个GCN的计算量完全在可控范围内不需要像视频Transformer那样在长序列上做全局注意力。和GraphSAGE为代表的inductive学习范式一脉相承。VidSage这个名字本身就带有GraphSAGE的痕迹采用的思想也是采样邻居、聚合特征、更新表征对新视频可以直接泛化不需要在训练时固定图结构。所以这个选型不是追新而是问题本身的匹配。2. 把视频看成图VidSage的建模思路读完论文我认为VidSage整个框架里最核心的设计决策只有一个如何把一段视频变成一张图。这个怎么建图的问题比用什么GCN层、用什么loss更关键。图建得不对后面的聚合和训练都是在错误的结构上跳舞。2.1 节点从原始帧到视频片段VidSage没有把每一帧作为图的节点。原因很直接单帧的信息量太低而且相邻帧之间的差异往往只是像素级别的微小变化把它们都当成独立节点图会变得非常冗余GCN聚合出来的表征也没有意义。实际做法是把视频切成长度相同的片段比如每4帧一个片段每个片段通过一个2D CNN编码成一个特征向量这个特征向量就作为图里一个节点的初始特征。用片段而不是单帧相当于做了时间维度的粗粒度化让图里的每个节点承载更丰富的语义信息也降低了图规模。这里有一个细节值得注意特征提取器在无监督阶段是和GCN一起端到端训练的不是固定不变的。这意味着GCN对图的聚合反过来会影响特征提取器的学习——如果两个片段在图里是邻居它们的特征就会被拉近于是特征提取器会逐渐学会把语义相关的片段映射到相近的空间。这种协同演化的关系我觉得比单纯用预训练特征更有意思。2.2 边时序近邻和语义近邻要同时存在图的边是VidSage的另一个关键设计。论文里建边不是只靠相邻片段连一条边而是把边的来源分成了两类第一类是时序边。相邻片段或者间隔K个片段的片段之间连边表达这两个片段在时间上是连续的。这条边保留了对时序顺序的建模能力是视频结构里最朴素也最可靠的关系。第二类是语义边。在特征空间中如果两个片段的特征相似度超过某个阈值或者互为k近邻就给它们连一条边。这条边表达的意图是这两个片段虽然在时间上隔得远但内容上是相关的。在我的理解里这两类边互补性很强。时序边保证模型知道什么顺序发生的语义边让模型知道什么东西是相关的。在实际视频里同一个物体反复出现、同一个场景来回切换这些跨时间的语义关联靠时序边根本表达不了只能靠语义边。2.3 图的结构是动态的还是静态的VidSage用的是动态图——图结构不是预先固定好的而是每一批训练数据进来、特征更新之后重新计算的。这个决策执行层的逻辑很清晰如果图是固定的那么GCN学到的只是在这个固定结构上的查表式聚合泛化能力有限。而动态图让每一轮迭代都在当前特征空间里重新定义邻居关系等于在训练过程中不断给模型提出新的挑战——你不仅要学特征还要在特征变化的同时适应新图结构。实操中这种动态建图要求模型对特征空间的变化不能太剧烈否则图结构会不稳定训练容易震荡。这也是我在复现时最注意的问题之一后面会详细说。3. 无监督训练目标模型靠什么信号学习建好了图接下来就是VidSage最核心的问题没有标签用什么损失函数来驱动GCN和特征提取器学习论文给出的方案可以拆成两个层次来看一个对比学习层面的全局目标一个图一致性层面的局部目标。3.1 对比学习拉近该近的推开该远的和主流的无监督视频表征学习一样VidSage也使用了对比学习的基本框架。具体来说同一段视频经过不同的数据增强比如随机裁剪、颜色抖动、时序打乱恢复得到的表征应该尽量接近而不同视频的表征应该互相推开。但VidSage的对比不是作用在视频级表征上就完了它还额外约束片段级的表征。这一点我认为在思路上更精细把同一个视频的不同片段看成这一组的成员它们的表征应该聚集在一起而来自其他视频和本视频无关的片段应当远离。于是对比目标既保留了视频级判别的能力又给片段级特征施加了空间约束防止图节点特征在训练中退化到无区分度的状态。3.2 图一致性约束邻居的表征要和谐单靠对比学习模型学到的大概率还是片段本身长什么样而GCN参与进来的价值应该体现在片段在上下文中的角色。为了让GCN真正学到图的语义VidSage加了一个图一致性约束。它的核心思想用一句话概括在图里互相关联的节点它们在表征空间里也应该保持一致或互补。具体做法是把原始特征和经过GCN聚合后的特征做一个对齐——让节点的原始表示和它的聚合表示互相预测。这个目标本质上是在逼问模型一个问题如果只知道某个片段和它的邻居是什么你能不能还原出这个片段的特征能完成这个任务意味着模型的节点特征已经包含了邻居上下文的信息。这其实和Word2Vec里CBOW的思想有一点神似——用上下文预测中心词。只不过在这里上下文不是一串词而是一张动态图上的邻居集合。3.3 训练时的采样和流程无监督训练要想稳定采样策略很关键。VidSage采用的做法是从训练集中随机抽一个batch的视频对每个视频做片段切分、特征提取、图构建然后同时计算对比损失和图一致性损失。整体流程大概是从一段视频中采样出若干片段特征提取器对每个片段编码得到节点初始特征在特征空间上计算节点间相似度结合时序关系构建图GCN在图上做几轮聚合得到带上下文信息的节点表征视频级表征通过对所有节点表征做池化得到用对比学习损失拉近同视频表征、推开异视频表征用图一致性损失对齐原始节点表征和聚合后节点表征。这个流程里我特别想强调的是第4步和第5步的衔接。GCN输出的每个节点已经带了邻居的信息这些节点再被池化成视频表征时视频表征就不只是帧特征的均值而是一个聚合了内部关系的整体表示。这比普通的帧级特征平均池化更有信息量。4. 实验设计与结果解读看论文的实验部分我一般不会只盯着精度数字而是会想清楚每个实验设计到底在验证什么。VidSage的实验安排在这方面做得比较完整从评估协议到消融实验环环相扣。4.1 评估协议线性探测是检验表征质量的试金石无监督表征学习的标准评估方式之一是线性探测linear probing把学到的特征提取器冻结特征后面接一个线性分类器只训练这个分类器看分类精度。这个协议的关键在于——它隔离了特征好不好和分类器强不强这两个变量。VidSage在这个评估协议下的结果在小规模动作识别数据集上线性探测准确率明显高于基于时序对比的基线方法。这个提升来源我认为要归功于语义边的引入时序对比方法只能利用相邻片段之间的关联而VidSage通过语义边把同一个动作中跨时间反复出现的视觉模式有效关联起来线性分类器拿到的特征自然更容易区分不同类别。4.2 不同数据集规模和迁移场景的表现论文在迁移学习上的实验也很有参考价值在源数据集上无监督训练然后迁移到其他下游任务评估效果。我发现这类图建模方法在迁移场景下通常比纯时序对比方法更稳原因在于GCN学到的是关系聚合的能力而关系聚合这个技能本身是跨数据集通用的。另外在小数据场景下VidSage的优势更明显。无监督方法最怕的不是数据多而是数据少且分布杂。GCN的邻居聚合天然起到了类似局部降噪的作用让单个片段的异常特征不容易带偏整体表征。4.3 消融实验的启示哪部分设计最关键论文的消融实验我重点看了三个问题去掉语义边只保留时序边性能明显下降。这说明跨时序的语义关联确实是收益的主要来源。去掉图一致性损失只保留对比学习性能也有下降但幅度小于去掉语义边。这告诉我们VidSage的核心竞争力更多在图结构的设计而不是loss设计。两个组件同时存在时互相增益最大。这里有一个自己的思考语义边的建图方式对结果非常敏感。用k近邻建图k值太大图会变得过度连通所有节点都互相影响GCN聚合出来就和全局平均差不多k值太小图又过于稀疏邻居信息不足。实验里最优的k值通常不大个位数到十几这暗示视频内部真正有意义的强关联是相对稀疏的。5. 复现实操中的几个关键细节读论文是一回事把代码跑起来又是另一回事。我复现VidSage的时候遇到了一些论文里着墨不多但实操中绕不过去的问题这里整理成笔记给想动手复现的朋友做个参考。5.1 图构建模块的实现要点图构建是我第一个卡住的模块。动态图意味着每一轮迭代都要重新计算相似度矩阵、取近邻、生成邻接矩阵。我最初的写法是用双重循环计算每对片段的相似度batch和片段数量一上来就慢得离谱。正确做法是把特征矩阵做矩阵乘法来算余弦相似度然后用topk取近邻。一个实现要点是拓扑维度的对齐别在batch维度上把不同视频的片段混在一起算近邻——每个视频内部的节点才能互相建边不同视频的片段在各自动图里是孤立的。这块用mask处理好还是很清爽的。5.2 训练稳定性的三个坑第一个坑是图结构震荡。前面提到动态图是每轮重新建的如果特征空间变动太剧烈节点的邻居关系会在训练早期频繁剧变GCN的聚合目标也跟着飘loss曲线看着就不对劲。缓解手段有两个一是给特征提取器的学习率设低一点让特征空间缓慢变化二是用滑动平均的方式更新用于建图的特征而不是直接用当前batch的原始特征。第二个坑是对比学习里的负样本设置。视频对比学习里同一个视频的正样本还好说负样本如果全部来自当前batch的其他视频容易出现batch太小、负样本太简单的问题。我当时把batch size调大之后效果有明显改善但显存占用也随之上升需要在性价比上做取舍。第三个坑是GCN层数不能太多。图卷积叠到三四层以上特征会过度平滑所有节点表征趋同。在视频片段级图上两层的GCN基本够用。论文里我没看到明确说用几层但按GCN的通病来说深了大概率坏事。5.3 一个小型超参数参考表我复现时用起来比较稳的参数组合大致是下面这样仅供参考参数取值范围备注片段长度4帧太短信息量不足太长片段内动作变化会被抹平视频采样片段数16这个量级建图计算量适中语义边k近邻值5~10我试过12图太密聚合效果反而下降GCN层数2超过3层就出现过度平滑建图特征滑动平均系数0.99太高更新慢太低图结构震荡对比学习温度系数0.1更低温让难负样本的梯度更突出注意这些参数在不同数据集上不保证通用尤其是片段数和k近邻值跟视频的平均时长、动作复杂度都有关系。我自己的经验是先固定其他参数只调k值观察哪个k值下验证集线性探测精度最先收敛再继续调别的。6. 读完之后的思考与扩展想法论文读完、代码跑通之后我坐在电脑前想了不少在这篇工作之外的问题。VidSage这篇论文最大的贡献在我看不是又一个无监督视频表征的方法而是示范了一种思路视频的理解不该被时序序列这一个框架锁死图结构可以成为更自然的表达语言。6.1 这个方法真正有价值的点把视频建模成动态图这个视角其实打开了不少后续工作的空间。最让我欣赏的是它对长时依赖的处理方式。对比学习做长时依赖通常靠时序上的间隔控制间隔大了就难学。但图模型不需要硬编码间隔——只要语义相似远距离的片段也会被连边GCN自然就把它们的表征关联起来了。这在处理视频前后呼应这类结构时特别自然。另外这种方法对多片段视频的扩展也更容易节点增加对GCN来说只是多几个邻居不需要像Transformer那样重新计算全局注意力。这在长视频场景下有实际应用价值。6.2 局限性也不能回避首先是语义边依赖初始特征质量。在训练早期特征提取器还比较弱的时候特征空间里算出来的近邻不一定真的语义相近这就相当于给图注入了一部分有噪声的关系。虽然有滑动平均缓解但我认为这个问题仍然没有被完全解决后续如果有工作能从局部像素特征或光流信息来补充建图应该会有改善。其次是图聚合的所得依赖建图的准确性。这其实是循环依赖问题——你想学好的表征来建好图可又需要好的图来学好表征。VidSage用动态迭代的方式缓解了这个死锁但它本质上靠的是大部分情况下弱特征也能找到粗粒度的近邻这个运气当视频内容特别杂、物体频繁切换时语义边的有效性会打折扣。6.3 我接下来想尝试的方向如果我在VidSage基础上做扩展会优先尝试三件事。第一把建图特征替换成多模态特征不只是RGB加上光流或者音频让语义边在跨模态的语义对齐下更可靠。第二在图聚合同步引入时序位置的编码信息目前节点特征已经包含了片段内容但显式的时序位置编码可以帮助GCN区分相邻的同类片段和相隔很远但语义相似的片段这两个情况在图里是连了不同的边。第三把预训练任务从纯对比扩展到视频级重建让模型在图聚合后不仅能判别视频还能重建原始片段序列这可能会让表征保留更多的细节信息。我在复现VidSage的过程中最大的体会是无监督视频表征学习到最后拼的往往不是模型有多复杂而是你有没有选对描述视频结构的语言。VidSage把图卷积网络带到这条赛道里挑了一个值得持续深耕的方向。希望这篇笔记能给正在看相关工作的你提供一些参考也欢迎在实践中一起交流把图建得更稳的经验。