Kaiming He
Link: [2111.06377] Masked Autoencoders Are Scalable Vision Learners (arxiv.org)
Code: https://github.com/facebookresearch/mae
1 Intro
盖住75%的patch,取剩余的patch输入encoder,没有mask的patch放在ViT输出相应的位置(蓝色),mask掉的部分只包含位置信息,然后输入decoder,还原出原图
跟BERT相比,在CV领域masked Autoencoding工作还很落后,为什么?
1、网络架构不同。之前CV中更多使用CNN,无法将mask或者位置编码很好地带入其中,不过现在ViT的提出解决了这个问题。
2、信息密度不同。在图像中冗余信息较多,mask掉一些像素并不会影响什么,或者通过简单地插值就可以还原。所以论文提出mask掉很高比例的区域的方法。
3、Decoder结构的区别。在BERT中,decoder的输出是高语义信心的,使用简单地MLP就能达到效果。而在CV中,重构出的像素是低语义信息的,通常需要更复杂的Decoder。
通过非对称的Encoder-Decoder架构,使用ViT-Large/Huge在Imagenet-1k上进行自监督学习就能达到很好地效果(87.8% acc on ImageNet-1k),且迁移学习效果也很好。
2 Method
使用的非对称的结构,在encoder部分只计算于没有被mask的部分。
2.1 Masking
与ViT一样,将原图分割成一个个小patch,服从均匀分布地随机采样出一些patch,使用一个高比例的mask,以此来消除冗余信息。
2.2 Encoder
是个ViT,输入只有没被mask的patch。patch经过线性投影并加上位置信息得到patch Embedding送入VIT blocks。
由于只有没有mask的patch会被送入encoder,所以大大降低了计算量
2.3 Decoder
Decoder使用一个小的ViT架构(计算量不到Encoder的10%),输入包含两部分:
(1)、Encoder的输出(没有mask的patch)
(2)、masked token(用一个共享的、可学习的向量表示)
给所有token加入位置信息。
Decoder只用于预训练阶段,图像表征提取还是使用Encoder
2.4 Reconstruction Target
Decoder结果是每个patch的像素值拉直(256d),再reshape回原始尺寸(16*16)。
损失函数在像素级别上使用MSE,只在被mask的token上计算损失(与BERT类似)
还探究了使用normalized target进行训练,结果有所提升
2.5 Simple implementation.
首先,将每个patch映射为patch Embedding(with Position Embedding),组成一个list;然后randomly shuffle 整个list,去掉后75%的部分,输入encoder。
得到encoder的输出后,将整个list进行unshuffle处理,还原原始的list顺序,再送入Decoder进行像素重构。
这样不需要有叙述操作,实现起来很快。
3 Experiment
3.1 ImageNet Experiments
在ImageNet-1K上进行自监督预训练,然后再进行finetune(end2end和linear probing)。
给ViT加上强正则后提升了效果