SwinBERT End-to-End Transformers with Sparse Attention for Video Captioning 论文笔记

本文最后更新于:2022年10月11日 下午

SwinBERT End-to-End Transformers with Sparse Attention for Video Captioning 论文笔记

这是CVPR2022的一篇来自微软的论文,他们使用自家的SwinTransformer,提出了一种进行Video Captioning任务的End-to-End的网络。这个网络没有利用多模态特征,只使用了经过运动数据集预训练得到的Swin来提取特征。这个网络也没有使用其他的offline的特征提取模型,简化了模型结构。结果显示这个模型达到了SOTA。这个网络还探索了Dense Sampling对结果的提升,训练时一个视频能采样高达64帧。

我感觉表面上这个模型是为了简化而来,但是仍然有很多层Transformer,其Sparse Attention确实能够加快速度,但是并没有通过实际的算法或者CUDA算子实现。这个工作相较来说更扎实,在5个数据集上进行了实验(MSVD、MSRVTT、VATEX、YouCook2、TVC),其他工作可能只会在前两个数据集上进行。

模型基本架构

SwinBERT

整体来说,SwinBERT包含两个Transformer。

被密集采样得到的视频帧将被送入VidSwin中得到T2×H32×W32\frac{T}{2} \times \frac{H}{32} \times \frac{W}{32}个video token,每个token是8C8C维的向量,一个token初始包含32x32x2的块。举例来说,一个224x224x16的视频,应该有392个token。

之后,video token和word token被拼接在一起送入多模态Transformer Encoder中进行编码,这里会用到Sparse Attention Mask。正常来说,Self-attention中QQKTK^T叉乘之后,会得到一个L×LL\times L的方矩阵(这里LL是输入长度),这个矩阵之后就会和一个Mask矩阵相乘,这个Mask矩阵能控制某个query是否对某个key进行attention。一般情况下这个Mask会在两种情况下用到:

  1. 当我们输入的Batch序列中各项数据不等长时,会先padding到固定长度LL,然后将被pad的部分的Mask置0,那样在计算注意力的过程中就不会计算pad位置的注意力。
  2. 当要进行Seq2Seq模型的输出时,以机器翻译为例,每输出一个单词时,应该只能对之前生成的单词计算注意力,所以此时Mask会呈现阶梯状,第一个单词只能计算它自己的注意力,第二个单词只能计算第一个和自己的注意力……

话说回来,观察上图的Sparse Attention Mask,取出第一行,表示第一个word token能够对自己和所有video token计算注意力,取出第二行,表示第二个word token能够对自己和第一个word token以及所有video token计算注意力……而在轮到video token时,令其只能对video而不能对word计算注意力。

以上部分都是不可学习的部分,而video对video的注意力矩阵(VV)是可学习的矩阵,SwinBERT通过施加sparsity constraint令其只关注一些关键的video token:

LSPARSE=λ×i=1Mj=1MVi,j\mathcal L_{SPARSE}=\lambda \times \sum^M_{i=1}\sum^M_{j=1}|V_{i,j}|

这就是一个简单的抑制VV矩阵的值的loss,类似L2正则化。如图中所示,VV会因此变得稀疏,理论上可以通过自定义CUDA算子进行加速,但是他们没做,所以整体来说计算量还是很大(作者在Discussion中也提到了,如下图)。

在最终训练目标的设置上,SwinBERT采用了Masked Language Modeling而不是Captioning,这里有一些迷惑。

一些细节

Video Swin Transformer使用Kinetics-600预训练的参数,采用其Swin-base版本(12层)。VidSwin得出的特征维度会通过一个MLP映射到multi-modal的维度。

Multi-modal transformer encoder随机初始化(而不是用BERT等模型初始化),维度为512,有12层

训练时先resize短边到224,再RandomCrop个224x224。测试时则是CenterCrop。

实验结果

整体实验没什么好说的,五个数据集基本都SOTA。下面是关于采样帧数的实验(指标为CIDEr),实验发现越多帧能带来更好的性能(未使用可学习mask)。但是越多帧数会带来更多更多的算力需求,即使是微软也最高只能把T设置成64。同时也可以考虑在刚开始训练时使用更少的帧数,然后使用更多的帧数进一步训练,并且实验证明进一步训练只用训练mask就能达到好结果。注意在使用更多的帧数时,由于输入的shape发生改变,mask的shape也会发生改变,需要进行线性插值。

对于attention mask的实验则更多,如下图添加了之后效果提升很多。

下图是针对soft和binary的实验,作者使用的mask可以看做是一种soft的mask,然而也可以通过设置阈值来转换为binary的mask。这里实验中,binary就是soft的模型通过阈值0.5 finetune之后的结果。结果显示binary的效果比soft更差,但是实际上binary有能加速的潜力,且其相较于Full仍然有提升。同时这个表也使用了不同的T,也体现出T越大效果越好。

下面还有一些迁移学习的实验,VATEX->MSVD的效果比较好,但VATEX->MSRVTT的效果并不那么好。

对于Sparse,作者通过下图说明,训练过程中mask非零的部分越来越少,但是CIDEr的增长却不受限制,说明Sparse的策略有效。同时对于超参λ\lambda在附加材料里也有实验,等于5的时候效果最好。

作者还放了一个可视化图,但是我感觉并不是特别清楚。样例视频中选择一帧进行展示,边缘的token对视频首末的注意力更多,作者分析是因为边缘是背景,和时间联系不大。中间的token则在时间上各处都有注意力,因为包含更多的运动信息。

文章还给了一些Qualitative results,可以去原论文看。