声明
本片文章主要介绍了自监督学习在预训练中的主要应用。许多内容非笔者原创,感谢以下作者对本篇文章的启发和指导。欢迎读者进行留言和讨论。
一、引言
自然语言处理中,BERT通过把每个词汇通过 Word2Vec 转为 Token,随机遮盖 Token,让模型根据不完整的句子来预测 Token。
那么不仅仅是一句话可以看做是一个sequence,一段语音也可以看做是一个sequence,甚至一个image也可以看做是一个sequence。所以BERT其实不仅可以用在NLP上,还可以用在CV里面。
BEiT是用于图片的BERT,与ViT类似,不同是训练时候会对图片的patch加上随机masking,利用掩码方式让模型在输入损坏图片的时候也能够正确预测出图片所对应的visual token现BEiT模型最高精度是top1 88.60%,可能是目前已知 paddle 开源模型精度最高的。
贡献总结如下:
- 提出了一个掩码图像建模 (MIM) 任务,以自监督的方式预训练视觉 Transformer。我们还从变分自编码器的角度提供了一个理论解释。
- 对 BEiT 预训练,并对下游任务进行广泛的微调实验,如图像分类和语义分割。
- 提出自监督 BEiT 的自注意机制来学习区分语义区域和对象边界 (semantic regions & object boundaries),尽管无需任何人类注释
二、理论及方法
给定一个输入图像 ,BEiT 将其编码为 经上下文化 (contextualized) 的向量表示。BEiT 通过自监督学习方式的掩码图像建模 (MIM) 任务进行预训练。MIM 旨在恢复基于编码向量的 masked image patches。对于下游任务 (如图像分类和语义分割),经预训练的 BEiT 上添加任务层,并对特定数据集上的参数进行微调。
2.1 图像编码
对 Origin 图进行 Patch 操作,划分不同的 Image Patches 操作。
随机挑选 Image Patches 采取 blockwise masking 方法进行Masking 操作,然后展平这里 Masking 。
对展平的 Tokens 进行进一步操作,便于后续进入编码器
然后…,经过Encoder 之后生成一系列的 h 向量,对应每个被 masked 的 image patches,如下图所示,masked 了5个 patches,经过 Beit encode 生成对应5个输出向量 h2、h3、h6、h7、h14,然后进入一个 fc 层,预测一系列的数字。
2.2 DVAE( Visual tokens)
visual tokens包含着图像信息,与 Tokenizer 对应的是 Decoder,负责从Visual tokens复原出原图像.
在第一阶段,获取图像 tokenizer 作为离散变分自动编码器。特别地,第一阶段使用一个 uniform 先验来最小化 Visual Token Reconstruction 损失,如公式 (2) 所示。在第二阶段,学习先验 ,同时保持和 固定。将简化为具有最有可能的视觉 token 的单点 (one-point) 分布。
2.3 自监督训练
生成预测的 visual tokens 是目标,我们要训练网络,预测被masked 的部分对应的 visual tokens 对应原图的 visual tokens,这个训练方法在自监督领域叫生成式学习
网络训练时候,优化步骤是先优化 dVAE,这个我们叫重构损失,通过优化 Tokenizer 和 Decoder 让dVAE 能够学习到更好的隐变量又能更好还原原图,然后再优化 Encoder 和 Masked Image Modeling Head,使得其能更好预测出对应的 visual tokens
-
给定一个输入图像 ,将其 split 为 个图像 patches ,并 tokenize 为 个视觉 tokens
-
随机 mask ~40% (掩码率为 0.4) 的图像 patches
-
将已损坏 (被 masked) 的图像 patches 馈入 L 层 Transformer 中,得到的最后隐层向量 被视为输入 patch 的编码表示
-
对于每个 mask 位置 ,使用 softmax 分类器 (其实是 FC+Softmax 构成的 MIM Head) 来预测相应的视觉 tokens
-
预训练的 objectives 是最大化 已损坏图像中 正确的视觉 tokens 的对数似然
2.4 Fine Tune
预训练 BEiT 后,我们在 Transformer 末尾追加了一个任务层,并微调下游任务的参数,就像 BERT。以图像分类和语义分割为例。在 BEiT 的其他视觉任务上利用 预训练然后微调 的范式是很简单的。
图像分类。对于图像分类,直接使用一个简单的线性分类器作为任务层。具体地,使用平均池化来聚合表示,并将全局提供给 softmax 分类器。类别概率计算为 ,其中 是第 个图像 patch 的最终编码向量, 是一个参数矩阵, 是类别/标签数。通过更新 BEiT 和 softmax 分类器的参数,来最大化有标签 (labeled) 数据的似然 (likehood)。
语义分割。对于语义分割,遵循 SETRPUP 中使用的任务层。具体地,使用经预训练的 BEiT 作为主干编码器,然后合并几个反卷积层 (deconv) 作为解码器来产生分割。该模型也类似于图像分类被端到端微调。
中间微调。经过自监督的预训练,我们可以在数据丰富的中间数据集 (即本工作中的 ImageNet-1K) 上进一步训练 BEiT,然后在目标下游任务上微调模型 (可以理解为三阶段:自监督预训练 → 中间数据集微调 → 下游任务微调)。这种中间微调 (intermediate fine-tuning) 是 NLP 中 BERT 微调的常见做法。我们直接遵循 BEIT 的方法
三、源码
四、试验
BEiT 的架构遵循 ViT-Base,以进行公平比较。我们使用 12 层 Transformer,隐层大小为 768,注意力头数为 12。FFN 的中间尺寸 (intermediate size) 为 3072。默认输入 patch size 为 16×16。直接用已训练好的图像 tokenizer。视觉 token 词表大小 (vocabulary) 为 8192。
我们在 ImageNet-1K 训练集上预训练,IN1K 包含约 120 万张图像。数据增广策略 包括:随机调整尺寸的裁剪、水平翻转、颜色抖动 (color jittering)。注意,我们 并未使用这些标签用于自监督学习。实验中使用了 224×224 的分辨率。因此,输入被 split 成 14×14 个图像 patches,以及相同数量的视觉 tokens。最多随机 mask 75 个 patches (掩码率约 40%,masked patches 数:14×14×0.4 = 78.4 ≈ 75)。
一步将 BEiT 扩展到大尺寸 (与 ViT-L 相同)。如表 1 所示,在从头开始训练时,在 ImageNet 上的 ViT384-L 比 ViT-384 更差。该结果验证了 视觉 Transformer 的 data-hungry 问题。在 ImageNet-22K 上进行有监督的预训练则部分缓解了这个问题,其中 ViT384-L 最终比 ViT-384 高出 1.2。相比之下,BEIT-L 比 BEIT 好 2.0,BEIT384-L 比 BEIT384 好 1.7。换句话说,将 BEiT 从 base 扩展到 large 的收益比使用 ImageNet-22K 进行有监督预训练的收益更大。更重要的是,比较 BEiT-384 和在 ImageNet-22K 上进行有监督预训练的ViT-384,随着从 base (即 0.6) 到 large (即 1.1),BEiT 的改进变得更大。结果表明,对于非常大的模型 (如 1B 或 10B),BEiT 倾向于更有用,特别是当有标签数据不足以对如此大的模型进行有监督预训练时。
收敛曲线。图 2 比较了 从头开始训练 和 预训练然后微调 范式的收敛曲线。我们发现,微调 BEiT 不仅获得 更好的性能,而且比从头训练DeiT 收敛得快得多。此外,微调 BEiT 可以在极少的 epochs 内达到合理的数字
五、总结
BEIT 遵循 BERT 的训练方法,让 BEIT 看很多的图片,随机盖住一些 image patches,让 BEIT 模型预测盖住的patches是什么,不断计算预测的 patches 与真实的 patches 之间的差异,利用它作为 loss 进行反向传播更新参数,来达到 Self-Supervised Learning 的效果。
不同的是,BERT 的 Encoder 输入是 token,输出还是 token,让盖住的 token 与输出的预测 token 越接近越好;而 BEIT 的 Encoder 输入是 image patches,输出是 visual tokens,让盖住的位置输出的 visual tokens 与真实的 visual tokens 越接近越好。真实的 visual tokens 是通过一个额外训练的 dVAE 得到的。
标签:tokens,BEiT,patches,训练,Beit,visual,图像 From: https://www.cnblogs.com/polly333/p/17792702.html