BLIP:Bootstrapping Language-Image Pre-training

研究背景

视觉-语言预训练(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(束搜索)是一种确定性的解码方法 。目标是:生成概率最大的句子。

如图片:🐶

模型可能认为:

第一名: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

第一次: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即使没有专门训练视频数据,也能直接迁移到视频语言任务,并取得不错效果。

相关推荐
2301_780356701 小时前
全视通智慧医院解决方案:构建数智化医疗新生态
大数据·网络·人工智能
sunywz1 小时前
【AI RAG知识库】09.【检索】【节点7】
人工智能
国服第二切图仔1 小时前
HarmonyOS APP《画伴梦工厂》开发第54篇-鸿蒙AI开放能力——语音与自然语言处理
人工智能·自然语言处理·harmonyos
AC赳赳老秦1 小时前
采购专员自动化:OpenClaw 自动比价、生成询价单、跟踪供应商报价进度实战指南
开发语言·数据库·人工智能·python·自动化·github·openclaw
QiLinkOS1 小时前
QiLink OS的失败数据共享平台的运作模式是否适用于所有行业?
android·开发语言·人工智能·算法·重构·开源
秦歌6661 小时前
agno-9-Culture
人工智能
AI小白Lin1 小时前
我用三个 Python 脚本,让 AI 学会了"记得自己是谁"
人工智能
Godspeed Zhao1 小时前
具身智能中的无线技术——总览
人工智能·具身智能·无线技术
在书中成长1 小时前
HarmonyOS 小游戏《对战五子棋》开发第12篇 - 简单AI实现:规则引擎与优先级策略
人工智能·华为·harmonyos