【笔记记录】MAE:Masked Autoencoders Are Scalable Vision Learners

与之前读的文章的关系

在这里插入图片描述

Transformer

  • 它是一个纯基于注意力机制的编码器和解码器
  • 在机器翻译任务上,它比基于RNN的架构要更好一些

BERT

  • 它使用一个Transformer编码器,拓展到了更一般的NLP任务上
  • 它使用了完形填空的自监督的训练机制,这样就不需要使用标号,而是通过预测一个句子里面哪些词不见了,从而获取对文本特征抽取的能力
  • BERT极大地扩展了transformer的应用,可以在一个大规模的、没有标号的数据上训练出非常好的模型出来

ViT

  • 这个模型可以认为就是将Transformer用到CV上面
  • 具体来讲,就是将整个图片分割成很多个16*16的小方块,然后每个方块做成一个次,然后放进transformer进行训练
  • ViT这篇文章证明:假设训练数据足够大的时候比如说用1000万或者1亿的训练样本,它相对于CNN的架构来说,transformer的架构在精度上可能会更高一点

MAE

  • 可以认为是BERT的CV版
  • 它是基于ViT这篇文章,但是它把整个训练拓展到没有标号的数据上面,也就是跟BERT一样通过完形填空来获取对于图片的理解
  • MAE并不是第一个将BERT拓展到CV上的工作,但是MAE很有可能是这一系列工作之中未来影响力最大的一篇(因为BERT这篇文章极大地加速了transformer这个架构在NLP里面的应用,所以MAE很有可能使得transformer在CV上的应用更加普及)

标题

在这里插入图片描述
Auto-Regressive(自回归) 是一种序列生成模型的特性,它表示生成序列中的每个元素都依赖于先前生成的元素。在解码器中,自回归性质意味着生成的每个词都是在前一个词的基础上生成的。 这种方法使得模型可以考虑到上下文信息,逐步生成输出序列,确保生成的序列在语法和语义上都是合理的。

摘要

在这里插入图片描述

关键图

在这里插入图片描述

在这里插入图片描述

结论

在这里插入图片描述

导言

在这里插入图片描述

在这里插入图片描述

相关工作

在这里插入图片描述

MAE模型

MAE是一个简单的自编码器

  • 自编码器看到了部分的观察的数据,然后用它来重构完整的原始信号,它跟所有的编码器一样,它是将观察到的信号映射到一个latnet representation(潜表示)中,这个潜表示可以认为是语义空间上的表示,然后再通过解码器将这个潜表示用来重构出原始的信号
  • 这个自编码器跟经典的自编码器不太一样,它是一个非对称的结构,因为编码器只看到可见的那些块,不可见的块它就看不到了,用来节省开销

掩码是如何工作的

  • 和vit一样,将整个图片割成一块一块的,每一块作为一个patch,也就是作为一个词
  • 在采样的时候 ,随机的均匀的采样一些出来进行保留,剩下的全部用掩码盖住,文中将这种方法叫做随机采样。关键技术在于只采样少量的块出来,然后剩下的全部盖住,这样采样少量的块,使得它们的冗余度不是很高,这样的话,任务就不是那么简单(不会说是用简单的插值就能解决问题了

编码器

  • 其实就是一个vit,没有做任何改动,但是它只作用于可见的那些块中,具体的做法跟vit是一样的:将每一块拿出来,然后做线性的投影,再加上位置信息,这样就做成一个词进去了
  • 但是不一样的是,如果这一块被盖住的话就不会进去了。所以如果有25%被选中,那么进入vit的话就只有25%的样本,这样的话就可以降低计算量

解码器

  • 因为要重构被盖住的块的像素信息,所以它需要看到所有的块,包括没有被盖住的块 (虽然没有被盖住,但是已经通过编码器将它表示成了潜表示) 和被盖住的块(没有进入编码器)
  • 解码器是对这些所有的块,通过共享的可以学到的向量来表示,也就是说每一个被盖住的块都表示成同样的向量,这个向量的值是可以通过学习得到的
  • 解码器其实就是另外一个transformer,所以需要加入位置信息,不然就无法区分它对应的到底是哪一个是掩码(这里有一点不确定:要不要对那些编码器输出的潜表示也加上位置信息,因为它们其实已经加上过一次了,那么这个地方要不要再加上一次?)
  • 解码器主要只在预训练的时候使用,当将模型用于做一些别的任务的时候,解码器是不需要的,只需要用编码对一个图片进行编码就可以了,这样的话比较灵活,想用什么东西,就可以用什么东西

怎样重构出原始的像素

  • 在解码器的最后一层是一个线性层。如果所切割成的一块中是1616的像素的话,那么这个线性层就会投影到长为256的这样一个维度,拿到这个投影之后,再将它reshape成所要的1616,就能还原出原始的像素信息了
  • 损失函数使用的是MSE,就是说预测和原始的真正的像素相减再平方,和BERT一样,只在被盖住的那些块上面使用MSE,那些没有被盖住的块,因为输入已经看到了整个像素信息,所以就不在上面做损失了
  • 也可以对要预测的像素值做一次normalization,就是说对每一个块里面的像素使它的均值变为0、方差变为1,使得在数值上更加稳定一点。(这里并没有写清楚在预测的时候怎么办,在训练的时候当然知道标号的那些东西,当然可以把均值和方差算出来,但是预测的时候呢)

简单实现

  • 首先生成了一些token列,token列就是一个一个的patch拿过来之后做一次线性的投影,再加上位置信息
  • 接下来将这些序列随机打乱,然后将最后一块拿掉,因为随机打乱,把头部保存下来,就等价于是把头部均匀的、没有重置的将里面的东西采样出来,所以如果是采样25%的话就随机shuffle一下,然后将前25%留下来,后面的丢掉就行了,这样就完成了随机采样
  • 在解码的时候,要在后面附上跟以前长度一样的掩码的词源mask tokens,它就是一个可以学习的向量,当然也要加上位置信息,然后再把它重新unshuffle一下还原到原来的顺序,这样的话,在算误差的时候跟之前那个原始的没有被做过任何操作的patches是能够一一对应起来的
  • 要加上位置信息(这里还是有一个疑惑:这个位置信息要不要对编码器那边来的也给加上,还是说从编码器出来的那些潜表达可以寄跳过加位置信息这个步骤)
  • 这里主要是说通过这样的shuffle和unshuffle使得不需要任何的稀疏操作,在实现起来是非常快的,也不影响后面所有的vit的操作

实验

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
下图中表一展示的是各种ablation study

在这里插入图片描述

  • 表a讲的是解码器的深度(需要用到多少个transformer块),这里有1、2、4、8、12这几种选择。第一列是所有可以学习的权重都跟着调,第二列表示只调最后一个线性层,可以发现前面一种方式虽然比较贵,但是效果会好很多,而且在块里面,这个地方显示的是使用8块比较好,对于全部调的话好像关系并不是很大,都是84左右,但是如果只调最后一层的话,用深一点的会比较好
  • 表b讲的是解码器的宽度(每个token表示成一个多长的向量),这里发现512比较好
  • 表c讲的是在编码器中要不要加入被盖住的那些块,结果显示,不加入被盖住的那些块,精度反而更高一些,而且计算量更少(以不加作为基线的话,加进去的计算量是不加的3.3倍),所以本文采用的是非对称的架构,不仅是在性能上更好,在精度上也更好一些
  • 表d讲的是在重构的时候的目标,最简单的就是对每个像素使用MSE,这里是加了normalization,就是将每一个块中的均值和方差分别变成0和1,发现效果不错。pca是做一次降维,最后一个其实是BEiT的做法(通过vit把每一块映射到一个离散的token上面,能够像BERT一样做预测),从表中可以发现,在fine-tune的话,值都是差不多的,所以在值差不多的情况下,当然是倾向于使用更简单的办法
  • 表e讲的是如何做数据增强。none表示什么都不做,第二行表示只裁剪(固定大小),第三行表示按照随机的大小裁剪,最后一行表示再加上一些颜色的变化。从表中可以发现,做简单的随即大小的裁剪,效果就已经很不错了,所以作者说MAE对于数据的增强不那么敏感
  • 表f讲的是如何采样,哪一些块需要被盖住。第一行表示的是随机采样,其实还有一块一块地采样,或者是按照格子来进行采样,但是最后发现随机采样这种做法最简单,效果也最好

下图是对以上表中结果的展开
在这里插入图片描述

下图表示采用不同的掩码采样策略的区别

在这里插入图片描述

第一列表示的是随机采样
第二列表示的是尽量按一块一块的来切
第三列表示的是尽量按照格点来切
通过图中可以发现,随机采样的效果比较好,而且比较简单,实现上也不难

评论

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45751396/article/details/132767017
今日推荐