论文标题:End-to-End Object Detection with Transformers
论文官方地址:https://ai.facebook.com/research/publications/end-to-end-object-detection-with-transformers
下面是对上述PPT内容的简单罗列和讲解,由于Word转图存在问题,可能部分内容不能全面展示,建议下载上述文档后,再继续。
DETR全程是End-to-End Object Detection with Transformers,他是基于attention注意力机制发展出来的一种网络结构算法。
后面我们会沿着attention--->DETR--->Deformable DETR 这三个方面展开。看完整片文章,会让你对transformer,以及单attention如何使用,有个较深的认识。下面我们开始吧。
Attention机制最早在视觉领域提出,2014年Google Mind发表了《Recurrent Models of Visual Attention》,使Attention机制流行起来,这篇论文采用了RNN模型,并加入了Attention机制来进行图像的分类。
Recurrent Models of Visual Attentionhttp://de.arxiv.org/pdf/1406.6247http://de.arxiv.org/pdf/1406.62472015年,Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,将attention机制首次应用在nlp领域,其采用Seq2Seq+Attention模型来进行机器翻译,并且得到了效果的提升。这篇论文是在自然语言处理(NLP)中或是encoder-decoder中第一个使用attention机制的工作,将attention机制用到了神经网络机器翻译(NMT) 。
2017 年,Google 机器翻译团队发表的《Attention is All You Need》中,完全抛弃了RNN和CNN等网络结构,而仅仅采用Attention机制来进行机器翻译任务,并且取得了很好的效果,注意力机制也成为了大家近期的研究热点。
从上面关于transform的发展历程,可以看出来。transform是基于attention机制发展起来的,尤其是在2015年和2017年两篇在翻译领域的重量级文章,推动了目前transform结构的完善。
1、Attention引入
在NLP翻译领域,输入是一串连续的英文,输出是一串连续的中文,这样就实现了最基本的英到中的翻译。假定输入的一串是英文a1、a2、a3、a4,那么对应的输出就是b1、b2、b3、b4(输出字符长度也可能不对等)。
(摘自attention is all you need)
上图,在循环神经网络RCNN中,下一个时刻的输出ht要依赖于上一个时刻的输出ht-1,从而导致无法在整个序列上进行并行处理,这会引起训练时间过长的问题。这样就没法实现翻译预测阶段的并行化,效率会相对比较低。
RCNN的缺点和不足:
- 时序机制,难以并行化
- 只依赖于最后state的状态很难利用句子中的结构信息
- 很早期的信息,会在后面时期的预测中,被遗忘掉(使用较大的ht,但是会较大的内存开销)
(摘自attention is all you need)
上图,为了解决RNN由于时许导致存在的无法并行化的问题,Facebook AI Research选择提出用CNN方式,解决这个问题,提出了《Convolutional Sequence to Sequence Learning》,也就是上面截图中ConvS2S的论文。
Convolutional Sequence to Sequence Learninghttps://arxiv.org/pdf/1705.03122.pdfhttps://arxiv.org/pdf/1705.03122.pdf论文中最主要的结构图,如下所示,最最典型的部分就是对输入数据进行编码时采用的Convolutions,这样:
(摘自Convolutional Sequence to Sequence Learning)
CNN参与其中的优势:
- 方便并行化
- 高低维度进行融合(层层卷积)
- 多个输出通道channel,不同的输出通道,可以用于识别不同的模式
所以,为了解决RNN中难以并行化的问题,借鉴了CNN的方式,实现了NLP领域中训练过程的并行化问题。
但是呢,采用CNN实现信号间的关联,就需要层层连接,最后才能实现较远信号之间产生联系。这就是论文中提到的:
In these models, the number of operations required to relate signals(关联信号所需要的操作) from two arbitrary input or output positions grows in the distance between positions, linearly for ConvS2S and logarithmically for ByteNet。
This makes it more diffificult to learn dependencies between distant positions。在这些模型中,从两个任意输入或输出位置关联信号所需要的操作数之间的距离,ByteNet是线性的和 ConvS2S是对数增长的。
这使得将距离较远位置信号的关联起来,变得更加困难。
后面,就引入了transform,他有别于RNN和CNN,眼界都比较大窄小。transform能过一眼看到所有的输入数据,就为建立起对数据的整体感知,提供了前提可能。
(摘自attention is all you need)
1.1、何为self- attention
网上搜集到很多的关于介绍transform- attention的相关资料,最终觉得这个比较的好,并微微做了一些改变,方便我们的学习理解。
在引入阶段结束的时候,放了 《attention is all you need》中的一个attention可视化案例。其中,简单的可以看到,在词与词的关联关系之中,并不是将注意力(颜色深浅)均匀的分布到每一个词上面的,也不是只与自己最近的那几个词,有可能就是相距很远,但是关联程度很高的。
attention,顾名思义就是关注度。那么,我们该如何模拟信号与信号(词与词)之间的关联程度,使得某一个词的确定,只与句子中其中某几个词,产生较大的联系呢?
例如:
小红很可爱,我好**她
小亮欺负了小红,他是个*人
上面是一个填空题的案例,补全其中**部分缺失的词,该如何确定?我们都知道,小红很可爱,我好喜欢她,空白处填写喜欢。那如果是:小红爱欺负人,我好**她,此时**的地方,肯定是个贬义词。
这里就可以看出,空白处补写的词,和对小红的描述很重要,描述变了,后面的评价词也对发生较大的改变,这就说明空白处需要填写的词,需要与对小红描写的词产生较大的attention,才能填写正确。
在PPT中,输入是x1、x2、x3、x4,希望得到翻译后的输出B,B可能是b1、b2、b3、b4或者更多组成,这里就先知关注b1,看看是如何从输入中,推理得到b1的。
一个attention函数可以描述为:
- 一个query和输出的一系列由key-value组成的键值
- query、key、value和输出都是向量
- 输出是计算values的加权和
- 分配给每个value的权重由query对相应的key值确定
论文中的这句话应该描述的算是比较简单清楚的,下面我们再通过PPT中的数据传递关系(上图self-attention)和定义attention function的代码,确认下理解思路是否正确。
1.1.1、attention function的代码
######################
# a attention function
######################
q = linear(query, _w, _b)
k = linear(key, _w, _b)
v = linear(value, _w, _b)
head_dim = embed_dim // num_heads
scaling = float(head_dim) ** -0.5
q = q * scaling
attn_output_weights = torch.bmm(q, k.transpose(1, 2))
attn_output_weights = softmax(attn_output_weights, dim=-1)
attn_output = torch.bmm(attn_output_weights, v)
1.1.2、数据传递关系
1.2、Mult-head self-attention(多头注意力)
2、匈牙利算法匹配

论文中提到的方法主旨结构如下所示,整个论文也是围绕这个这个结构就行展开的。