Transformer系列

RocheL
Aug 1, 2022
Last edited: 2023-5-24
type
Post
status
Published
date
Aug 1, 2022
slug
transformer-series
summary
从注意力到MAE
tags
AI
PaperLib
category
学习思考
icon
password
Property
Aug 2, 2022 02:15 AM
URL
从注意力到MAE,学习教程笔记

注意力

视觉认知工程中提过,由于中心凹等生理结构的存在使得真正处于观察范围内的视角比较小,人眼视觉的认知本质是高速扫描关键点,注意力机制也与此对应。 还需要知道的是,人眼视觉线索可以分为随意线索(top-down)和非随意(down-top)线索,随意线索例如我想要喝咖啡去找咖啡杯,是自顶向下的。非随意线索例如纯白背景的房间放置一个红色咖啡杯,由于其视觉上的独特性构成自底向上的非随意线索。

注意力机制

我们此前的卷积和池化层等等操作主要考虑的是非随意线索,注意力机制希望引入对随意线索的实现。
  • 随意线索称为查询(query)
  • 输入(已知)是值(value)和非随意线索(key)的对(pair)
  • 注意力机制即希望通过需要的随意线索,寻找与之接近的非随意线索的加权值
notion image
以上就是一个非参的注意力机制实现,其中x是query,xi和xj是key,yi是value,K是核函数,度量相似性,如果使用高斯核就会变成
notion image
 

注意力分数

notion image
可以知道,输出注意力权重由计算得到的注意力分数经过归一化得到。图很形象,假设已知一些 key-value 对和一个 query,首先将 query 和每一个 key 通过注意力分数函数 a 和 softmax 运算得到注意力权重(与 key 对应的值的概率分布),将这些注意力权重再与已知的 value 进行加权求和,最终就得到了输出。 高维情况下,即q个查询,m个键值对,可以得到
notion image
softmax作用
softmax 操作用于输出一个概率分布作为注意力权重,但是在某些情况下,并非所有的值都应该被纳入到注意力汇聚中。在处理文本数据集的时候,为了提高计算效率,可能会采用填充的方式使每个文本序列具有相同的长度,便于以相同形状的小批量进行加载,因此可能会存在一些文本序列被填充了没有意义的特殊词源(比如“<pad>”词元) 因此,为了仅仅将有意义的词元作为值来获取注意力汇聚,可以指定一个有效序列长度(即词元的个数),任何超出有效长度的位置都被掩蔽并置于 0,便于在计算 softmax 的时候过滤掉超出指定范围的位置,这也就是掩蔽 softmax 操作 (作者:如果我是泡橘子https://www.bilibili.com/read/cv15934199?from=note )
 

加性注意力(Additive attention)

当 query 和 key 是不同长度的矢量时,可以使用加性注意力作为注意力分数
notion image
h:超参数 Wk:key 从 k map 到 h(将 key 向量的长度从 k 转化为 h) Wq:query 从q map 到 h(将 query 向量的长度从 q 转化为 h) Wk、Wq 都是矩阵,v 是向量 tanh:激活函数 上式中,k 是长为 k 的向量,q 是长为 q 的向量 等价于将 query 和 key 合并起来变成一个长度为 k+q 的向量,然后将其输入到一个隐藏层大小为 h ( h 是一个超参数),输出大小为 1 的但隐藏层的 MLP(没有偏置项),最终得到输出 优点是 key、value 向量可以是任意的长度,可以不同
 

缩放点积注意力(Scaled Dot-Product Attention)

使用点积可以得到计算效率更高i的评分函数,但是点积操作要求 query 和 key 具有相同的长度
notion image
假设 query 和 key 的所有元素都是独立的随机变量,并且都满足零均值和单位方差,那么两个向量的点积的均值为 0 ,方差为 d 这里不需要学习任何东西,直接利用 <q,ki> 将 q 和 ki 做内积然后除以根号 d (除以根号 d 的目的是为了降低对 ki 的长度的敏感度,使得无论向量的长度如何,点积的方差在不考虑向量长度的情况下仍然是 1 )
 

举例:seq2seq中的注意力

notion image
notion image
未采用注意力时,RNN(encoder)的输出采用最后一个单词对应的隐藏状态h_last。也称为分心模型,即注意力是平均的。 引入注意力后,翻译的单词更加注重对应的、更重要的单词。(2.从Encoder-Decoder框架来理解注意力机制_哔哩哔哩_bilibili
notion image
 

自注意力

notion image
自注意力即对于序列数据中的每个x,其qkv三个部分都是他自身,操作同上述注意力一致。 比较了三者的复杂度,序列越长,自注意力时间复杂度越高(),因为每个x都对整个序列计算注意力,其他两个都是n的一次方。
notion image

位置编码

加入了位置信息(加入位置是直接跟输入序列中的元素相加),主要特性是其可以实现相对位置关系的转化,具体信息可以看后续transformer等等是怎么用的
notion image
notion image
即,如下图所示,对每个序列中的元素都会有带有位置信息的与之想加,热度图在右侧,其通过上述的sin cos生成。sin cos规则是attention is all you need提出来的,目前位置编码的选择仍比较多,也尚待研究,甚至也可以交给反向传播自己去学。
notion image
 

Multi-head Self-attention

“相关有多种表现形式,提现为注意力的多头” 如上右图,对序列中的每个元素,得到之后再分别乘两个矩阵(两个head)共6个矩阵得到多头注意力所需要的。 每个head是相互独立的,所以计算的时候分开计算如下,多头结果concat之后再过矩阵得到最终一样的注意力分数结果
notion image
notion image
notion image
 

李宏毅&笔记

李宏毅的版本对此有详细介绍。
b站用户uncle-强github和gitee上开源了笔记,挺全面了,我在下面放个pdf自己备忘。
我们的目的是获取序列中的相邻语义信息,所以一开始考虑用window+fc(全连接层)(左图),但许多任务其实需要全局的语义信息,self-attention由此诞生,框架如右图,self-attention输出的特征即包含全局语义信息
notion image
notion image
最简单的dot product self-attention,可学参数就是三个矩阵(pdf里详细讲了)
notion image
notion image

Transformer

《Attention Is All You Need》已经是2017年的工作了,BERT是18年的工作
notion image

李宏毅

其中P1主要讲的是seq2seq模型能用的任务以及encoder结构,P2是剩余的技术细节 P2超大小了,拆了一部分 PS:笑死,行话是这样的
notion image
 

网络结构

首先transformer是一个nlp的seq2seq的model,其中output seq不定长,eg语音识别。

Encoder编码器

notion image
notion image
transformer的Encoder,用的就是self-attention,其中含有多个block,<简化版>如右图具体是:
  • 先做一个self-attention,input一排vector以后,做self-attention,考虑整个sequence的全局语义特征,Output另外一排vector
  • 接下来这一排vector,会再丢到fully connected的feed forward network裡面,再output另外一排vector,这一排vector就是block的输出
对比一下左图和右图,可以发现,transformer实际上多了两处residual connection,分别在多头注意力前后和FC(Feed Forward就是全连接)前后,另外,不同于一般的batch normalization,其采用的是可以应对可变长输入的layer normalization。因此,encoder实际运行如下:
  • 首先 你有self-attention,其实在input的地方,还有加上positional encoding,我们之前已经有讲过(位置编码 ),如果你只光用self-attention,你没有未知的位置前后关系,所以需要加上positional的information,然后在这个图上,有特别画出positional的information
  • Multi-Head Attention,这个就是self-attention的block,这边有特别强调说,它是Multi-Head的selfattention
  • Add&norm,就是residual加layer normalization,我们刚才有说self-attention,有加上residual的connection,加下来还要过layer normalization,这边这个图上的Add&norm,就是residual加layer norm的意思
  • 接下来,要过feed forward network。fc的feed forward network以后再做一次Add&norm,再做一次residual加layer norm,才是一个block的输出。然后这个block会重复n次。
后续BERT的encoder与transformer保持一致 transformer结构选择:On Layer Normalization in the Transformer Architecture作者对各层位置和residual connection调整后的效果做了探讨,发现layer normalization放在attention和FC之前效果更好。 PowerNorm: Rethinking Batch Normalization in Transformers作者对layer normalization做了探讨,提出了power normalization
 

layer normalization

b是batch,从左到右是第1个序列到第n个序列,len是序列长度,第一个序列从下到上是第1个元素到第n个元素,d是每个元素的特征维度,如图,layer normalization不对每个特征维度做归一化,而对序列中每个example的所有特征做归一化,因此其可以对变长输入序列进行归一化。
notion image

Decoder解码器

预测阶段操作流程

notion image
从输入输出来看decoder需要完成什么。首先,在nlp任务中,我们将上图中的所有单字化为Vocabulary中的One-Hot(当然one-hot是最简单的,Word Embedding等等方法也都可行),也即建立一个几千字的常用汉字库,每个字都是一个几千维的仅一位为1的Vector(nlp中称为Token),另外句子开头和结尾这两个字符也包含在Vocabulary中,是两个特殊的Token。我们首先传入BOS(Begin of Sentence)这个Vector,decoder会生成“机”(实际上是输出结果通过softmax之后选取最大值是“机”,然后输出“机”对应的One-Hot编码),然后“机”这个输出会返回来作为decoder的输入,decoder根据BOS和“机”生成“器”,再根据BOS、机、器生成学…直到最后“习”字输入,decoder输出END表示识别完成(可变长输出,END标识结束)。
 

结构:Masked Multi-Head Attention

decoder结构具体如下,与encoder相比,主要增加的是块中下方的Masked Multi-Head Attention。掩码的添加是符合直觉的,即我串行推理的时候,只能看到已有的信息,而无法预知未来的输入。具体来说,计算时,只把的运算结果concat输出,与无关。
notion image
notion image
notion image
notion image

Autoregressive(AT) & Non-Autoregressive(NAT)

以上我们介绍的都是AT的内容,NAT相比于AT,主要是一次全部输入START(类似BOS),一次运行输出全部的结果,而AT需要串行输出。由于我们的输入和输出是可变长的序列,因此对NAT而言,最大的困难在于确定给入START的数量,通常的简单方法有两种:
  • 另外learn一个 Classifier,这个 Classifier ,它吃 Encoder 的 Input,然后输出是一个数字,这个数字代表 Decoder 应该要输出的长度,这是一种可能的做法
  • 不管三七二十一,给它一堆 BEGIN 的 Token,你就假设说,你现在输出的句子的长度,绝对不会超过 300 个字,你就假设一个句子长度的上限,然后 BEGIN ,你就给它 300 个BEGIN,然后就会输出 300 个字嘛,然后,你再看看什麼地方输出 END,输出 END 右边的,就当做它没有输出,就结束了,这是另外一种处理 NAT 的 Decoder应该输出的长度的方法
NAT的好处是并行度高速度快,但精度performance不行且难训,由于自己不搞NLP,所以就简单记一下到这里了,深入讲解在youtu有。
notion image
 

Encoder-Decoder信息传递

主要就是Cross Attention,cross attention相比于self-attention出现的更早,实际上来说他就是我们开始讲的注意力分数 ,只不过相同罢了。 流程如下方右图,对于mask self-attention的输出,乘一个矩阵变成,同时encoder的输出全部与矩阵相乘生成,然后用得到的计算注意力分数(原文是缩放点积注意力,前面有讲),归一化得到注意力权重,与相乘想加得到输出,通过FC就是一个块,反复n个decoder块再线性层、softmax得到decoder输出。decoder的第一个输出作为decoder的第二个输入(第一个输入是BOS)反复上述操作直至全部输出。
notion image
notion image
也可以不用encoder最后一个块和decoder第一个块做数据传递,各种各样方法都试过了,论文已水(bushi。
notion image
 

训练策略train strategy

采用交叉熵损失Cross Entropy,decoder的训练比较特殊如右图所示,把 Ground Truth 即正确答案给它,希望 Decoder 的输出跟正确答案越接近越好。即在训练的时候我们会给 Decoder 看正确答案,也就是我们会告诉它说:在已经有 "BEGIN",在有"机"的情况下你就要输出"器”;有 "BEGIN" 有"机" 有"器"的情况下输出"学”… 在 Decoder 训练的时候,我们会在输入的时候给它正确的答案,这叫做 Teacher Forcing 在梳理这个之前我一直想问训练的时候decoder根据正确答案有交叉熵,那encoder的梯度根据什么更新?写到这里一想就比较清楚了,encoder根据两者之间交叉注意力的信息传递对比自己的输出结果更新权重。
notion image
notion image
 

Transformer的trick&tips

  • nlp领域通常需要有复制能力Copy Mechanism,即把输入的部分直接搬到输出,例如问答和写摘要。从Pointer Network、Copy Network可以看出seq2seq model可以具有这种能力。
  • 在语音合成任务中,我们往往需要网络的attention集中部分从最左端移到最右端,这需要借助Guiding Attention
  • nlp领域常用的评价标准是BLUE score(越大越好),但我们训练用的交叉熵,但是BLUE不能微分实操难度较大。实际上是可以做的,P2_2.pdf有介绍文献
  • 我们decoder的训练跟测试是不一致的,这叫做Exposure Bias。假设 Decoder 在训练的时候,永远只看过正确的东西,那在测试的时候,只要有一个错,那很可能就会一步错,步步错,因為对 Decoder 来说,它从来没有看过错的东西,它看到错的东西会“非常的惊奇”,然后接下来它產生的结果可能都会错掉,即error propagation。因此,通常训练时我们会给 Decoder 的输入加一些错误的东西,(很直觉),不要给 Decoder 都是正确的答案,偶尔给它一些错的东西,它反而会学得更好,这叫做Scheduled Sampling。这个trick很早就有了可以看上面的文献。
 

BERT

BERT(Bidirectional Encoder Representation from Transformers)是NAACL-HLT的2019年最佳论文。毕竟是NLP领域的论文,网络结构其实也比较简单,我们侧重原理简要介绍即可。BERT的目的是:计算机视觉领域常用大的数据集预训练一个CNN模型去finetune完成各种视觉任务,而BERT以前,在NLP领域缺乏一个预训练好的深度网络模型去完成各种NLP任务。 而基于深度学习的 NLP 模型只有对数亿甚至十亿级的带注释的数据进行训练,才能达到很好的效果。因此,BERT提出了无监督学习的技术途径,解决了训练数据问题,从模型结构和训练数据策略两方面提供了一个NLP领域可用的预训练模型。
网络结构其实很简单,就是transformer的编码器。输入上增加了几个特殊的token,包括句与句的分隔符[SEP],判断上下句关系的分类头[CLS],用于完形填空的掩码[Mask]等,基于大规模无标注的数据集预训练两个任务:预测被屏蔽的单词和判断两句的上下文关系是否成立:
notion image
notion image
notion image
notion image
当然也可以两个无监督任务混合去训练,既判断上下文又同时预测掩码,按照15%的概率随机遮蔽单词以及50%的下一句是真实的进行训练。生成两个模型版本,Base版本含有12个transformer块,FC全连接层神经元个数也即所有特征向量维数为768,多头注意力的head个数为12,参数总量为1.1亿,不调参的情况下训练一次需要16块TPU,4天;Large版本含24个transformer块,特征向量维数为1024,多头注意力的head个数为16,参数总量为3.4亿,需要64块TPU训4天。数据集为English Wikipedia,>30亿个词。取得了当时nlp领域sota的性能。

VIT

VIT(An Image Is Worth 16*16 Words:Transformers For Image Recognition at scale),2021年发表于ICLR
ViT论文及代码解读-ICLR2021:Transformer用于视觉分类也有很好的性能
论文:An Image Is Worth 16*16 Words:Transformers For Image Recognition at scale 时间:2021年 发表于:ICLR 本人大量注释的代码: https:// github.com/zlove-summer /Vision-Transformer-pytorch 论文链接: An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale transformer于2017年的Attention is all your need提出,一般用于自然语言处理任务(序列任务),因为其相较于循环神经网络RNN能够并行化处理而广泛使用。本文最大的创新点就是将transformer应用于图像分类的cv任务,证明在cv领域使用Transformer依然可以获得很好的性能,启发了后面基于transformer的目标检测和语义分割等网络。 图像是三维矩阵结构,如何将其变为序列是一个问题。 在本文中,将图像使用卷积进行分块(14*14=196),再每一块进行展平处理变成序列,然后将这196个序列添加位置编码和cls token,再输入多层Transformer结构中。最后将cls tooken取出来通过一个MLP(多层感知机)用于分类。 图一是ViT的整体模型结构。 图二[1]是ViT模型的基本结构。可以看出整体模型还是非常简洁的,我将其分为预处理、Transformer模块和分类模块。 和很多论文一样,ViT也按照模型的深度分为了多种版本,如图3所示。其中Layers是Transformer模块的个数,Hidden size是分块时卷积升维后的通道数量,也是每一个块的序列长度。 本节将按照一张图片输入ViT模型后,经过的变换,详解ViT的代码。 预处理模块的结构如图4所示。处理流程如下: 一张224*224*3的图片,通过一个卷积核大小为16*16、步长为16、输出通道为768的卷积,得到14*14*768的输出。 14*14*768的输出,将其按照宽高进行Flatten,其shape变成196*768,表示为196个序列,每个序列长度为768。 在196*768的数据上,cat一个1*768的分类token在最前面。则shape变成197*768。我们设这个197*768的矩阵为 A 。 设置一个1*197*768的Position Embedding,对应值相加至 A 。分类token和Position Embedding都需要nn.init.trunc_normal_进行初始化。 PatchEmbed模型(图4的Patch Embedding,用于得到196*768的序列) 将预处理得到的输出,经过多层Transformer模块,用于特征的提取,如图2所示。多层Transformer模块,顾名思义就是多次叠加Transformer模块。因此本节主要讲解Transformer,模块结构如图5[1]。 Transformer模块主要有两个部分,一个是Muti-head Attention,另一个是MLP。 Transformer与CNN最大的不同就是这个自注意力结构,它能够使得网络看到全局的信息,而不是CNN的局部感受野。self-attention的计算方式如图6。 关于Self-attention的详细计算可以看我的文章 Vision Transfromer:解读self-attention 。其实就是,序列a,经过三个不同的矩阵,得到 q,k,v ,q与k点乘得到相关系数 \alpha ,对所有 \alpha 缩放并softmax归一化,再分别乘以v进行加权,得到输出序列b。 在代码实现时,矩阵相乘可以用一个线性层得到( nn.Linear),代码实现时,将线性层的输出通道为原来3倍,可以一次性得到 q,k,v ...
ViT论文及代码解读-ICLR2021:Transformer用于视觉分类也有很好的性能
Vision Transformer详解_太阳花的小绿豆的博客-CSDN博客_vit详解
论文名称: An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale 论文下载链接: https://arxiv.org/abs/2010.11929 原论文对应源码: https://github.com/google-research/vision_transformer Pytorch实现代码: pytorch_classification/vision_transformer Tensorflow2实现代码: tensorflow_classification/vision_transformer 在bilibili上的视频讲解: https://www.bilibili.com/video/BV1Jh411Y7WQ Transformer最初提出是针对NLP领域的,并且在NLP领域大获成功。这篇论文也是受到其启发,尝试将Transformer应用到CV领域。关于Transformer的部分理论之前的博文中有讲, 链接 ,这里不在赘述。通过这篇文章的实验,给出的最佳模型在ImageNet1K上能够达到88.55%的准确率(先在Google自家的JFT数据集上进行了预训练),说明Transformer在CV领域确实是有效的,而且效果还挺惊人。 在这篇文章中,作者主要拿ResNet、ViT(纯Transformer模型)以及Hybrid(卷积和Transformer混合模型)三个模型进行比较,所以本博文除了讲ViT模型外还会简单聊聊Hybrid模型。 下图是原论文中给出的关于Vision Transformer(ViT)的模型框架。简单而言,模型由三个模块组成: Linear Projection of Flattened Patches(Embedding层) Transformer Encoder(图右侧有给出更加详细的结构) MLP Head(最终用于分类的层结构) 对于标准的Transformer模块,要求输入的是token(向量)序列,即二维矩阵[num_token, token_dim],如下图,token0-9对应的都是向量,以ViT-B/16为例,每个token向量长度为768。 对于图像数据而言,其数据格式为[H, W, C]是三维矩阵明显不是Transformer想要的。所以需要先通过一个Embedding层来对数据做个变换。如下图所示,首先将一张图片按给定大小分成一堆Patches。以ViT-B/16为例,将输入图片(224x224)按照16x16大小的Patch进行划分,划分后会得到 ( 224 / 16 ) 2 =
Vision Transformer详解_太阳花的小绿豆的博客-CSDN博客_vit详解
这篇笔记配合读论文的视频效果拔群。更多详细的关于论文的笔记就直接做到readpaper上了,这里主要介绍自己对他们工作的认识。
视频1个小时,一口气看完挺上头的,讲得很好。VIT的本质目的是证明BERT在nlp领域的高performance也能迁移到cv领域去取代cnn做大规模的预训练模型(最好还是用类似bert的无监督去训练)。结果证明其是可行的,用”较少”的训练代价(TPUv3+2500 天,笑)取得了imagenet的SOTA。idea是很自然的。 我们知道,BERT对NLP而言,输入是word sequence,硬件可接受的序列长度也就几百,但是如果把图像的每个pixel都当成一个token展开成序列后,即使是一个224*224的图片也能变成50176长度的序列,这是迁移的最大困难。之前的工作提出了两种解决方法,一种是用cnn或者其他编码生成的小size的特征图去做序列输入;一种是改自注意力机制,即从全局的变成只关注局部的自注意力。前者不够纯粹,后者特殊的自注意力机制当时硬件加速不了,导致训练一个大模型很困难。之前也有工作是跟vit一样打成patch做的,但是小块patch的size大小是2*2,而且数据集不大效果不行。 我们介绍vit的前向操作:
  • PATCH Embedding:我们以224*224*3的图片任务为例,定义打散后小块的大小即patch size是16*16的,因此我们会生成 个patch,每个patch是 ,每个patch经过linear projection of flattened patches即线性投影层(权重矩阵也即768个神经元),会展开成长为 的一行向量(正好和bert-base的维度d对应哈哈),所以过了线性投影层可以得到序列长196(patch个数),序列中每个元素768维,此时已经与nlp对应。
  • 位置编码Position Embedding:原文进行了实验,用了三种位置编码,结果都差不多(但比不用位置编码好),最终采用跟bert一样的1d的可学的位置编码,生成197*768位置编码矩阵跟输入相加(sum)就行。
  • 分类头[cls]:同bert一样,增加一个特殊的token[cls],(196+1)*168的序列输入encoder
  • Encoder:对197*768输入做layer norm,然后进多头注意力,12个头,那么每个头中q,k,v的维度如右图所示 然后是residual connection,再过一个layer norm,接下来进MLP,中间层会将维度扩大四倍到197*3072,然后再接全连接到197*768输出,重复多次
  • 我们认为添加的[cls]可以通过注意力得到全局的语义信息,因此对[cls]token对应的输出过MLP,softmax之后最终得到分类。
notion image

TIPS

  • 不对[cls]对应输出继续操作,而是像cv一样,对encoder的所有输出concat之后做GAP(Global Average Pooling)怎样?可以,效果差不多,但是需要调参
  • 分为数个版本,VIT-L/16的意思是网络结构是Large,然后patch size是16。patch size越小,patch数量越多,序列长度越长,训练代价越贵。
notion image
notion image
  • 实验结果是,在imagenet-21k数据集(14million张图)以及更大的数据集上,在相同TPU训练代价下,VIT胜过Resnet。自注意力可视化如上
  • 概念,归纳偏置inductive biases:即我们的操作会带有我们认为的一些先验知识,例如CNN的卷积操作,我们对此其实有两个针对于图像的先验,一是locality局部性,即相邻区域相似,卷积操作也是对局部操作;二是平移不变性translation equivariance,即一个物体所在位置不影响自身属性( 是卷积是平移)。CNN的操作其实就带有这两个归纳偏置,作者认为这是CNN能在较小规模的数据集上胜过VIT的原因(imagenet-1k 1.2million张图算小规模了笑死)
  • 训练的时候VIT还是使用CV传统的监督学习,给了分类标签等等,也试着做了无监督,掉点比较多。作者认为能做到无监督更具前景,MAE应运而生哈哈
  • 做finetune的时候改变了图像的尺寸,怎么办?保持patch size不变,反正Transformer本身就可以处理可变长序列,但是patch数量变化了导致序列长度变化,位置编码对不上了,作者使用插值,效果还行。
  • 提出了先过CNN再过VIT的混合模型Hybrid architecture,等待发扬光大
  • 1d,2d,relative位置编码都做了消融实验,可以看原文了解,后续工作有对网络结构,位置编码,监督训练、对比学习等等做改进。该片文章的相关工作介绍的很全面,别人做的笔记也很好,值得一读。
  • 提到了模型性能和参数量关系,认为其还没有出现性能饱和
  • “money is all you need”

Swin Transformer

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows,2021年ICCV最佳论文。去年下半年一直在屠榜,让大家认识到transformer让cv变天了,但是现在是2022年8月,ConvNeXt已经问世,看来cv界transformer和卷积鹿死谁手犹未可知,真的卷。Swin Transformer是一个用了移动窗口的层级式的Vision Transformer。移动窗口是作者提出的针对VIT等模型注意力机制的改进,保持能获取全局注意力情况下大幅降低计算复杂度,Hierarchical 层级化的意思是类似于传统cnn的encoder-decoder架构中的encoder,往往是通过多个block获取多个size的特征图,即网络结构是分stage的。照例贴一下视频和别人的笔记,自己的论文笔记之后在readpaper里去做,如果要写代码解析的话应该会notion另开一篇文章吧(懒,估计不会了。Swin Transformer相对于VIT而言,目的是推出一个适合cv的高性能,大规模预训练backbone,因为之前的VIT不是层级式架构,许多下游任务应用其实是有困难的。

Patch&Window划分

VIT如右图所示,采用了16倍的下采样率特征(相当于16*16的pixel整合为一块)做patch,这对于密集预测性的任务比如分割就不友好。Swin-Tran如左图所示,是在不同下采样倍率的图上分别做操作的,不同下采样率的特征图是通过swin-tran块级联的层级式的不同stage得到的,后面会具体介绍。以下方的4x为例,在这个层级中,我们将每个4*4打包成一个patch,8x的层级就是将8*8打包成一个patch。这样序列长度也不至于太大。 window的划分是用来算局部的自注意力的,左图中的意思就是每个4*4的patch作为一个window去算自注意力,window与window间相互独立,只用管自己window内部的自注意力就够了,但是,这样得不到全局的注意力了,于是作者设计了window间的shift操作,之后介绍。基于window的自注意力可以大幅降低计算复杂度,我们知道,VIT的全局自注意力是的,即计算量与图片大小成平方关系,引入window后计算量与图片大小降为了线性关系,比如我长宽各乘二,面积变为原来4倍,那我window的数量也会变成原来的4倍,由于window里面的patch数量是固定的,即每个window自注意力计算量是常数,因此计算量与图片大小降为了线性关系。 需要说明的是,上述图片文字是用来弄明白patch,window如何划分,有什么用的,具体实现的数值可能与上述不一致。论文中一个window是7*7个patch
notion image

Shifted window&Mask

notion image
一个shift window操作即如上方图片所示,一个灰色小块就是一个patch,一个红框大正方形就是一个window。一次shift中,每个window会向左下角移动2*2个patch,相当于框出新的window,然后再计算自注意力。需要注意这里是拿2*2window举例,实际不止。这样,新的window里面含有之前不同window的patch,实现了间接的长距离自注意力。 新的问题随之诞生,我们划分出来新的window很明显好多都不是规则的,虽然自注意力仍然可行,但是无法大规模并行计算,给我们的炼大丹造成了麻烦,作者如何解决呢?cycle shift和掩码mask应运而出。
如下方左上图所示,移动后右下方的四个块保持不变,把左上的三个块移动到右下方去拼七巧板,拼成四个标准大小的window块,这样就适合并行计算了,但仍有问题,有些块之间我们不希望他们那么强关联,比如原来的C块可能是天空,现在我们把他挪到最下方去做拼接,那很可能是去跟地面做拼接,这两者特征没必要做注意力,因此作者又引入了掩码。 如下方右图所示,右图中最开始的左上图其实就对应刚才图中cycle shift上方框红的部分,长宽是14*14个patch,也即一个window内部是7*7patch,标号0134四个部分是原来就在的,25678标号是之后挪过去的。对于36组成的新window,我们如下计算带掩码的自注意力。3的部分展开成28(标号3有7*4个patch)行d维(d由patch展开决定)向量,同理,6的部分展开成21(7*3)行向量,在转置一下跟自己做矩阵乘法(点积注意力),生成一个49*49矩阵,然后我们如左下图中window2所示的掩码跟49*49矩阵做sum相加,将3和6,6和3的注意力结果置为很负而其他不变,这样就相当于各自做自注意力啦。做完之后挪回去,操作完成,继续往下走。 也有提出其他方法,比如不挪位置直接在四周pad0,这样也可以但是计算量是上述的两倍多(9个window和4个window)。
notion image
notion image
notion image

网络结构和计算量

notion image
notion image
notion image
假定是一个224*224*3的输入,先通过一个patch partition,即打patch,一开始的patch大小是4*4,打完之后size就变成56*56个patch,通道数48就是一个patch展开4*4*3。 再过一个linear embedding变成3136*96,即序列长度展开维数增多,实际上这两步在代码中是通过一步conv2d实现的(kernel size=4,stride=4,filter=96),相当于vit的linear projection。这里序列长度3136就相对于vit而言太长了,所以才有之前讲的窗口机制,但是全局注意力还是希望能保持住,所有又有滑窗。
接下来过swin-tran块,在图示的(b)部分,它是两个块打包一起的,所以(a)中网络结构每个stage的块2262都是偶数。第一个tran块把注意力改成了窗口注意力,即那刚开始规则的窗口做一次注意力操作,然后第二个tran块用到了swin-msa滑窗自注意力,即先做一次滑窗操作,然后再做w-msa(窗口-多头自注意力),输入输出shape不变。
最后一个部分就是patch merging,他的目的是实现类似cnn的池化操作,降低size,增大感受野,增加通道数。(类似于pixel shuffle的上采样过程PixelShuffle原理的反操作),图中上方就是这个操作的草稿,对HWC输入,每隔一个像素取一个,一共四类,同类归并在一块,然后垂直摞起来变成size减半,通道数四倍的特征图,但pool通常通道数翻倍就够了,因此再用一个1*1卷积通道数降为2倍。每个stage的特征图shape如上所标。
网络没有使用特殊token,最后特征图7*7*768直接GAP拉直成1*768进softmax。
对一个h*w(eg,56*56)个patch的图片,接下来计算多头自注意力和窗口注意力的计算量。c是特征维度,M是一个window有M*M个patch,论文中为7。 如右图,自注意力MSA时,计算qkvA各贡献一个计算量,Av相乘和投影总计;对于窗口注意力而言,一个窗口含M*M个patch,注意力计算量相当于M代h和w的MSA,是,图片中的window数量是,相乘就得到(2)

结论性能就不介绍了,反正是屠榜,主要是swin这个操作可以泛用,思考没有vit那么多。
 

MAE

Masked Autoencoders Are Scalable Vision Learners。目的是想像BERT一样做一个无监督(自监督)的CV预训练模型出来(VIT的方法是监督的)。Masked Autoencoders-带掩码的自编码器是 可扩展的视觉学习器-scalable vision learners。
Autoencoders,auto不是自动的意思,是“自”,类似于自回归模型,表示样本sample和编号label是一个集合,BERT的带掩码的自编吗语言模型(完形填空)训练也可称之为“auto”,nlp中较常见,但cv领域标号往往是文本等等,一般不为同一个集合。

Asymmetric Encoder-Decoder Architecture

非对称的编码器-解码器架构。非对称指的是编码器与解码器看到的不一样,编码器只看到shuffle的可见块,编码器的输出和遮挡块的位置信息放在一起,unshuffle之后输入进解码器,重构 masked patches。为什么非对称?大量 masked 块(mask比例在75%以上),编码器只看可见块,极大降低计算开销、减少内存消耗
编码器是一个只看见可见块的VIT-L/16,当然这些可见块是随机选择出来的并且输入编码器时附加了位置信息。解码器也是一个transformer结构,通过读入带位置信息的可见块和非可见块对应patch非乱序序列输出整图。比较简单。
notion image

Meaningful Self-Supervisory Task

该任务可以看出当然是自监督的,实验表明在加入正则项约束之后,即使是在1k这种较小规模数据集上效果也不错。 文章对自身动机的阐述是通过三个问题引入的,值得一读。
 
 
DETRMiDaS&DPT