1.背景
1.1 之前存在的两个问题
(1) 模型视角:大多数方法要么采用基于编码器的模型,要么采用编码器-解码器模型。基于编码器的模型不太容易直接转移到文本生成任务(例如,图像字幕),而编码器-解码器模型尚未成功用于图像文本检索任务。
(2)数据集j角度:存在噪声,训练次优
基于编码器的模型:CLIP,缺少decoder对文本生成的能力相对较弱
采用编码器-解码器:SimVLM
1.2 提出的解决办法
(a) 编码器-解码器的多模态混合(MED)
可以用于单一模态,也可以作为基于图像的文本任务的编码器或者是解码器
该模型与三个视觉语言目标联合预训练:图像文本对比学习、图像文本匹配和图像条件语言建模。
(2)字幕和过滤(CapFilt):一种新的数据集增强方法
将预先训练的MED微调为两个模块:一个是生成给定网络图像的合成字幕的字幕器,另一个是从原始网络文本和合成文本中去除噪声字幕的过滤器。
二.方法
1.1 BLIP 模型架构
能看到ALBEF和VLMO的影子。
- 每个图像-文本对只需要正向通过一次视觉转换器,并且分别三次正向通过文本转换器,并通不同的损失函数来激活 单模态编码器,基于图像的文本编码器,基于图像的文本解码器的功能。
- 通过在自注意力 (SA) 层和文本编码器的每个变换器块的前馈网络 (FFN) 之间插入一个额外的交叉注意力 (CA) 层来注入视觉信息。
1.2 损失函数
- 图像-文本对比度损失(ITC):激活单模态编码器
- 图像-文本匹配损失(ITM):激活基于图像的文本编码器 。
ITM是一种二元分类任务,其中模型使用ITM头(线性层)来预测图像-文本对匹配的还是不匹配的 - 语言建模损失(LM):激活基于图像的文本解码器
文本编码器和文本解码器共享除SA(self-attention)层之外的所有参数,只由SA层来捕捉编码和解码任务之间的差异同时也提高了交叉注意力和FFN层的效率。区别于ALBEF,BLIP的计算ITC和计算ITM的SA层共享参数。
编码器采用双向自注意来构建当前输入tokens的表示,而解码器采用因果自注意来预测下一个tokens。
1.3 CapFilt
引入了两个模块:一个用于生成给定网络图像的字幕的字幕器,以及一个用于去除噪声图像-文本对的过滤器。
三.模型实现
【代码】GitHub
核心问题就是想明白三个损失函数怎么实现,怎么对应(如果你vit和bert已经相对熟悉)
如果你对21年的ALBEF这篇论文和代码有所了解,就会发现其实代码上基本上一脉相承。它同样也是用到了动量蒸馏的技巧和ITC,ITM等训练目标,但是将原先的掩码语言建模(MLM)任务更换成了语言建模(LM)任务
ALBEF代码不熟悉的可以先看看【读论文看代码】多模态系列-ALBEF
3.1 模型构建
(1)tokenize增加了两个special tokens 和 一个编码器的tokenid
(2)视觉编码器额外提供了16层VIT的选择
(3)文本编码器从 ALBEF 的 BertForMaskedLM 替换成了一个用bert-base-uncased初始化的Bert模型
BaseModelOutputWithPoolingAndCrossAttentions
(4)多模态解码器(文本解码器)同样也是替换成了bert-base-uncased初始化的Bert模型,
CausalLMOutputWithCrossAttentions
3.2 语言建模(LM)任务
为了文本生成任务,将MLM任务更换成LM