大数跨境
0
0

深度了解自监督学习,就看这篇解读 !微软首创:运用在 image 领域的BERT

深度了解自监督学习,就看这篇解读 !微软首创:运用在 image 领域的BERT 极市平台
2021-06-21
1
导读:这个工作用一种巧妙的办法把 BERT 的训练思想成功用在了 image 任务中。
↑ 点击蓝字 关注极市平台

作者丨科技猛兽
来源丨极市平台
编辑丨极市平台

极市导读

 

本文介绍的这篇工作是把 BERT 模型成功用在 image 领域的首创,也是一种自监督训练的形式,所以取名为视觉Transformer的BERT预训练模型。这个工作用一种巧妙的办法把 BERT 的训练思想成功用在了 image 任务中。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

深度了解自监督学习,就看这篇解读 !Hinton团队力作:SimCLR系列

本文目录

1 BERT 方法回顾

2 BERT 可以直接用在视觉任务上吗?

3 BEiT 原理分析
3.1 将图片表示为 image patches
3.2 将图片表示为 visual tokens
3.2.1 变分自编码器 VAE
3.2.2 BEIT 里的 VAE:tokenizer 和 decoder
3.2.3 BEIT 的 Backbone:Image Transformer
3.2.4 类似 BERT 的自监督训练方式:Masked Image Modeling
3.2.5 BEIT 的目标函数:VAE 视角
3.2.6 BEIT 的架构细节和训练细节超参数
3.2.7 BEIT 在下游任务 Fine-tuning
3.2.8 实验

科技猛兽:Self-Supervised Learning系列解读 (目录)

https://zhuanlan.zhihu.com/p/381354026

Self-Supervised Learning,又称为自监督学习,我们知道一般机器学习分为有监督学习,无监督学习和强化学习。而 Self-Supervised Learning 是无监督学习里面的一种,主要是希望能够学习到一种通用的特征表达用于下游任务 (Downstream Tasks)。其主要的方式就是通过自己监督自己。作为代表作的 kaiming 的 MoCo 引发一波热议, Yann Lecun也在 AAAI 上讲 Self-Supervised Learning 是未来的大势所趋。所以在这个系列中,我会系统地解读 Self-Supervised Learning 的经典工作。

今天介绍的这篇工作是把 BERT 模型成功用在 image 领域的首创,也是一种自监督训练的形式,所以取名为视觉Transformer的BERT预训练模型。这个工作用一种巧妙的办法把 BERT 的训练思想成功用在了 image 任务中,涉及的知识点包括 BERT (第1节),VAE (第3.2.1节) 等等,为了方便阅读本文也会对它们进行简单讲解。

总结下 Self-Supervised Learning 的方法,用 4 个英文单词概括一下就是:

Unsupervised Pre-train, Supervised Fine-tune.

下面首先借助 BERT 模型理解一下这句话的意思。

1 BERT 方法回顾

Self-Supervised Learning 超详细解读 (一):大规模预训练模型BERT (https://zhuanlan.zhihu.com/p/378360224)里面我们介绍了 BERT 的自监督预训练的方法,BERT 可以做的事情也就是Transformer 的 Encoder 可以做的事情,就是输入一排向量,输出另外一排向量,输入和输出的维度是一致的。那么不仅仅是一句话可以看做是一个sequence,一段语音也可以看做是一个sequence,甚至一个image也可以看做是一个sequence。所以BERT其实不仅可以用在NLP上,还可以用在CV里面。所以BERT其实输入的是一段文字,如下图1所示。

图1:BERT的架构就是Transformer 的 Encoder

接下来要做的事情是把这段输入文字里面的一部分随机盖住。随机盖住有 2 种,一种是直接用一个Mask 把要盖住的token (对中文来说就是一个字)给Mask掉,具体是换成一个特殊的字符。另一种做法是把这个token替换成一个随机的token。

图2:把这段输入文字里面的一部分随机盖住

接下来把这个盖住的token对应位置输出的向量做一个Linear Transformation,再做softmax输出一个分布,这个分布是每一个字的概率,如下图3所示。

那接下来要怎么训练BERT呢?因为这时候BERT并不知道被 Mask 住的字是 "湾" ,但是我们知道啊,所以损失就是让这个输出和被盖住的 "湾" 越接近越好,如下图4所示。

图3:把这个盖住的token对应位置输出的向量做一个Linear Transformation
图4:让这个输出和被Mask 住的 token 越接近越好

其实BERT在训练的时候可以不止是选取一个token,我们可以选取一排的token都盖住,这就是 SpanBERT 的做法,至于要盖住多长的token呢?SpanBERT定了一个概率的分布,如图5所示。有0.22的概率只盖住一个token等等。

图5:SpanBERT定了一个概率的分布

除此之外,SpanBERT还提出了一种叫做Span Boundary Objective (SBO) 的训练方法,如下图6所示,意思是说:

图6:Span Boundary Objective (SBO)

盖住一串token以后,用这段被盖住的token的左右2个Embedding去预测被盖住的token是什么。SBO把盖住的部分的左右两边的Embedding吃进来,同时还输入一个数字,比如说3,就代表我们要还原被盖住的这些token里面的第3个token。

就是通过上面的图1-图6的方法,让 BERT 看很多的句子,随机盖住一些 tokens,让模型预测盖住的tokens是什么,不断计算预测的 token 与真实的 token 之间的差异,利用它作为 loss 进行反向传播更新参数,来达到 Self-Supervised Learning 的效果。

Self-Supervised Learning 训练好 BERT 以后,如何在下游任务上使用呢?

我们就以情感分析为例,要求输入一个句子,输出对应的情感类别。

BERT是怎么解Sentiment Analysis的问题呢?给它一个句子,在这个句子前面放上 class token,这步和 ViT 是一模一样的。同样地,我们只取输出的Sequence里面的class token对应的那个vector,并将它做Linear Transformation+Softmax,得到类别class,就代表这个句子的预测的情感,如下图7所示。

值得注意的是,对于这种下游任务你需要有labelled data,也就是说 BERT 其实没办法凭空解Sentiment Analysis的问题,也是需要一部分有监督数据的。我们此时的情感分析模型包括:

  1. BERT部分
  2. Linear Transformation部分

只是BERT部分的初始化来自 Self-Supervised Learning,而 Linear Transformation 部分采样的是随机初始化。这两部分的参数都用Gradient Descent来更新。

图7:使用BERT做情感分析

下图8其实是个对比,就是BERT部分不用预训练模型的初始化 (scratch) 和用了预训练模型的初始化 (fine-tune) 的不同结果,不同颜色的线代表GLUE中的不同任务。不用预训练模型的初始化会导致收敛很慢而且loss较高,说明预训练模型的初始化的作用。

图8:预训练模型的初始化结果

2 BERT 可以直接用在视觉任务上吗?

上面的 BERT 都是在 NLP 任务上使用,因为 NLP 任务可以把每个词汇通过 Word2Vec 自动转化成一个固定大小的 token,我们随机盖住一些 token,让模型根据这个不完整的句子来预测被盖住的 token 是什么。那么一个自然而然的问题是:对于图片来讲,能否使用类似的操作呢?

第1个困难的地方是:视觉任务没有一个大的词汇表。 在 NLP 任务中,比如图3所示,假设我们盖住词汇 "湾",那么就想让模型根据这个不完整的句子来预测被盖住的 token 是 "湾",此时我们有个词汇表,比如这个词汇表一共有8个词,"湾" 是第3个,则 "湾" 这个 token 的真值就是  ,只需要让模型的输出和这个  越接近越好。

但是 CV 任务没有这个词汇表啊,假设我盖住一个 patch,让模型根据这个不完整的 image 来预测被盖住的 patch 是什么。那么对应的这个  是什么呢?

BEIT 通过一种巧妙的方式解决了这个问题。

假设这个问题可以得到解决,我们就能够用 masked image modeling 的办法 (和BERT类似,盖住图片的一部分之后预测这部分) 训练一个针对图片的预训练模型,这个预训练模型就也可以像 BERT 一样用在其他各种 CV 的下游任务中啦。

3 BEIT 原理分析

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

论文地址:

https://arxiv.org/pdf/2106.08254.pdf

本文提出的这个方法叫做 BEIT,很明显作者是想在 CV 领域做到和 NLP 领域的 BERT 一样的功能。在第1篇文章中提到,训练好的 BERT 模型相当于是一个 Transformer 的 Encoder,它能够把一个输入的 sentence 进行编码,得到一堆 tokens。比如输入 "台湾大学",通过 BERT 以后会得到4个 tokens。并且这4个 tokens 也结合了sentence 的上下文。

那 BEIT 能不能做到类似的事情呢?,即能够把一个输入的 image 进行编码,得到一堆 vectors,并且这些个 vectors 也结合了 image 的上下文。

答案是肯定的。BEIT 的做法如下:

在 BEIT 眼里,图片有 2 种表示的形式:

image → image patches | visual tokens

在预训练的过程中,它们分别被作为模型的输入和输出,如下图9所示。

图9:图片有 2 种表示的形式:image patches or visual tokens

BEIT的结构可以看做2部分,分别是:

  • BEIT Encoder
  • dVAE

BEIT Encoder 类似于 Transformer Encoder,是对输入的 image patches 进行编码的过程,dVAE 类似于 VAE,也是对输入的 image patches 进行编码的过程,它们的=具体会在下面分别详细介绍。

3.1 将图片表示为 image patches

将图片表示为 image patches 这个操作和 Vision Transformer 对图片的处理手段是一致的。首先把  的图像分成  个展平的2D块 

式中, 是 channel 数,  是输入的分辨率,  是块大小。每个 image patch 会被展平成向量并通过线性变换操作 (flattened into vectors and are linearly projected)。这样一来,image 变成了一系列的展平的2D块的序列,这个序列中一共有 个展平的2D块,每个块的维度是

实作时  ,和 ViT 一致。

问:image patch 是个扮演什么角色?

答: image patch 只是原始图片通过 Linear Transformation 的结果,所以只能保留图片的原始信息 (Preserve raw pixels)

3.2 将图片表示为 visual tokens

这一步是啥意思呢?BEIT的一个通过 dVAE 里面一个叫做 image tokenizer 的东西,把一张图片  变成离散的 tokens  。字典  包含了所有离散 tokens 的索引 (indices)。

要彻底理解如何将图片表示为 visual tokens,那就得先从 VAE 开始讲起了,熟悉 VAE 的同学可以直接跳过3.2.1。

  • 3.2.1 变分自编码器 VAE

VAE 跟 GAN 的目标基本是一致的——希望构建一个从隐变量  生成目标数据  的模型,但是实现上有所不同。更准确地讲,它们是假设了 服从某些常见的分布(比如正态分布或均匀分布),然后希望训练一个模型 ,如下图10所示,这个模型能够将原来的概率分布映射到训练集的概率分布,也就是说,它们的目的都是进行分布之间的变换。

图10:生成模型的难题就是判断生成分布与真实分布的相似度,因为我们只知道两者的采样结果,不知道它们的分布表达式

图10里面的  服从标准的正态分布,那么我就可以从中采样得到若干个 ,然后对它做变换得到  。注意这些  都是通过  重构出来的数据集,那如何衡量  的分布与目标的数据集分布是不是一样的呢?注意在这里我们只有一堆重构出来的数据  ,但并不知道  的分布是啥,所以没法用KL散度来衡量  的分布与目标的数据集分布的关系,因为KL散度是根据两个概率分布的表达式来算它们的相似度的。我们只有一批从构造的分布采样而来的数据 ,还有一批从真实的分布采样而来的数据 (也就是我们希望生成的训练集)。我们只有样本本身,没有分布表达式,当然也就没有方法算KL散度。

上面的假设是直接从正态分布中采样,实际情况是  由真实的分布采样而来的数据 计算得到,并希望它接近标准正态分布。之后的步骤不变,假设 描述了一个由  来生成  的模型,而我们假设  服从标准正态分布,也就是

【声明】内容源于网络
0
0
极市平台
为计算机视觉开发者提供全流程算法开发训练平台,以及大咖技术分享、社区交流、竞赛实践等丰富的内容与服务。
内容 8155
粉丝 0
极市平台 为计算机视觉开发者提供全流程算法开发训练平台,以及大咖技术分享、社区交流、竞赛实践等丰富的内容与服务。
总阅读5.7k
粉丝0
内容8.2k