细粒度动作识别新思路:跨注意力与潜在稀疏专家的融合方案

细粒度动作识别新思路:跨注意力与潜在稀疏专家的融合方案 细粒度动作识别听起来像一个方向非常明确的计算机视觉子领域但真正动手做过的人会知道难的不是“识别动作”而是“识别到能分辨的程度”。比如跑、走、跳这类动作视频分类模型很容易做到八九十分可一旦要区分“投篮出手”和“被犯规出手”、“正常切菜”和“刀工练习”、“太极推手”和“推搡动作”问题就完全变了。模型知道大框架没有用它得抓到那几十帧里真正起判别作用的局部线索。这种需求不是巧合而是很多真实场景的刚需。体育姿态分析、康复训练评估、工业安全监控、机器人模仿学习都要求模型不能只说“这个人动了”还要说清楚“这个人做的是哪种细微动作”。最近有一类方法试图把细粒度动作识别、跨注意力机制和潜在稀疏专家放到同一个架构里思路非常有意思与其让一个巨大网络记住所有动作模板不如让模型在推理时动态选择最适合当前样本的一组专家表示去做判断。这个方向值得认真拆一拆。1. 细粒度动作识别难在哪不是分类难是找到判别性线索最难1.1 粗粒度动作模型为什么会在细粒度任务上失灵常见的视频动作识别模型通常分成两个阶段先用预训练视频主干提取时空特征再用全局池化或时序聚合得到整段视频的表示最后送进线性分类器。这套流程对“跑步”“游泳”这种动作差异明显的任务非常有效因为类别之间的特征分布距离天然就大哪怕全局表示存在少量噪声分类边界也能轻松划分。但细粒度动作的类别差异往往只集中在极小的时空区域。举个例子同样是“倒水”倒热水和倒冷水的肢体轨迹高度相似区别可能只在手腕的倾斜角度以及容器离开桌面的距离。另一个常见问题是类别之间可能存在层级关系比如“跳”和“跳远”既重叠又有区分度。全局特征会把大量共性信息放到最高权重导致对差异极小的那部分特征非常不敏感。也就是说粗粒度模型的损失函数虽然在整个训练集上是下降的但它学到的那种特征分布本身就不适合解决“局部细节判别”问题。这有点像我们整理一个人的照片时第一眼记住的是整体着装颜色而不是手腕上一块表和袖口的关系如果任务变成了“根据衣品细节判断这个人当时是不是在参加商务活动”整体记忆就会失灵。1.2 细粒度识别真正需要的是“可选择的判别性线索”从人的判断机制看我们在区分相似动作时也不会用全身所有部位的信息。通常做法是先用余光看到整体场景然后立刻把注意力集中到最有区分度的区域手部形状、接触面材质、腿部弯曲时间点、物体和身体的相对位移。类比到模型里这个需求可以被拆成三条模型需要具备多个不同“视角”的表征专家每个专家擅长捕捉某一类判别性线索模型不能强迫每个视频都经过所有专家否则细粒度判别会被大量无关信息稀释模型需要让输入特征与专家特征自主交互找到哪些专家信息对当前样本最有用。这三点分别指向了稀疏专家、潜在空间和跨注意力。把它们组合在一个系统中正好构成了标题里那三个关键词的潜在逻辑先在潜在空间压缩信息再决定哪些专家应该被激活最后通过跨注意力让激活结果和原始视频特征深度融合。2. 从标题拆解三个概念为什么偏偏要放在一起2.1 潜在空间先压缩再决策而不是拿着全部视频帧去硬选先看“潜在”。视频经过主干网络后会形成一大串时空特征比如T×H×W×C的张量。如果直接把这样的特征送给门控网络做专家选择计算量很大而且冗余时间帧会严重干扰路由判断。模型经常会把注意力分配到画面主体发生的动作上却忽略了真正需要细看的那几帧。所以一个更合理的做法是先把时空特征投影到一个低维潜在空间让模型在潜在空间里学习“该类动作的抽象语义”。比如通过注意力池化或一组可学习的 latent query把原始视频特征压缩成几十个或几个潜在向量。这时候再进行专家选择相当于先给视频做了一次重要级摘要路由决策也就会稳定很多。从概念上说“潜在”在这里起的是中间人作用。它不是为了可视化或者做生成而是为了给后续的稀疏选择提供一个更紧凑但保留判别信息的支点。2.2 稀疏专家用条件计算替代“所有专家都对每个视频发言”专家这个思想并不新混合专家模型在语言模型和视觉模型里已经很常见。普通 MoE 通常会把 token 分发到不同专家每个专家可以是一组前馈网络或一个小型分类器。稀疏则是指门控网络只选择 top-k 个专家进行激活让每次前向计算不需完整跑全部专家。在细粒度动作识别里加入稀疏专家的核心动机应当是缓解专家之间的表征竞争。细粒度类别在特征空间上非常拥挤如果所有专家都会参与所有样本的预测专家很快就演化成一个大而全的网络每个专家之间没有明确分工。反过来如果通过潜在空间的稀疏门控让不同专家只响应当前视频中最有辨识度的若干因素专家就可以更“专注”。这里需要特别强调稀疏的关键不是省计算而是制造表征分离。即便在算力完全充足时稀疏结构也有价值因为它迫使模型放弃某些通用特征去使用少数几个更专项的特征组合来做出判断。2.3 跨注意力让视频特征和专家之间发生双向交互跨注意力的作用就更好理解了。视频特征和专家各自处在不同的语义空间视频特征更偏向原始时空外观专家则更偏向某一种判别策略。要让二者有效结合需要让视频特征部分作为 query去专家特征中检索和当前查询最贴合的信息。常见的实现形式是用视频特征或潜在特征作为 query专家输出作为 key/value得到注意力加权后的融合表示。这样做的好处是即便某个样本只被激活两个专家视频特征也可以在不同时间步上按需从专家中取用所需细节而不是简单地把专家输出拼在一起。读者如果熟悉 Transformer可以把跨注意力理解成“先看整篇文档再去查对应章节然后基于章节内容修正文档预判”。在细粒度动作识别场景里视频的自我注意力只能发现“这段动作大概属于哪个大类”而跨注意力能发现“如果用这个专家提出来的标准去检视它是不是更像某一个子类”。3. 架构工作流程一个合理的完整流水线3.1 从主干网络到下游头这个结构可以如何组织由于论文摘要没有展开我不能虚构作者的原版网络细节。但按照标题给出的设计语言和细粒度视频识别的常见工程结构可以搭建一条概念上自洽的完整流水线视频输入经过 2D/3D 主干网络提取多尺度时空特征特征通过时间池化或空间注意力形成一组原始视频 token使用少量可学习潜在 query 对视频 token 做跨注意力池化得到潜在语义向量将潜在向量传入门控网络计算每个专家的激活概率根据 top-k 选择或可微的稀疏采样机制选出若干参与本次推理的专家选中的专家各自输出判别特征再通过另一层跨注意力让视频 token 与专家特征交互最后聚合结果并根据细粒度类别标签完成分类。这套流水线强调了一个顺序先有潜在语义摘要再做专家路由最后做跨注意力融合。很多初看论文标题的人容易把跨注意力和稀疏专家的顺序搞反以为先让所有视频帧和所有专家做注意力再做稀疏化。但那样稀疏就不太有意义因为已经发生全交互了。3.2 伪代码级别的概念实现针对上述流程可以写一段简化但不失逻辑的 PyTorch 风格伪代码。它不是论文原版实现只为了帮助理解整体结构。真要用在自己的项目里需要注意topk之后带来的梯度传播和专家负载均衡问题。class LatentSparseExpertLayer(nn.Module): def __init__(self, latent_dim512, num_experts8, top_k2, hidden_dim1024): super().__init__() self.num_experts num_experts self.top_k top_k # 投影到潜在空间 self.latent_queries nn.Parameter(torch.randn(1, num_latents, latent_dim)) # 门控网络从潜在向量决定专家路由 self.gate nn.Sequential( nn.LayerNorm(latent_dim), nn.Linear(latent_dim, num_experts, biasFalse) ) # 每个专家可以用一个小型 FFN 或独立分类头表示 self.experts nn.ModuleList([ nn.Sequential( nn.Linear(latent_dim, hidden_dim), nn.GELU(), nn.Linear(hidden_dim, latent_dim) ) for _ in range(num_experts) ]) # 跨注意力层让视频特征去“查询”选中的专家 self.cross_attn nn.MultiheadAttention( embed_dimlatent_dim, num_heads8, batch_firstTrue ) def forward(self, video_tokens): # video_tokens: [B, L, D] # 1. 在潜在空间生成 query 并汇总视频信息 z cross_attention_from_queries( queryself.latent_queries.repeat(B, 1, 1), keyvideo_tokens, valuevideo_tokens ) # [B, num_latents, D] # 2. 计算专家路由概率 gate_logits self.gate(z.mean(dim1)) # [B, E] gate_probs torch.softmax(gate_logits, dim-1) # 3. top-k 稀疏选择 top_probs, top_indices gate_probs.topk(self.top_k, dim-1) # 4. 汇集被选中专家输出 expert_outputs [] for b in range(B): sample_experts [] for k in range(self.top_k): idx top_indices[b][k] expert self.experts[idx](z[b]) # [num_latents, D] sample_experts.append(expert) expert_outputs.append(torch.stack(sample_experts).sum(dim0)) expert_feats torch.stack(expert_outputs) # [B, num_latents, D] # 5. 跨注意力融合视频 token 与专家特征 fused, _ self.cross_attn( queryvideo_tokens, keyexpert_feats, valueexpert_feats ) # 6. 再接分类层完成细粒度分类 return fused这段代码最需要重视的是第 3 步。普通topk会让未被选中的专家完全不参与梯度更新这容易产生“路由崩溃”也就是某几个专家被反复选中其他专家长期休眠。大家在自己的实现里要么加入专家负载平衡辅助损失要么改用带噪声的 top-k 门控以保证路由探索要么设置专家 dropout让梯度有机会流向非最优先专家。3.3 为什么这个流程能保留细粒度信息从信息流的角度看细粒度信息其实经历了一次“粗选-精选-融合”的过程。原始视频里的所有时空信息先被压缩成潜在语义这一步天然过滤掉大量背景噪声。稀疏专家再用自己擅长的局部模式去处理潜在语义相当于把模糊线索定向放大。最后的跨注意力则保证放大的专家特征并没有替代原始视频特征而是回到视频特征上做逐位置修正避免关键帧信息在压缩阶段就被丢失。这样设计带来的直接好处是模型的分类边界不再依赖单一全局向量而是可以同时容纳多个决策维度。比如某个细粒度类别在“手部形状”上很难分类但加上“交互物体的时间点”这个专家维度后两个原来看起来几乎一样的视频就能被区分开。4. 训练阶段最容易踩的坑稀疏不是把 top-k 写了就够4.1 路由崩溃所有样本都走向同一个专家时该怎么办做过 MoE 类项目的人应该都见过这种场景训练一开始门控网络确实在选择不同专家但迭代几千步之后几乎所有输入的 gate logits 都偏向某几个专家最后那几个“不常被选中”的专家根本没有机会学习到有区分力的特征。细粒度动作识别里这个问题会更严重。因为细粒度类别的训练样本本来就少同一动作类别内的视频非常相似如果门控网络发现某个专家对这一类样本的预测已经比较准它就会一直增加该专家权重形成正反馈。长此以往稀疏专家退化成单个专家结构优势完全消失。常见的补救措施包括在门控 logits 上增加均匀分布的 KL 正则鼓励专家激活概率不要过度集中每批训练后统计专家被选中的次数对选中率过低的专家做一次权重扰动或临时提高路由噪声把top-k改成带温度的软性选择让梯度能够流向非 top-k 的专家。业界在文本 MoE 里经常使用的 load balance loss在视频细粒度场景中也同样适用。只不过这里需要注意视频任务中一个样本的多个帧/多个潜在位置可能会产生多个路由决策所以计算负载平衡时要考虑到底是以“视频粒度”统计还是以“token片段粒度”统计。从细粒度动作的目标来看我更建议以视频粒度统计路由概率因为最终类别标签对应的是整段视频而不是某一帧。4.2 预热、学习率和辅助损失需要重新设计细粒度动作识别的标签噪声本身也偏高。因为人和人判断相似动作的一致性远低于普通动作人工标注经常出现边界模糊。这时如果训练一开始就让跨注意力层学习“视频特征到专家特征的精确映射”模型很容易把数据噪声一并学会泛化就会变差。一种更稳妥的策略是分阶段训练。第一阶段先把视频主干网络和潜在特征提取器训练到基本可用的程度让潜在表示已经包含足够细粒度的语义第二阶段再打开门控网络和稀疏专家让模型慢慢学习路由选择第三阶段再端到端微调所有部分。这种安排牺牲了一些训练便利但能显著降低门控网络和专家特征在初期相互耦合导致的震荡。学习率方面给门控网络和跨注意力层设置较小的学习率通常更安全。因为这两个模块更新过度会直接改变路由分布导致前几步还在学习的专家特征突然失去训练样本后几步又被重新激活模型表示会非常不稳定。4.3 辅助任务不是每个视频都必须走稀疏专家如果采集到的动作类别之间已经有明确的层级结构例如“运动-球类运动-篮球-投篮”这种树状体系那么稀疏专家和类别层级可以形成天然互补。我们可以让不同层级的专家负责不同抽象级别的语义或者用多任务训练方式让潜在表示同时预测粗粒度类别和细粒度类别。这样模型内部不会只聚焦最终标签而是保留层级上下文。细粒度标签之间的样本太少时粗粒度类别的信息就会反向补充专家特征的学习让每个专家不至于学习得太过孤立。5. 它和普通 MoE、普通注意力相比位置到底特殊在哪里5.1 普通 MoE 是“让每个 token 找专家”这里更像“让视频找判断策略”在语言模型或通用视觉 MoE 中输入会被拆成很多 token每个 token 分别被路由到不同专家。这种设计的核心是为了扩展模型容量同时控制计算成本。对于一个视频来说几百个 token 会在不同专家之间分散没有任何一个专家能对整段视频形成整体理解。细粒度动作识别则更接近“整段视频提供可解释的判别意见”。如果沿用语言模型的 token 级路由模型很容易赚到表征多样性的便宜但很难学到“这个动作需要用哪几条线索来判定”这种全局判断。因此标题里的潜在稀疏专家很可能更倾向于在潜在语义层做路由而不是在整个时空特征图上直接逐位置路由。这也是为什么文章开头说要从潜在空间开始而不是直接从原始 token 开始。从这个角度讲潜在稀疏专家结构的本质不是“把 MoE 搬到视频里”而是把 MoE 从 token 级推广到了任务级。它试图回答的问题不是“视频的某个局部由谁来处理”而是“这个视频样本的判别式难点由谁来提供测试假设”。5.2 跨注意力不是通道注意力也不是普通自注意力另一种容易混淆的做法是用通道注意力或自注意力直接增强细粒度特征。这类方法的注意力范围只局限在图像/视频本身的内部关系参数少训练稳定在不少标准数据上有效。但它们缺少一个显式的外部表示源。跨注意力引入专家特征作为“外部知识源”之后模型的查询就从“我内部哪些通道和位置更有用”变成了“专家掌握的哪些判别模式更适合当前这个动作”。当专家数量增多、每个专家有不同初始化或不同输入分辨率时这种外部知识结构比单纯加深网络更容易提供互斥且互补的特征。当然这并不意味着跨注意力比自注意力更强。只有当专家集合确实包含了多样且稳定的判别模式外部知识源才有价值。如果专家都从同一个主干初始化并在同样的样本上训练那它们彼此相似跨注意力融合到最后其实还是自注意力的一种变形。所以稀疏路由的真正挑战是如何保持专家多样性。6. 用一套可复用的实验评价框架来验证它6.1 不能只看 Top-1 准确率还要看“最难样本对被分开多少”细粒度动作识别最大的误差来源是易混淆类别比如“开门”和“关门”或“投篮命中”和“投篮未中”。只计算整体 top-1 准确率会被大量简单样本拖平掩盖模型在边界样本上的表现。建议的验证指标至少包含四类评价维度指标关注点基础分类能力Top-1 / Top-5 准确率整体够不够用细粒度判别能力易混淆类别准确率、每个类的 F1有没有真在解决细粒度难点专家利用状态路由分布、负载均衡度、激活专家数量稀疏机制有没有健康工作计算效率FLOPs、单条视频推理耗时、专家缓存占用换来细粒度收益的同时成本是否可控其中“易混淆类别准确率”在论文类的消融中非常重要。简单做法是统计训练集中最常见的类别对只评估这些类别对上的二分类准确率然后与整体准确率比较。如果整体指标提升 2%但在最难的类别对上没有提升说明模型提升的其实是背景建模或时序平滑能力不是真正的细粒度判别能力。6.2 消融实验到底要消融掉什么很多研究者做消融时只知道“去掉跨注意力”或“去掉稀疏专家”但这样得到的结果很难说明设计意图。更合理的消融路径是逐步改变路由粒度用来验证潜在稀疏的必要性第一步把潜在稀疏专家替换成普通全局特征池化 全连接分类器第二步保留专家但把稀疏 top-k 改成所有专家都融合第三步保留 top-k 但去掉跨注意力直接把路由得分当作权重对专家输出做线性加权第四步保留全设计但把潜在空间向量替换成原始时间平均向量验证潜在压缩是否有效。这四个版本的性能差异其实分别对应四个结论专家机制是否有效、稀疏是否带来增益、跨注意力融合是否优于线性加权、潜在空间是否优于简单池化。这样即使没有展示复杂的注意力热图也能让读者信服设计的每一步都有信息量。6.3 适合与不适合的应用场景边界适合使用这类架构的场景通常有三个共同点有细粒度类别定义且不同类别的外观差异小于类内差异有足够的训练数据能够承载多专家和跨注意力的学习成本推理端允许在一定延迟范围内做额外计算而不是部署到受限的嵌入式设备。不适合的场景也比较明显。比如类别非常少且容易区分时加入专家结构只是徒增训练负担如果训练数据只有几十个视频跨注意力和稀疏专家的组合反而容易过拟合效果未必比一个精心调参的 3D 卷积网络更好。另外实时性要求极高的端侧任务也不适合使用一个需要多个专家前向推理的复杂模型。7. 如果自己想复现怎么把一个大方向变成能跑的实验7.1 数据和代码组织的顺序决定了你能不能定位问题第一次复现这类方向的模型最好不要直接从完整数据集开始。因为稀疏专家和跨注意力两个模块叠加在一起一旦指标不好很难判断是路由崩了、注意力没学到、还是数据加载有 bug。建议采用一条从易到难的路径先在粗粒度动作识别数据上验证模型基础能力再在细粒度数据上只冻结主干、训练潜在表示与分类头记录当前最好分数加入一个专家和一个全融合跨注意力看看模型能不能回到此前分数增加专家数量和稀疏路由逐步比较性能变化。每走一步都要保存 checkpoint 和指标曲线否则后期会陷入“疯狂调参但不知道哪里出了问题”的状态。我见过很多人直接训练 MoE 视频模型结果第一个实验跑到一半就出现梯度变成 NaN最后排查下来发现只是某段视频解码失败后产生的异常张量影响了整个 batch。细粒度数据集的预处理链路通常比通用数据集更长优先把视频解码、裁剪、采样和标签对齐检查好再进入模型部分会省掉很多不必要的排查时间。7.2 三层调试链路先看损失再看路由最后看表征复现过程中遇到指标异常建议按以下顺序排查看训练损失有没有下降。如果连训练集损失都不降问题通常在数据或主干网络适配层看路由分布是否退化。如果所有样本都集中在某几个专家上说明辅助损失或者温度设置有问题看输出表征的最近邻。找几个分类错误的样本把它们在潜在空间中的特征和正确类别样本做相似度计算。第三点经常被忽略但特别有效。细粒度动作识别中模型分类错误的真实原因往往不是分类边界不好而是它提取到的表征里错误类别和正确类别已经无法区分。这时要做的是改进特征提取而不只是换一个更强的分类器。跨注意力里的注意力权重也可以作为观察窗口如果一个视频被错误地分类到另一个专家可以可视化这个片段中注意力集中在哪个时间段看是不是和人工判断的关键片段一致。这套调试方法等于给模型做了一次“细粒度模型体检”。7.3 资源不够时能不能用这个结构很多研究者和学生并不具备训练超大视频模型的条件。这种情况下可以用一个简化版做 sanity check主干网络从视频大模型换成 2D CNN 时序池化只保留专家结构的核心逻辑把视频帧率降到很低比如每秒 2 帧测试跨注意力能否从少量帧中恢复动作细节专家数量设置成 4 到 8 个每个专家只保留一两层线性映射。简化版依然可以验证“细粒度判别是否能从稀疏专家中受益”这个核心命题。如果真的有效再逐步扩大数据集和模型规模。这样做既符合科研迭代规律也避免了一个人为了复现论文而陷入算力泥潭。8. 这件事真正值得关注的地方也许不是架构本身对比过去几年细粒度动作识别的发展可以看出一条很清晰的变化线。早期方法把大量精力放在手工设计部分检测器、姿态估计器和交互关系模块上后来端到端视频模型凭借更强的学习能力完成了统一建模而到了现在的阶段研究者又开始强调结构先验和条件计算。潜在稀疏专家这种架构可以被理解成两个时代方案的折中它用跨注意力保留了端到端的可学习性又用专家集群恢复了“先找局部判别部件再做综合判断”这种认知结构。我觉得这套思想的价值远不止于刷榜。它真正在解决的是训练和推理之间的结构不对称问题训练时数据可能是复杂、多模态、充满干扰的视频但最终判断只需要少数几个决策维度。让网络对每一个输入都跑一遍全结构空间和时间成本都很高而且在细粒度任务里还会引入噪声。通过潜在空间和稀疏路由模型学会了“先摘要、再选择、后融合”这种流程和人类审查高难度样本时的思路越来越接近先扫一遍理解整体布局再快速定位小窗口里的局部差异最后综合判断。未来视频内容理解的落地场景会越来越细分比如在线教育里的动作纠错、直播场景中的行为识别、体育训练中的姿态评估这些任务都不可能再靠一个简单视频分类模型打天下。真正能站稳脚跟的一定是愿意在特征表征层面进行结构性设计、并且能针对任务重新组织推理方式的系统。而细粒度动作识别中的这类交叉研究恰好给了我们一个比较完整的参照。如果现在你正在做类似方向我最想给的提醒不是“快去找更好的骨干网络”而是先把问题定义清楚它到底需要几个角度来判别不同角度之间是否存在互斥性哪些角度可以被潜在表示压缩而不损失精度。把这些搞定之后像潜在稀疏专家这种结构才有机会成为你的工具箱而不仅仅是论文里的一个名词。