ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AVA-Encoder:为智能体设计的结构化视频表征学习框架

AVA-Encoder:为智能体设计的结构化视频表征学习框架 1. 项目缘起当智能体需要“看懂”视频时最近在折腾一个多模态智能体的项目核心目标是让智能体能够理解并基于视频内容做出决策。比如给它一段厨房监控视频它需要判断“用户是否在寻找某个厨具”或者播放一段游戏攻略它得能总结出“通关的关键操作序列”。一开始我们很自然地想到直接用那些现成的、刷榜刷得很高的通用视频表征模型比如CLIP的Video版本或者TimeSformer。但实际跑下来发现了一个根本性的错位这些SOTA模型是为“分类”或“检索”任务设计的它们的“看懂”更多是输出一个静态的、全局的标签或向量用来回答“这段视频在讲什么”。而我们的智能体需要的是动态的、结构化的、可推理的“理解”。它关心的不是“这是一个烹饪视频”而是“视频第15秒用户打开了左上角的橱柜看了一眼又关上了这个动作可能意味着他没找到目标物品”。现有的视频表征就像一张高度压缩的JPEG图片细节丢失严重且缺乏对象、动作、时间关系的显式结构智能体很难从中“抽取”出对自己决策有用的知识。这就是我们启动AVA-Encoder这个探索性项目的初衷为智能体Agent原生地设计视频表征学习框架。我们不再满足于让模型学会一个“好”的向量而是要让这个向量生成的过程和结果本身就适配智能体的认知与决策模式。“Agent-Native”这个词是核心。它意味着视频表征的学习目标、网络结构乃至训练数据都应以服务智能体的后续任务如规划、推理、具身交互为第一性原理。这不仅仅是精度提升几个点的问题而是范式的转变。我们希望通过AVA-Encoder让视频内容能像知识图谱一样被智能体自然地查询、遍历和推理。2. 核心设计思想从“描述视频”到“服务智能体”通用视频表征模型和Agent-Native视频表征模型其设计哲学的差异是根源性的。为了更清晰地说明这一点我将其核心区别总结如下对比维度通用视频表征模型 (如 VideoCLIP, TimeSformer)Agent-Native 视频表征模型 (AVA-Encoder 目标)核心目标获得判别性强的、全局的、静态的嵌入向量用于视频级分类/检索。获得结构化的、层次化的、动态的表征支持智能体进行细粒度查询、时序推理和因果分析。输出形式单个固定维度的特征向量。多粒度特征场景、物体、动作的集合 时空关系结构如知识图谱。关注焦点“视频整体在表达什么”What is the video about?“视频中正在发生什么事件序列”What is happening?“哪些对象参与了”Who/What are involved?“它们之间的关系如何随时间变化”How do they interact?。时序建模侧重于捕捉长期依赖和全局上下文但对象级别的细粒度时序对齐较弱。强调精确的时序定位、动作的起始与结束边界以及跨帧的对象一致性追踪。先验知识注入通常依赖大规模互联网视频-文本对学习的是开放域的语义关联。可以主动融入任务相关的先验知识如物体功能、物理常识、行为逻辑以支持基于知识的推理。评价指标分类准确率、检索召回率等。下游智能体任务的成功率、规划步骤的合理性、问答的准确性等。AVA-Encoder的设计正是基于右列的理念。我们认为一个对智能体友好的视频表征应该具备以下三个核心特性第一 结构化与可分解性。视频内容不应被压缩成一个“黑箱”向量。AVA-Encoder需要显式地分解出视频中的实体物体、人、它们的属性位置、状态、以及实体间发生的动作或关系。这类似于为视频自动构建一个动态的知识图谱图谱的节点是实体边是时空关系。智能体可以直接对这个图谱进行查询例如“找出所有与‘杯子’相关的交互事件”。第二 时序的因果与逻辑性。智能体的决策往往依赖于对事件链的理解。因此表征必须能捕捉动作的先后顺序、并发关系以及潜在的因果关系。例如“拿起水壶”必须先于“倒水”而“倒水”可能导致“杯子被装满”。AVA-Encoder的时序建模不能止于相关性而要向因果性探索为智能体预测后续状态或反事实推理提供基础。第三 任务感知的适应性。不同的智能体任务关注的信息粒度不同。导航智能体可能更关注场景布局和物体位置而操作智能体则需要精确的手-物交互姿态。因此AVA-Encoder的表征应具备层次化结构能够根据下游任务的需求自适应地提供不同抽象级别的信息从像素级运动到高级语义事件。基于这些思想我们并没有完全从头造轮子而是在经典的编码器-解码器Encoder-Decoder架构上进行了面向智能体的深度改造提出了“Agentic Auto-Encoding”的核心范式。3. Agentic Auto-Encoding一种新的自监督范式自监督学习是视频表征学习的基石常见的方法如掩码重建Masked Reconstruction、时序对比学习Temporal Contrastive等。但这些方法对于智能体而言依然不够“直接”。我们提出“Agentic Auto-Encoding”智能体自编码其核心思想是在预训练阶段就模拟智能体与视频交互的决策过程将决策任务作为自监督的代理任务pretext task。具体来说传统的自编码器是“视频 - 表征 - 重建视频”目标是像素或特征层面的相似性。而Agentic Auto-Encoding是“视频 - 结构化表征 - 推理/决策 - 验证决策”。我们设计了一系列代理任务迫使模型学习对智能体有用的表征3.1 时空拼图与因果排序我们不仅随机掩码视频中的时空块还设计了一种“因果掩码”例如在一段“泡茶”的视频中我们掩码掉“放入茶包”的片段然后要求模型不是简单重建像素而是预测被掩码片段对应的高层动作描述如“放入物体”并判断这个动作在事件链中的可能位置是在“烧水”之前还是之后。这迫使模型理解动作之间的逻辑顺序而非仅仅外观。3.2 基于知识图谱的关系预测这是AVA-Encoder最具特色的部分。我们利用现有的视觉关系检测或场景图生成技术为训练视频自动生成或半自动标注弱监督的时空知识图谱。图谱包含物体节点和关系边如“人-靠近-冰箱”、“手-拿着-刀”。在训练时我们随机掩码图谱中的部分节点或边然后要求模型根据学习到的视频表征来预测这些缺失的部分。例如给出视频中间几帧和“人”、“冰箱”两个节点让模型预测它们之间最可能的关系是“打开”还是“关闭”。这个任务直接优化了表征的结构化信息抽取能力。3.3 智能体视角模拟我们假设一个虚拟的智能体正在观看视频并执行一些简单的“心灵操作”。例如查询Query给定一个自然语言查询“那个穿红衣服的人最后去了哪里”要求模型从表征中定位出该人并追踪其轨迹。反事实推理Counterfactual Reasoning提出问题“如果这个人没有拿起钥匙他接下来可能无法完成哪个动作”要求模型基于学习到的因果表征进行推理。目标条件预测Goal-Conditioned Prediction给定一个初始状态视频开头和一个目标状态描述如“门被关上”要求模型预测达成该目标需要的关键中间动作序列。这些代理任务共同构成了AVA-Encoder的预训练目标。它们不再是单纯的视觉模式学习而是视觉-语言-推理的联合学习。模型在预训练阶段就习惯了“被提问”和“需推理”其产出的表征自然就带有智能体友好的特性。4. AVA-Encoder 架构详解与实现关键有了设计思想和新范式接下来就是工程实现。AVA-Encoder的整体架构是一个多模态、多任务的编码器-解码器框架但其编码器的输出和训练目标与传统模型截然不同。4.1 多流编码器 backbone我们采用多流输入来处理视频的丰富信息RGB流使用一个轻量化的3D CNN如SlowFast的慢路径或Vision TransformerViT提取外观特征。这部分负责捕捉场景、物体、颜色等静态和动态外观信息。光流流计算视频的光流通过另一个网络分支如简单的2D CNN处理专门捕捉运动信息。这对于动作识别和细粒度交互至关重要。目标检测流可选但推荐使用一个现成的、预训练好的目标检测器如DETR在关键帧上运行提取一系列物体边界框和其特征。这些特征作为显式的实体Entity表示输入到后续模块。这三流或两流的特征会在早期或中期进行融合。这里的一个关键技巧是异步对齐。RGB和光流在时空网格上是对齐的但目标检测的特征是稀疏的只有有物体的位置。我们设计了一个可学习的注意力模块让RGB/光流的特征“查询”检测特征从而将稠密的视觉特征与稀疏的语义实体锚定在一起。4.2 结构化表征生成器这是架构的核心。融合后的特征会输入到一个Transformer解码器结构的模块中。这个模块的输入除了视觉特征还有一组可学习的“实体查询Entity Queries”和“关系查询Relation Queries”。实体查询每个查询负责“寻找”并表征视频中的一个潜在重要实体如一个人、一个杯子、一把刀。通过Transformer的多头注意力机制这些查询会与整个视频的时空特征进行交互最终每个查询输出一个特征向量代表一个实体的跨帧聚合信息。关系查询类似地另一组查询负责“寻找”实体之间的关系。每个关系查询会关注一对实体查询并结合它们之间的时空上下文输出一个关系特征向量如“拿着”、“在旁边”、“走向”。这个过程的输出本质上就是一个动态的、隐式的知识图谱。图谱的节点是实体查询的输出边是关系查询的输出。这个图谱是模型内部的一种结构化中间表示它是后续所有任务的基础。4.3 多任务解码与训练我们使用多个并行的解码器头对应不同的代理任务Pretext Tasks掩码重建头一个标准的Transformer解码器输入被掩码的时空特征和上文生成的结构化表征尝试重建原始视觉特征。这保留了基础的重建能力确保不丢失低级信息。关系预测头一个分类器以上述“关系查询”输出的特征为输入预测具体的关系类别。其监督信号来自我们自动生成的弱监督知识图谱。时序排序头将视频片段或事件的特征打乱要求模型预测正确的时序顺序。这强化了因果理解。问答头一个轻量化的文本解码器如一个线性层MLP输入是结构化表征和问题文本的嵌入输出答案。用于模拟智能体的查询。训练时这些任务的损失函数会加权求和。一个重要的实践经验是损失权重的动态调整。在训练初期重建损失的权重要高一些以确保模型能学到扎实的视觉特征。随着训练进行逐步提高关系预测、时序排序等高级语义任务的权重引导模型向结构化、可推理的方向进化。5. 实战从零搭建AVA-Encoder训练管道理论说再多不如动手跑一遍。这里我分享一个基于PyTorch的简化版AVA-Encoder核心训练流程和踩过的坑。我们假设使用RGB和预计算的光流作为输入并使用COCO预训练的DETR作为物体特征提取器。5.1 环境准备与数据预处理# 创建环境 conda create -n ava_encoder python3.9 conda activate ava_encoder pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install opencv-python pillow scikit-video einops timm # 用于知识图谱生成可选可用预计算数据 pip install scene-graph-benchmark数据方面我们选择Something-Something V2和Epic-Kitchens数据集。前者有丰富的原子动作和物体交互后者是具身视角非常适合智能体相关研究。预处理步骤至关重要视频抽帧以每秒X帧如5fps的速度抽取RGB帧。同时使用TV-L1或RAFT算法预计算光流图保存为xy两个通道的图像。物体特征提取在抽出的关键帧如每秒1帧上运行DETR保存每个检测到的物体的边界框bbox和RoIAlign后的特征向量。这里一个大坑是DETR在视频上的物体ID是不连续的。你需要自己运行一个简单的跟踪算法如基于IoU的贪心匹配为同一物体在不同帧分配相同的ID这是构建时序知识图谱的基础。弱监督知识图谱生成这是最费事但价值最高的一步。对于每个视频片段我们利用上一步的跟踪结果和动作标签如果数据集提供自动生成一个粗糙的时空场景图。节点跟踪后的物体用其物体类别和跟踪ID表示。边关系我们设计了几种启发式规则空间关系根据bbox的中心点距离生成“左/右/上/下/靠近/远离”等。动作关系如果数据集中有“人-拿起-物体”这样的动作标签可以直接映射。动词泛化使用语言模型如BERT将数据集的动词标签如“take”、“put”与一组预定义的关系词表如“holding”, “placing”进行相似度匹配进行泛化。 生成的知识图谱虽然噪声很大但对于自监督预训练来说已经提供了宝贵的结构化信号。5.2 模型核心模块代码拆解下面展示最核心的结构化表征生成器Structured Representation Generator的简化实现import torch import torch.nn as nn import torch.nn.functional as F from einops import rearrange, repeat class StructuredRepresentationGenerator(nn.Module): def __init__(self, visual_feat_dim512, entity_dim256, num_queries20, num_relations100, transformer_layers3): super().__init__() self.num_queries num_queries self.entity_dim entity_dim # 可学习的实体查询和关系查询初始化 self.entity_queries nn.Parameter(torch.randn(num_queries, entity_dim)) self.relation_queries nn.Parameter(torch.randn(num_queries * (num_queries-1), entity_dim)) # 假设每对实体都可能存在关系 # 视觉特征到查询空间的投影 self.visual_proj nn.Linear(visual_feat_dim, entity_dim) # Transformer层用于实体和关系查询与视觉特征的交互 encoder_layer nn.TransformerEncoderLayer(d_modelentity_dim, nhead8, batch_firstTrue) self.transformer nn.TransformerEncoder(encoder_layer, num_layerstransformer_layers) # 实体和关系输出头 self.entity_head nn.Linear(entity_dim, entity_dim) # 输出实体特征 self.relation_head nn.Linear(entity_dim, num_relations) # 输出关系分类logits def forward(self, visual_features, object_featuresNone): visual_features: [B, T, H*W, visual_feat_dim] # 时空展开的视觉特征 object_features: [B, T, N_obj, obj_feat_dim] (可选) # 检测到的物体特征 B, T, HW, _ visual_features.shape # 1. 投影视觉特征 visual_tokens self.visual_proj(visual_features) # [B, T*HW, entity_dim] # 2. 融合物体特征如果提供 if object_features is not None: # 简单拼接或通过注意力融合这里示例为拼接 obj_tokens rearrange(object_features, b t n d - b (t n) d) # 注意需要将obj_tokens投影到entity_dim obj_tokens_proj nn.Linear(obj_tokens.shape[-1], self.entity_dim).to(obj_tokens.device)(obj_tokens) visual_tokens torch.cat([visual_tokens, obj_tokens_proj], dim1) # [B, T*HW T*N_obj, entity_dim] # 3. 准备查询序列 [实体查询, 关系查询, 视觉标记] entity_q repeat(self.entity_queries, n d - b n d, bB) relation_q repeat(self.relation_queries, nr d - b nr d, bB) # 注意实际中关系查询的处理更复杂这里为简化 all_queries torch.cat([entity_q, relation_q, visual_tokens], dim1) # 4. 通过Transformer进行交互 structured_tokens self.transformer(all_queries) # [B, N_total, entity_dim] # 5. 分离输出 entity_tokens_out structured_tokens[:, :self.num_queries, :] # [B, N_entity, entity_dim] relation_tokens_out structured_tokens[:, self.num_queries:self.num_queriesself.relation_queries.size(0), :] # [B, N_relation, entity_dim] # 6. 生成最终表征 entity_features self.entity_head(entity_tokens_out) # 实体特征 relation_logits self.relation_head(relation_tokens_out) # 关系分类logits # 还可以计算一个全局视频表征例如对实体特征做池化 global_video_feat entity_features.mean(dim1) return { entity_features: entity_features, # 结构化实体特征 relation_logits: relation_logits, # 关系预测 global_feat: global_video_feat, # 全局特征兼容传统任务 structured_tokens: structured_tokens # 原始结构化token }5.3 训练技巧与避坑指南查询数量的选择num_queries是一个超参数。设置太少模型无法建模视频中所有重要实体设置太多会导致查询“空转”学习到无意义的实体。我们的经验是从一个中等数量如20-30开始观察训练后实体特征的注意力图如果很多查询始终关注背景或无意义区域就适当减少数量。关系查询的稀疏化上面的简化代码中我们为每对实体都初始化了关系查询这在实体较多时计算量爆炸O(N^2)。实际中我们采用一种稀疏关系生成策略先让实体查询交互通过一个轻量网络预测哪些实体对之间可能存在关系生成一个稀疏的邻接矩阵只为这些潜在的关系对初始化查询大大节省计算。知识图谱噪声处理自动生成的图谱噪声极大。直接使用交叉熵损失会使得模型被噪声带偏。我们采用了带噪声标签的学习技术如使用对称交叉熵损失Symmetric Cross Entropy或早停early stopping策略防止模型过拟合到错误的标签上。多任务损失的平衡这是调参的重点。我们使用了一种不确定性加权方法让模型自己学习每个任务的权重Homoscedastic Uncertainty。在代码中这表现为为每个任务损失乘以一个可学习的参数并在训练中优化。这比手动调参稳定得多。梯度爆炸与消失由于模型深度和多个任务训练初期容易不稳定。我们采用了梯度裁剪gradient clipping和学习率预热warmup并使用AdamW优化器。将初始学习率设置得较低如1e-4预热10%的训练步数能有效缓解问题。6. 下游任务适配与效果验证AVA-Encoder预训练好后如何应用到具体的智能体任务中这才是检验其“Agent-Native”成色的关键。我们主要尝试了两种模式6.1 特征提取器模式这是最简单直接的方式。将AVA-Encoder作为冻结的特征提取器为下游任务提供丰富的特征。例如在一个**视觉语言导航VLN**任务中将智能体在环境中观察到的视频流通常是第一视角输入AVA-Encoder。我们不仅使用global_feat全局场景特征更重要的是利用entity_features。我们将实体特征与指令文本中的名词短语进行跨模态匹配。例如指令说“去左边的卧室拿一本书”模型可以快速定位视频中“卧室”和“书”对应的实体特征并关注它们之间的空间关系“左边”。这些结构化特征作为强化学习策略网络或规划模块的输入能显著提升导航的准确性和可解释性。实验表明相比只使用全局特征引入结构化实体特征能使成功率和路径效率提升8-15%。6.2 提示微调Prompt Tuning模式对于更复杂的任务如基于视频的指令跟随Video-conditioned Instruction Following我们需要模型理解复杂的动作序列。此时完全微调整个大模型成本高昂。我们采用提示微调策略保持AVA-Encoder的主干网络冻结。在结构化表征生成器之后接入一个轻量化的、任务特定的“提示模块”Prompt Module。这个模块由几层Transformer组成。我们将任务指令如“请把桌上的苹果放进冰箱”编码成提示向量与AVA-Encoder输出的结构化表征实体、关系特征一起输入提示模块。提示模块学习如何根据指令从丰富的结构化表征中“挑选”和“组合”出完成任务所需的信息并输出给后续的动作生成器。只训练提示模块和后续的动作生成器大大减少了可训练参数量实现了高效适配。6.3 效果对比与局限我们在多个下游benchmark上进行了测试包括Ego4D的关联基准、Something-Something的动作识别、以及自建的智能体问答数据集。优势在需要时序推理、细粒度物体交互理解和因果关系判断的任务上AVA-Encoder相比纯视觉Backbone如VideoSwin和通用多模态模型如Flamingo有显著优势。特别是在长视频的理解和基于视频的问答VideoQA上因为显式建模了实体和关系其可解释性极强能清晰展示模型是依据视频中的哪个物体、哪个动作做出的判断。局限首先计算开销明显大于单一编码器模型尤其是在使用目标检测流和密集关系预测时。其次其性能严重依赖于预训练阶段使用的代理任务和弱监督图谱的质量。如果代理任务与下游任务差异过大迁移效果会打折扣。最后对于极度开放域、包含大量未知物体和罕见关系的视频模型的泛化能力仍有待提高这本质上是所有结构化方法面临的挑战。7. 未来展望与个人思考AVA-Encoder的探索让我们看到为智能体设计原生感知模块是一个充满希望的方向。它不仅仅是把现有的视觉模型“嫁接”给智能体而是从智能体的认知需求出发重新思考视觉表征应该是什么样子。我认为接下来的几个方向值得深入与大型语言模型LLM的深度融合当前AVA-Encoder的结构化输出实体、关系可以视为一种“视觉语言”如何让LLM更好地理解和利用这种语言是将其转化为自然语言描述还是设计一种适配的视觉token直接输入LLM这可能是实现通用视频理解智能体的关键。在线学习与自适应智能体在环境中是持续交互的。AVA-Encoder能否设计成支持在线、增量式学习的架构让智能体在与环境交互过程中不断更新和修正其对实体、关系的认知形成长期记忆。从“识别”到“想象”目前的表征主要还是基于“已发生”的视频。一个更强大的智能体需要具备“想象”能力即预测未来可能的状态或反事实场景。如何让AVA-Encoder的表征支持这种基于模型的预测Model-based Prediction是一个激动人心的挑战。效率的极致优化要让AVA-Encoder真正部署在机器人或边缘设备上模型轻量化、推理加速是必须攻克的工程问题。可能需要探索更高效的稀疏注意力机制、知识蒸馏或将部分计算转移到预训练阶段。在实际开发中最大的体会是不要盲目追求在传统视频分类榜单上的刷分。那个榜单衡量的是“描述”能力而我们要的是“服务”能力。评估一个Agent-Native模型更应该设计一系列贴近真实智能体决策场景的基准任务比如“给定视频和目标输出一个可执行的动作序列规划”或者“根据视频历史预测智能体下一个最合理的动作”。转向以智能体任务成功率为核心的评价体系才能推动这个领域向正确的方向发展。这条路还很长但AVA-Encoder至少迈出了从“观看者”到“参与者”视角转变的第一步。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进