Is Space-Time Attention All You Need for Video Understanding?

系列博客目录



TimeSformer模型

输入片段:TimeSformer模型的输入片段。TimeSformer的输入是一个大小为 X ∈ R H × W × 3 × F X \in \mathbb{R}^{H \times W \times 3 \times F} XRH×W×3×F 的片段,其中 F F F 是从原始视频中采样的RGB帧的数量,每帧的大小为 H × W H \times W H×W

分解为补丁:参照ViT(Dosovitskiy et al., 2020),我们将每帧图像分解为 N N N 个不重叠的补丁,每个补丁的大小为 P × P P \times P P×P,使得 N N N 个补丁覆盖整个帧,即 N = H × W P 2 N = \frac{H \times W}{P^2} N=P2H×W。我们将这些补丁展开成向量 x ( p , t ) ∈ R 3 P 2 x(p,t) \in \mathbb{R}^{3P^2} x(p,t)R3P2,其中 p = 1 , … , N p = 1, \dots, N p=1,,N 表示空间位置, t = 1 , … , F t = 1, \dots, F t=1,,F 表示帧的索引。

线性嵌入:我们通过一个可学习的矩阵 E ∈ R D × 3 P 2 E \in \mathbb{R}^{D \times 3P^2} ERD×3P2,将每个补丁 x ( p , t ) x_{(p,t)} x(p,t) 线性映射为一个嵌入向量 z ( p , t ) ( 0 ) ∈ R D z^{(0)}_{(p,t)} \in \mathbb{R}^D z(p,t)(0)RD
z ( p , t ) ( 0 ) = E x ( p , t ) + e ( p , t ) p o s (1) z^{(0)}_{(p,t)} = E x_{(p,t)} + e_{(p,t)}^{pos} \tag{1} z(p,t)(0)=Ex(p,t)+e(p,t)pos(1)
其中 e ( p , t ) p o s ∈ R D e_{(p,t)}^{pos} \in \mathbb{R}^D e(p,t)posRD 表示可学习的位置信息嵌入,用于编码每个补丁的时空位置。得到的嵌入向量序列 z ( p , t ) ( 0 ) z^{(0)}_{(p,t)} z(p,t)(0),其中 p = 1 , … , N p = 1, \dots, N p=1,,N t = 1 , … , F t = 1, \dots, F t=1,,F,作为Transformer的输入,并且与NLP中的文本Transformer接收到的嵌入单词序列类似。与原始BERT Transformer(Devlin et al., 2018)类似,我们在序列的第一个位置添加一个特殊的可学习向量 z ( 0 , 0 ) ( 0 ) ∈ R D z^{(0)}_{(0,0)} \in \mathbb{R}^D z(0,0)(0)RD,表示分类标记的嵌入。

查询-键-值计算:我们的Transformer由 L L L 个编码块组成。在每个块 l l l 中,为每个补丁从前一个块编码的表示 z ( p , t ) ( l − 1 ) z^{(l-1)}_{(p,t)} z(p,t)(l1) 计算查询/键/值向量:

其中 LN ( ) \text{LN}() LN() 表示层归一化(LayerNorm,Ba et al., 2016), a = 1 , … , A a = 1, \dots, A a=1,,A 表示多个注意力头的索引, A A A 表示注意力头的总数。每个注意力头的潜在维度设置为 D h = D A D_h = \frac{D}{A} Dh=AD

自注意力计算:自注意力权重通过点积计算。对于查询补丁 ( p , t ) (p,t) (p,t),自注意力权重 α ( p , t ) ( l , a ) ∈ R N F + 1 \alpha^{(l,a)}_{(p,t)} \in \mathbb{R}^{NF+1} α(p,t)(l,a)RNF+1 由以下公式给出:

其中 SM 表示 softmax 激活函数。需要注意的是,当注意力计算仅在一个维度上进行(例如,仅在空间维度或时间维度上),计算量会显著减少。例如,在空间注意力的情况下,只会进行 N + 1 N + 1 N+1 次查询-键比较,并且仅使用与查询来自同一帧的键:
在这里插入图片描述
编码:在块 l l l 中,编码 z ( p , t ) ( l ) z^{(l)}_{(p,t)} z(p,t)(l) 通过首先计算使用来自每个注意力头的自注意力系数加权求和的值向量来获得:

在这里插入图片描述
然后,将所有头部的这些向量进行拼接,并通过一个多层感知机(MLP)进行投影处理,在每个操作后使用残差连接:
在这里插入图片描述
分类嵌入:最终的片段嵌入是通过从最后一个块中提取分类标记的嵌入得到的:
在这里插入图片描述

在该表示的顶部,我们附加了1隐藏层MLP,其用于预测最终的视频类别。

时空自注意力模型:我们可以通过将公式 (5) 中的时空注意力替换为仅在每一帧内进行的空间注意力(公式 6)来减少计算成本。然而,这样的模型忽略了跨帧捕捉时间依赖性的问题。正如我们在实验中所示,与完整的时空注意力相比,这种方法会导致分类精度下降,特别是在需要强时间建模的基准测试中。我们提出了一种更高效的时空注意力架构,称为“分离时空注意力”(简称 T+S),其中时间注意力和空间注意力是分别应用的,且顺序进行。这种架构与空间注意力和联合时空注意力的架构在图 1 中进行了比较。图 2 给出了在视频示例上不同注意力模型的可视化。对于分离注意力,在每个块 l l l 内,我们首先通过将每个补丁 ( p , t ) (p,t) (p,t) 与其他帧中相同空间位置的所有补丁进行比较,来计算时间注意力:
在这里插入图片描述

使用时间注意力应用公式 (8) 得到的编码 z ( p , t ) ( l ) time z_{(p,t)}^{(l)\text{time}} z(p,t)(l)time 会被反馈用于空间注意力计算,而不是直接传递到 MLP 中。换句话说,从 z ( p , t ) ( l ) time z_{(p,t)}^{(l)\text{time}} z(p,t)(l)time 中获得新的查询/键/值矩阵,然后使用公式 (6) 计算空间注意力。最后,得到的向量 z space ( l ) ( p , t ) z_{\text{space}}^{(l)}(p,t) zspace(l)(p,t) 会传递到公式 (9) 的 MLP 中,以计算块 l l l 中补丁的最终编码 z ( l ) ( p , t ) z^{(l)}(p,t) z(l)(p,t)。对于分离注意力模型,我们分别在时间和空间维度上学习不同的查询/键/值矩阵:

{ W Q time ( l , a ) , W K time ( l , a ) , W V time ( l , a ) } 和 { W Q space ( l , a ) , W K space ( l , a ) , W V space ( l , a ) } \{ W^{(l,a)}_{Q_{\text{time}}}, W^{(l,a)}_{K_{\text{time}}}, W^{(l,a)}_{V_{\text{time}}} \} \quad \text{和} \quad \{ W^{(l,a)}_{Q_{\text{space}}}, W^{(l,a)}_{K_{\text{space}}}, W^{(l,a)}_{V_{\text{space}}} \} {WQtime(l,a),WKtime(l,a),WVtime(l,a)}{WQspace(l,a),WKspace(l,a),WVspace(l,a)}

需要注意的是,相较于联合时空注意力模型公式 (5) 中每个补丁需要进行的 (NF + 1) 次比较,分离注意力模型每个补丁仅执行 (N+F+2) 次比较。我们的实验表明,这种时空分解不仅更加高效,而且还提高了分类精度。

我们还实验了“稀疏局部全局”(L+G)和“轴向”(T+W+H)注意力模型。它们的架构在图 1 中进行了说明,而图 2 显示了这些模型考虑的注意力补丁。对于每个补丁 ( p , t ) (p,t) (p,t),(L+G) 首先通过考虑邻近的 F × H / 2 × W / 2 F \times H/2 \times W/2 F×H/2×W/2 补丁来计算局部注意力,然后通过沿时间维度和两个空间维度使用步幅为 2 的方式,计算整个片段的稀疏全局注意力。因此,它可以看作是通过局部-全局分解和稀疏性模式(类似于 Child et al., 2019 所使用的方式)来加速完整时空注意力的近似。

最后,“轴向”注意力将注意力计算分解为三个不同的步骤:时间、宽度和高度。对图像的两个空间轴进行分解注意力的方式已经在 (Ho et al., 2019; Huang et al., 2019; Wang et al., 2020b) 中提出,我们的 (T+W+H) 在视频的情况下增加了第三个维度(时间)。所有这些模型通过为每个注意力步骤学习不同的查询/键/值矩阵来实现。

<think>好的,我现在要解决用户关于Divided Space-Time Attention代码实现的问题。首先,我需要回顾用户提供的引用内容,看看是否有相关的代码资源。引用3提到作者提供了源码和数据集,并且项目地址中有详细的运行方法,这对用户来说应该很有帮助。用户需要具体的代码实现或下载方式,所以我应该先引导用户到项目地址查找。 接下来,我需要确认用户是否已经访问过项目地址。如果没有,可能需要给出具体的链接或指引。不过用户提供的引用中并没有直接给出项目地址,但引用3提到“本文最上面已经放了项目地址”,所以推测在原始资料中可能有链接。但由于这里无法直接访问外部链接,我需要建议用户根据引用3的信息查找源码。 另外,用户引用了Divided Space-Time Attention的结构设计,说明该方法的实现可能涉及将时间和空间注意力分开处理。根据引用2,分开计算时间和空间的attention可以降低计算成本,并且效果更好。代码实现时可能包括分别定义时间注意力和空间注意力的模块,并在模型中进行组合。 用户可能需要具体的代码片段示例,所以我可以尝试根据常见的Transformer结构,给出一个伪代码或简化版的实现思路,比如先处理时间维度的注意力,再处理空间维度。同时提醒用户参考官方源码以确保正确性。 此外,用户可能还想知道如何下载数据集,如引用4中的THUMOS14,但当前问题主要关注代码实现,所以可以附带提及数据集下载的指令,但重点还是代码部分。 最后,确保回答结构清晰,分步骤说明可能的源码位置和实现方法,并生成相关问题,帮助用户深入理解该注意力机制的应用和优化。</think>关于Divided Space-Time Attention的代码实现,根据引用内容可以分三步定位资源: 1. **源码获取途径** 根据引用[3]明确指出,作者在项目地址中公开了完整源码和数据集,并提供了详细的运行指南。建议优先访问论文作者提供的官方仓库,该实现采用PyTorch框架,包含时空注意力分离的核心模块。 2. **核心代码结构解析** 该模块的实现主要涉及两个关键部分(参考引用[1][2]): ```python # 伪代码示例 class DividedAttention(nn.Module): def __init__(self): self.time_att = MultiHeadAttention() # 时间轴注意力 self.space_att = MultiHeadAttention() # 空间轴注意力 def forward(x): # 输入维度: (batch, frames, patches, dim) x = self.time_att(x) # 跨帧处理时间关系 x = self.space_att(x) # 单帧内处理空间关系 return x ``` 实际代码会包含更复杂的位置编码和归一化操作,这种结构相比传统时空联合注意力,计算复杂度从$O((N \times F)^2)$降至$O(N^2 + F^2)$(N为空间特征数,F为时间帧数)[^2] 3. **数据集准备** 如引用[4]所示,使用视频理解任务时需要下载THUMOS14等数据集,官方代码库通常包含数据预处理脚本,建议结合`torchvision`或`decord`库进行视频帧提取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值