学习MAE视频【mgdjc】
He, K., Chen, X., Xie, S., Li, Y., Dollár, P., & Girshick, R. (2021). Masked autoencoders are scalable vision learners. arXiv preprint arXiv:2111.06377.
Masked Autoencoders 带掩码的自编码器 是可扩展的视觉学习器 scalable vision learners
【MAE】AbstractMAE:Masked AutoEncoders
MAE虽然自称是一个自编码器(auto-encoder),但是也包含了编码器和解码器。MAE的编码器只关注可见的patches,节省计算时间。通过随机盖住图像中大量的块(75%),迫使模型学习更好的表征,重构缺失的像素MAE 使用小数据集 ImageNet-1K 100w 图片,self-supervise达到的效果很好MAE主要用来做迁移学习,证明在别的任务上表现很好。 【MAE】图1 MAE Architecture
5. encoder的计算量要大于decoder:计算量主要来自于encoder,对图片像素进行编码。
6. 预训练才同时需要encoder和decoder。
7. 用 MAE 做一个 CV 的任务,只需要用编码器。一张图片进来,不需要做mask,直接切成 patches 格子块,然后得到所有 patches 的特征表示,当成是这张图片的特征表达,用来做 CV 的任务。
P.S. MAE不一定对所有的数据效果都很好,这里放的可能是比较好的结果。
【三个问题】
本节回答三个问题:
patch,作为一个词 token【random sampling】随机均匀采样块保留, 剩余块用 mask 掩码盖住。 【MAE encoder】 ViT, 没有任何改动只处理可见的patches(unmasked)encoder处理可见patches的details: 和 ViT 一样:
每一个 patch 块拿出来,做一个线性投影,加入位置信息 -->作为一个 token进入encoder。和 ViT 不一样:
masked 块不进入 MAE 编码器,减少计算量。 【MAE decoder】 【unmasked patches】通过encoder->潜表示。【masked patches】->表示为一个通过学习得到的共享向量。【decoder】是另一个Transformer,要加入位置信息(否则,不知道是哪个mask)。【decoder】主要对预训练使用,其他计算机任务只需要使用encoder。【计算开销】是encoder的1/10不到。 【Reconstruction target】
decoder的最后一层: a linear projection
一个 patch 是 16 * 16 像素的话,线性层会投影到长为 256 的维度再 reshape(16, 16), 还原原始像素信息【Loss function】MSE【Normalization】对要预测的像素只做一次normalization,i.e.使每一个块里面的像素均值变0,方差变1,数值上更稳定 【Simple implementation】 对每一个输入 patch 生成 a token:一个一个 patch 的线性投影 + 位置信息随机采样:randomly shuffle 随机打断序列,把最后一块拿掉。 从头部均匀的、没有重置的样本采样25% 意味着 随机 shuffle, 只保留前 25% 解码时:append 跟以前长度一样的这些掩码的一些词源 masked tokens (一个可以学习到的向量 + 位置信息),重新 unshuffle 还原到原来的顺序MSE 算误差时,跟原始图的 patches 对应 【MAE】 Experiments 【对比实验】【实验方法】
在 ImageNet-1K 100万张图片 数据集上
【两种微调】
end to end 的微调,允许改整个模型 所有的可学习的参数;linear probing 允许改最后一层的线性输出层【实验结果】
epochesscratch, our impl.: 82.5 加入 strong regularization A.2 ViT 文章说 ViT
需要很大的数据才行 小一点的数据 + 合适的正则化 ✔baseline MAE: 84.9 先使用 MAE 做预训练,再在 ImageNet 上微调 50 epoches
数据集没变化,预训练和微调都是 ImageNet MAE 纯从图片上学到不错的信息 【消融实验】
(a) 解码器的深度,即多少个 Transformer 块
ft(fine-tune所有可学习的权重都一起调):效果和深度关系不大 84.x,效果更好(但耗费更贵)
lin(linear-probe只调最后一个线性层):深度深一点好
(b) 解码器的宽度,每一个 token 表示成一个多长的向量
512 最佳
(c) 编码器要不要加入masked patches:
w/o(不加masked)精度更高、计算量更少
结论:非对称的架构 精度更好、性能更好
(d) 重构的目标:minimize MSE(pixel)
w/o + normalization(均值为0 方差为 1):效果和w/差不多,但计算量更小,更简单
w/ + normalization(均值为0 方差为 1) :效果最好
PCA (做一次降维)
dVAE(jpdds 的做法,通过 ViT 把每一个块映射到一个离散的 token,像 BERT 一样的去做预测)
(e) 怎么样做数据增强
什么都不做
固定大小的裁剪(crop)
随机大小的裁剪(crop):效果最好
裁剪 + 颜色变化
结论:MAE 对数据增强不敏感
(f) 怎么采样 被盖住的块
随机采样 (采样率75 %):最简单最好
块采样 (采样率50 %)
块采样 (采样率75 %)
网格采样(采样率75 %)
128核TPU-v3+TensorFlow
ViT-Large + 解码器只使用一层 Transformer 的patch:84.8% 精度不错,耗时最少 (11.8h)
ViT-Huge + 解码器只使用一层 Transformer 的patch:85.9% 精度不错,耗时最少 (29.3d)
左:随机采样(采样率75%) 效果最好
中:方块采样(采样率50%)
右:网格采样(采样率75%)
ImageNet-1K 上训练个 1000 个数据轮,精度仍有提升,过拟合没很严重
一般在 ImageNet 上训练, 200轮就足够了,1000轮已经很多了。
在ImageNet-1K上,与以前工作对比,MAE效果最好
MAR预训练vs.有监督预训练:JFT效果最好,MAE次之。(可能因为JFT数据集包括的类数远远大于 ImageNet)
fine-tune层数少,快,精度差
fine-tune层数多,慢,精度好
调 4 - 5 层比较好
【MAE】结论
【MAE思想很简单】利用 ViT 来做跟 BERT 一样的自监督学习
【MAE 相对ViT 的提升点】