ViT学习笔记

ViT(vision transformer)在这里插入图片描述

ViT与CNN不一样的特性:

1.遮挡(occlusion)
2.数据分布偏移(distribution shift)
3.对抗性patch(adversarial patch)
4.图片patch打散排列组合(permutation)
以上特性是CNN做不好的,但transformer能够胜任

自注意力:

计算复杂度与序列长度成平方倍的
BERT中序列长度为512

输入序列长度改进:

1.使用网络中间特征层(CNN)
resnet stage4输出14x14=196
2.孤立自注意力(stand-alone attention)
使用local window而非整张图作为输入
3.轴自注意力(axial attention)
将在2d图片上的自注意力操作改为分别在图片的高和宽两个维度上做self-attention,可以大大降低复杂度

但是由于目前硬件没有对这种操作做加速(stand-alone attention, axial attention),很难支持大规模的数据量级

论文精度

标题:

An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
一张图片等价于16x16大小的单词,transformer做大规模图像识别

摘要:

一个纯transformer作用在图像任务中也是work的,大数据集做预训练,迁移到中小数据集能过的与最好的神经网络相媲美的结果

引言:

随数据增长,transformer性能还在上涨,没有出现饱和现象
前人工作:将图像转化成序列,使用自注意力,需降低序列长度(参见:输入序列长度改进)
本文思想:直接用标准transformer作用于图片,尽量做少的修改,去解决视觉领域问题
序列长度:将整张图片(224x224)拆分成patch(16x16),每个patch转成序列(14x14=196)
	将每个patch经过 fc layer 得到 linear embedding 作为输入传入transformer,每个patch相当于一个词向量
有监督:NLP大多使用无监督训练,ViT用的是有监督训练
对比CNN:在中型大小数据上训练,ViT比同等大小残差网络弱,弱的原因:缺少卷积神经网络的归纳偏置:
	1.locality:假设相邻区域有相邻特征
	2.translation equivariant: 平移等变性,f(g(x))=g(f(x)),先做哪个效果一样,
	  但当数据规模足够大后,ViT就能学到足够好的效果,可以在下游迁移学习中获得好的结果

结论:

只加了patch enbedding 和位置编码这些归纳偏置,使用NLP中的纯tansformer在大数据集上预训练,就可以在视觉领域获得很好效果
ViT不但可以做分类,还可以做检测(DETR)、分割(SETR)。(Swin-Transformer:融合多尺度设计,更适合做视觉任务)
自监督训练,并预言ViT可以做得更大(ViT-G:scaling vision transformer,将imagenet分类准确率提升到90%以上)
ViT不但挖了一个视觉的坑,还给多模态任务挖了一个坑

相关工作:

NLP中tansformer大模型一般都是现在大数据集上预训练,再到目标任务上进行微调。一个是BERT,一个是GPT()
BERT用denoising的自监督方式(完形填空),GPT用language modeling自监督方式(已有一个句子,预测下一个词)
1.视觉中自注意力可将每个像素点当成一个元素,让其俩俩做自注意力(复杂度高,实际用local neighborhood小窗口做自注意力)
2.另外一个方法是用sparse transformer,只对一些稀疏的点做自注意力,是全局自注意力的近似
3.将自注意力用在不同大小的block上,极端情况下是轴(高/宽)自注意力
其他相似工作(iGPT:image GPT),NLP中GPT是在做生成,视觉中image GPT也做生成,用的也是transformer,
iGPT在imageNet上最高准确率也就72%,ViT能达到88.5%
MAE:生成式模型(何凯明)

ViT模型:

直接拿用NLP中的transformer结构,几乎不做修改。
自注意力是没有顺序的,图像块之间是有序的,引入位置编码
BERT中有个特殊字符,借鉴BERT,添加一个特殊向量做分类
前向传播推理:
	image:224x224
	blocks:224*224/16*16=196(patch:一共得到196个图像块)
	block size:16*16*3=768(每个图像块是长度为768的向量)
	linear projection:线性投射层E(全连接层:768*768。前一个768由patch展平得来,后一个768是文中的D,可变,使模型更大)
	patch embedding:x*E=(196*768)x(768*768)=(196*768):输入变为196个token,每个token768维向量
		加一个特殊字符cls,维度1*768,输入变成197*768
	position embedding:是直接加上去的,不是concat,输入维度不变
		位置编码不是数字1,2,3,...,是一个表,表的每一行代表1,2,3这样的数字,维度与D相同,也是768	
		至此做完了图片与处理,transformer的输入patchs embedding的维度就是197*768
	Multi-Head attention:多头自注意力(q, k, v)
		用了12个头,每个头维度:768/12=64(q:197*64,k:197*64,v:197*64),最后将所有头再拼接起来又变成197*768

实验:

消融实验:transfomer结构不变,主要在前处理和后处理做实验。
1.无论在cls token上做分类还是在全局输(GAP)出上做分类,效果一样,只是训练学习率不同
2.1D,2D,相对位置编码的结果差不多。原因:在patch上做位置编码比在pixel上做位置编码简单得多,容易学到,1D就够了
用自监督去训练ViT效果还行,有潜力(MAE证明自监督训练ViT确实效果很好)

评论:

ViT在CV领域挖了一个巨大的坑,在各个领域大有可为。

对比学习是所有自监督方法里表现最好的,用对比学习训练ViT
在这里插入图片描述

在这里插入图片描述
数据越大,ViT性能越好,超过Resnet


个人笔记,未曾整理,不适合作为学习参考
参考视频:https://www.bilibili.com/video/BV15P4y137jb/?spm_id_from=333.337.search-card.all.click&vd_source=d453f413f8f2bcee0ad2e96594e386b1
推荐笔记:https://blog.csdn.net/charles_zhang_/article/details/123989506

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值