8.MAE

Masked Autoencoders Are Scalable Vision Learners

MAE:CV版的BERT

MAE 2021.11.11提交 arxiv

知乎 百万 view; Reddit or Twitter 讨论不多

MAE 很新 —> 如何在读比较新的文章 获取一些新的研究思路?

0.和之前精读论文的关系?

Transformer

  • 一个纯基于注意力机制的编码器和解码器
  • 表现比 RNN 架构好,在机器翻译任务

BERT

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

ViT

  • 将 Transformer 用到 CV 上面
  • 把整个图片分割成很多 16 * 16 的小方块,每一个方块 patch 做成一个词 token,然后放进 Transformer 进行训练
  • 证明:训练数据足够大 (1,000万 或者 一个亿的训练样本)的时候,Transformer 的架构 精度 优于 CNN 架构

MAE

  • BERT 的一个 CV 的版本,基于 ViT ,BERT化,把整个训练拓展到没有标号的数据上面,通过完型填空来获取图片的一个理解
  • MAE不是第一个将 BERT 拓展到 CV 上;但MAE 很有可能 未来影响最大
  • BERT 加速了 Transformer 架构 在 NLP 的应用
  • MAE 加速 Transformer 在 CV 上的应用

1.标题 + 作者

1.1 标题

Masked Autoencoders Are Scalable Vision Learners

Masked Autoencoders 带掩码的自编码器 是可扩展的视觉学习器 scalable vision learners

scalable:可扩展的,模型比较大

efficient:算法特别快

vision learners:≠ classifier,一个 backbone 的模型

masked:来源于 BERT

  • BERT 是 masked language model,带掩码的语言模型;完形填空
  • 每次挖掉一些东西,然后去预测挖掉的东西

Auto-encoder

  • auto “自”,ML模型 auto 自模型;i.e., 自回归模型
  • 标号 y 和 样本 x 来自 同一个东西;语言模型中,每一次用前面那些词,去预测接下来的一个词;在另外一个样本里面,我们这个预测的词也是标号,也是成为另外一个样本的 x 本身
  • 样本 x 和 标号 y 来自于同样的句子里面的词 —> auto
  • NLP 里,语言模型是一大类,有没有 auto 大家都理解;Transformer、BERT 用的是 encoder,加不加 auto 大家都觉得没问题
  • 但在CV 里 auto 自任务很少,因为图片(像素)的标号很少来自于图片本身,图片的标号更多是文本;encoder-decoder 在图片里用得很多,加 auto 在 encoder之前,MAE 的图片标号是图片本身,区分于其它工作

1.2 标题模板

强有力的句式:文章的结论总结成一句话,XX 是 好 XX结论放在 title 里,句式相对客观

i.e., GPT 系列 3篇文章

  • GPT1: Improving Language Understanding by Generative Pre-Training (Generative Pre-Train Model 就是GPT模型的名字由来)
  • GPT2: Language Models are Unsupervised Multitask Learners
  • GPT3: Language Models are Few-Shot Learners

Example

我的手写笔是世界上 最好用来做笔记的笔 ❌

手写笔是一个做笔记很好的工具 ✔

  • 虽然手写笔是我第一个发明的
  • 从读者角度讲述,手写笔为什么它是一个好东西?

1.3作者

FAIR

一作:Kaiming 恺明 ResNet 一作 + Project lead (从公司拿资源做项目、管理者;不是一般最后的大老板)

*:equal technial contribution

最后两位作者:CV 物体检测的大佬

2.摘要

扩展 title MAE

Masked Autoencoders Are Scalable Vision Learners —> Masked AutoEncoders are scalable self-supervised learners for computer vision.

MAE 简单

随机盖住图片里的一些块(patch, image 的一个块),再重构 缺失的像素

  • 思想来自于 BERT 带掩码的语言模型
  • 这里不是 masked 词,而是图片的一个块 image,重构这个缺失块里面的所有像素

**2个 **core designs

(1)asymmetric encoder-decoder architecture

  • 虽然 MAE 说自己是 masked autoencoder;任何一个模型都有一个编码器解码器;BERT 预测相对简单, 解码器:最后的一个全连接输出层
  • MAE 预测一个块里面的所有像素
  • MAE 的编码器 只关注 可见的 patches,节省计算时间
  • 如果 一个 patch 被丢掉了,编码器不会对它进行编码
  • MAE a lightweight decoder 重构原始的像素

(2)MASK部分块,做自监督学习

遮住大量的块 (i.e., 75%) 重构像素是一个非显然 nontrivial and meaningful 有意义的 self-supervisory task 自监督任务

  • 如果只遮住几块的话,插值法就可以得到缺失的像素,
  • 遮住一大半的块,迫使模型学习更好的表征

更有效训练模型

asymmetric encoder-decoder + 75% masked —> train large models efficiently and effectively

  • 大:比较有挑战的任务,不是求显然的解 nontrivial
  • :不看遮住的块,训练量是 1 / 4,加速 3 倍 or 以上

效果

(1) ViT-Huge 模型 在 ImageNet-1K

最简单的 a vanilla ViT-Huge 模型 在 ImageNet-1K 87.8% 准确率

  • ViT 的自监督学习,效果不那么好,所以没怎么展开
  • ViT 的作者认为还是需要 有标号的模型、用更大的训练集,效果更好
  • MAE 使用小数据集 ImageNet-1K 100w 图片,self-supervise 效果很好

(2)迁移学习效果

MAE 主要用来做 迁移学习,在别的任务上表现好

shows promising scaling behavior

3.关键图

3.1 MAE结构图

CV 最重要的一张图就是放在第一页的右上角

预训练流程:input —> patches —> masked —> unmasked patches in encoder —> unmasked + masked 按位置排列 进 decoder —> decoder 重构 masked patches 的像素

  • patches + masked:一张红色鸟图片进来,切成 patches,masked 块 (3/4) 是 灰色的。
  • unmasked patches,encoder:没有 masked (1 / 4) 的块 进入 encoder (ViT),得到每一块的特征(蓝色)。
  • encoder 的输出 和 masked tokens 按照在图片中的原始位置排列成一长条向量 (包含位置信息)。
  • 长条向量 进入 decoder,解码器尝试重构缺失的像素信息,还原原始图片

encoder 比 decoder 高:计算量主要来自于 encoder,对图片的像素进行编码

优化 encoder by 编码器只用处理 unmasked patches,i.e., 一张图里 1/4 的像素,—> 计算量降低

  • Transformer 模型计算量特别大,几倍加速也很重要。

什么情况不需要解码器? 用 MAE 做一个 CV 的任务,只需要用编码器。一张图片进来,不需要做掩码,直接切成 patches 格子块,然后得到所有 patches 的特征表示,当成是这张图片的特征表达,用来做 CV 的任务。

3.2 测试图片

图2:ImageNet 测试集图片

三列分别是:80% masked tokens, MAE 重构的效果,ImageNet 真实图片

虽然细节有一点模糊,钟的指针、车的形状、狗、灯都还原的很好。

  • 图片尺寸只有那么高,分辨率有限

Note: MAE 不一定对 所有图片的构造都那么好,图 2 是展示比较好的样例

图3:COCO

不同的数据集,效果也惊人。

**图4 **同一张图片、masked patches 的不同比例 的还原效果

95%效果惊人,蘑菇🍄、斑马🦓、车🚗、西红柿 都还原出来了。

4.结论

Simple algorithms that scale well are the core of deep learning. 简单 + 可以拓展很好的算法是 DL 的核心

simple:作者的简单是在 ViT 基础上,MAE 提出来的东西相对简单

scale well:能跑 大数据集

在NLP 领域自监督学习比较火,而在CV 里 有标号的预训练数据是主流。MAE 在 ImageNet 数据集上,通过自编码器学习到 可以媲美 有标号的 结果。

图片和语言的差别

  • a word in a sentence:一个词是语义单元,包含较多语义信息
  • a patch in an image:一定的语义信息,但不是一个语义的 segment,一个 patch 并不含有一个特定的物体,可能是多个物体的一小块 or 一个物体重叠的一块
  • 即使图片和语言的 masked 的单元包含语义信息不同,MAE or Transformer 可以学到一个隐藏的比较好的语义表达

broader impacts

如果工作出圈,对社会的影响?

  • 只用了图片本身信息学习,图片本身有 bias 的话,倾向于某一些图片 or 有一些不好的图片,可能会有负面的社会影响
  • MAE 可以用来生成不存在的内容,MAE 是生成模型,生成原始的像素,和 GAN 类似,有误导大家的可能
  • 如果要使用这个工作,请一定要考虑潜在的影响

5.导言

5.1 问题 & 其他领域解决方案

问题所在:深度学习飞速发展,但 CV 仍然以来百万级别、甚至更多有标注的数据

大量有标注数据是必须的吗?其它领域怎么解决的?

NLP 的自监督学习很好

  • GPT、BERT 可以使用 无标注 的数据及逆行训练,得到千亿级别可学习的参数模型
  • GPT 系列,一个标准的语言模型
  • BERT 一个带掩码的自编码模型

CV 里已有的 maksed autoencoder 带掩码的自编码器

  • denoising autoencoder,一张图片里加入很多噪音,通过去噪来学习对这张图片的理解
  • 最近也有很多工作将 BERT 应用于 CV

但,作者认为 BERT 在 CV 领域的应用落后于 NLP。

5.2 什么使得带掩码的自编码器模型在 CV 和 NLP 处理上的不一样呢

What makes masked autoencoding different between vision and language?

(1)CV 使用 CNN,卷积窗口不好将 mask 放进去

archtectural gap has been addressed by ViT

  • CNN 在一张图片上,使用一个卷积窗口、不断地平滑,来汇聚一些像素上面的信息 + 模式识别
  • Transformer 的一个 mask 对应的是一个特定的词,会一直保留,和别的词区分开来
  • 卷积上做掩码? 图片的一块盖住 by 像素替换成一个特定的值,卷积窗口扫过来、扫过去时,无法区分边界,无法保持 mask 的特殊性,无法拎出来 mask;最后从掩码信息很难还原出来
  • 卷积不好加入位置编码? 不那么充分。Transformer 需要位置编码:attention 机制没有位置信息;卷积自带位置信息,不断平移时,不需要加入位置信息

(2)语言和图片的信息密度不同

NLP 的一个词是一个语义的实体,一个词在字典里有很长的解释;一句话去掉几个词,任务很难,i.e., 完形填空 —> BERT 的 mask 比例不能过高

CV 的图片去掉一个块,通过对邻居的像素值进行插值还原怎么让任务不那么 trivial 呢?

  • 随机去掉很高比例的块,极大降低图片的冗余性
  • 这一块的周边块都被去掉了,这一块和很远的块的关系不那么冗余
  • nontrivial 任务,使 模型去看 一张图片的 holistic 全局信息,而不仅关注局部

(3)The autoencoder’s decoder

CV 还原图片的原始像:低层次的表示

NLP 还原句子里的词:语义层次更高,i.e., BERT 的一个全连接层还原词

图片分类、目标检测的 decoder:一个全连接层

语义分割(像素级别的输出):一个全连接层不够,很有可能使用一个转置的卷积神经网络、来做一个比较大解码器。

5.3 MAE 的想法

随机遮住大量的块,然后去重构这些被遮住的像素信息,让它使用一个非对称的编码器和解码器的机制。

非对称:编码器和解码器看到的东西不一样

  • 编码器只看到可见块
  • 解码器拿到编码器的输出之后,重构 masked patches

非对称的原因大量 masked 块;编码器只看可见块,极大降低计算开销、减少内存消耗

5.4实验结果

MAE预训练,只使用 ImageNet-1K 100w 无标号数据,ViT-Large/-Huge 达到 ViT 需要 100倍于 ImageNet-1K 的数据 的效果。

迁移学习效果也很好,预训练的模型在 目标检测、实例分割、语义分割 的效果都很好。

和 NLP 类似的效果:在大量的没有标号的数据上,通过自监督学习训练出来模型,迁移学习效果不错

5.5 导言总结

2页,图片 + 使用了 问题 - 回答问题 - 引出想法 的写法

更本质的问题?

把 BERT 从 NLP 用到 CV 有什么问题?

MAE 算法为什么要设计成这样?

  • ViT 解决 图片中的 mask
  • 大量随机 masked 块,降低图片冗余度
  • 非对称的自编码器-解码器

写作建议:

讲清楚,你为什么要这么做?你对这个问题的动机?

  • 没有动机 就是技术报告了,i.e. AlexNet

6.相关工作

6.1带掩码的语言模型

BERT, GPT

6.2自编码器在 CV 的应用

  • MAE 也是一种形式的 带去噪的自编码
  • masked patch 在这一个图片块里面加了很多噪声
  • 和 传统的 DAE(Denoising autoencoder) 是很不一样的
  • MAE 基于 ViT、transformer 架构

6.3带掩码的自编码器在 CV 的应用

  • iGPT,GPT 在 image 的应用
  • ViT 最后一段,怎么用 BERT 方式训练模型
  • BEiT,BERT 在 image 上的应用
  • 给每一个 patch 离散的标号,更像 BERT

MAE 直接重构 原始的像素信息

6.4 self-supervised learning

最近火 的 contrastive learning,使用数据增强

MAE 不需要数据增强(实验部分有讲)

相关工作总结:4个角度的对比,MAE 和它们都不同,但是没有特别讲 MAE 和每一个不一样的地方在哪里

7.MAE模型

7.1 MAE总体架构

MAE 是一个简单的 自编码器:看到了部分的观察的数据,用观察到的部分数据 重构 完整的原始信号。

所有自编码器的工作

  • 将观察到的信号 映射到一个潜在 latent 表示里面
  • 潜在表示:语义空间的一个表示
  • 解码器 用 潜表示 latent 重构原始信号

MAE 的自编码器 和 经典自编码器的不同?

  • asymmetric design 非对称结构
  • 编码器只看 可见块
  • 忽略不可见 masked 块,节省计算开销

7.2 掩码 mask

和 ViT 的一样图片 patches 化, i.e., 一张图片 九宫格分割,3 * 3,每一格 代表一个 patch,作为一个词 token。

random sampling: 随机均匀采样块保留, 剩余块用 mask 掩码盖住。

MAE 的关键技术? 只采样少量的块,其余的块全覆盖,去掉图片 patches 之间的冗余度。—> 增加任务的复杂度

7.3 MAE 的编码器

  • 就是一个 ViT, 没有任何改动,只作用于 可见块

MAE 编码器如何作用于可见块呢?

  • 和 ViT 一样部分:每一个 patch 块拿出来,做一个线性投影;然后+ 位置信息 —> token
  • 和 ViT 不一样部分:masked 块不进入 MAE 编码器。i.e., 随机采样概率 1 / 4, 25% 样本块进入 ViT,计算量减少

7.4 MAE 的解码器

要重构 masked 块的像素信息,需要看到 可见块(编码器对可见块的潜表示) 和 masked 块 (没有进入编码器)通过一个共享的可以学到的向量来表示:每一个被盖住的块都表示成同样一个向量,此向量值可学习。

解码器是另外一个 transformer,需要位置信息,不然无法区分对应哪一个 掩码masked tokens

可见块的位置信息 question?

  • 位置信息 要不要也对那些编码器过来的 潜在表示 也加上
  • 因为可见块的潜表示其实本来已经加过一次了,那么这个地方要不要再加上一次?

解码器主要在pre-training用到;别的下游任务,解码器不需要,只需要编码器对图片编码得到潜表示 → 灵活,想用什么随便用

解码器的架构大小:相对小,计算开销不到编码器的 1 / 10

7.5 重构出原始的像素

解码器的最后一层: a linear projection

  • 一个 patch 是 16 * 16 像素的话,线性层会投影到长为 256 的维度
  • 再 reshape(16, 16), 还原原始像素信息
  • 损失函数: MSE,像素值相减,再平方和
  • 损失只作用于非可见块的损失,和 BERT 一样,可见块的图片编码器已经看到了,看到答案就不算正确率了

对预测的像素做一次 normalization,使像素均值为 0 方差为 1,数值更稳定。

7.6 简单实现

  • 对每一个输入 patch 生成 a token:一个一个 patch 的线性投影 + 位置信息
  • 随机采样:randomly shuffle 随机打断序列,把最后一块拿掉。从头部均匀的、没有重置的样本采样;25% 意味着 随机 shuffle, 只保留前 25%
  • 解码时:append 跟以前长度一样的这些掩码的一些词源 mask tokens (一个可以学习的向量 + 位置信息),重新 unshuffle 还原到原来的顺序
  • MSE 算误差时,跟原始图的 patches 对应

The decoder is applied to this full list (with positional embeddings added)。编码器处理可见块的潜表示需不需要再加位置信息?

shuffle 和 unshuffle 好处: 没有稀疏的操作,实现快,不影响 ViT 块的实现

8.实验

8.1 ImageNet 的实验

在 ImageNet-1K 100万张图片 数据集上:先做自监督的预训练(不用标号,只拿图片);然后再在同样的数据集上做有标号的监督训练

做法:

  • end to end 的微调,允许改整个模型 所有的可学习的参数;
  • linear probing 允许改最后一层的线性输出层

结果:在验证集上报告 top-1 的精度,用 中心剪裁的 224*224 的图片

Baseline: ViT-Large / 16, 16 * 16。ViT-Large 比 ResNet50 要大很多,很容易 overfitting

比较的 3 种情况:

  1. scratch, original:76.5。 ViT 所有的内容在 ImageNet-1K上训练, 结果不稳定 200 epoches
  2. scratch, our impl: 82.5。加入 strong regularization 。ViT 文章说 ViT 需要很大的数据才行;但是后来发现,小一点的数据 + 合适的正则化 也是可以的。
  3. baseline MAE:84.9先使用 MAE 做预训练,再在 ImageNet 上微调 50 epoches。数据集没变化,预训练和微调都是 ImageNet

MAE 纯从图片上学到不错的信息

8.2**主要结果 **

(1)表1

a:解码器的深度,多少个 Transformer 块; end to end fine-tuning 贵一点,但效果好

  • 全都 ft,深度和效果关系不大 84.x
  • 只调 lin, 深度深一点好

b:解码器的宽度,每一个 token 表示成一个多长的向量,512 比较好。

c:编码器要不要加入被盖住的 masked 块:

  • 不加很好,精度高、计算量更少
  • 非对称的架构 精度好、性能好

d:重构的目标

  • 每个像素的MSE
  • 每个像素的MSE + normalization 均值为0 方差为 1 效果好
  • PCA 做一次降维
  • dVAE: BEiT 的做法,通过 ViT 把每一个块映射到一个离散的 token,像 BERT 一样的去做预测

e:怎么样做数据增强,MAE 对数据增强不敏感

  • 什么都不做
  • 固定大小的裁剪
  • 随机大小的裁剪
  • 裁剪 + 颜色变化

f:怎么采样 被盖住的块

  • 随机采样 最简单最好
  • 按一块块的采样 50 %
  • 按一块块的采样 75 %
  • 网格采样

(2)表1 主结果内容的展开图

使用不同的掩码率的时候的效果:10%的块被遮住: 83.2%;超过 40%的块被遮住:精度大幅提升

只调最后一层:更敏感

(3)表2 训练时间

  • ViT-Large + 解码器只使用一层 Transformer 的块:84.8% 精度不错,耗时最少
  • 带掩码的块 + 大的解码器,加速 3.7倍
  • ViT huge 加速也比较多

绝对时间:128个 TPU v3的 core, tensorflow 实现;训练时间是10个小时 和 大概是一天多,可以忍受。

(4)图 6 表示的是不同的掩码采样策略的区别

  • 随机采样效果好
  • 尽量的按照一块一块的来切
  • 按照格点来切

(5)图 7 预训练的轮数和微调的精度的对比

ImageNet-1K 上训练个 1,000 个数据轮,精度有提升,在一直训练一直学习,过拟合也没那么多严重,因为1,000轮是非常非常多的

  • 一般在 ImageNet 上训练, 200轮 enough

8.3 与之前工作相比

(1)表3:跟前面结果比 MAE 效果是最好的

(2)图8:跟 ViT 里面的结果比

  • 最上面的虚线:ViT 在 JFT 3亿标号的图片数据集合的效果
  • 排第二的线:只使用 ImageNet-1K 也就是1/300数据的效果
  • 两根线很接近,不能说这是一个很公平的比较
  • JFT数据集包括的类数远远大于 ImageNet
  • 它们很多是一些 顾我自己 care 的一些目标,但是 ImageNet很多都是一些猫猫狗狗的图片
  • 测试集也是 ImageNet,JFK 它多了很多很多 可能跟你那些标号不那么一样的图片

把验证集换到一个 不那么跟 ImageNet 相像的数据集上,可能这个差距会大一点,主要比较的是算法,而不是数据集

8.4调编码器所有层的参数和最后一层的参数效果差距大

到底调多少层:

  • 少,快,精度差
  • 多,慢,精度好

  • x轴表示多少个Transformer块被调
  • y轴表示精度

调 4 - 5 层比较好

  • 底层不调:底层学到的东西稍微是比较低层次一点,你可以换一个任务也不需要变太多
  • 上面那些层,跟你的任务相关,要调

8.5迁移学习实验结果

COCO 的目标检测和分割

  • MAE 做它的主干网络 效果最好
  • 跟之前的 ViT 和 BEiT 比

重构像素的比较

  • 像 BEiT 那样重构 or 用 dVAE 学出来的标号比 差别不大
  • 重构原始的像素 简单、好

9.评论

9.1 算法

MAE 算法不难

  • 利用 ViT 来做跟 BERT 一样的自监督学习
  • ViT 文章已经做了这个事情了

MAE 在 ViT 的基础提升点

  • 需要盖住更多的块,降低剩余块之间的冗余度,任务变得复杂一些
  • 使用一个 Tranformer 架构的解码器,直接还原原始的像素信息,使得整个流程更加简单一点
  • 加上在 ViT 工作之后的各种技术,训练更鲁棒

以上三点 MAE 使得在 ImageNet-1K 这个数据集上使用自监督训练的效果超过了之前的工作

9.2写作:简单,故事性好

导言:为什么 MAE 这么做

非常详细的实验数据:整个 MAE 里面 所有可以调的超参数 它到底是什么意思?

简单的想法、非常好的结果、详细的实验 → 一个非常高质量的工作