恺明大神在2021年的时候发布了论文MAE(Masked Autoencoders Are Scalable Vision Learners),给大家指出了如何在cv预训练任务中设计无监督任务。
受知乎大佬李rumor启发,重新堵了vision transformer的附录部分(之前没读过附录部分-_-||),在VIT论文中作者探究了无监督任务的表现,但是指标不如有监督任务,所以在附录中给出来但是正文中没写。
翻译翻译这一段
首先选择50%的patch,然后在这部分patch中80%使用可学习的[mask]替代,10%使用随机其他的patch替代,10%保持不变。这部分设计和BERT的MLM的设计很像,在MLM中是选了15%的token,在这里用了50%的patch,是因为对于NLP任务,少量的mask就可以保证任务的难度,但是在CV中,信息是很冗余的,要更多的MASK比例才能保证任务的难度,让模型学习到有用的信息。任务设计主要有3种
- 预测mask的patch的均值
- 预测16*16的原始patch下采样之后的4x4的patch的值
- 对所有patch使用L2回归计算,
这三种方式第一种表现最好,第三张最差,但是还是不如有监督任务下的指标,现在回过头来看,第三个任务设计与本文的主角MAE非常相似,那么为啥当时在VIT中没能做出效果来呢?稍后分解。
在BEIT中提出了MIM任务(在后面的EVA论文中发现MIM任务并不是很有效),使用dvae对patch进行离散化,然后使用训练好的dvae的patch特征作为mask_patch的学习target,去掉dvae部分,BEIT就跟BERT基本一模一样。在BEIT中使用的事40%的mask比例,此外在论文中尝试了复原pixel,但是效果并不好,和我之前在vlbert任务重使用MRM任务负向的表现基本一致,对于图像来说,我们需要的是图像的全局的,高维的信息,回归pixel任务会使模型过多的关注非常局部的细节,缺少了对全局的刻画(在GLIP中给出开了一种不一样的任务设计,使模型能cover图片的全局信息和局部的object信息)。
使什么导致视觉和文本的mask autoencoing不一样
- 模型结构的问题,在传统的CNN结构中,很难将mask标记集成到卷积网络中,随着VIT的提出,这部分算是被解决了,可以很好的使用transformer来做视觉任务
- 信息密度的不同,在NLP中语言是高度语义化并且信息密度很高,少量的mask就可以保证任务的难度,使模型学习到有效信息,但是图片的信息是很冗余的,mask的视觉patch可以被周边的patch很好的复原,这就意味着,要对视觉patch更高比例的mask才能保证任务的难度,只有这样模型才能学习到有效信息。
- decoder的设计很关键,将mask的向量进行复原在图文任务中发挥的作用不同。在视觉任务中,decoder用来重建像素值,这个任务输出的语义是显著低于常见的视觉任务的,比如图像分类任务,需要获取全局语义,而对于patch的重建语义信息显然更低维度。在NLP中decoder用来恢复mask的token,使用MLP实现,decoder没那么重要,所以在视觉任务中decoder要更精细的设计。
- 在BEIT中,使用encoder,如果太关注细节就会丧失高维的语义抽象能力,所以恺明大神在encoder后面加了一个decoder,让encoder负责高维语义的抽取,让decoder负责低纬的细粒度还原,如此训练得到的encoder就能具有高维语义的能力了,这也是我们想让视觉encoder做到的。
- PIPELINE
- encoder只处理没有进mask的patch
- encoder输出的结果中插入mask的patch的embedding
- encoder处理后的embedding输入到decoder中
- 对decoder的输出进行reshape,复原到原始图片的尺寸
- 计算mask的patch的和重建之后的patch的MSE Loss
- 总结起来,有两个特点
- 非对称的encoder decoder设计
- 输入上,encoder接收没有mask的视觉patch,decoder部分接收全部的图像块
- 参数上,encoder使用多层堆叠的transformer,decoder使用较少层甚至一层即可
- 使用较高的MASK设计,75%
- 对比NLP任务的15%mask比例,在视觉任务要更高比例的mask才能保证任务的难度。
- 非对称的encoder decoder设计
模型的效果过于惊艳,每3列是一组,每组中最左侧是mask之后的图片,mask的比例是80%,中间是重建之后的图片,右侧是原始图片。给大佬来杯卡布奇诺。
MASK策略
mask的方式
mask方式对结果的影响非常重要,论文中给出了不同的mask方式得到的结果的差异
可以看到random的时候表现最好,“block”表示mask掉大块的patch,gride是表示网格的方式mask
mask的比例
不同的mask比例意味着不同难度的任务,从曲线中可以看出,随着mask比例的增加可以看到指标是逐渐提升的,在80%的时候指标出现下降。
在finetune任务和linear probing任务中,趋势不是很一致,在finetune任务中,mask在30%-40%的时候指标激增,然后就趋于饱和了,而在linear probing任务中几乎是线性递增的。
这是为啥呢?
- linear probe,仅调整模型最后的几层分类头(fix 住其它部分,如 Encoder)。因此,mask比例越高,在预训练时得到的 Encoder 就越强,但这部分在下游任务中是不能够再被训练的了,所以其性能就随着 mask 比例的增加呈线性增涨的趋势,体现的事encoder的模型能力。
- finetune,继续训练 Encoder 的参数去适配下游任务,因此在 mask 比例超过一定程度后,对于下游任务的性能提升就不那么明显了,因为finetune的数据毕竟是较少的,上游的encoder不太容易提升。
ENCODER
在MAE中encoder只用来处理没有被mask掉的视觉patch,模型默认用的是VIT,由于unmasked的区域很少(mask的比例是75%),encoder的计算消耗会变得很小,也就是可以训练更大的模型。
为啥encoder中要抛弃掉masked token呢?论文中给出了encoder使用masked的指标
可以看到,添加masked的token之后模型存在掉点,至于原因,这是因为上游任务和下游任务存在着gap,在下游任务中没有masked token。
DECODER
在decoder中不仅要处理encoder的输出,还要处理masked的patch特征,这部分masked的特征是怎么来的呢?这里用的是一个可学习的共享向量来表示,全部的masked-patch都用一个向量来表征,再加上masked的位置特征,这就构造了masked的特征。
DEcoder的目的是为了重建图像,因此在这里就和encoder进行了解耦,并且encoder才是后面我们想要的部分,所以decoder完全可以设计的轻量化一些,让模型更多的去学习encoder部分,如此encoder模型参数可以很多,但是输入的数据少;decoder接收的数据很多,要处理全量的token,但是模型可以设计的很轻量化,这就实现了efficient,真是牛掰。
论文中给出了decoder的深度和宽度对下游任务的影响
可以看出来,decoder的深度和宽度对linear probing有更大的影响,对于finetune的影响不太显著。
这里的原因实际上跟mask对下游任务的影响基本一致。
- decoder更深更宽,那么他就有更好的特征重建能力,这样encoder就能更好的专注特征的提取,也就是能得到有更好能力的encoder
- 在linear probing任务中,encoder是固定住的,也就是更多的体现的是encoder的能力,encoder越强,下游表现越好;
- 在finetune任务中,encoder是开放学习的,可以继续训练encoder参数。
任务目标:像素重建
MAE中的任务是对masked的patch进行像素值重建,LOSS就是简单的MSE,为什么不计算全部的patch的mse,而只计算masked的mase呢?论文中给出的结论是如果计算全部patch的mse loss会出现掉点。
对比了像素重建任务(有无归一化),PCA的方式(对 patch 空间实施 PCA 并预测最大的因子),BEIT类似的预测dVAE的token的方式,从指标上可以看出来,像素重建+归一化表现最好,Beit的搞法表现也不错。
为啥归一化的像素重建可行呢?
每个patch都独立统计各自的均值和方差,如此将每个patch都归一化到不同的表征空间,相比于使用全局均值和方差的归一化方式,每个patch经过归一化之后的差异性更强,有更多的高频信息,相当于将各个patch构成了边缘和纹理,从cv的角度上看,对比度更高。从而使得模型更有针对性地学习各个patch的特征模式。同时,数值上由于做了归一化,因此又不会使得模型在这方面有所偏倚。
高频性质的目标能够“迫使”特征提取器(Encoder)编码出来的各类特征更有差异性和区分性,它们之间的margin更大。
数据增强
论文中探究了数据增强对模型的影响,都是常用的老套路,剪裁,固定尺寸/随机尺寸,颜色扰动,可以看到固定尺寸和随机尺寸对指标的影响不大,但是原色扰动会带来指标下降。
这里结合MAE的过程,在MAE中对patch进行mask,然后进行像素值预测,这里已经相当于是一种数据增强,因此不需要过分的额外数据增强就可以取得不错的效果(颜色扰动,在mask掉一些patch之后,还扰乱原来的像素值,对模型来说太难搞了)
linear probe的调整
Linear probe一直是比较流行的搞法,预训练完成好,下游固定住backbone,只训练下面几层fc来适配不同的任务。它和finetune的不同是,finetune在下游开放encoder的权重,encoder部分始终保持学习。在论文中能看到Linear probe和Finetune总是会存在一些偏差,例如decoder的深度和宽度对linear probe的影响很大,但是对finetune影响不大。
在论文里面,作者将linear prob和finetune进行了融合,即“放开encoder后几层”,这种搞法在工业界算是基操了。因为只靠几层的fc是很难捕捉高层的非线性特征的。