参考:Self-Supervised Learning 超详细解读 (六):MAE:通向 CV 大模型 - 知乎 (zhihu.com)
仅供个人学习使用,侵权私信删。
自监督学习:MAE.. 1
1.1 self-supervised learning.. 1
1.2 Masked Autoencoders(MAE)方法概.... 2
1.3 MAE Encoder:... 4
1.4 MAE Decoder:... 4
1.5 自监督学习目标函数 Reconstruction Target(重建目标).... 4
1.6 具体实现方法.... 5
1.7 ImageNet 实验结果.... 5
1.8 masking ratio 对性能的影响.... 5
1.9 观察到的一些实验现象.... 6
1.10 训练策略.... 7
1.11 结果对比.... 8
1.12 Partial Fine-tuning.. 9
总结.... 9
自监督学习:MAE
Self-Supervised Learning,又称为自监督学习,我们知道一般机器学习分为有监督学习,无监督学习和强化学习。 而 Self-Supervised Learning 是无监督学习里面的一种,主要是希望能够学习到一种通用的特征表达用于下游任务 (Downstream Tasks)。 其主要的方式就是通过自己监督自己。作为代表作的 kaiming 的 MoCo 引发一波热议, Yann Lecun也在 AAAI 上讲 Self-Supervised Learning 是未来的大势所趋。所以在这个系列中,我会系统地解读 Self-Supervised Learning 的经典工作。
1.1 self-supervised learning
在预训练阶段使用无标签的数据解(unlabeled data),因为有标签的数据集需要大量的人工去进行标注,需要非常高的人工成本,但是无标签的数据在网络上到处可见,通过爬取的方式也便于收集。在训练模型参数的时候,我们不追求把这个参数用带标签数据从初始化的一张白纸给一步训练到位,原因就是数据集太贵。于是 Self-Supervised Learning 就想先把参数从一张白纸训练到初步成型,再从初步成型训练到完全成型。注意这是2个阶段。
预训练模型的时候,就是模型参数从一张白纸到初步成型的这个过程,还是用无标签数据集。等我把模型参数训练个八九不离十,这时候再根据你下游任务 (Downstream Tasks) 的不同去用带标签的数据集把参数训练到完全成型,那这时用的数据集量就不用太多了,因为参数经过了第1阶段就已经训练得差不多了。
第一个阶段不涉及任何的下游任务,就是拿着一堆无标签的数据去训练我们的网络,没有设定特定的任务。第二个阶段涉及下游任务,就是拿着一堆带标签的数据去下游任务上做微调,
1.2 Masked Autoencoders(MAE)方法概
本文使用带掩码的自编码器进行自监督学习,另一个同种类型的自监督学习例子是BERT
对于BERT模型而言,一个sentence中间盖住一些tokens,让模型去预测,令得到的预测结果与真实的tokens之间的误差作为损失函数,它告诉了我们直接 reconstruct sentence(重建的句子) 也可以做到很 work。
对于 MAE 模型而言,一个 image 中间盖住一些 patches,让模型去预测,令得到的预测结果与真实的 image patches 之间的误差作为损失。它告诉了我们直接 reconstruct image(重构的图片) 原图也可以做到很work。
为什么 BERT (2018) 提出这么久以后,直到 BEIT (2021.6) 和 MAE (2021.11) 之前,一直在 CV 领域都没有一个很类似的 CV-BERT 出现?
Kaiming在这里给出了三个解释:
- CV 和 NLP 主流架构不同:直到 ViT (2020.12) 出现之前,CV 的主流架构一直是以卷积网络为主,NLP 的主流架构一直是以 Transformer 为主。卷积核作用在一个个的 grid 上面,直观来讲没法产生像 Transformer 一样的 token 的概念,也就是说如果我们只使用卷积网络,那么 image token 概念的建立就不那么直观。所以,像 Transformer 那样在 token 的基础上进行自监督学习就不太适用,这是第一个难点。
- 语言和图片 (视频) 的信息密度不同:语言是人类造就的信号,它 highly semantic , information-dense。而图片 (视频) 是自然产生的信号,它 heavy spatial redundancy。即挡住图片的一部分 patches,可以很容易地通过看它周围的 patches 而想象出它的样子来。所以,语言和图像,一个信息密度高,一个信息密度低,这是第二个难点。解决的办法是什么呢?作者提出了一个简单的策略:即挡住图片的 patches 的比例高一些。比如之前你挡住一张图片的 30% 的 patches,能够轻松通过周围的 patches 预测出来;那现在如果挡住图片的 90% 的 patches,还能够轻松通过周围的 patches 预测出来吗?
- AutoEncoder 里面的 Decoder 部分 (就是将映射得到的中间特征重建为 input 的模块) 在 CV 和 NLP 中充当的角色不同:在 CV 领域,Decoder 的作用是重建 image pixels,所以 Decoder 的输出语义级别很低。在 NLP 领域,Decoder 的作用是重建 sentence words ,所以 Decoder 的输出语义级别很丰富。
基于以上的解释:MAE 的方法很简单:Mask 掉输入图像的随机的 patches 并重建它们。它基于两个核心理念:研究人员开发了一个非对称编码器 - 解码器架构,其中一个编码器只对可见的 patch 子集进行操作 (即没有被 mask 掉的 token),另一个简单解码器可以从潜在表征和被 masked 掉的 token 重建原始图像。Decoder 的架构可以是十分轻量化的模型,且具体的架构对模型性能影响很大。研究人员进一步发现,Mask 掉大部分输入图像 (例如 75%) 会产生重要且有意义的自监督任务。结合这两种设计,我们就能高效地训练大型模型:提升训练速度至 3 倍或更多,并提高准确性。
MAE 方法严格来讲属于一种去噪自编码器 (Denoising Auto-Encoders (DAE)),去噪自动编码器是一类自动编码器,它破坏输入信号,并学会重构原始的、未被破坏的信号。MAE 的 Encoder 和 Decoder 结构不同,是非对称式的。Encoder 将输入编码为 latent representation(潜在表示),而 Decoder 将从 latent representation (潜在表示)重建原始信号。
/**-----------------------------------------------***---------------------------------------------------**/
对于去噪自编码器的详细解释:
去噪自动编码器(Denoising Autoencoder)是一种神经网络模型,旨在从包含噪声的输入数据中学习干净的、有用的特征表示。它是自动编码器(Autoencoder)的一种变体,具有以下工作原理:
1. 编码(Encoding):去噪自动编码器首先接收一个包含噪声的输入数据。这个输入数据可能受到不同类型的噪声、干扰或失真的影响,例如图像中的像素噪声、文本中的错字等。编码器部分负责将这个噪声输入数据转换为一种更紧凑的表示,即编码。编码的目标是捕获输入数据中的有用特征,并且抑制或去除噪声成分。编码器通常由神经网络层组成,其输出是编码后的特征。
2. 去噪(Denoising):这是去噪自动编码器的核心概念。在编码过程中,编码器会强制模型通过学习来去除输入数据中的噪声,使得编码的特征表示尽可能干净和有用。噪声可以是随机的或有针对性的,具体取决于应用场景。
3. 解码(Decoding):解码器部分接收编码后的特征表示,并将其还原为尽可能接近原始数据的形式。解码的目标是生成无噪声或去噪后的输出数据,使其与原始输入数据相似。解码器通常由神经网络层组成,其输出是解码后的数据。
4. 训练:训练去噪自动编码器的过程通常包括以下步骤:
- 向输入数据中添加噪声:通过引入噪声,模拟现实世界中的数据干扰或噪声。
- 使用编码器将噪声数据转换为编码。
- 使用解码器将编码后的特征还原为尽可能接近原始数据的形式。
- 比较解码后的数据与原始数据之间的差异,并使用损失函数来度量它们之间的误差。
- 调整编码器和解码器的参数,以最小化损失函数。这样,模型将学会去噪输入数据,并提取有用的特征。
去噪自动编码器的应用包括降维、特征学习、图像去噪、异常检测等。通过去除噪声并学习有用的特征表示,这种模型有助于提高数据质量和支持各种数据分析和处理任务。
MAE 和 ViT 的做法一致,将图像划分成规则的,不重叠的 patches。然后按照均匀分布不重复地选择一些 patches 并且 mask 掉剩余的 patches。作者采用的 mask ratio 足够高(75%),因此大大减小了 patches 的冗余信息,使得在这种情况下重建 images 不那么容易。所以模型可以学到信息。
/**-----------------------------------------------***---------------------------------------------------**/
1.3 MAE Encoder:
MAE Encoder 采用 ViT 架构,但只会作用于 unmasked images。和 ViT 思路一样,MAE Encoder 会先通过 Linear Projection(线性投影) 编码图片,再加上位置编码,随后送入一堆连续的 Transformer Block 里面。但是编码器只对整个图片 patches 集合的一个小子集 (例如25%)进行操作,而删除 masked patches。这里和 BERT 做法不一样,BERT 使用对于 mask 掉的部分使用特殊字符(使用其他字符替代、MASK或者不改变),而 MAE 对于MASK patchs 不作为encoder的输入。
1.4 MAE Decoder:
MAE Decoder 采用 Transformer 架构,输入整个图片 patches 集合,不光是 unmasked tokens (图4中蓝色色块),还有被 mask 掉的部分 (图4中灰色色块)。每个 mask tokens 都是一个共享的、学习的向量,它指示了这里有一个待预测的 tokens。作者还将位置嵌入添加到这个完整 image patch 集合中的所有 tokens 中,位置编码表示每个 patches 在图像中的位置的信息。
MAE Decoder 仅用于预训练期间执行图像重建任务。因为自监督学习的特点就是只用最后预训练好的 Encoder 完成分类任务。因此,可以灵活设计与编码器设计无关的解码器结构。作者用比编码器更窄更浅的很小的解码器做实验。 在这种非对称的设计下,tokens 就可以由轻量级解码器处理,这大大缩短了预训练的时间。
1.5 自监督学习目标函数 Reconstruction Target(重建目标)
Decoder 的最后一层是一个 Linear Projection (线性投影)层,其输出的 channel 数等于图像的像素 (pixel) 数。所以 Decoder 的输出会进一步 reshape 成图像的形状。损失函数就是 MSE Loss,即直接让 reconstructed image(重构的图像) 和 input image(输入的图像) 的距离越接近越好。实际的损失函数的设计为reconstructed patch与mask patchs之间求解MSE Loss
作者还尝试了另外一种损失函数,就是先计算出每个 patch 的像素值的 mean(均值) 和 deviation(方差),并使用它们去归一化这个 patch 的每个像素值。最后再使用归一化的像素值进行 MSE Loss 计算。但是发现这样做的效果比直接 MSE Loss 好。
1.6 具体实现方法
MAE 的具体实现方法是:
- 首先通过 Linear Projection (线性投影)和position embedding得到 image tokens。
- 随机 shuffle 这些 tokens,按照 masking ratio 扔掉最后的一部分。
- 把 unmasked patches 输出到 Encoder 中,得到这些 tokens 的表征。
- 把 Encoder 的输出,结合 masked tokens (经过position embedding的可学习的向量),执行 unshuffle操作恢复顺序,再一起输入到 Decoder 中。
- shuffle 和 unshuffle 操作的时间开销可忽略不计。
在MAE中:在推理时 Encoder 的输入在 pretrain 的时候 mask 掉了部分,在进行微调时encoder的输入不需要再进行mask,序列长度发生变化,MAE是怎么处理这种长度变化的
由于MAE的编码器在pretrain和 fine-tuning输入的维度维度不同,我们在编码器之后采用线性投影层进行匹配。
1.7 ImageNet 实验结果
第1个实验使用 ViT-Large (ViT-L/16) 作为 Encoder 的 Backbone,作者首先对比了3个结果,如下图5所示:
76.5是VIT论文的ViT-large使用ImageNet训练的结果。
82.5是通过在ViT-large的基础上添加合适的正则化实现的,作者认为要使用较大的 weight decay = 0.3。82.5的实验设置如下图6所示。
84.9 是作者自己实现的,ViT-Large 使用 MAE pretrain 之后,再在 ImageNet 上做完整 Fine-tuning 的结果,可以看到优于有监督的 82.5。
1.8 masking ratio 对性能的影响
如下图3所示代表了 masking ratio 对结果的影响。最优的 masking ratio 竟然出乎意料地高,且当 masking ratio=75% 时,linear probing 和 fine-tuning 的性能依旧很高。 这种行为与 BERT 相反,BERT 的典型mask ratio 只有15%。从这个结果可以得出结论:MAE 自监督训练好的模型可以推断出缺失的补丁。作者假设这种类似推理的行为,与学习有用的表征有关。
图3还显示了linear probing 和 fine-tuning 的结果随着的不同的变化趋势。对于 fine-tuning,结果是40-80%的 masking ratio 都能表现良好。
图7。训练时间表。较长的训练计划会带来显著的改善。这里的每一点都是一个完整的训练时间表。模型是ViT-L,默认设置见表1。
1.9 观察到的一些实验现象
如下图4所示,作者做了一些不同实验设置下的对比实验。
表1。在ImageNet-1K上用ViT-L/16进行的MAE消融实验。我们报告了微调(ft)和线性探测(lin)精度(%)。如果未指定,默认为:解码器深度为8,宽度为512,重建目标为非标准化像素,数据增强为随机调整大小的裁剪,掩蔽率为75%,预训练长度为800个时期。默认设置以灰色标记。
图8 (a):足够深的 Decoder 对于 linear probing 很重要。原因:pixel reconstruction task 和 recognition task 本质不同,AutoEncoder 的末尾几层对于重建 pixel 更重要。而且有趣的是,只有1层 Block 的 Decoder 在 fine-tuning 之后就能达到84.8%的 accuracy。默认配置是8层。
图8 (b):更窄的 Decoder 也能够在 fine-tuning 时获得较好的性能。默认配置是 Embedding dimension=512。
计算量只有 ViT-L 的9%。
图8 (c):研究有没有必要在输入 Encoder 的时候一并输入 masked patches。结果发现,如果也一起给 Encoder 输入了 mask tokens,效果其实是变差的:Linear Probing 性能降低了14%。作者认为,这可能是因为:在这种情况下,在预训练和部署之间存在差距。即:编码器在预训练的输入中有很大一部分是 mask tokens,这在未损坏的图像中是不存在的。这个 gap 可能会降低部署的准确性。
而且,通过跳过编码器中的 mask token,大大减少了训练计算量 (约3.3倍)。 此外,GPU memory 大大减少,这可以使训练更大的模型或加快 large-batch training。时间和 GPU memory 效率使我们更适合训练大型模型。
图8 (d):不同损失函数的影响。除了 MSE Loss 以外,作者还尝试了另外一种损失函数,就是先计算出每个 patch 的像素值的 mean 和 deviation,并使用它们去归一化这个 patch 的每个像素值。最后再使用归一化的像素值进行 MSE Loss 计算。但是发现这样做的效果比直接 MSE Loss 好。
图8 (e):不同数据增强策略的影响。MAE 只使用 cropping-only 就比较好,而进一步添加 color jittering 会影响性能。 即使没有使用数据增强 (only center-crop, no flipping) ,MAE 模型仍然能够表现得体。作者也给出了原因,即:在 MAE 中,数据增强的角色其实是由 random masking 来扮演的。每个 iteration 的 mask 都不同,所以就相当于是产生了新的训练样本。
图8 (f),图f:不同 mask 采样策略的影响。block-wise masking 在 mask 50%时的效果还行,但是当 mask ratio 达到75%时性能就大幅下降了。grid-wise sampling 使得任务变得更简单,但相应的,图像重建质量也下降了。 简单的随机抽样最适合 MAE 模型。
图6。掩模采样策略决定了借口任务的难度,影响重建质量和表征(表1f)。这里,每个输出都来自用指定的掩蔽策略训练的MAE。左图:随机抽样(我们的默认)。中间:移除大的随机块的分块采样[2]。右图:每四个补丁中保留一个的网格采样。图像来自验证集。
1.10 训练策略
下图10展示了不同 training epochs 的影响。在 training epochs=1600 时 MAE 还没有达到饱和。
1.11 结果对比
如下图11所示为不同自监督方法性能对比,对于 ViT-B 模型,所有的方法性能相似,但是对于更大的 ViT-L 模型,性能差距就拉开了,证明了 MAE 对于大模型的泛化性能。
表3。与ImageNet1K上以前的结果进行比较。预训练数据是ImageNet-1K训练集(除了BEiT中的标记器是在250M DALLE数据上预训练的[50])。所有自监督方法都通过端到端微调进行评估。ViT模型有B/16、L/16、H/14[16]。每列的最佳值用下划线标出。所有结果都在224大小的图像上,除了ViT-H在448上有一个额外的结果。这里,我们的MAE重建归一化像素,并对1600个时期进行预训练。
使用 ViT-H 结构的 Encoder,经过 448 fine-tuning 之后可以得到 87.8% 的 Accuracy,而整个过程只使用了 ImageNet 数据集。
与 BEiT 相比,MAE 更快,训练方式更简单,MAE 重建 pixel,而 BEiT 重建 tokens。图11中的模型是为了更高的精度预先训练的 1600 epochs 的模型。即便如此,如果他们在同样的硬件环境下训练,我们总的训练前时间比其他任何方法都短。例如,对于 ViT-L,MAE 的训练时间是1600个 epochs,31小时。moco v3的训练时间是300个 epochs,36小时,使用相同的128个 TPU-v3 核心。
1.12 Partial Fine-tuning
最后,作者提出了一种 Partial Fine-tuning 的新套路,它不同于之前人们常用的 Linear Probing (只训练最后一层线性分类器的参数) 和 Fine-tuning (训练所有层的参数)。
Partial Fine-tuning 是指 只训练最后模型的若干层的参数。如下图12所示,值得注意的是,Fine-tuning 1个 Transformer Block 可以把 Accuracy 从73.0%提升至81.0%。此外,如果我们只Fine-tuning 1个 Transformer Block 的 MLP block,我们可以得到79.1% ,比 Linear Proing 要好得多。
图9。ViT-L w.r.t。的部分微调结果表1中默认设置下微调的Transformer块数。调优0块是线性探测;24是完全微调。我们的MAE表示不太线性可分,但如果调整一个或多个块,始终优于MoCo v3。
总结
用 MAE 做 pre-training 只需 ImageNet-1k 就能达到 87.8% 的 Top-1 准确度,超过了所有在 ImageNet-21k pre-training 的 ViT 变体模型。而从方法上看,MAE 选择直接重建原图的元素,而且证明了其可行性,改变了人们的认知,又几乎可以覆盖 CV 里所有的识别类任务,看起来像是开启了一个新的方向。直接重建原图的元素是非常重要的,因为通过这个形式,作者就用最最直观的方式完成了 MIM 任务,使得 MIM的潜力逐步被证实。从 MLM 到 MIM 的过渡已被证明,由此观之比肩 GPT3 的 CV 预训练大模型已不远矣。