研究背景
视觉-语言预训练(Vision-Language Pre-training,简称 VLP)显著提升了许多视觉语言任务的性能。
VLP可以理解为视觉领域的"BERT"或者"GPT"。基本思想是:
- 用大量图片+文本数据进行预训练;
- 让模型同时学习图片和文字之间的对应关系;
- 再迁移到各种下游任务。
如图片:🐶 一只狗在草地上玩飞盘。 文本:"A dog catches a frisbee on the grass."
模型不断学习:图片是什么内容?文本是什么意思?图片和文字是不是匹配?
因此,之后做很多任务都会变得更容易,如:图像描述(Image Captioning)、图片检索(Image Retrieval)、VQA(Visual Question Answering)、图文匹配
现有方法的问题
问题一:
大多数现有模型只能擅长理解类或生成类任务中的一种,不能同时做好,BLIP希望统一。
1.理解任务 【Encoder-based 擅长判断】**:**模型不用"创造"文字,而是理解图片和文字之间关系。
如图片:🐱 sitting on a sofa 问题:What animal is on the sofa? 模型回答:Cat。 属于VQA任务,是在固定答案集合中选择概率最高,不需要**逐词生成完整句子,**不算生成
或:
图片+文字是否匹配?
图片:🚗 文字:A red car. 输出:相似度 = 0.96 True
它们主要使用 Encoder(编码器)。大概结构:
图片 → Image Encoder → Image Feature
比较两个Feature是否接近
文字 → Text Encoder → Text Feature
Encoder模型特别适合:✅ 图文匹配 ✅ 图像检索 ✅ 分类,它没有Decoder,不会一句一句生成
这些都属于理解任务(Understanding)。
2.生成任务【Encoder-Decoder擅长写出来】:要求模型自己写文字。
如:输入图片 输出:A little boy is riding a bicycle.
结构:图片 → Encoder → Feature → Decoder → 一句一句输出文字
Encoder-Decoder适合Image Caption、OCR生成、Visual Dialog,生成能力很强,但是Retrieval效果不好。因为Retrieval需要快速计算Image Feature和Text Feature间距离。而Decoder主要负责预测下一个词,并不是为了计算Embedding。
问题二:
目前性能提升主要依赖于不断扩大网络收集的图文数据规模,但是数据噪声很多,监督信号并不好
noisy image-text pairs?
图片:🍕 标题:IMG_202205.jpg或者Nice.或者hahaha
图片:🐶 文字:My vacation.
文字几乎没有描述图片,模型学不到真正对应关系。还有错误标注
BLIP提出的方法
提出BLIP,一个新的视觉语言预训练框架,可以同时迁移到理解任务和生成任务。
做VQA、Caption、Retrieval、Text Generation都可以。
一、新的模型架构:MED
(Multimodal Mixture of Encoder-Decoder)
传统模型通常只有一种固定结构,而 MED 可以根据任务切换三种不同的工作方式。不同任务,打开不同功能。论文称:Mixture。
1.Unimodal Encoder
普通Encoder,separately encodes image and text. 图片和文字分别编码,比较距离。用于Image-Text Contrastive Learning(ITC)。
图片 → Image Encoder → Image Feature
文字 → Text Encoder(BERT) → Text Feature
BERT里也有CLS,
文本:A dog is running.
输入:
CLS A dog is running
最后CLS 的输出表示整个句子的语义,和ViT完全一样。
这一阶段主要学习图片和文本各自的表示,为后续图文对比学习(ITC)提供基础。
2.Image-grounded Text Encoder
基于图像的文本Encoder,加入Cross-Attention,图片帮助文字理解。
图片:🐶 文字:A dog is running.
Encoder:同时看图片、文字,学习是不是匹配,用于Image-Text Matching。
在文本编码器每一个 Transformer Block 中,都加入了一个 Cross-Attention(CA)层。
Self-Attention(SA) 只关注自己这一种模态 。 如:A cat sits on a sofa. "cat" 可以关注"A" "sits" "sofa",但是不能看图片,学到的是文本内部的关系。
Cross-Attention(CA) 可以关注另一种模态的信息 。 模型读到cat时,不仅可以关注其它单词,还可以关注图片中的🐱对应区域,学习图文之间关系
原来Transformer:Self Attention → Feed Forward
现在变成:Self Attention → Cross Attention → Feed Forward,每一层都会融合图片信息。
**Cross Attention作用:**如果不看图片,animal可能:狗?猫?马?不知道。
加入Cross Attention:文字开始关注图片,知道animal就是狗
又增加一个task-specific **Encode token,**如输入:
[Encode]
A cat sits on a sofa.
Encode 输出的向量代表:整张图片 + 整句话 共同形成的表示。称为:multimodal representation,以后Image-Text Matching(ITM)等任务,就利用这个向量完成分类。
3.Image-grounded Text Decoder
生成任务,Decoder开始工作,需要逐词生成一句话。
"replaces bidirectional self-attention with causal self-attention"这一句最重要。
如:图片:🐱
Decoder一步一步生成:A cat is sleeping,就是:Caption Generation。
所以作者把 Self-Attention【是Bidirectional的,左右都能看】 换成Causal Self-Attention(因果自注意力) 【只能看左边】,也叫掩码自注意力(Masked Self-Attention),保证模型在生成第 t 个词时,只能利用前面已经生成的词,而不能访问未来的词,这正是 GPT 等自回归语言模型采用的机制。
因为生成文本时不能"偷看答案",例如训练:A cat sits on a sofa.
生成到 A cat 时,模型只能看到 A cat,不能提前看到:sits on a sofa,否则训练就没有意义。
图片信息仍然通过 Cross-Attention 注入,因此模型在生成每一个词时,都可以参考图片内容。
如:
图片 → Image Encoder → 图片特征
↑
Cross-Attention
↑
[Decode] → A → cat → is → sitting → ...
Decode 表示开始生成句子。 模型看到 [Decode] 后,就开始一个词一个词地输出文本。
当生成到<eos>生成停止。
1、需要处理纯文本 时,它可以作为单模态编码器使用。
2、需要理解图片和文本之间的关系 时,它可以作为图像引导的文本编码器,负责提取图文联合表示,用于图文检索、视觉问答等理解任务。
3、需要生成文本 时,它可以作为图像引导的文本解码器,根据图片内容逐步生成文字描述。
为了让 MED 学会这些能力,作者同时设计了三种训练目标。
1、图文对比学习(Image-Text Contrastive Learning,ITC) 。它的目标是让匹配的图文在特征空间中距离更近,不匹配的图文距离更远。主要提升图文检索能力。
2、图文匹配(Image-Text Matching,ITM) 。模型需要判断一张图片和一句文字是否真正对应,帮助模型学习更细粒度的跨模态理解能力。
3、图像条件语言建模(Image-Conditioned Language Modeling,LM) 。模型根据图片内容预测下一词,学习如何生成自然、准确的图像描述,提升模型的生成能力。
Bootstrapping 可以理解成:自己帮助自己学习。 或者:**自动改善训练数据。**BLIP做了两步。
二、CapFilt(Captioning and Filtering)
目前高质量的图文数据非常少且人工标注昂贵。因此,近年来很多模型都改用互联网数据。
如图片:🐱🛋️
网页中 alt-text 可能是:Home Page,或者:Click here,或者:My lovely weekend
文字虽然能够大量自动获取,但很多时候没有描述图片内容, 因此这些 alt-text 对视觉语言学习来说是一种噪声监督(noisy signal)。监督信息本身就是错误的,模型学不到正确的图文对应关系。
1.Captioner生成新的Caption
先训练一个 Captioner。不是重新设计的新模型, 就是上一节介绍的 MED切换成Image-grounded Text Decoder(生成模式),然后利用 COCO 数据集微调。由于 COCO 的描述都是人工写的,因此 Captioner 能够学会:看到图片 → 生成准确描述。
网页图片:🐱🛋️ 网页原始文字:My lovely weekend
Captioner 不看网页文字,直接根据图片生成:A cat sitting on a sofa.【Synthetic Caption(合成描述)】 记作:
2.Filter过滤
新的描述并不是全部都拿去训练,因为模型可能生成错误描述,还需要第二个模块:Filter。
Filter 同样来自 MED。不过切换的是:Image-grounded Text Encoder(理解模式)。利用ITC、ITM进行微调,学会判断图片和文本是否真正匹配。
图片:🐱 文本:A cat sitting on a sofa. ITM Head 输出:Matched → 保留
图片:🐱 文本:A dog running. ITM Head 输出:Unmatched → 删除
Filter 不仅过滤 Captioner 生成的新文本 。还过滤原来的网页文本。 对于同一张图片,作者同时拥有 网页原始文字 和生成的新文字
。
Filter 会分别判断 是否匹配以及
是否匹配。
ITM Head 判断 Unmatched 的文本就删除,网页和生成文字都可能被删掉,只留高质量数据。
因为 Captioner 不是百分之百正确。如果图片比较复杂或者图片质量很差,Captioner 也可能描述错误。所以**生成以后仍然需要再检查一遍。**Captioning和Filtering两步缺一不可。
3.重新构建数据集
经过 Filter 得到的高质量图文对,与人工标注数据合并,形成一个新的训练集。然后重新训练一个 BLIP 模型。
实际上整个过程不是:训练 BLIP → 直接结束,而是:
① 训练初始 BLIP(MED)
↓
② 微调成 Captioner
↓
③ 微调成 Filter
↓
④ 清洗整个互联网数据
↓
⑤ 得到新的高质量数据集
↓
⑥ 从头重新训练最终 BLIP
因此,Captioner 和 Filter 更像是数据制作工具。 真正部署、测试时,使用的是最后重新训练出来的新 BLIP。 作者把这个过程称为Bootstrapping:
模型利用自己已有的能力去改善训练数据,再利用改善后的数据训练出一个更强的模型。
整个流程叫:Caption Bootstrapping,可以表示为:
网页图片 Iw
│
├──────────────┐
│ │
Captioner 原始网页文本 Tw
│ │
生成 Ts │
└──────┬───────┘
│
Filter(图文匹配)
│
保留高质量图文对(若二者都合适,都保留)
│
与 COCO 合并
│
重新训练新的 BLIP
模型先借助少量高质量人工数据(如 COCO)学会生成和判断图文,再反过来提升大规模网页数据的质量,最后再利用这些高质量数据重新进行预训练。整个过程形成了一个"模型提升数据质量,数据质量再提升模型能力"的循环,这正是 BLIP 中 CapFilt 的核心思想,也是它区别于以往直接使用网页图文数据训练的重要创新。
预训练目标
BLIP 利用三个互补的预训练目标共同训练模型。ITC 学习图片和文本的全局语义对齐,使模型具备检索能力;ITM 学习图文之间细粒度的对应关系,使模型具备更强的理解能力;LM 学习根据图片逐词生成文本,使模型具备生成能力。
1. Image-Text Contrastive Loss(ITC)
激活Unimodal Encoder(单模态编码器)。图片和文本分别独立编码,不进行跨模态交互。
假设有一张猫的图片:🐱
对应文本:A cat sitting on a sofa.
经过编码后得到图片向量和文本向量,训练目标就是让匹配的图片和文本向量距离更近,不匹配的距离更远。
例如一个 batch 中有三组图文:
| 图片 | 文本 |
|---|---|
| 猫 | A cat |
| 狗 | A dog |
| 汽车 | A car |
模型希望最后得到:猫 ↔ A cat 相似度高,猫 ↔ A dog 相似度低,猫 ↔ A car 相似度低,因此 ITC 学习的是全局语义对齐(global alignment)。
引入了Momentum Encoder(动量编码器)
因为现实中的训练数据并不完美。
如:图片:🐱,文本:A small pet sitting indoors. 虽然没有出现 "cat" 这个词,但也是正确描述。如果模型把所有没有配对的文本都认为是负样本,就会把一些实际上描述同一图片的文本也推远。因此 ALBEF 提出了Momentum Encoder 。可以理解成一个更新速度更慢、更稳定的教师模型 。它会产生更加稳定的特征表示,并利用这些表示生成 Soft Label(软标签)。
传统分类标签通常只有:Cat = 1,Dog = 0,软标签可能变成:Cat = 0.92,Pet = 0.87,Animal = 0.81。这样模型不会把所有非配对样本都当成完全错误,而是允许某些样本具有一定相似性,更符合真实数据的情况。
2.Image-Text Matching(ITM)
激活的是Image-grounded Text Encoder 。这时图片和文本已经通过 Cross-Attention 融合,模型学习的不再只是"整体是否相似",是更加细粒度(fine-grained)的对应关系。
如:图片:一只猫坐在沙发上。
文本一:A cat is sitting on a sofa. 文本二:A dog is sitting on a sofa.
对于 ITC 来说,两句话都出现了 "animal"、"sofa" 等类似语义,因此相似度可能都比较高。但 ITM 更关注细节,会进一步检查图片里的到底是不是猫?动作是不是坐着?位置是不是沙发?
ITM实际上就是一个二分类问题。输入融合后的图文表示( Encode 输出),经过一个线性层(ITM Head),最后预测Matched或 Not Matched。
Hard Negative Mining(困难负样本挖掘)
设训练数据中有两种错误文本:
1:A plane flying in the sky. 2:A dog sitting on a sofa.
对于猫图片来说,第一句太容易判断错误,第二句却很容易混淆。如果一直训练第一种错误样本,模型很快就学会了,没有什么提升。因此作者希望训练更加困难的负样本。
具体做法:先利用 ITC 的相似度。如果一个错误文本和图片非常相似:
图片:猫 文本:Dog sitting on sofa 相似度:0.82
它就更有可能被选中作为负样本。这样的训练更加有效,因为模型必须学习更加细致的视觉差别,而不仅仅依靠粗略语义。
3.Language Modeling(LM)
激活 **Image-grounded Text Decoder,**负责生成图片描述。
输入:🐱
模型逐词生成完整句子
A
↓
A cat
↓
A cat is
↓
A cat is sitting
↓
A cat is sitting on
...
训练目标:让模型预测的下一个词尽可能接近真实文本。
Label Smoothing = 0.1
它是一种常见的正则化方法。例如真实标签本来是:Cat = 1,Dog = 0;加入 Label Smoothing 后:Cat = 0.9,Dog = 0.1。这样模型不会过于自信,可以减少过拟合,提高泛化能力。
使用 LM ,而不是很多 VLP 模型采用的 MLM(Masked Language Modeling)?
MLM 就是 BERT 的训练方式。如:A cat is MASK on a sofa. 模型预测:sitting
这种训练方式只能学习**填空,**模型始终知道句子的大部分内容。而LM 是:模型必须一个词一个词生成。
A → A cat → A cat is → A cat is sitting
因此它学会了:**如何把图片信息转换成完整自然语言。**这种能力对于图像描述等生成任务更加重要。
参数共享(Parameter Sharing)
BLIP 同时具有 Text Encoder 和 Text Decoder,如果完全独立,参数会增加一倍。实际上两者只有 Self-Attention(SA) 不一样。
Encoder使用Bidirectional Self-Attention(双向自注意力), 能综合整个句子上下文理解当前词。Decoder 使用Causal Self-Attention(因果自注意力),预测下一个词只能看到前面的词,不能提前看到后面的词,因此生成更加符合真实推理过程。
除了 SA 不一样,其余模块其实作用相同,这些都可以共享。
于是 BLIP 中,Embedding、Cross-Attention、FFN都共享,只有 Self-Attention 分开。这样既减少参数数量,又能让 Encoder 和 Decoder 在共享知识的基础上分别完成理解和生成任务,提高训练效率,同时充分发挥多任务学习的优势。
Image Encoder(图像编码器)
采用 Vision Transformer(ViT) 作为图像编码器。
把图片切成很多小块(Patch)。
+------------------------+
| |
| 一张图片 |
| |
+------------------------+
ViT不会一次看整张图片,而是切成很多小块:
+----+----+----+----+
| P1 | P2 | P3 | P4 |
+----+----+----+----+
| P5 | P6 | P7 | P8 |
+----+----+----+----+
| P9 |P10 |P11 |P12 |
+----+----+----+----+
每一个 Patch 就像 NLP 中的一个 Word Token。
图片 → Patch → Embedding →Transformer
sequence of embeddings
每一个 Patch 都会变成一个向量。
例如:
Patch1 → [0.31,0.84,...]
Patch2 → [0.19,0.52,...]
Patch3 → [0.62,0.77,...]
最后得到:Patch1 Patch2 Patch3 ... Patch196,就是一串Embedding序列(Sequence)。
CLS Token
ViT最前面会加一个:
[CLS]
Patch1
Patch2
Patch3
...
因为最后Transformer会输出:
CLS embedding
Patch1 embedding
Patch2 embedding
...
其中:CLS就是整个图片的代表。
如图片:🐶
最后:
CLS → [0.84,0.91,0.63...]
表示:整张图片的信息, 代表Global Feature(全局特征)。
为什么不用目标检测器?
早期视觉语言模型通常会先利用目标检测器找到图片中的物体。
图片:🐱🛋️🌳
目标检测器先识别:Cat、Sofa、Tree,再把这些目标送给语言模型做视觉语言任务。
这种方法虽然有效,但是计算量较大,因为目标检测本身就是一个复杂任务。
ViT 不需要先检测物体,而是直接处理整张图片,因此计算更加简单、高效(computation-friendly),近年来很多视觉语言模型都开始采用这种方式。
传统:
ViT:
但是BLIP认为ViT更简单、更快、更统一、不需要额外目标检测器、更容易训练,所以采用ViT。
caption的选择
已经生成:
A dog is
模型对于下来**选哪个词?**不同算法有不同策略。
Nucleus Sampling
假设模型预测:(先按概率从大到小排序,然后才计算累计概率。)
| Token | 概率 | 累计概率 |
|---|---|---|
| running | 0.45 | 0.45 |
| playing | 0.25 | 0.70 |
| jumping | 0.15 | 0.85 |
| sleeping | 0.08 | 0.93 |
| barking | 0.04 | 0.97 |
| eating | 0.03 | 1.00 |
如果设置:p = 0.9,那么累计到:
running playing jumping sleeping
已经超过0.9。于是Sampling Pool(候选集合)就是:
running playing jumping sleeping
然后随机抽一个,可能抽到running,也可能 playing 或 jumping,这就是Sampling。
Nucleus(核心): 因为它只保留**概率最高的一小部分词。**不是所有词随机,而是只在最有可能的一部分里面随机。因此既不会太离谱,又有随机性。
p=0.9
论文说:p={0.85,0.9,0.95} 都差不多,p越大,候选越多,随机性越强。
如果 p=0.85 候选:running、playing、jumping
如果 p=0.95 候选:running、playing、jumping、sleeping、barking
Beam Search
Beam Search(束搜索)是一种确定性的解码方法 。目标是:生成概率最大的句子。
如图片:🐶
模型可能认为:
第一名:A dog is running. 概率:0.92
第二名:A brown dog is running. 概率:0.90
第三名:A dog plays outside. 概率:0.87
Beam Search总是选第一名。所以同一张图片,生成十次都是:A dog is running. 没有变化。
Nucleus Sampling VS. Beam Search
Nucleus Sampling
第一次:A brown dog is running.
第二次:A dog plays in the grass.
第三次:A happy dog running outdoors.
因为生成越随机意味着错误也越多,Noise Ratio更高,Filter删除比例更高。生成更加多样、更加令人意外的Caption。
如图片:🐶
Beam Search总是:A dog is running.
Nucleus生成的句子可能包含以前没有的信息:brown(颜色)、Labrador(品种)、frisbee(飞盘)、grassy(草地)、playful(状态)。
Beam Search对于任何狗都写 A dog. 任何猫都写A cat. 不会犯错,但是也没有新信息。
这一节可以总结成下面这张图
图片
│
▼
Captioner
┌────────────┴────────────┐
▼ ▼
Beam Search Nucleus Sampling
(确定性解码) (随机采样解码)
│ │
▼ ▼
"A dog is running." 每次可能不同:
• A brown dog is running.
• A playful dog runs outdoors.
• A Labrador chases a frisbee.
│ │
▼ ▼
信息较少 信息更多、更丰富
│ │
▼ ▼
BLIP预训练效果较差 BLIP预训练效果更好
核心思想
作者发现了一个看似矛盾但很重要的现象:
- Nucleus Sampling 生成的 Caption 噪声更多,因此会有更多 Caption 被 Filter 删除;
- 但是,保留下来的 Caption 往往更加丰富、多样,提供了更多细节和新的语义信息。
相比之下,Beam Search 虽然生成的 Caption 更稳定、错误更少,但容易反复使用训练集中最常见、最保守的表达(例如 "A dog is running."),对模型来说新增的信息有限。
实验结果说明:对于视觉语言预训练来说,合成 Caption 的"多样性(Diversity)"比单纯追求"最高概率(Most Probable)"更重要。 多样的 Caption 能让模型接触到更丰富的语言表达和视觉描述,从而学到更全面的视觉-语言对应关系。
结果
BLIP在很多视觉语言任务上都取得了当时最先进(State-of-the-Art,SOTA)的效果。
包括:Image-text Retrieval(图片找文字或文字找对应图片)、Image Captioning(给图片写描述)、VQA(Visual Question Answering)
BLIP即使没有专门训练视频数据,也能直接迁移到视频语言任务,并取得不错效果。