目录
介绍
Masked Autoencoders Are Scalable Vision Learners
Facebook Al的kaiming大神等人于2021年十一月提出了一种带自编码器(MAE),它基于(ViT)架构。他们的方法在imageNet上的表现要好于从零开始训练的VIT。
灵感来源:
监督学习是训练机器学习模型的传统方法,它在训练时每一个观察到的数据都需要有标注好的标签,如果我们有一种训练机器学习模型的方法不需要收集标签,会怎么样?如果我们从收集的相同数据中提取标签呢?这种类型的学习算法被称为自监督学习。这种方法在自然语言处理中工作得很好。一个例子是BERT,谷歌自2019年以来一直在其搜索引警中使用BERT。不幸的是,对于计算机视觉来说,情况并非如此。
MAE总体想法:
随机遮住大量的块,然后去重构这些被遮住的像素信息,让它使用一个非对称的编码器和解码器的机制。
非对称:编码器和解码器看到的东西不一样
- 编码器只看到可见块
- 解码器拿到编码器的输出之后,重构 masked patches
非对称的原因:
大量 masked 块,
编码器只看可见块,极大降低计算开销、减少内存消耗 。
关于MAE:
- BERT 的一个 CV 的版本
- 基于 ViT ,BERT化
- 把整个训练 拓展到没有标号的数据上面
- 通过完型填空来获取图片的一个理解
- MAE 加速 Transformer 在 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,解码器尝试重构缺失的像素信息,还原原始图片。
图片还原:
虽然细节有一点模糊,钟的指针、车的形状、狗、灯都还原的很好。图片尺寸只有那么高,分辨率有限。图三是Coco数据集,表明在不同的数据集上效果也不错。
实验过程
主要结果:
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 %
- 网格采样
训练时间:
- ViT-Large + 解码器只使用一层 Transformer 的块:84.8% 精度不错,耗时最少
- 带掩码的块 + 大的解码器,加速 3.7倍
- ViT huge 加速也比较多
绝对时间
128个 TPU v3的 core, tensorflow 实现
训练时间是10个小时 和 大概是一天多,可以忍受
图 6 表示的是不同的掩码采样策略的区别
- 随机采样效果好
- 尽量的按照一块一块的来切
- 按照格点来切
图 7 :预训练的轮数和微调的精度的对比
ImageNet-1K 上训练个 1,000 个数据轮,精度有提升,在一直训练一直学习,过拟合也没那么多严重,因为1,000轮是非常非常多的
- 一般在 ImageNet 上训练, 200轮 enough
表3:跟前面结果比 MAE 效果是最好的
图8:跟 ViT 里面的结果比
- 最上面的虚线:ViT 在 JFT 3亿标号的图片数据集合的效果
- 排第二的线:只使用 ImageNet-1K 也就是1/300数据的效果
- 两根线很接近,不能说这是一个很公平的比较
- JFT数据集包括的类数远远大于 ImageNet
- 它们很多是一些 顾我自己 care 的一些目标,但是 ImageNet很多都是一些猫猫狗狗的图片
- 测试集也是 ImageNet,JFK 它多了很多很多 可能跟你那些标号不那么一样的图片
把验证集换到一个 不那么跟 ImageNet 相像的数据集上,可能这个差距会大一点。
调编码器所有层的参数和最后一层的参数效果差距大
到底调多少层:
- 少,快,精度差
- 多,慢,精度好
调 4 - 5 层比较好
- 底层不调:底层学到的东西稍微是比较低层次一点,你可以换一个任务也不需要变太多
- 上面那些层,跟你的任务相关,要调
结论
MAE预训练,只使用 ImageNet-1K 100w 无标号数据,ViT-Large/-Huge 达到 ViT 需要 100倍于 ImageNet-1K 的数据 的效果。
迁移学习效果也很好,预训练的模型在 目标检测、实例分割、语义分割 的效果都很好。
和 NLP 类似的效果:
- 在大量的没有标号的数据上,通过自监督学习训练出来模型,迁移学习效果不错。
simple:作者的简单是在 ViT 基础上,MAE 提出来的东西相对简单。
scale well:能跑大数据集。
CV 里 有标号的预训练数据是主流。MAE 在 ImageNet 数据集上,通过自编码器学习到 可以媲美 有标号的 结果。
论文: 原文链接
代码:代码链接