前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈Transformer的原理与运用

浅谈Transformer的原理与运用

作者头像
灿视学长
发布2021-10-12 14:50:49
1.9K0
发布2021-10-12 14:50:49
举报
文章被收录于专栏:灿视学长

大家好,百面计算机视觉正式进入Transformer的阶段,欢迎各位follow我的git与关注我。

本篇文章,主要是来自ChaucerG的成果,欢迎各位想在cv领域有突破的小伙伴们follow哦。

浅谈Transformer的原理与运用

Transformer为什么可以这么6?

  • 首先,传统的RNN神经网络由于序列长度的不同意并不不利于并行化;
  • 其次,CNN替代RNN表征长度很有限,但是CNN的并行度很高;
  • 最后,Self-Attention兼顾2者的优点因此产生了Transformer的设计。

Self-Attention是个什么东西?

2.1 Self-Attention简要示意

注:Q、 K、 V的shape是相同的, A便是得到的Pairwise Attention Matrix;然后对A进行SoftMax操作得到A’ Matrix进而与Value矩阵点乘得到实际的注意力输出。

2.2 Self-Attention原理

Self-Attention在Transformer中起着基础性的作用。如下图,它将query和一组key和value对映射到输出。

更具体地说,对于输入序列,如单词或图像块的嵌入,

x=(x_1,...,x_n)

,其中

x_i\in R^{d_x}

,Self-Attention计算一个输出序列

z=(z_1,...,z_n)

,其中

z\in R^{d_z}

。每个输出元素

z_i

是作为输入元素的加权和计算的:

每个权重系数

\alpha _{ij}

使用softmax计算:

其中

e_{ij}

是使用一个scaled dot-product attention来计算的:

这里,投影

W^Q, W^K, W^V \in R^{d_x×d_z}

是参数矩阵,每层都是唯一的。

MultiHead Self-Attention(MHSA)不是计算一次Self-Attention,而是并行运行多次Self-Attention,即使用H个Attention Head。Attention Head的输出被简单地连接起来并线性地转换成设计的维度。

为什么Self-Attention在CV领域也可以有效?

卷积具有2个功能:

  • 特征聚合:通过卷积核在特征图上进行卷积来融合特征的过程;
  • 特征变换:在卷积完成后进行一系列的线性和非线性变换。

特征聚合和特征变换是可以解耦的,特征变换可以通过线性映射和非线性变换来实现,而Self-Attention机制可以通过全局视野替代卷积用来特征聚集。

Position Embedding是什么?有什么用?

其实大家应该了解到Transformer中还有一个位置嵌入向量Position Embedding Vector,在NLP中它是为了解释输入序列中单词顺序而存在的,维度和Embedding的维度一致。这个向量决定了当前词的位置,或者说是在一个句子中不同的词之间的距离。如果在CV领域那么就代表图像Patch的位置以及Patch之间的相互关系。

为什么位置嵌入是cat操作而不是直接的相加add操作?

为什么用LayerNorm?

这个问题我们可以进去讨论交流

ViT在做什么事情呢?

Transformer用于目标检测

先用CNN提取特征,然后把最后特征图的每个点看成word,这样特征图就变成了a sequence words, 而检测的输出恰好是a set objects, 所以transformer正好适合这个任务。

Transformer用于语义分割

用ViT作为的图像的Encoder,然后加一个CNN的Decoder来完成语义图的预测。

Transformer模型的局限和解决方案

ViT作者这么说的——"that transformers do not generalize well when trained on insufficient amounts of data.", 这意思我们没得玩喽!!!

  • 使用Class Token迫使patch token与class token之间互相传递信息,使得Class Token包含全局信息;
  • 使用大分辨率图形来作为输入用来微调Transformer模型;
  • 引入Distillation Token然后通过与Patch Token交互学习类似Global Class Token的信息;

注意:Class Token的目标是跟真实的label一致, 而Distillation Token是要跟teacher model预测的label一致。

DeiT

DeiT的训练

训练过程中Backbone自然还是ViT, 同时class token和distillation token是朝着不同的方向收敛的(因为loss约束不同) , 最终的预测结果相似但不相同。因为目标是生产相似但不相同的目标。作者也做实验验证了这个问题, 感兴趣的可以看DeiT论文原文。

DeiT的测试

只使用distillation token进行测试,性能是要强于只使用class token进行测试的。

DeiT还有一个问题没解决?

DeiT依然把图片转化成patch并进行Flatten操作之后输入ViT模型,而这种转化成patch的方法没有进行patch内部信息的挖掘。

Transformer之所以有效,是因为它能处理长度为N的输入序列中这N个输入之间的关系(relationship),而对于每个输入的内部信息的relationship,它是无能为力的,因为ViT,DeiT,IPT,SETR,ViTFRCNN这类模型把每个patch展平为了一个向量,破坏了每个patch的内部信息。

TNT解决了ViT的局限吗?

每个TNT Block包含2个Transformer Block:

Outer block:建模patch embedding之间的 global relationship。

Inner block:建模pixel embedding之间的local structure information。

CNN是不是一个局部的Self-Attention?

使用self-attention去处理一张图片的时候,1的那个pixel产生query,其他的各个pixel产生key。在做inner-product的时候,考虑的不是一个小的范围,而是一整张图片。但是在做CNN的时候是只考虑感受野红框里面的信息,而不是图片的全局信息。所以CNN可以看作是一种简化版本的selfattention。那么一个自然而然的问题是:可否把CNN融入Transformer中,使得Transformer也具有CNN的这些适合图片的property呢?

CNN+Transformer是不是一个好的解决方案呢?

CvT模型

CvT具有CNN的一些优良的特征:局部感受野,共享卷积权重,空间下采样。CvT具有Self-attention的一些优良的特征:动态的注意力机制,全局信息的融合。

2个变化:

  • 不再使用位置编码。
  • class token只加在最后一个stage里面。
1 Convolutional Token Embedding

在每个stage中会进行下面的操作:输入的2D token map会先进入Convolutional Token Embedding这个层,相当于在2D reshaped token map上做一次卷积操作。这个层的输入是个Reshape成2D的token。再通过一个LN。

卷积的目的是保证在每个阶段都减小token的数量,也就是减小特征尺度;在每个stage都扩大token width,也就是扩大特征维度。这样实现的效果就和CNN差不多,都是随着层数的加深而逐渐减小特征尺度和逐渐增加特征维度。

2 Convolutional Projection

采用的是卷积变换。具体来讲,token首先reshape成2D的token map,再分别通过3个Depthwise-separable Convolution(kernel =sxs )变成query,key和value值。最后再把这些query,key和value值通过Flatten操作得到真正的query,key和value值。

3 Squeezed convolutional projection

在计算query时, 采用的Depthwise-separable Convolution的stride值为1。在计算key和value时, 采用的Depthwise-separable Convolution的stride值为2。如下图所示。按照这种方式, token的数量对于key和value来说可以减少4倍,性能只有很少的下降。

4 CvT的位置编码哪里去了?

答:不需要位置编码

问:为什么CvT不需要位置编码?

答:因为CvT的Convolutional Projection操作,采用的是卷积变换,也就是说,CvT把传统Transformer的Linear Projection操作给换成了卷积操作。具体的方法上面也介绍了,就是先reshape成2D的,再做卷积,最后再reshape成sequence的形式。那么最重要的是Convolutional Projection可以学习到隐式位置信息,所以就不用再像ViT, DeiT一样使用显式的位置编码了。

可以参见下面的论文:

《Attention Augmented Convolutional Networks》

《Self-Attention with Relative Position Representations》

《Do We Really Need Explicit Position Encodings for Vision Transformers?》

LeViT开启轻量化Transformer模型时代

LeViT以ViT的架构和DeiT的训练方法为基础, 合并了对卷积架构有用的组件。如果不考虑classification embedding的作用, ViT就是一个处理激活映射的Layer的堆叠。

特点:

  • 通道浅;
  • 中间层添加了Attention bias取代数位时的位置嵌入;
  • 使用了降采样;
  • 卷积之后都要进行BN操作(为什么?)
  • 1x1卷积+BN替代LN+Linear;

为什么在transformer组的输入上应用一个小卷积可以提高精度?【进群交流可知】

在LeViT stage之间,一个缩小的注意块减少了激活映射的大小:在Q转换之前应用一个subsample, 然后传播到soft activation的输出。这将一个大小为(C,H,W)的输入张量映射到一个大小为(C,H/2,W/2)的输出张量。由于尺度的变化这个注意块的使用没有残差连接。同时为了防止信息丢失,这里将注意力头的数量设为C/D。

- END -

复旦在读博士,94年已婚有娃的前bt算法工程师。双非材料本科出身,零基础跨专业考研到985cs专业。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灿视学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 浅谈Transformer的原理与运用
    • Transformer为什么可以这么6?
    • Self-Attention是个什么东西?
      • 2.1 Self-Attention简要示意
        • 2.2 Self-Attention原理
          • 为什么位置嵌入是cat操作而不是直接的相加add操作?
          • 这个问题我们可以进去讨论交流
      • 为什么Self-Attention在CV领域也可以有效?
      • Position Embedding是什么?有什么用?
      • 为什么用LayerNorm?
      • ViT在做什么事情呢?
      • Transformer用于目标检测
      • Transformer用于语义分割
      • Transformer模型的局限和解决方案
      • DeiT
        • DeiT的训练
          • DeiT的测试
            • DeiT还有一个问题没解决?
            • TNT解决了ViT的局限吗?
            • CNN是不是一个局部的Self-Attention?
            • CNN+Transformer是不是一个好的解决方案呢?
              • CvT模型
                • 1 Convolutional Token Embedding
                • 2 Convolutional Projection
                • 3 Squeezed convolutional projection
                • 4 CvT的位置编码哪里去了?
            • LeViT开启轻量化Transformer模型时代
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档