BEiT: BERT Pre-Training of Image Transformers 论文笔记

2023-08-18 20:22:37

BEiT: BERT Pre-Training of Image Transformers 论文笔记

论文名称:BEiT: BERT Pre-Training of Image Transformers

论文地址:2106.08254] BEiT: BERT Pre-Training of Image Transformers (arxiv.org)

代码地址:unilm/beit at master · microsoft/unilm (github.com)

作者讲解:BiLiBiLi

作者PPT:文章资源



首先展示的是我基于这个算法搭建的网页demo,欢迎体验。https://wangqvq-beit-gradio.hf.space/
在这里插入图片描述


整体结构图

在这里插入图片描述


Visual Tokens

将图像分解为离散的标记

  • 离散 variational autoencoder

  • 学习通过视觉令牌的条件来重建原始图像

在这里插入图片描述

  • 图像表示(两个视角)

在这里插入图片描述


  • 分块遮罩
    • 每次都会对图像块进行遮罩处理

在这里插入图片描述


  • 将受损图像补丁输入到 Transformer
    • 最终的隐向量被视为编码表示

在这里插入图片描述


  • 在给定受损图像的情况下恢复正确的视觉标记
    • 视觉标记将细节总结为高层抽象

在这里插入图片描述


1.1 总体方法

  • BERT 启发,提出了一项预训练任务,即掩码图像建模(MIM)
  • MIM为每个图像使用了两种视图,即图像块(image patches)和视觉标记(visual tokens)
  • 图像被分割成一个网格的图像块,这些图像块是骨干Transformer的输入表示。
  • 通过离散变分自编码器(discrete variational autoencoder),图像被“标记化”(tokenized)为离散的视觉标记,其中离散变分自编码器来自于 DALL·E

在预训练阶段,图像的一部分图块(image patches)会被随机地遮挡(masked),然后将这些被遮挡的输入提供给Transformer模型。模型会学习如何从遮挡后的输入中恢复原始图像中的视觉标记(visual tokens),而不是从遮挡的图块中恢复原始像素。

换句话说,模型在这个过程中学习了如何通过遮挡和损坏的输入来推断出原始图像的部分内容,这有助于模型学习图像的语义和特征。作者认为这种预训练策略可以增强模型在图像处理任务中的能力,使其能够更好地理解和表示图像。

1.2 图像表示

图像具有两种表示视图,即图像块视觉标记。这两种类型在预训练期间分别用作输入和输出表示。

1.2.1 图像块 (Image Patches)

在这里插入图片描述

  • 尺寸为 H × W × C H×W×C H×W×C 的二维图像被分割成大小为 P 2 P^2 P2 的图像块序列 x p x_p xp(其中 p p p 1 1 1 N N N),其中 p a t c h patch patch 的数量 N N N = H W / P 2 HW/P^2 HW/P2
  • 图像块 x p x_p xp 被展平为向量,并且进行线性投影,这与 BERT 中的词嵌入类似。

具体而言,BEiT 将每个 224 × 224 224×224 224×224 的图像分割成一个 14 × 14 14×14 14×14 的图像块网格,每个图像块大小为 16 × 16 16×16 16×16

1.2.2 视觉标记 (Visual Tokens)

在这里插入图片描述

图像不再以原始像素的形式表示,而是被分解成一系列离散的标记(tokens),这些标记是通过一个名为“图像分词器”(image tokenizer)获得的。换句话说,图像被转化成了一串由特定标记组成的序列,而不再是像素点的集合。

具体而言,尺寸为 H × W × C H×W×C H×W×C 的图像被标记化为 z = [ z 1 , … , z N ] z=[z1, …, zN] z=[z1,,zN],其中词汇表 V = { 1 , 2 , … , ∣ V ∣ } V=\{1, 2, …, |V|\} V={1,2,,V} 包含离散的标记索引。

  • 由 DALL·E 学习的离散变分自编码器(dVAE)直接使用了图像标记器。

  • 在视觉标记学习过程中,存在两个模块,即标记器tokenizer)和解码器decoder)。

  • 标记器 q ( z ∣ x ) q(z|x) q(zx) 将图像像素 x x x 映射为离散标记 z z z,根据一个视觉码本(即词汇表)。

  • 解码器 $p(x|z) $学习基于视觉标记 z z z 重构输入图像 x x x

  • 词汇表大小设置为 ∣ V ∣ = 8192 |V| = 8192 V=8192


1.3 ViT Backbone

  • ViT的基础上,使用了 T r a n s f o r m e r Transformer Transformer 骨干网络。

  • T r a n s f o r m e r Transformer Transformer 的输入是图像块序列 x i p x_i^p xip

  • 然后,图像块通过线性投影得到块嵌入 E x i p Ex^p_i Exip

  • 标准的可学习的一维位置嵌入 E p o s E_{pos} Epos 被添加到块嵌入中:

H 0 = [ e [ S ] , E x i p , … , E x N p ] + E p o s \boldsymbol{H}_{0}=\left[\boldsymbol{e}_{[\mathrm{S}]}, \boldsymbol{E} \boldsymbol{x}_{i}^{p}, \ldots, \boldsymbol{E} \boldsymbol{x}_{N}^{p}\right]+\boldsymbol{E}_{p o s} H0=[e[S],Exip,,ExNp]+Epos

  • 编码器包含 L L L T r a n s f o r m e r Transformer Transformer 块:

H l =  Transformer  ( H l − 1 ) \boldsymbol{H}^{l}=\text { Transformer }\left(\boldsymbol{H}^{l-1}\right) Hl= Transformer (Hl1)

  • 最后一层的输出向量为:

在这里插入图片描述

这些向量被用作图像块的编码表示,其中 h i L h^L_i hiL 是第 i i i 个图像块的向量。

  • 使用了ViTBase,它是一个包含 12 12 12 T r a n s f o r m e r Transformer Transformer 的模型,每层有 768 768 768 的隐藏大小和 12 12 12 个注意力头。前馈网络的中间大小为 3072 3072 3072

2. BEiT的预训练:掩码图像建模

2.1. Masked Image Modeling (MIM)

img

  • 将图像分割成图像块后,如上所述,大约 40 % 40\% 40% 的图像块会被随机遮蔽,遮蔽的位置标记为M。被遮蔽的块会被可学习的嵌入e[M]所取代。在 BEiT 中,最多会遮蔽 75 75 75 个图像块。

  • 然后,好的和被遮蔽的图像块被输入到 L L L T r a n s f o r m e r Transformer Transformer 中。

  • 使用softmax分类器来预测相应的视觉标记:

img

预训练目标是最大化给定受损图像情况下正确视觉标记 z i z_i zi 的对数似然:

在这里插入图片描述

  • BEiTImageNet-1K 的训练集上进行预训练。

  • 预训练大约运行了500k步(即800epoch),使用了2k的批大小。这500k个训练步骤使用了16Nvidia Tesla V100 32GB GPU 卡,大约花费了五天的时间。

2.2. Blockwise Masking 分块遮蔽

在这里插入图片描述

补丁块是随机遮蔽的,如上图和算法所示,而不是以随机方式逐个遮蔽每个补丁。

2.3. From VAE Perspective 从VAE的角度

  • BEiT 的预训练可以看作是变分自编码器的训练:

    原始图像: x x x

    当前图像: x ~ \widetilde{x} x

    视觉标记: z z z

在这里插入图片描述

  • 在第一阶段,图像标记器作为一个离散变分自编码器获得。具体来说,第一阶段最小化重构损失,使用均匀先验。
  • 在第二阶段,保持 q φ q_φ qφ p ψ p_ψ pψ 固定的同时学习先验 p θ p_θ pθ
  • 因此,上述方程被重写为:

在这里插入图片描述

其中第二项是提出的 BEiT 预训练目标。

3. 实验结果

3.1. ImageNet-1K 和 ImageNet-22K 预训练,以及在 ImageNet-1K 上的图像分类

img

  • 一个简单的线性分类器被用作任务层。平均池化被用来聚合表示,并将全局表示输入到一个 softmax 分类器中。
  • 预训练的 BEiT 显著提高了在这两个数据集上的性能。

BEiT 在 ImageNet 上提高了性能,显示了在资源丰富的设置下的有效性。

  • 更高的分辨率在 ImageNet 上将 BEiT 的结果提高了 1+ 个百分点。

更重要的是,即使在使用相同输入分辨率时,预训练于 ImageNet-1KBEiT384 甚至在性能上超越了使用 ImageNet-22K 进行监督预训练的 ViT384

img

BEiT 进行微调不仅实现了更好的性能,而且收敛速度比从零开始训练的 DeiT 快得多。

3.2. ADE20K的语义分割

img

  • 使用了 SETR-PUP 中使用的任务层

  • 具体来说,将预训练的 BEiT 用作骨干编码器,并结合几个反卷积层作为解码器来产生分割。

BEiT 比监督式预训练具有更好的性能,尽管 BEiT 不需要手动注释进行预训练。

  • 在 ImageNet上对 BEiT 进行中间微调,即首先在ImageNet上对预训练的 BEiT 进行微调,然后在ADE20K上对模型进行微调。

中间微调进一步改善了语义分割的 BEiT

3.3. 消融研究

img

  • 块屏蔽(Blockwise masking)对这两个任务都是有益的,尤其是在语义分割方面

  • 所提出的掩蔽图像建模(MIM)任务明显优于朴素像素级自动编码。结果表明,视觉代币的预测是 BEiT 的关键要素。

  • 恢复所有视觉对象令牌会损害下游任务的性能。

  • 对模型进行更长时间的预训练(800 个 epoch)可以进一步提高下游任务的性能

3.4. 自注意力图分析

img

  • BEiT 中的自我注意机制可以分离物体。

    经过预训练后,BEiT 学会使用自我注意头来区分语义区域,而无需任何特定于任务的监督。BEiT 获得的这些知识有可能提高微调模型的泛化能力,特别是在小规模数据集上。


更多推荐

【JavaEE】_JavaScript基础语法

目录1.JavaScript概述1.1JavaScript简介1.2HTML、CSS、JavaScript的关系1.3JavaScrip的组成2.JavaScript的书写形式2.1内嵌式2.2行内式2.3外部式3.输出3.1alert3.2console.log4.变量的使用4.1创建变量4.1.1使用var4.1.

华为云云耀云服务器L实例评测|带宽,磁盘,CPU,内存以及控制台监控测试

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。🏆数年电商行业从业经验,AWS/阿里云资深使用用户,历任核心研发工程师,项目技术负责人。🎉欢迎👍点赞✍评论⭐收藏文章目录🚀一、网络带宽测试🔎1.1Nginx反向代理到

华为云云耀云服务器L实例评测 | 华为云部署Docker容器

文章目录一、什么是Docker二、Docker的好处☁️模块化⛅层和镜像版本控制❄️回滚⚡快速部署三、华为云云耀云服务器L实例安装Docker四、Docker安装镜像测试五、Docker常用命令⛵小结一、什么是DockerDocker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然

华为云云耀云服务器L实例评测|使用宝塔10分钟部署一个围猫猫小游戏

目录前言一、选择华为云云耀云服务器L实例的原因二、华为云云耀云服务器的优势三、快速部署一个小游戏(1)终端部署1、使用`Termius`工具连接终端2、安装Nginx3、上传打包文件(2)宝塔可视化面板部署1、进入宝塔2、宝塔菜单3、上传代码4、下载Nginx应用5、配置Nginx(1)可视化面板配置(2)直接修改`n

Pytest自动化测试 - 必知必会的一些插件

【软件测试行业现状】2023年了你还敢学软件测试?未来已寄..测试人该何去何从?【自动化测试、测试开发、性能测试】Pytest拥有丰富的插件架构,超过800个以上的外部插件和活跃的社区,在PyPI项目中以“pytest-*”为标识。本篇将列举github标星超过两百的一些插件进行实战演示。插件库地址:http://pl

浅谈 AI 大模型的崛起与未来展望:马斯克的 xAI 与中国产业发展

文章目录💬话题📋前言🎯AI大模型的崛起🎯中国AI产业的进展与挑战🎯AI大模型的未来展望🧩补充📝最后💬话题北京时间7月13日凌晨,马斯克在Twiiter上宣布:“xAI正式成立,去了解现实。”马斯克表示,推出xAI的原因是想要“了解宇宙的真实本质”。GhatGPT横空出世已有半年,国内外“百模大战”愈演愈

内网IP端口提供外网连接访问?快解析动态域名与内网映射P2P穿透方案

我们在本地搭建服务器及发布互联网时,可以通过动态域名的方式联网。DDNS原理是用固定的域名代替变化IP,实现局域网发布公网,是适合本地动态IP环境的使用。但当本地没有公网IP时,如果解析绑定到内网IP,将内网IP端口提供外网连接访问?这时我们就需要用到内网映射的方式了。动态域名与内网映射是二种不同的方法,分别针对动态公

Apache Hive安装部署详细图文教程

目录一、ApacheHive元数据1.1HiveMetadata1.2HiveMetastore二、Metastore三种配置方式​2.1内嵌模式​2.2本地模式​2.3远程模式​三、Hive部署实战3.1安装前准备3.2Hadoop与Hive整合3.3远程模式安装3.3.1安装MySQL3.3.2Hive安装3.4启

汉威科技亮相2023上海传感器展,智能传感新品引关注

作为全球三大传感器展之一的中国(上海)国际传感器技术与应用展览会,被誉为全球传感器行业发展的风向标,每届展会都会展出数以万计的行业尖端传感新技术和新产品。今年,第8届中国(上海)国际传感器技术与应用展览会于9月13至15日在上海跨国采购会展中心起航。此次展会上,车载传感、激光和柔性传感等智能传感领域的新品受到了关注。近

100天精通Python(可视化篇)——第99天:Pyecharts绘制多种炫酷K线图参数说明+代码实战

文章目录专栏导读一、K线图介绍1.说明2.应用场景二、配置说明三、K线图实战1.普通k线图2.添加辅助线3.k线图鼠标缩放4.添加数据缩放滑块5.K线周期图表书籍推荐专栏导读🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶

【Python 数据科学】Dask.array:并行计算的利器

文章目录1.什么是Dask.array?1.1Dask简介1.2Dask.array概述1.3Dask.array与Numpy的对比2.安装与基本用法2.1安装Dask库2.2创建Dask数组2.3数组计算与操作3.Dask.array的分块策略3.1数组分块的优势3.2调整分块大小3.3数据倾斜与rebalance4

热文推荐