当前位置:   article > 正文

学习总结——注意力机制(transformer、DETR)_detr相比于transformer的区别

detr相比于transformer的区别

初探注意力

我们知道图片可以通过提取特征进行分类、目标检测等后续操作,拿最简单的图片分类来说,可以将图片分类成猫、狗等,但图片中可能含有背景或者其他杂物,也就是说,不是所有的像素点都对识别出目标物有用,那图片中的哪些像素点是对于识别出目标物是重要的呢?
基于这个问题,类似人看物体,某一时刻只会把注意力放到某些事物上,例如,人看图片只会集中在图片上的某个区域,说明这块区域对我们来说是重要的,从而忽略另外的一些不重要区域。
那我们是不是就可以给重要区域赋较大的权重,不太重要的区域赋较小的权重,这样更多关注对我们有用的信息。这里所说的权重就是注意力(Attention)。
这就是最简单的注意力机制。

通道注意力

一张图片通过卷积层会得到特征图(feature map),假设特征图是n*m*L,得到的通道数是L,从通道上来看,特征图的每个通道都用来被视作一个特征检测器,所以通道特征聚焦的是图像中有用的信息是"什么"。每个通道可能对最后结果的影响不一样,我们对每个通道赋于不一样的权重,将重要的通道的权重提高,这就是通道注意力。
将特征图经过全局平均池化或者全局最大池化,特征图变成1*1*L,通过MLP卷积(多层感知机)得到一个1* 1 *L的向量,再与特征图相乘,这样就将特征图上的每个通道赋上不同的权重。
通道注意力

空间注意力

从空间上看特征图,空间注意力聚焦于特征图上的有效信息在"哪里",为了计算空间注意力,首先在通道维度平均池化和最大池化,然后将他们产生的特征图进行拼接起来(concat),然后在拼接后的特征图上,使用卷积操作来产生最终的空间注意力特征图。
空间注意力

CV中基本注意力机制

  1. 通道注意力
  2. 空间注意力
  3. 时间注意力
  4. 分支注意力

可将通道和空间注意力机制结合使用,Convolutional Block Attention Module(CBAM)中提出。还有空间和时间注意力结合。

NLP中的注意力机制

假设我们数据集中有问题和答案,称问题为Key(K),答案为Value(V)。现在来了一个新的问题,成为Query(Q),当然我们的Q、K、V都是向量。计算Qi与Ki的相似度,得到结果Ci,比如使用余弦相似度,余弦值接近1,夹角趋于0,表明两个向量越相似,余弦值接近于0,夹角趋于90度,表明两个向量越不相似。
余弦相似度计算
将Ci送入softmax函数中,得到概率Pi,将Pi与Vi相乘再相加得到VT,这个VT是Query的Value,这样就将数据库中的不同答案Value赋予了不同的权重,与数据库中问题Key相似度越高,其答案的重要程度越高,更可能是新问题Query对应的答案。
注意力

自注意力机制

self-atttention在Transformer中使用到,它将Q=K=V,例如我们要将“我是一只猫”变翻译为“I’m a cat’”,数据集中的K=V,例如K=“我”时,V=“我”。首先将"我"、“是”、“一只”、“猫”通过word2vec变为相同维度的词向量。
首先我们单个来看,将“我”即作为Q,也作为K,还作为V,将“我”与数据集中K(“我”、“是”、“一只”、“猫”)计算相似度Ci,例如余弦相似度。将Ci送入softmax得Pi,P1*V1+P2*V2+…+Pi*Vi=Bi,这样就把“我”与其他三个词关联在一起了,还赋予了权重。其他几个词按照同样的步骤计算,示例图如下:
在这里插入图片描述
Transformer中将的自注意力多了一部分,将Q、K、V乘以了转移矩阵W1、W2、W3,即转换后的Q*=W1*Q、K*=W2*K、V*=W3*V,再按照之前的步骤计算。Muti-head self-attention是因为使用了多组转移矩阵,但不同组之间的转移矩阵size一样,同组之间的size也一样,这是为了保证输入与输出的维度一样。
在这里插入图片描述

  1. Positional Encoding是加上位置编码,告诉机器词是有顺序的,比如A打了B,B打了A,如果不加顺序,机器可能认为两句话意思一样。
  2. Add是为了残差运算,防止梯度消失。
  3. Norm使用的Layer Norm,用于对每一层的激活值进行归一化,归一到均值为0、方差为1中;Batch Normalization强行让一个batch的数据的某个channel的均值为0、方差为1,而Layer Normalization让一个数据的所有channel的均值为0、方差为1。
  4. FFN(前馈神经网路)就相当于全连接层。
  5. 加Masked之后就可以在并行计算的同时,不会提前知道预测答案。例如,如果decoder需要解码出“apple is red”,在最初用串行计算的话,需要得到预测结果"apple",再送入decoder中,预测下一个单词为“is”,这样循环串行操作,因为预测下一个词需要依赖之前的预测结果,这样效率低,用并行计算快,效率高,但是需要将整个答案输入到decoder。为了并行操作又不能提前知道后面的答案,就加masked,如果已经知道输出是“apple is red”就没有预测的必要性。

DETR

在这里插入图片描述
DETR是用来做目标检测,将Transformer用到了CV中,它将图片经过CNN提取特征后得到T(通道数)*N*M的特征图,经过一个1*1*d(通道数)卷积,得到d(通道数)*N*M的特征图,再reshape成d*(N*M)的二维向量,送入到encoder中。编码器内部位置编码Positional Encoding仅仅作用于Query和Key,即只与Query和Key相加,Value不做任何处理。没有使用masked,是因为图片目标检测并没有答案(汉译英翻译中,每一句汉语都有一句英文对应,decoder中输入的是答案),object queries是需要学习的参数,它最后包含图片的全局信息,因此没必要规定mask,也不需要顺序,故decoder输入不需要位置编码。
object queries相当于问问题的人,有100个这样的参数,它是可以学习的,第一个参数(1*256)相当于问图片的左下角是不是有小物体、中间是不是有大物体等,第二个参数(1*256)相当于问图片的右下角是不是有小物体等,并不是bounding box。
根据decoder输出的结果,我们需要送入到FFN中得到类别以及位置信息,会得到100个类别和位置数据,假如图片实际只有三个物体,那通过二分图中的匈牙利算法选出最适合的3个框,通过损失函数以及反向传播,我们就可以无限拟合预测值靠近真实值的类别和位置信息。

所以transformer中的encoder可以用于特征提取,可以安插在其他网络中做backbone。transformer中不管是encoder还是decoder,输入与输出都保持一致。

参考文献

记录一下学习内容,方便以后查阅,欢迎大家指正,参考了以下文章:

  1. https://zhuanlan.zhihu.com/p/340149804?utm_medium=social&utm_oi=619639436095393792&utm_psn=1627067395729727489&utm_source=wechat_session&utm_id=0
  2. https://zhuanlan.zhihu.com/p/510223283
  3. https://www.bilibili.com/video/BV1GB4y1X72R/?spm_id_from=333.999.0.0
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/337939
推荐阅读
相关标签
  

闽ICP备14008679号