Vision & Language Pretrained Model 总结


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

出发点:

  1. 模型角度: encoder only的模型不擅长文本生成, 而encoder-decoder的模型又不擅长检索.
  2. 数据角度: 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

现有工作的缺点:

  1. Single Encoder: 代指纯视觉预训练模型, 这些模型不能处理VL Task.
  2. Dual Encoder: 类似CLIP的双塔, 有利于检索, 但对VL的融合能力不足, 无法直接迁移到VL Understanding任务里.
  3. 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抽取更多有用的信息.


文章作者: DaNing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 DaNing !
评论
 上一篇
2024-元旦 2024-元旦
2024-元旦都有小半年没更新博客了, 已经鸽了好久了… 首先祝大家元旦快乐! 这半年来, 找工作和申博我都试了试, 最后是选择了自己觉得更合适的一条路, 也算是人生中做的一个关键的节点吧. 2023年是LLM横行霸道的一年, 我印象中光是
2024-01-01
下一篇 
Large Model并行优化 Large Model并行优化
Large Model并行优化为什么要并行优化?大就是好, 虽然丛2019年人们的认识普遍就是大就是好, 这个概念在当今依然没有被改变, 只是有了更深刻的认识. 所以, 为什么要并行? 虽然大就是好, 模型太大显存吃不消(空间)
2023-06-01
  目录