2024.4.21: 添加CoCa, 并修改对WPA的描述.
2024.4.23: 增加了BLIP-2的部分描述.
Vision & Language Pretraining 总结
本文只是以总结的形式梳理了近期比较有代表性的VLP模型结构和预训练任务, 推荐有基础后再阅读.
UNITER
UNITER是典型的单塔模型, 直接把Region Feature也变成Token Level Feature和Token Emebdding(Text)一并交给Transformer完成各类预训练任务.
UNITER有四个预训练任务:
- MLM - Masked Language Modeing: 和BERT相同, 对文本打
[MASK]
预测原来的Token. - MRM - Masked Region Modeling: 把Region Vector变成全0, 但是由于Visual Feature是连续的, 没法像NLP的Token一样被多分类预测出来, 所以作者提出了三个MRM的变体:
- MRFR - Masked Region Feature Regression: 用一个Linear层把被Mask的ROI Feature直接恢复出来, 用L2回归损失.
- MRC - Masked Region Classification: 用Linear预测ROI Feature的Semantic Class. 这里没有Ground Truth Label, 直接用Fast RCNN预测的物体类别当做Ground Truth Label.
- MRC-kl - Masked Region Classification with KL-Divergence: 由于MRC中的Label过于硬了, 所以MRC-kl用Soft Label当做Ground Truth.
- ITM - Image-Text Matching: 采样若干负样本, 用
[CLS]
接一个Linear来判断图文是否匹配. - WRA - Word Region Aligment: 粒度比ITM更细, 对齐每个Text Token和Region. 由于图文在正样本里是匹配的, 所以可以最小化最优传输的分配代价, 来达到细粒度对齐的目的. 可以把最优传输看成是计算Text Modality到Vision Modality的距离, 最小化这两个分布的距离即可.
当预训练的时候, 每次只Mask掉一个模态的Token, 使另一个模态的信息能充分交互.
Oscar
出发点:
Region Feature可能不能很好的区分开不同的物体, 例如图中的dog和couch实际上很大部分重叠到了一起, 但是在Word Embedding Space上二者是分开的.
单塔, 把Region Tag的语义标签也加入到模型的预训练过程中:
Tag本身具备Language的语义, 但实际上描述的是Visual信息, 所以Tag打通了V&L的桥梁.
和现在普遍使用”中间过渡模态“的思想非常像.
两个预训练任务, 都与Tag相关
- Dictionary View: Tag和Text都属于同一个Word Dictionary下, 所以沿用BERT的MLM任务, 要求模型用剩余的Tag或Text, Region Feature来恢复.
- Modality View: Tag和Region Feature同属Visual Signal, 作者令训练阶段有50%的概率替换Tag为负样本, 用
[CLS]
来预测Tag是否被替换.
CLIP
CLIP的模型和训练方法非常简单, A picture is worth a thousand words:
采用双塔结构, 最大化主对角线上的匹配的图文对之间的相似度, 最小化对角线两侧其他文本的相似度即可, 力大砖飞.
在做Zero Shot Image Classification时, 直接用prompt A photo of a {object}
来预测Image和每个Class的Prompt之间的相似度.
伪代码:
# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter
# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2
ViLT
ViLT的核心思想: 弱Embed重交互:
先前的模型在Embedding上是不均衡或者都非常重的, 反而是在交互上设计的比较弱. 作者认为弱Embedding重交互也可以得到很好的性能, 并且非常省时间.
模型非常简单, 直接单塔大一统:
经典预训练任务ITM, MLM. WPA与UNITER里的WRA类似, 算作是ITM Loss的一个附加Loss. 由于ViLT从输入的Region变成了Patch, 所以作者希望Text Token和Image Patch的匹配程度越高越好, 即总体距离越小越好.
ALBEF
出发点:
先前的模型(UNITER, Oscar)仍然在用Region based视觉特征, 整个模型性能受限于Detector的性能. 并且因为Detector是Freeze住的, 没有参与E2E的训练, 所以Visual Feature和Text Feature一起扔给一个单塔模型会导致Visual和Text没有对齐, 单塔学起来就比较困难.
模型框架:
双塔和单塔融合结构, 先双塔, 后单塔融合. BERT被拆成两半, 一半给文本用, 一半给多模态用.
至于为什么劈开的是BERT而不是ViT, 有些人认为在多模态任务中往往是视觉占主导地位, 所以对Visual这边要给的重一些.
虽然叫Multimodal Encoder, 但实际上是个Decoder.
ALBEF用了三个Loss: ITC, ITM, MLM, 都是多模态老传统了.
作者认为, 从Web上爬下来的数据都太脏了, 很有可能出现图文不匹配的情况. 所以直接用One Hot的Cross Entropy去计算对模型的伤害会比较大. 所以要用Momentum Distillation, 也就是MoCo中提到的方式来缓解这种强惩罚.
假设图像Token为$\boldsymbol{v}$, 文本Token为$\boldsymbol{w}$. $g_v, g_w, g_v^\prime, g_w^\prime$ 都是Linear Projection. Momentum Encoder得到的V & L归一化以后的Feature为$g_v^{\prime}\left(\boldsymbol{v}_{\mathrm{cls}}^{\prime}\right), g_w^{\prime}\left(\boldsymbol{w}_{\mathrm{cls}}^{\prime}\right)$.
ITC Loss计算如下. 计算主干和Momentum Encoder的图文匹配相似度:
$$
\begin{aligned}
s(I, T)=g_v\left(\boldsymbol{v}_{\mathrm{cls}}\right)^{\top} g_w^{\prime}\left(\boldsymbol{w}_{\mathrm{cls}}^{\prime}\right) \\
s(T, I)=g_w\left(\boldsymbol{w}_{\mathrm{cls}}\right)^{\top} g_v^{\prime}\left(\boldsymbol{v}_{\mathrm{cls}}^{\prime}\right)
\end{aligned}
$$
其实和MoCo是完全一样的, 拿Momentum Encoder和主干Encoder投影完做点积. 主要是为了扩大Dictionary Size.
$M$ 为图文匹配对数量, 计算InfoNCE:
$$
\begin{aligned}
p_m^{\mathrm{i} 2 \mathrm{t}}(I)=\frac{\exp \left(s\left(I, T_m\right) / \tau\right)}{\sum_{m=1}^M \exp \left(s\left(I, T_m\right) / \tau\right)} \\
p_m^{\mathrm{t} 2 \mathrm{i}}(T)=\frac{\exp \left(s\left(T, I_m\right) / \tau\right)}{\sum_{m=1}^M \exp \left(s\left(T, I_m\right) / \tau\right)}
\end{aligned}
$$
如果使用Momentum Distillation, 则需要从计算One Hot损失变为加权计算Momentum Encoder得到的概率分布$\boldsymbol{q}^{\mathrm{i} 2 \mathrm{t}}, \boldsymbol{q}^{\mathrm{t} 2 \mathrm{i}}$ 和主干预测结果$\boldsymbol{p}_m^{\mathrm{i} 2 \mathrm{t}}, \boldsymbol{p}_m^{\mathrm{t} 2 \mathrm{i}}$ 之间的KL散度:
$$
\begin{aligned}
s(I, T)=&g_v\left(\boldsymbol{v}_{\mathrm{cls}}\right)^{\top} g_w^{\prime}\left(\boldsymbol{w}_{\mathrm{cls}}^{\prime}\right) \\
s(T, I)=&g_w\left(\boldsymbol{w}_{\mathrm{cls}}\right)^{\top} g_v^{\prime}\left(\boldsymbol{v}_{\mathrm{cls}}^{\prime}\right) \\
&\Downarrow \\
s^\prime(I, T)=&g_v^\prime\left(\boldsymbol{v}^{\prime}_{\mathrm{cls}}\right)^{\top} g_w^{\prime}\left(\boldsymbol{w}^{\prime}_{\mathrm{cls}}\right) \\
s^\prime(T, I)=&g_w^\prime\left(\boldsymbol{w}^{\prime}_{\mathrm{cls}}\right)^{\top} g_v^{\prime}\left(\boldsymbol{v}^{\prime}_{\mathrm{cls}}\right) \\
\end{aligned}
$$
$$
\begin{aligned}
\mathcal{L}_{\mathrm{itc}}=&\frac{1}{2} \mathbb{E}_{(I, T) \sim D}\left[\mathrm{H}\left(\boldsymbol{y}^{\mathrm{i} 2 \mathrm{t}}(I), \boldsymbol{p}^{\mathrm{i} 2 \mathrm{t}}(I)\right)+\mathrm{H}\left(\boldsymbol{y}^{\mathrm{t} 2 \mathrm{i}}(T), \boldsymbol{p}^{\mathrm{t} 2 \mathrm{i}}(T)\right)\right] \\
&\Downarrow \\
\mathcal{L}_{\text {itc }}^{\mathrm{mod}}=&(1-\alpha) \mathcal{L}_{\mathrm{itc}}+\frac{\alpha}{2} \mathbb{E}_{(I, T) \sim D}\left[\mathrm{KL}\left(\boldsymbol{q}^{\mathrm{i} 2 \mathrm{t}}(I) | \boldsymbol{p}^{\mathrm{i} 2 \mathrm{t}}(I)\right)+\mathrm{KL}\left(\boldsymbol{q}^{\mathrm{t} 2 \mathrm{i}}(T) | \boldsymbol{p}^{\mathrm{t} 2 \mathrm{i}}(T)\right)\right]
\end{aligned}
$$
MLM任务也做相应的改动:
$$
\begin{aligned}
\mathcal{L}_{\mathrm{mlm}}=&\mathbb{E}_{(I, \hat{T}) \sim D} \mathrm{H}\left(\boldsymbol{y}^{\mathrm{msk}}, \boldsymbol{p}^{\mathrm{msk}}(I, \hat{T})\right) \\
&\Downarrow \\
\mathcal{L}_{\mathrm{mlm}}^{\mathrm{mod}}=&(1-\alpha) \mathcal{L}_{\mathrm{mlm}}+\alpha \mathbb{E}_{(I, \hat{T}) \sim D} \mathrm{KL}\left(\boldsymbol{q}^{\mathrm{msk}}(I, \hat{T}) | \boldsymbol{p}^{\mathrm{msk}}(I, \hat{T})\right)
\end{aligned}
$$
在ITM Task中, 作者采用前面计算ITC时除去匹配对相似度最高的图文对作为Hard Negative, 作为一个比较难的负样本让模型学习.
BLIP
出发点:
- 模型角度: encoder only的模型不擅长文本生成, 而encoder-decoder的模型又不擅长检索.
- 数据角度: Web端获得的图文匹配对有大量噪声.
模型结构图:
不难看出, BLIP实际上也是延续ALBEF的一种单双塔融合模型(两篇论文均出自Salesforce之手), 在Image Encoder和Text Encoder完成了两个模态的对齐, 在这个基础上额外加了一个Text Decoder完成Language Modeling的任务, 取代了MLM.
作者共享了所有的Text Encoder的部分参数, 除了SA是独有的, CA和FFN在二者之间共享.
所以BLIP的预训练任务也是ITC, ITM, 以及新加入的LM.
在计算ITC的时候同样是延续ALBEF对ITM用了Hard Negative, 而知识蒸馏以另一种方式CapFilt在BLIP中体现.
至于BLIP为什么要这么设计, 请看后面的CapFilt.
由于大部分图文对都来自网络, 质量很低, 作者希望通过Captioning and Filtering来得到质量更高的数据:
在数据中, 人为标注的数据$\{(I_h, T_h)\}$ 肯定是质量非常高的, 但是从网上爬下来的图文对 “image and alt-text pairs” $\{(I_w, T_w)\}$ 质量就差很多, 包含了大量噪声.
这时候再看看作者设计的模型, 既然Image - grounded Text Decoder实现的是对图像的描述, Image - grounded Text Encoder完成的是对图文是否匹配的判断, 那么Captioning and Filtering的框架就呼之欲出了:
作者首先在所有数据$\{(I_h, T_h)\} + \{(I_w, T_w)\}$ 上完成BLIP的预训练, 然后在人为标注的数据$\{(I_h, T_h)\}$ 上对Captioner和Filter进行微调.
微调后, Captioner为网上爬下来的图像$I_w$ 生成描述$T_w$, 再把这部分生成的图文对交给Filter. Filter将网上爬下来的图文对$\{(I_w, T_w)\}$ 和Captioner生成的图文对进行过滤, 最后将这两部分和人为标注的数据$\{(I_h, T_h)\}$ 一起作为新的数据集重新训练一个BLIP.
参数共享在CapFilt阶段是不启用的, 作者在文中有实验说明.
BLIP和ALBEF其实思想上非常相似, 从出发点到模型再到左脚踩右脚上天的思想都是一致的.
CoCa
现有工作的缺点:
- Single Encoder: 代指纯视觉预训练模型, 这些模型不能处理VL Task.
- Dual Encoder: 类似CLIP的双塔, 有利于检索, 但对VL的融合能力不足, 无法直接迁移到VL Understanding任务里.
- Encoder - Decoder: Generative Pretraining, 在VL Alignment上很差.
模型图:
Attentional Pooling就是一层Cross Attention, 将Query作为Q, Image Feature作为KV, 从而使得Query提炼图像中的特征.
Image Encoder可以是预训练的Visual Encoder, 在计算Contrastive Loss的时候, Query(Contrastive Query)数量设定为1, 这时候作用和[CLS]类似. 在计算Image Caption Loss的时候, 可能需要更细粒度的Visual Feature, 所以设定这种Query(Cap Query)有256个.
文中写到, 整个Text Decoder的前半部分的Cross Attention全部被忽略, 以便于编码文本单独的特征. 所以文本模态的Text Decoder其实就是Casual Mask + Self Attention.
损失函数:
- Single-Encoder Classification: 只对Image Encoder做各类图像相关的分类任务的损失, 在有标注数据下进行.
- Dual-Encoder Contrastive Learning: 在Image Encoder和纯文本模态的Text Decoder上做的ITC Loss.
- Encoder-Decoder Captioning: 两个Text Decoder都用上的Next Token Prediction Loss.
伪代码:
综上, 个人认为CoCa和上面讲过的BLIP很像, 甚至在对视觉信息的处理上是下面要说的BLIP-2里Q-Former的雏形.
VLMo
VLMo对不同模态使用了专家系统(MOE), 大框架如下:
SA是可以被共享的, 当VLMo执行不同任务时, 不同的FFN会被启用:
如图, VLMo预训练一共使用了三个Loss: ITC, ITM, MLM, 同样ITM也带有Hard Negative, 和ALBEF, BLIP一样. 做ITC时候, 只走V-FFN和L-FFN, 不使用VL-FFN, 此时VLMo更像双塔一些. 当做ITM和MLM时候, VLMo的前(L-F)层用V-FFN和L-FFN对Image Patch和Word Token分别编码, 后F层用VL-FFN把两种模态的数据整合, 此时VLMo更像ALBEF类的单双塔融合模型. 在Base和Large中F分别取2和3.
实验中证明Shared SA比不Share性能要高很多, 这可能说明SA对模态并不是那么敏感, 而且只是用来控制数据流的一个组件而已, 与模态无关.
由于VLMo使用了专家系统, 所以VLMo的使用方式可以十分灵活. VLMo将自己的训练过程拆分为多个阶段:
模型首先在Image dataset上训练SA和V-FFN, 然后再把它们冻住, 去训练L-FFN(用MLM), 此时可以认为VLMo在VL Task上已经有一个良好的初始化, 并且L-FFN是兼容SA输入的. 所以在Image - Text Pair上进行预训练时, 直接开放全量微调.
BLIP-2
出发点: 当前大规模模型在预训练期间的高额计算消耗太大, 数据也用的特别多.
作者引入一个lightweight Querying Transformer (Q-Former)来完成Visual & Language模态的桥接过程:
作者把Q-Former的训练拆分为两个阶段:
- 首阶段: 让Q-Former从Freeze Image Encoder中学习VL表示.
- 次阶段: 从Freeze LLM中学习VL表示.
Q-Former结构和首阶段预训练如下:
Q-Former实际上由双塔的两个Transformer组成, 分别被称为Image Transformer和Text Transformer. 结构上类似于BLIP中的Image-Grounded Text Encoder和Text Encoder.
Image Transformer的SA和Text Transformer的SA参数是共享的(这点和VLMo出奇的一致). Learnable Query从Image Transformer给入, 通过CA来从Frozen Image Encoder中获取视觉信号.
作者还在文中补充了一个小细节, 实际上的Visual Key Value采用的是Image Encoder的倒数第二层输出, 而不是最后一层, 效果会稍微好一点, 这点与大家使用Stable Diffusion的时候取CLIP的倒数第二层输出有点类似.
所以但从结构上来看, 首阶段的训练目标是希望Query能够学到从Image Encoder中抽取对Text最有用的内容. 再看训练任务也是这样, 设计了三种:
- ITC(Image-Text Contrastive Learning): 虽然说是老生常谈的Loss, 但因为Query经过Trm以后得到的表示有多个, 所以作者计算了多个Query与Text Transformer
[CLS]
的余弦相似度, 选择相似度最大的作为正样本. 为了避免信息泄露, 在做ITC的时候要保证Q和T之间是互相不可见的(最右侧Mask). - ITG(Image-grounded Text Generation): 使得Q对T完全可见, T单独用Casual Mask, 然后生成图文匹配的文本段. 这就要求Query必须覆盖Image的全部信息, 且Query抽取出的信息必须是有效的(中间Mask).
[CLS]
也被换成[DEC]
. - ITM(Image-Text Matching): ITM也是常见Loss, Q必须拥有两个模态的信息才能一起判断图文是否匹配, 作者对所有Query都计算ITM Loss, 最后取平均作为Logits, 同时也使用Hard Negative.
次阶段预训练, 直接用Q-Former完成图生文:
由于在首阶段中Q-Former已经完成了Query从Image Encoder中抽取关键信息的学习, 这也就使得Visual Signal可以被Query以Soft Visual Prompt的形式传递给LLM. 所以Q-Former中的Text Transformer变得不再必要, 可以被丢弃. Query表示还需要过一层Linear Project和大模型输入维度对齐.
如果不要首阶段直接硬学的话, 由于没有Text Transformer打辅助, 所以想要让Q-Former学到从Image中抽取出更多有关文本的信息会更难. 但文本模态在Q-Former首阶段训练中起到的实际上是一个Grounding的作用, 根据Language来让Learnable Query抽取更多有用的信息.