【视觉预训练】《BEIT: BERT Pre-Training of Image Transformers》 ICLR 2022

BEIT: BERT Pre-Training of Image Transformers

回顾 VLMo

【视觉预训练】《BEIT: BERT Pre-Training of Image Transformers》 ICLR 2022_第1张图片

BERT 回顾

【视觉预训练】《BEIT: BERT Pre-Training of Image Transformers》 ICLR 2022_第2张图片

在BERT中,每个单词或者字会分配一个 token,所以模型的输入是一系列 token id。MLM训练方式是 mask 一个位置的token,然后经过BERT之后预测这个位置的 token是什么。由于mask 的位置是我们自己选的,所以我们是有预测任务的 Ground Truth的,因此可以来优化模型参数

BERT应用于视觉任务

BERT应用在视觉任务上最大的困难是:视觉任务没有一个大的词汇表(vocabulary),比如上图 mask “湾”,softmax 预测 “湾” 的token id就好了。但是在CV任务中,mask一块patch,预测的Ground Truth是什么呢?

其实也有Ground Truth,直接恢复原图像patch的pixel。但是这样像素级别的恢复任务的缺点是 把模型的建模能力浪费在了 short-range dependencieshigh-frequency details

为了解决这个问题,本文提出的这个方法叫做 BEIT,很明显作者是想在 CV 领域做到和 NLP 领域的 BERT 一样的功能。训练好的 BERT 模型相当于是一个 Transformer 的 Encoder,它能够把一个输入的 sentence 进行编码,得到一堆 tokens。 BEIT 也是在做类似的事情,即能够把一个输入的 image 进行编码,得到一堆 vectors,并且这些个 vectors 也结合了 image 的上下文。

模型输入

在 BEIT 眼里,图片有 2 种表示的形式,即可以看作 image patches,又可以看作 visual tokens,在预训练的过程中,它们分别被作为模型的输入和输出,如下图所示:

【视觉预训练】《BEIT: BERT Pre-Training of Image Transformers》 ICLR 2022_第3张图片

将图片表示为 image patches 这个操作和 Vision Transformer 对图片的处理手段是一致的。将 x ∈ R H × W × C x \in \mathbb{R}^{H \times W \times C} xRH×W×C 的图片拉成 x p ∈ R N × ( P 2 C ) x^p \in \mathbb{R}^{N \times\left(P^2 C\right)} xpRN×(P2C) 的输入。

然后利用dVAE的 image tokenizer,把一张图片 x ∈ R H × W × C x \in \mathbb{R}^{H \times W \times C} xRH×W×C 离散成 tokens z = [ z 1 , … , z N ] ∈ V h × w z=\left[z_1, \ldots, z_N\right] \in \mathcal{V}^{h \times w} z=[z1,,zN]Vh×w,字典 V = { 1 , … , ∣ V ∣ } \mathcal{V}=\{1, \ldots,|\mathcal{V}|\} V={1,,V} 包含了所有离散索引。具体而言,作者训练了一个 discrete variational autoencoder (dVAE),训练的过程如下:

【视觉预训练】《BEIT: BERT Pre-Training of Image Transformers》 ICLR 2022_第4张图片

所以一张 224×224 的输入图片通过 Tokenizer 变成了 14×14 个 visual token,每个 visual token 是一个位于[1,8192]之间的数。就像有个 image 的词汇表一样,这个词汇表里面有 8192 个词,每个 16×16 的image patch会经过 Tokenizer 映射成 |V| 里面的一个词。因为 visual token 是离散的数,所以优化时没法求导,所以采用了 gumbel softmax 技巧。

BEIT模型

BEIT 的总体结构如下,BEIT 的 Encoder 结构就是 Transformer 的 Encoder,模型架构是一样的。图片在被分成 N = H W / P 2 N=H W / P^2 N=HW/P2 个展平的2D块 x p ∈ R N × ( P 2 C ) x^p \in \mathbb{R}^{N \times\left(P^2 C\right)} xpRN×(P2C) 之后,通过线性变换得到 E x i p \boldsymbol{E} x_i^p Exip,其中 E ∈ R ( P 2 C ) × D \boldsymbol{E} \in \mathbb{R}^{\left(P^2 C\right) \times D} ER(P2C)×D 。在concat上一个 special token [S]。这里作者还给输入加上了 1D 的位置编码 E p o s ∈ R N × D \boldsymbol{E}_{p o s} \in \mathbb{R}^{N \times D} EposRN×D,所以总的输入张量可以表示为:
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} x_i^p, \ldots, \boldsymbol{E} x_N^p\right]+\boldsymbol{E}_{p o s} H0=[e[s],Exip,,ExNp]+Epos
【视觉预训练】《BEIT: BERT Pre-Training of Image Transformers》 ICLR 2022_第5张图片

输入 BEIT 的 Encoder (就是 Transformer 的 Encoder) 之后,张量依次通过 L 个 Encoder Block:
H l = Transformer ⁡ ( H l − 1 ) \boldsymbol{H}^l=\operatorname{Transformer}\left(\boldsymbol{H}^{l-1}\right) Hl=Transformer(Hl1)
最后一层输出 H L = [ h [ s ] L , h 1 L , … , h N L ] \boldsymbol{H}^L=\left[\boldsymbol{h}_{[s]}^L, \boldsymbol{h}_1^L, \ldots, \boldsymbol{h}_N^L\right] HL=[h[s]L,h1L,,hNL] 作为 image patches 的 encoded representations。

训练方式

既然BEIT 是图像界的 BERT 模型,所以也遵循着和 BERT 相似的自监督训练方法。核心思想是:让 BEIT 看很多的图片,随机盖住一些 image patches,让 BEIT 模型预测盖住的patches是什么,不断计算预测的 patches 与真实的 patches 之间的差异,利用它作为 loss 进行反向传播更新参数,来达到 Self-Supervised Learning 的效果。

具体做法为:

  1. 给定输入图片 x \boldsymbol{x} x
  2. x \boldsymbol{x} x 变成 N 个 image patches { x i p } i = 1 N \left\{\boldsymbol{x}_i^p\right\}_{i=1}^N {xip}i=1N
  3. x \boldsymbol{x} x 变成 N 个 visual tokens { z i } i = 1 N \left\{z_i\right\}_{i=1}^N {zi}i=1N
  4. 随机盖住40% 的 image patches,盖住的位置可以表示为 M ∈ { 1 , … , N } 0.4 N \mathcal{M} \in\{1, \ldots, N\}^{0.4 N} M{1,,N}0.4N
  5. 把盖住的这40%的image patches 替换成可学习的编码 e [ m ] ∈ R D e_{[\mathrm{m}]} \in \mathbb{R}^D e[m]RD
  6. 现在这个输入的 image patches 就可以表示成:

x M = { x i p : i ∉ M } i = 1 N ⋃ { e [ M ] : i ∈ M } i = 1 N x^{\mathcal{M}}=\left\{\boldsymbol{x}_i^p: i \notin \mathcal{M}\right\}_{i=1}^N \bigcup\left\{\boldsymbol{e}_{[M]}: i \in \mathcal{M}\right\}_{i=1}^N xM={xip:i/M}i=1N{e[M]:iM}i=1N

  1. 把这个 x M x^{\mathcal{M}} xM 通过 L 层的 BEIT Encoder,得到 { h i L } i = 1 N \left\{\boldsymbol{h}_i^L\right\}_{i=1}^N {hiL}i=1N ,表示输入image patches的编码表示。
  2. 盖住的位置的输出 { h i L : i ∈ M } i = 1 N \left\{\boldsymbol{h}_i^L: i \in \mathcal{M}\right\}_{i=1}^N {hiL:iM}i=1N,去通过一个分类器,去预测盖住的这个 patch的相应的 visual token

p M I M ( z ′ ∣ x M ) = softmax ⁡ z ′ ( W c h i L + b c ) p_{\mathrm{MIM}}\left(z^{\prime} \mid x^{\mathcal{M}}\right)=\operatorname{softmax}_{z^{\prime}}\left(\boldsymbol{W}_c \boldsymbol{h}_i^L+\boldsymbol{b}_c\right) pMIM(zxM)=softmaxz(WchiL+bc)

式中 x M x^{\mathcal{M}} xM 是盖住之后的所有 image patches, W c ∈ R ∣ V ∣ × D , b c ∈ R ∣ V ∣ \boldsymbol{W}_c \in \mathbb{R}^{|\mathcal{V}| \times D}, \boldsymbol{b}_c \in \mathbb{R}^{|\mathcal{V}|} WcRV×D,bcRV,这里 |V|=8192 ,D 是模型的 Embedding dimension。

  1. BERT 的训练目标是最小化计算预测的 token 与真实的 token 之间的差异,所以BEIT的目标也是最小化计算预测的 token 与真实的 token 之间的差异。在 BEIT 里面,假设我盖住第 i 个patch,毫无疑问它对应的 visual token 应该是 z i z_i zi ,这时候我希望 Encoder 输出的第 i 个位置的东西通过分类器之后是 z i z_i zi 的概率最大,即:

max ⁡ ∑ x ∈ D E M [ ∑ i ∈ M log ⁡ p M I M ( z i ∣ x M ) ] \max \sum_{x \in \mathcal{D}} E_{\mathcal{M}}\left[\sum_{i \in \mathcal{M}} \log p_{\mathrm{MIM}}\left(z_i \mid x^{\mathcal{M}}\right)\right] maxxDEM[iMlogpMIM(zixM)]

式中, D D D 是全部的无标签训练数据, M M M 是随机盖住的位置, x M x^M xM 是盖住以后的corrupted image。 i ∈ M i \in \mathcal{M} iM 就是对盖住的每个 patches,BEIT 的 Encoder 在这个位置的输出 h i L \boldsymbol{h}_i^L hiL 通过线性分类器 softmax ⁡ z ′ ( W c h i L + b c ) \operatorname{softmax}_{z^{\prime}}\left(\boldsymbol{W}_c \boldsymbol{h}_i^L+\boldsymbol{b}_c\right) softmaxz(WchiL+bc) 之后得到预测的 visual token真实 patches 对应的 visual token 越接近越好:

【视觉预训练】《BEIT: BERT Pre-Training of Image Transformers》 ICLR 2022_第6张图片

下游任务fine-tuning

拿着训练好的 BEIT Encoder,给它添加一个 分类层 (Linear Transformation),池化层 (Avg),和激活函数,只微调分类层 (Linear Transformation),池化层 (Avg),和激活函数的参数,Encoder的参数保持不变 BEIT 在下游任务 Fine-tuning

【视觉预训练】《BEIT: BERT Pre-Training of Image Transformers》 ICLR 2022_第7张图片

DALLE

【视觉预训练】《BEIT: BERT Pre-Training of Image Transformers》 ICLR 2022_第8张图片

你可能感兴趣的:(论文解读,CV,多模态,bert,深度学习,人工智能)