BLIP 系列
BLIP
背景
BLIP(Bootstrapping Language-Image Pre-training)是一种统一的视觉语言理解与生成的预训练模型。其核心思想是通过 Bootstrapping 方法,利用 Captioner-Filter 机制生成高质量的文本标注,从而提高数据的质量和数量。BLiP 通过多模态混合结构 (Multimodal mixture of Encoder-Decoder, MED) 实现了视觉和语言的对齐与生成。
在 BLIP 中,Bootstrapping 体现在 Captioner-Filter 机制中:
- Captioner: 生成图像的文本标注。
- Filter: 去除标注中的噪声,提升数据质量。
通过不断迭代生成和过滤,BLIP 能够从有限的标注数据中扩展出更多高质量的训练数据。
模型结构
BLIP 的核心是多模态混合结构(MED),包括以下四个模块:
Image Encoder
- 基于 Transformer 的 ViT 架构。将输入图像分割为多个 patch,并编码为一系列 Image Embedding
- 使用
[CLS]
token 表示全局图像特征 - 功能:提取图像特征,用于对比学习
Text Encoder
- 基于 BERT 架构
- 在输入文本开头添加
[CLS]
token 以总结句子 - 功能:提取文本特征,用于对比学习
Image-grounded Text Encoder
- 在 Text Encoder 中添加 Cross-Attention 层,注入视觉信息
- 在输入文本开头添加
[Encode]
token 以标识特定任务 - 功能:提取文本特征并与图像特征对齐
Image-grounded Text Decoder
- 将自注意力替换为因果自注意力(Causal Self-Attention)层
- 在输入文本开头和结尾分别添加
[Decode]
token 和[EOS]
token,标识序列的开始和结束 - 功能:生成符合图像和文本特征的文本描述
预训练方法
图文对比损失(Image-Text Contrastive Loss, ITC)
- 目标:对齐图像和文本的特征空间
- 方法:
- 最大化正样本图像-文本对的相似度
- 最小化负样本图像-文本对的相似度
- 使用动量编码器生成伪标签以辅助训练
- 作用:用于训练 Image Encoder 和 Text Encoder
图文匹配损失(Image-Text Matching Loss, ITM)
- 目标:实现视觉和语言之间的细粒度对齐
- 方法:
- 通过二分类任务预测图像-文本对是正样本还是负样本
- 使用 Hard negative mining 技术更好地捕捉负样本信息
- 作用: 用于训练 Image-grounded Text Encoder
语言建模损失(Language Modeling Loss, LM)
- 目标:生成图像的文本描述
- 方法:
- 通过优化交叉熵损失函数,训练模型以自回归的方式最大化文本概率
- 使用 0.1 的标签平滑计算损失
- 作用:用于训练 Image-grounded Text Decoder
CapFilt 机制
由于高质量的人工标注数据(如 COCO 数据集)有限,BLIP 从网络中收集了大量图像-文本对作为训练数据。然而这些网络数据的文本通常包含噪声。为此,BLIP 提出了 Captioning and Filtering (CapFilt)机制 :
字幕器 Captioner
- 功能: 基于 Image-grounded Text Decoder, 生成给定图像的文本描述
- 训练:在 COCO 数据集上使用 LM 损失函数进行微调
- 输出: 给定网络图片 ,生成字幕 。
过滤器 Filter
- 功能: 基于 Image-grounded Text Encoder,去除文本噪声
- 训练:在 COCO 数据集上使用 ITC 和 ITM 损失函数进行微调
- 方法:通过比对文本和图像的匹配情况,删除原始 Web 文本 和合成文本 中的噪声
数据集构建
将过滤后的图像-文本对与人工注释对结合,形成新的高质量数据集。使用该数据集重新训练 BLIP 模型。
总训练流程
- 初始训练:使用含有噪声的网络数据训练 BLIP
- 微调:在 COCO 数据集上微调 Captioner 和 Filter
- 数据过滤:使用 Filter 从原始网络文本和合成文本中去除噪声,得到干净数据
- 最终训练:使用干净数据重新训练 BLIP,得到高性能模型
BLIP2
与 BLIP 相比,BLIP-2 模型新引入 Querying Transformer(Q-Former)模块用于对图文进行对齐。
模型结构
BLIP-2由以下三个主要组件组成:
- Image Encoder: 从输入图片中提取视觉特征。文中采用了两种不同的网络结构:CLIP 训练过的 ViT-L/14 和 EVA-CLIP 训练过的 ViT-g/14。
- Large Language Model (LLM): 大语言模型进行文本生成。
文中尝试了两种不同的网络结构: decoder-based LLM 和 encoder-decoder-based LLM
- Q-Former: 弥补视觉和语言两种模态间的差异,实现跨模态间的对齐。Q-Former 使用了一组可学习的查询向量 (Queries)来从冻结的 Image Encoder 中提取视觉特征,然后传入 LLM 供其生成文本。 Q-Former 的结构由 Image Transformer 和 Text Transformer 两个子模块构成, 它们共享相同的自注意力层。
- Image Transformer: 用于与冻结的图像编码器进行交互,从中提取一定数量的输出特征。
- Text Transformer: 既可以作为文本编码器,也可以作为文本解码器。它创建一组可学习的 Queries 作为 mage Transformer 的输入,这些 Queries 在 Image Transformer 中通过自注意力层相互作用,并通过交叉注 意力层与冻结的图像特征进行交互。
模型流程
- Image Encoder 接收图像作为输入,输出图像的视觉特征
- Q-Former 接收文本和 Image Encoder 输出的图像视觉特征,结合查询向量进行融合,学习与文本相近的视觉特征,输出 LLM 能够理解的视觉表示
- LLM 模型接收 Q-Former 输出的视觉标识,生成对应文本
预训练方法
BLIP2采用两阶段预训练策略:
- 表示学习阶段 (Representation Learning)
- 生成学习阶段 (Generative Learning )
表示学习
在表示学习阶段,Q-Former 被连接到冻结的 Image Encoder,训练集为图像-文本对。通过联合优化三个预训练目标,Q-Former 学习到高质量的跨模态对齐表示。为了控制 Image Transformer 和 Text Transformer 的交互方式,Q-Former 在 Query 和 Text 之间采用了不同的注意力掩码策略。
图像-文本对比学习(ITC)
ITC的自标是对齐图像嵌入和文本嵌入,最大化匹配图文对的相似度,同时最小化不匹配图文对的相似度。
- 计算来自 Image Transformer 的 Query 嵌入与来自 Text Transformer 的文本嵌入之间的相似度
- 为了避免信息泄漏,ITC 采用单模态自注意力掩码,禁止 Query 和 Text 之间的直接交互
- Text Transformer 的文本嵌入是
[CLS]
标记的输出嵌入,而 Query 嵌入包含多个输出嵌入。计算每个 Query 嵌入 与文本嵌入的相似度,选择最高的一个作为图像-文本相似度
基于图像的文本生成(ITG)
ITG的自标是在给定输入图像作为条件的情况下,训练 Q-Former生成文本,迫使 Query提取包含文本信息的视觉特征。
- 由于 Q-Former 的架构不允许冻结的图像编码器和文本标记之间的直接交互,生成文本所需的信息必须由 Query 提取,并通过自注意力层传递给文本标记
- ITG 采用多模态因果注意力掩码(Causal Attention Mask),允许 Query 相互关注,但不能关注 Text 标记。每个 Text 标记可以处理所有 Query 及其前面的 Text 标记
- 将
[CLS]
标记替换为新的[DEC]
标记,作为第一个文本标记来指示解码任务
图像-文本匹配(ITM)
ITM 的目标是细粒度判断图文对是否匹配,从而增强模态对齐的局部一致性。
- 将 Image Transformer 输出的每个 Query 嵌入输入到一个二分类线性分类器中,获得对应的 logit
- 将所有 logit 平均,计算匹配分数。ITM 使用双向自注意力掩码,允许所有 Query 和 Text 之间相互关注
生成学习
在生成学习阶段,Q-Former 被连接到冻结的 LLM,以利用 LLM 的语言生成能力。具体步骤如下:
- 特征投影: 使用全连接层将 Q-Former 输出的 Query 嵌入线性投影到与 LLM 文本嵌入相同的维度
- 输入构造: 将投影后的 Query 嵌入添加到输入文本嵌入的前面
- 生成任务: 由于 Q-Former 已经过预训练,能够提取包含语言信息的视觉表示,因此它可以作为信息瓶颈,将最有用的信息传递给LLM,同时过滤不相关的视觉信息,减轻 LLM学习视觉-语言对齐的负担
BLIP2 试验了两种类型的 LLM:
- 基于 Decoder-only 的 LLM: 使用语言建模损失进行预训练,冻结的 LLM 根据 Q-Former 的视觉表示生成文本
- 基于 Encoder-Decoder 的LLM: 使用前缀语言建模损失进行预训练,将文本分为前缀和后缀两部分。前缀文本与视觉表示连接作为 LLM 编码器的输入,后缀文本作为 LLM 解码器的生成目标
官方代码: