ControlNet Blog

ControlNet Blog

马上订阅 ControlNet Blog RSS 更新: https://controlnet.space/atom.xml

计算机视觉中的Transformer续

2021年7月27日 04:31

上一篇文章《计算机视觉中的Transformer》讲了计算机视觉中的Transformer结构[1],还有非常受欢迎的Vision Transformer(ViT)[2]。本篇文章将补上上一篇掠过的《Attention Augmented Convolutional Networks》[3]和《End-to-End Object Detection with Transformers》[4],同时也会介绍一下DeiT (Data-effieciency Image Transformer)[5]

Self-Attention回顾

Transformer的核心是Self-Attention。Self-Attention是基于特征向量对序列上token成对关系的表征学习(Representation Learning)。

self-attention
Fig. 1. Self Attention.

计算方式大致如下:

  • 序列: $X\in R^{n\times d}$
  • Query向量: $Q$有相对应的可学习权重$W^Q\in R^{n\times dq}$
  • Key向量: $K$也有相对应的可学习权重$W^K\in R^{n\times dk}$
  • Value向量: $V$也有相对应的可学习权重$W^V\in R^{n\times dv}$
  • $Q=XW^Q, K=XW^K, V=XW^V$
  • Self-Attention层: $Z=softmax(\frac{QK^T}{\sqrt{d_q}})V$
  • 若是Masked Self-Attention层,则需要增加一层mask: $softmax(\frac{QK^T}{\sqrt{d_q}}\circ M)$

self-attention-operation
Fig. 2. Self Attention运算过程. Adapted from [1]

这里展示的是一个简单的Self-Attention计算方式,对于[1]同时提出的Multi-Head Self-Attention,可以将上述过程并行的执行多次来模拟不同的head。

在2021年,计算机视觉领域中的Transformer和Self-Attentio的相关技术已经发展了很多。我们可以使用以下这张图来理解今天的Self-Attention相关技术的不同类型。
taxonomy-self-attention
Fig. 3. Self Attention不同类型. Adapted from [6]

在上图中能看到不同的Attention类型,比如Local Attention, Global Attention, Vectorized Attention。下图介绍了这些类型的大致计算流程。

self-attention-overview
Fig. 4. Self Attention的不同类型. Adapted from [6]

用Attention增强卷积

从之前我们可以了解到,Self-Attention可以很好的找到距离较远的token之间的关系,而普通的卷积层只能计算非常有限的范围。如果我们能够将这些距离较远的token之间的关系计算出来,那么就可以使用Self-Attention来弥补卷积层的这个缺陷,对图像分析是有帮助的。而且卷积层是等变的,在不同区域的卷积用的是同一个参数。所以在2019年的时候,这篇文章的作者看到Self-Attention已经被广泛运用于NLP领域,所以就想到了用Self-Attention来增强卷积,并且使用基于相对位置的Positional Encoding用于解决上述说的等变问题[3]

Flatten和Attention层

先介绍会在这个部分中使用的一些数学符号:

  • $H, W, F_in$是指特征图中高度、宽度、输入feature map的数量
  • $N_h, d_v, d_k$是指head的数量,value和key的维度。其中$N_h$是可以整除$d_v$和$d_k$的。
  • $d^h_v, d^h_k$是指每一个head中value和key的维度。

attention-augmented-convolution
Fig. 5. Attention Augmented Convolution的计算过程. Adapted from [3]

第一步是需要将输入的特征图进行flatten,从$(H,W,F_in)$变成一个新矩阵$X\in \mathbb{R}^{HW\times F_{in}}$。然后把它放进标准的Multi-head Attention(MHA)层中,于是输出它的输出则是,
$$O_h=Softmax(\frac{(XW_q)(XW_k)^T}{\sqrt{d^h_k}})(XW_v)$$

Positional Encoding

在这篇文章,作者使用了一个基于像素的相对位置的Positional Encoding,专门用于图像分析。其实这个相对位置的Positional Encoding之前已经提出,具体的可以参考这篇[7]

它的计算方式是

$$l_{i,j}=\frac{q_i^T}{\sqrt{d_k^h}}(k_j+r^W_{j_x-i_x}+r^H_{j_y-i_y})$$

其中$r$是Positional Encoding,$i$是当前token所代表的像素,$j$是计算Self-Attention时的目标像素,而$x$和$y$则是像素的位置。将这个计算向量化后,

$$O_h=Softmax(\frac{QK^T+S_H^{rel}+S_W^{rel}}{\sqrt{d^h_k}})V$$

这篇作者也提到,根据他们的实验,最好的效果是同时使用传统卷积层和Attention层的输出,所以以上的结果要通过一个简单的拼接层来获得。

$$AAConv(X)=Concat[Conv(X),MHA(X)]$$

实验结果

首先是每篇论文都会提到的自己的方法比别人强。

aa-result
Fig. 6. Attention Augmented用于分类的实验结果. Adapted from [3]

可见,用于一些传统的CNN模型,用Attention增强卷积的方法可以得到更好的结果。对于COCO数据集的对象检测也是一样的,这里就不再赘述了。

不过其中最有趣的还是Positional Encoding的对比。

pos-enc-result
Fig. 7. Positional Encoding是否使用的对比结果. Adapted from [3]

能看到这个Positional Encoding真的是很有用,所以在Transformer中的Self-Attention层中基本人人都会用它。

E2E的Transformer对象检测

在2020年的时候,一篇论文[4]提出了一个E2E的Transformer对象检测模型Detection Transformer (DETR),它非常有开创性的使用Transformer结构实现了一个完全端到端的训练方式。这有什么好处呢?首先之前的对象检测模型很多都是需要Proposal,Anchor,或者Window之类的容易出错,而且还需要一些人工处理,比如说非最大值抑制等等。这些东西在一定程度上会影响模型的性能。如果能使用E2E的模式避免人工处理的情况下训练,那就能解决这个问题。

首先来看一下它的结构。

detr
Fig. 8. DETR结构. Adapted from [4]

这个结构是由一个骨干网络,Positional Encoding,Transformer,以及一个FFN预测头组成的。让我们一个一个看。

骨干特征提取器

首先是第一步的backbone,这一部分在原文中是一个CNN的特征提取器,需要从图像中提取出高价值的特征图。在原文中对于一个图像为$x_{img}\in \mathbb{R}^{3\times H_0 \times W_0}$,在骨干网络后将会变成一个特征图$f\in \mathbb{R}^{C\times H\times W}$。他们设定的值是$C=2048$ $H,W=\frac{H_0}{32},\frac{W_0}{32}$ 。

Transformer部分

通过骨干网络得到的特征图会通过一个1x1卷积压缩通道数,得到$z_0\in\mathbb{R}^{d\times H\times W}$。因为这个Transformer编码器希望得到一个序列作为输入,所以不能用一个三维的矩阵,需要压平成二维。这个特征图将会被flatten到$(d\times HW)$。对于每一层Transformer编码器,都有一个Self-Attention层和FFN,就像原版Transformer一样。作者还特地说明了,对于每一层,都添加了一个固定的不可训练的Positional Encoding加到输入中去。对于Self-Attention层和Transformer编码器部分相信大家都很熟悉了,但是这个网络还使用了Transformer解码器部分,这需要好好看看。

detr-transformer
Fig. 9. DETR中的Transformer部分. Adapted from [4]

这里我们可以看到,它并没使用原版Transformer中的Masked Multi-Head Self-Attention层,可能是因为原版的是对于时间序列的预测所以需要遮盖未来时间的序列元素,但是这里是图像分析,则不需要这些。然后是对于编码器的Attention层,和解码器的第二个Attention层,都使用了Positional Encoding,而且是每一层都会使用。

这里的Object queries其实是一个可学习的参数,原文中设定的长度是$N=100$。剩下的都是一些相加融合,根据这张图应该是很容易理解的。

FFN预测头

在解码器的输出得到嵌入序列之后,对于序列中的每一个元素都通过两个FFN网络,一个用于预测类型,一个用于预测Box。

这些FFN在原文中使用的是一个3层MLP和ReLU。对于一个91个类的多分类问题,这里的类型预测FFN会输出一个92长度的向量,多出来的一个代表”没有对象($\phi$)”。这个预测Box会被编码成中心坐标(x,...

剩余内容已隐藏

查看完整文章以阅读更多