赞
踩
本博客针对视觉Transformer方面的工作,对当前热点研究做一下总结。主要是VIT、Swin Transformer、MAE、CILP 这四篇。
有一句话说的很有道理,因此放在这篇博客最前面。为什么NLP领域的预训练模型很好用,但是图像领域的预训练模型就很一般?这因为我们在NLP领域中找到了非常棒的 pretext task (代理任务),比如回想一下bert,我们需要理解一句话的意思,知道语义信息,那么我们把其中一个词遮住,如果我们真的搞懂了这句话的意思,搞懂了语义信息,把这块补出来这是非常简单的。但是目前对于图像的 pretext task 还有很大的改进,我们没有找到适合图像信息的 pretext task ,即使和NLP一样遮住图像某一块信息,这对于我们人类来说,都很少去做这种的题目吧,所以这就导致了图像的预训练模型是比较差的。
ViT(vision transformer)是Google在2020年提出的直接将transformer应用在图像分类的模型,后面很多的工作都是基于ViT进行改进的。
ViT的思路很简单:直接把图像分成固定大小的patchs,然后通过线性变换得到patch embedding,这就类比NLP的words和word embedding,由于transformer的输入就是a sequence of token embeddings,所以将图像的patch embeddings送入transformer后就能够进行特征提取从而分类了。
整体思路比较简单,但是有几个有意思的点要明确:
为什么小数据时CNN效果要好于VIT,大数据时VIT效果更好一些?
传统的CNN卷积神经网络有很强的inductive biases(归纳偏置),是根据图像的本质而设计的一种网络,比如卷积核的平移不变性和局部性。因此在小数据时,VIT学不到这些,自然效果就不好,但是数据多起来后,就不太需要针对图像特意去设计这些小tips了。
混合架构
作为原始图像图块的替代,可以从CNN的特征图形成输入序列。在该混合模型中,将patch embedding投影应用于从CNN特征图提取的图块。(即,将图像块先经过CNN网络,然后将CNN的网络输出的特征矩阵输进Transformer中,这样也是可以的,论文有尝试过)
位置信息
Transformer和CNN不同,需要position embedding来编码tokens的位置信息,这主要是因为self-attention是permutation-invariant,即打乱sequence里的tokens的顺序并不会改变结果。如果不给模型提供patch的位置信息,那么模型就需要通过patchs的语义来学习拼图,这就额外增加了学习成本。但是CNN是滑动的,是本身就具有位置信息的。所以在使用VIT时要手动加上位置信息。论文中试验过使用1-D和2-D的位置信息效果差不多。
微调和更高的分辨率
通常,我们在大型数据集上对ViT进行预训练,并微调到(较小的)下游任务。为此,我们删除了预训练的预测head,并附加了一个零初始化的D*K的前馈层,其中K是下游类的数量。以比预训练更高的分辨率进行微调通常是有益的。当提供更高分辨率的图像时,我们将图块大小保持不变,这会导致更大的有效序列长度。ViT可以处理任意序列长度(直到内存限制),但是,预训练的位置embedding可能不再有意义。因此,我们根据预先训练的位置嵌入在原始图像中的位置执行2D插值。请注意,只有在分辨率调整和色块提取中,将有关图像2D结构的感应偏差手动注入到Vision Transformer中。
参考:
https://zhuanlan.zhihu.com/p/356155277
https://zhuanlan.zhihu.com/p/359071701
目前Transformer应用到图像领域主要挑战在于:图像分辨率高,像素点多,Transformer基于全局自注意力的计算导致计算量较大(例如VIT);在不同场景下视觉Transformer性能未必很好(我理解的是小目标和大目标的识别)。
因此Swin Transformer横空出世,有效的解决了上述两个弊端。不过我个人感觉Swin Transformer不会很火爆,因为它比较繁琐,没有像Resnet和VIT等模型“大道至简”的感觉。
Swin Transformer最主要的两方面:层级化+滑窗设计,我们先看下Swin Transformer的整体架构
整个模型采取层次化的设计,一共包含4个Stage,每个stage都会缩小输入特征图的分辨率,像CNN一样逐层扩大感受野。
Window Attention 和 shift window attention:
这是这篇文章的关键。传统的Transformer都是基于全局来计算注意力的,因此计算复杂度十分高。而Swin Transformer则将注意力的计算限制在每个窗口内,进而减少了计算量。
window attention就是按照一定的尺寸将图像划分为不同的window,每次transformer的attention只在window内部进行计算。那么如果只有window attention就会带来每一个像素点的感受野得不到提升的问题,所以它又设计了一个shift window attention(下移两个patchs)的方法,就是换一下window划分的方式,让每一个像素点做attention计算的window块处于变化之中。那么就起到了提升感受野的作用。
不过,Shift Window Attention引入了一个问题:即window的个数翻倍了,由原本四个窗口变成了9个窗口。
缩小Shift Window Attention的窗口数:
在实际代码里,我们是通过对特征图移位,并给Attention设置mask来间接实现的。能在保持原有的window个数下,最后的计算结果等价。
但是这样的话,如何计算Attention呢,因为A只能和A计算,不能和B计算,如果直接如上图所示算的话,肯定会计算A与B的注意力,但是A和B的顺序本来就是不同的啊,是我们为了快速计算强行拉到了相同的位置,所以计算A和B的注意力是没有意义的。这里参考这篇博客:https://zhuanlan.zhihu.com/p/367111046
采用一种Mask的方法,将不需要计算注意力的地方遮盖住就可以了。(实际是用-1000这种特别大的负数,然后经过softmax函数,达到mask效果)。我们算的是同一个图像中,图像像素与图像像素之间的权重嘛,但是不同图像间(或者说位置不同的图形块间)是没必要计算相似度,相似度为0就行了,-1000的数值经过softmax函数后必然是等于0的。
MAE是由凯明大神提出的,在CV领域中,Masked Autoencoders(MAE)是一种scalable的自监督学习器。MAE方法很简单:我们随机mask掉输入图像的patches并重建这部分丢失的像素。
MAE论文从三个方面做了分析,这也是MAE方法的立意:
CLIP打通了文本和图像之间的联系,是多模态方面的经典之作。
优点:
训练高效、预训练任务简单;
方便迁移,CLIP图像对应的标签不再是一个值了,而是一个句子,这就让模型映射到足够细粒度的类别上提供了可操作空间;
全局学习:CLIP学习的不再是图像中的一个物体,而是整个图像中的所有信息,不仅包含图像中的目标,还包含这些目标之间的位置,语义等逻辑关系。这便于将CLIP迁移到任何计算机视觉模型上。这也就是为什么CLIP可以在很多看似不相关的下游任务上(OCR等)取得令人意外的效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。