Skip to main content

transformer

· 9 min read

[TOC]

这东西老实说是一个大坑,坑在哪呢,学的东西要写很久。姑且先鸽一会。

VIT

第一次将transformer引入cv中,因为transformer在NLP中的表现很好。

image

Transformer的优势

1.并行计算

image2.全局视野 3.灵活的堆叠能力

VIT结构

image

只使用了transformer的encoder

但是transformer有全局视野

self attention

对相似度的计算

image

image

Query:查询,询问

Key:键值,关键词

Value:价值,数值

q1,k1向量点积计算相似度,从点积求投影就可以看成,越相似,投影越长。

image

norm只是为了让值小一点,multiply我理解为重要程度,而sum就是上下文。

矩阵计算本身就是并行

MultiHead Attention 有多个Wq,Wk,Wv,上述操作重复多次结果concat一起

可以给注意力提供多种可能性,比如稀疏,密集之类

transformer encoder

image

输入端适配

因为transformer本身并非用于cv的,而是NLP,所以需要做出一些调整,将图片进行切分然后按编号输入网络。用来模拟句子,当然输入线性层直接打平。

image

Patch 0的作用

需要一个整合信息的向量 如果只有原始输出的9个向量 用哪个向量来分类都不好全用计算量又很大 所以加一个可学习的vector也就是patch 0来整合信息。

同时图像切片损失了位置信息,而且transformer本身也不关注这个。所以需要补位置信息。ViT使用了一个可学习的vector来编码 vector和patch vector直接相加组成输入。(相加是concat的特例)

PVT

挺拉的,就别浪费时间管他了,主要就想控制显存,transformer真不是一般人能用的,控制k,v的数量,但是它怎么控制的我真不想评价,只能说给我干沉默了。

Swin transformer

很好的baseline!它和之前的PVT其实关注的都是一个问题,transformer占显存,通过控制token大小与数量来实现。

VIT的缺点

  • 显存占用- Token数量

  • 表示方法-Token应该多大?

  • 难以用在下游任务

    • Token指的是模型运行中最小的处理单元。
    • NLP中的Token一般指的是一个单词,Token的数量就是一段文字中单词的数量,一般不会特别多。
    • ViT中的Token指的是一个Patch,Token的数量就是Patch的数量,这一点和图像分辨率以及Patch大小有关

dilemma

Patch小-> Token数量多->MHA复杂度高->资源不足

Patch大->Token数量少->Feature Map分辨率低

structure

image

W-MSA

Swin Transformer使用window multiscale self attention,将attention的计算限制在同一个窗口内,使得复杂度降到了o(n)

缺点

显然这样硬性的限制会丢失全局信息,限制模型能力,因此需要一个跨Window的操作,增强window间的交互,所以还要一个SW-MSA

SW-MSA

image

缺点

移动切分后,window的数量变多了,而且window的尺寸不一样了。

所以他们设计了一种更高效的办法cyclic shift

image

image

相对位置编码

这里的相对位置编码是对每个window内的patch写死的,是不可学习的,是人为设计好的

inductive bias

比较有趣的一个东西,它就是我们所说的归纳偏置 归纳->总结,也就是从现存的例子中找到一些比较通用的规则偏置->选择偏好。 整理在一起可以理解为:在面对一些特定问题的时候,我们认为模型应该会有哪些特点会比较容易work,因此而做出的一系列对模型的人为限制。 比如图像处理中,每个位置的信息与周围的信息相关,因此设计出conv

conv中的两个归纳偏置

  • 局部相关性:邻近的像素是相关的。会导致feature map十分平滑,在一定程度上影响目标检测的效果。
  • 权重共享:图像的不同部分应该以相同的方式处理,无论它们的绝对位置如何。

比如NLP中,认为输出的结果与单词的先后顺序相关,因此设计出RNN。

为什么卷积核是奇数的

因为奇数的卷积核拥有中心,可以很好确定位置

为什么深层feature map让人san值狂掉

因为浅层特征还关注的是颜色边缘,深层以后其实已经是多个特征组成的语义了。能理解就怪了()

DETR

structure

image

image

nms缺点

  1. 如果两个框离的很近,那么两个框很有可能属于同一instance(两个instance本来就很近)
  2. 在属于同一instance的框中,分类得分越高的,定位质量越高(并不一定)

Dense prediction

  1. 利用Anchor进行预定位
  2. 判断Anchor是前景还是背景给出proposal
  3. 之后预测给出的proposal的类别
  4. 最后NMS输出结果

Set prediction

将预测集与GT集进行匹配。

match loss

image

image

匈牙利算法之前deepsort说过,这里就不说了,就是找最大匹配。

位置编码(position embedding)

这里的位置编码是写死的,不可学习的 具体写法是根据左边公式,其中pos代表token在序列中的位置,而d代表一个token用多少维来表示。由于图像是2d的,因此DETR将这种方法推广到了2d,见右边公式。

imageimage

这里的位置编码会应用到每一个encoder上,而不只是开头的第一个而且只会加到QK上,不影响V 原因: Patch间的信息交互才需要位置信息,也就是需要加到Q@KT这一步上。而下一次生成QK,是根据V生成的,所以每一个encoder都要重新加一遍这个信息。

encoder&decoder

image

左侧为编码器,右侧为解码器 多出来的MSA,K和V来自于encoder而Q是来自于Obj queries 这种来QK来自于不同地方的attention也叫cross attention

Object quiries

这个东西的作用和cls token类似,也是在整合信息。 Object queries是一个可学习的向量(num, b, dim)

  • Num是人为给的值,远大于图片内物体数量,默认100b是batch size
  • dim是attention运行过程中用的维度数

最终学出来的东西类似于Anchor