本文是笔者对《Is Space-Time Attention All You Need for Video Understanding?》 一文的理解和相关知识总结。
原文链接:https://arxiv.org/abs/2102.05095
温馨提示:本文第一部分对Nlp中的Transformer做出简单的总结和归纳,属于论文的扩展知识,不需要阅读的友友可以直接阅读第二部分(Motivation)~
一切都要从Transformer在NLP领域的一举成名说起。这种简单只使用注意力机制(attention)的结构在机器翻译等等方向都取得了不错的效果。顾名思义,这篇文章的方法基于Transformer——Facebook AI提出了一种用于视频理解的框架,命名为Timesformer。
在介绍论文提出的Timesformer之前,首先对Transformer做一个简单的科普,由于我的方向不是NLP,所以这里不对复杂的计算和理论做出阐述,只单纯介绍整个Transformer的结构和运作机制,便于后续更好地理解Timesformer。
1 什么是Transformer?
我们可以把Transformer看做一个black box,输入一句语言A,经过transformer的华丽操作,得到翻译好的语言B。
Transformer中最主要的结构由两部分组成,分别是编码器Encoder和解码器Decoder。输入的句子经过Encoder和Decoer,最后得到输出。
编解码器在transformer中的堆叠模式如下图所示。图中的堆叠方式是6个相同的编码器和解码器,这个6不是固定的,不同任务可以使用不同的堆叠数量。这些Encoder独立进行计算,权重不共享。每一个Encoder的输出作为下一个Encoder的输入。
Encoder由自注意力模块(self-attention)和前馈神经网络(Feed Forward NN, FFN)组成,Decoder部分除了和Encoder相同的两部分之外,在注意力模块和FFN中间插入编解码注意力模块。
1.Self-Attention:当前翻译和已经翻译的前文之间的关系;
2.Encoder-Decnoder Attention:当前翻译和编码的特征向量之间的关系。
下面进入正题:transformer是怎么运作的?
-
Step 1:Embedding
Embedding具体指什么呢,我的理解是把单词变成可以用实数表示的向量。我们把输入的每个词都embedding成512维的vector,以便于输入后续的网络结构中。Embedding只发生在堆叠的最底层的那个Encoder中。我们可以将这个embedding后的向量维度的大小视为一个超参数,那么如何确定这个超参数的大小呢,在NLP中,基本上这个参数大小=我们训练数据集中最长句子的长度
。 -
Step 2: Encoding-self attention
在self-attention中,整个句子输入到self-attention结构中,注意力机制可以对输入句子的上下文信息进行关联,得到输出向量z1
、z2
。z1
和z2
再分别输入到FFN中(注意:两个FFN相对独立),得到第一个Encoder结构的输出r1
和r2
,r1
和r2
再作为下一个Encoder的输入... 这里自注意力机制的细节就不过多占用篇幅描述了,简而言之,自注意力模块可以更好地对句子中的各个词的相互关联关系进行分析,得到不同的关联程度。比如一句英文句子,The animal didn't cross the street because it was too tired.
,我们人类可以很明确的读懂,这里的it
指的是animal
,但是机器有可能把这个it
判断为另一个名词street
。自注意力机制的目的就是使机器判断这个词为正确语义的概率更高。
在自注意力模块中,向量是如何计算的?也就是z1
和z2
是如何得到的呢?
首先,计算每个词向量的三个值query, key, value。这三个值是计算注意力值的抽象概念。
然后计算每个单词的注意力得分,注意力得分的公式为:
我们以第一个词Thinking
为例。怎么计算它的attention值呢?
-
Step 3: Encoding- FFN
得到注意力值Z后,Z被传入下一个结构,FFN。FFN这个全连接有两层,第一层的激活函数是ReLU,第二层是一个线性激活函数,计算过程可以表示为:
为了解决深度学习中的退化问题,encoder结构中还使用了残差网络中的short-cut结构。最终整个encoder过程就是这样啦:
在Transformer中,还有一个重要的概念,就是multi-head attention(多头注意力)。其实这个多头注意力结构就是由 n 个self-attention结构组成的。我们假设 n=8,那么x1
就被分别输入到8个自注意结构中,得到8个z1
。然后将这个8个z拼接成一个大的特征矩阵,再通过全连接层得到输出Z。
-
Step 4: Decoding
在解码器中,上文也提到了,Transformer block比编码器中多了个encoder-cecoder attention。在encoder-decoder attention中,来自于解码器的上一个输出,和 则来自于与编码器的输出。其计算方式和step2的过程相同。
解码器解码之后,解码的特征向量经过一层激活函数为softmax的全连接层之后得到反映每个单词概率的输出向量。此时我们便可以通过CTC等损失函数训练模型了。
所有步骤结束,Transformer的大致流程就讲完了。看这张图我们也大致可以了解它的大概机制是如何。
但是到目前为止我们训练出的只是一个词袋模型,因为每个单词的位置信息并没有被使用,也就是无论一个句子中的单词顺序如何打乱,最后的结果都一样。所以transformer使用position encoding,来解决上述问题。关于Position Encoding,由于篇幅问题,在这里也不赘述了。
2 Motivation
1)CV vs NLP
在CV中使用transformer,首先比较下视频理解任务和NLP的相同点:
- Sequential 连续性:视频和句子基本上都是连续的。
- Contextual 具有上下文联系:句子中某个单词的意思通常需要通过将其与句子中的其他单词联系起来来理解;对于视频来说,为了消除歧义,片段中的行为也需要与视频的其余部分结合起来。
所以,NLP的自注意模型可能会对视频建模有效。因为其不仅可以捕捉跨时序的依赖关系,还可以通过对不同空间位置的特征进行两两比较,从而揭示每一帧中的上下文信息。
2)Transformer可以代替卷积吗?
虽然从理论上来说,transformer可以实现视频理解的任务,但是在CV领域,2D/3D卷积依然是核心方法。文章也在思考,能不能使transformer完全替代卷积。
从这点出发,卷积操作也存在一定的缺陷:
-
Inductive Bias 归纳偏置
笔者将这个概念粗浅地理解为是conv操作的一个固有“价值观”——它认为这样操作可以得到有用的特征,所以我们就都这样做。在这种归纳偏置之下,conv可操作的范围很有限,也就是它只能在自己的“价值观”范畴内行动(比如局部连接性和平移不变性)。而transformer并非如此,如果用transformer取代conv,对数据的操作就有更多的可能性了。 -
Short Range Temporal-spatial Imformation 捕捉的信息范围小
卷积核是专门设计来捕捉短期时空信息的,它们不能对超出接受域的依赖关系进行建模。虽然加深网络会扩大感受野,可以从一定程度上解决这个问题,但是如果要把小范围的信息聚集得到大范围信息,这种策略会存在局限性。与之相反,Transformer中的自注意力机制通过直接比较在所有时空位置上的特征,可以被用来捕捉局部和全局的长范围内的依赖。 -
耗时
当应用于高清的长视频时,训练深度 CNN 网络非常耗费计算资源。目前有工作(Image Recognition1、Image Recognition2、Object Detection)证明,在图像领域,Transformer 训练和推导要比 CNN 更快。使得能够使用相同的计算资源来训练拟合能力更强的网络。
3 Timesformer
1)背景
方法是Google提出的用于图像的Transformer方法ViT的扩展,将该方法命名为“TimeSformer(Time-Space Transformer)”。 ViT中是将NLP中的词更换为图片中的patch,但是视频中存在大量的patch,计算量巨大,而且忽略了视频中的时空信息。为了解决这些问题,文章提出了几种基于时空容量(space-time volume)的可扩展自我注意设计结构。这其中最好的设计是“分散注意力(divided attention)”架构,它分别在网络的每个区块内应用时间注意力和空间注意力。
2)方法
模型输入为,代表帧的RGB图像,每张图高,宽。然后将每一帧分解为个不重叠的小块(patch),每个小块的大小为。和NLP 中的词向量embedding相似,我们先对每个patch线性embedding,其中使用到的位置编码信息记为,位置编码的具体细节还需要看源码理解,文章中没有仔细讲解。那么如何将图像patch变成向量呢?我们将embedding后的向量记为,其中表示一个可学习的矩阵:
得到这个embedding后的向量后,我们就可以开始transformer的主要流程了。介绍流程之前,先把每个encoder中的结构晒出来,以便后续的讲解。
我们把每个encoder中的计算过程分成两部分,分别是Attention部分和MLP部分。
- Attention值的计算
在第个encoder中,编码器已经得到了上一个encoder传入的。我们首先使用来计算transformer中最重要的三个量——q,k,v,其中LN操作由LayerNorm完成,字面意思应该是层归一化。
得到三个重要的虚拟值后,下一步就是搬出softmax公式,来计算attention值啦。在这里要注意,值和值是点乘操作,需要对进行转置。由于transformer是多头attention结构,表示当前是多头attention的第几个attention。根号下的表示每个attention的维度,由总维度得到。
公式中的看起来特别复杂吧,开始笔者也没理解这到底啥意思。后来定睛一看,因为视频数据包含时、空两个维度的信息,TimeSformer把这两个维度的attention值分开运算,所以根据不同需要取不同的值。这个公式表示的是Joint Space-time Att.。
除了joint方式,也可以在时序和空间上分别计算两个attention值,过程如下:
softmax操作结束后,最后一步——把得到的attention值和value值相乘求和,得到当前patch和相邻空间/时间上patch的关联信息。
最后,将attention模块中multi-head的部分做处理,把这些单个的attention结构得到的值拼接到一起。然后乘上权重,与第个编码器输出的相加,实现short-cut的操作。
到此为止,attention的部分就计算好了。再次搬出整体的流程图:
下面开始计算MLP部分(也就是上图中黄线以下的部分)。这部分比较简单,通过感知机嵌套LN计算得到的值,再和attention部分得到的相加,得到最后的输出值。
最后收尾步骤就是完成分类任务。使用一个hidden layer的感知机,输出视频类别。
3)结构设计
如前所述,我们可以将时空注意力Joint Space-time Att.替换为每帧内的空间注意力,从而降低计算成本。但是这种结构忽略了时间依赖性。正如我们的实验所示,与全时空注意力相比,这种方法导致分类精度下降,特别是在需要强时间建模的基准上。
所以文章提出了另一种更有效的时空注意力架构,名为“Divided Space-Time Attention”(用T+S表示),将时间注意和空间注意分别应用。
“Divided Space-Time Attention”先计算每个patch上的时序attention值,再计算每帧的空间attention值。
除此之外,还提出了两种其他的结构,Sparse Local Global”(L+G) 和 “Axial”(T+W+H)。结构上不赘述了,每种结构的机制还是通过下图来理解。
- 空间注意力机制(S):只取同一帧内的图像块进行自注意力机制;
- 时空共同注意力机制(ST):取所有帧中的所有图像块进行注意力机制;
- 分开的时空注意力机制(T+S):先对不同帧中,相同位置的patch进行注意力机制,再对同一帧中的所有图像块进行自注意力机制;
- 稀疏局部全局注意力机制(L+G):先利用所有帧中,相邻的 H/2 和 W/2 的图像块计算局部的注意力,然后在空间上,使用2个图像块的步长,在整个序列中计算自注意力机制,这个可以看做全局的时空注意力更快的近似;
- 轴向的注意力机制(T+W+H):先在时间维度上进行自注意力机制,然后在纵坐标相同的图像块上进行自注意力机制,最后在横坐标相同的图像块上进行自注意力机制。
3)实验
在四个数据集上进行实验:Kinetics-400,Kinetics-600, Something-Something-v2,Diving-48,采用在ImageNet上预训练的“基础”ViT模型架构。使用大小为8×224×224的clip,帧采样率为1/16。patch大小设置为16 × 16。
推理过程:在视频中间采样一个单一的时间片段。我们使用3个crops(左上角、中间、右下角),这样整个视频剪辑就被空间覆盖了。最后的预测是将这3个预测的softmax得分取平均值。
- 实验1 在k400和ssv2上的验证
对于 K400 数据集,仅使用空间信息已经能够分类比较好了,这些前面的研究者也发现了,但是,对于 SSv2 数据集来说,这个数据集中的视频对时序上信息比较看重,所以仅仅使用空间信息的效果非常差。这说明了对时间建模的重要性。 -
实验2 Divided ST Att. vs Joint ST Att. 计算量比较
Divided ST Att.无论是在空间上还是时间上,都显著节省了计算量。
-
实验3 增加帧数/增加patch个数对结果的影响
在空间上,增加到一定数量,精度会下降;而时序上,增加输入帧的数量,精度持续增加。
这里由于显存的限制,没有办法测试 96 帧以上的视频片段。作者说,这已经是一个很大的提升了, 因为目前的卷积模型,输入一般都被限制在 8-32 帧。 -
实验4 预训练模型和数据集规模对实验的影响
因为这个模型需要非常大的数据才能够训练,作者有尝试自己从头训练,但是都失败了,因此在论文中报告的所有结果,都使用了 ImageNet 进行预训练。
为了了解视频数据规模对性能的影响,在K400和SSv2的不同子集上训练模型:{25%,50%,75%,100%}。
在K400上,TimeSformer在所有情况下都表现最好。在SSv2中,需要更复杂的时间推理,TimeSformer只有在使用足够多的训练视频时才优于其他模型。
-
实验5 与SOTA的比较
文章使用了三种TimeSformer的变体:
TimeSformer :输入 8×224×224,8为帧数
TimeSformer-HR:空间清晰度比较高,输入为 16×448×448
TimeSformer-L:时间范围比较广,输入为 96×224×224
SSv2和Diving48上的结果,SSv2并没有达到最好的结果,作者提到说所提方法采用了完全不同的结构,对于这么有挑战性的数据集来说已经是比较好的了,有进一步发展的空间。
-
实验6 Long-Term Video Modeling验证
这部分实验在HowTo100M数据集上完成。它包含大约100万个教学网络视频,展示人类执行超过23K种不同的任务,如烹饪、修理、编织和艺术创作。这些视频的平均时长是7分钟。
-
可视化结果
本文为原创文章,根据笔者对文章的理解以及资料的参考撰写。若有错误麻烦评论指出,感谢观看~
参考资料:
http://jalammar.github.io/illustrated-transformer/
https://zhuanlan.zhihu.com/p/48508221
https://zhuanlan.zhihu.com/p/104393915
https://blog.csdn.net/m0_37169880/article/details/114941518