0%
URL
TL;DR
BLIP
是 Salesforce
提出的一种图文多模态对齐算法,全称是 Bootstrapping Language-Image Pre-training
,是一种自举的图文多模态预训练算法
- 相较于
CLIP
只能对齐图像和文本表征,BLIP
将任务范式进行了扩展,基本已经有了多模态大模型的雏形
Algorithm
BLIP 整体架构
![blip_1.png](https://s2.loli.net/2025/01/18/oHgnamrsQYBRUeX.png)
BLIP
在预训练阶段,包含三种损失函数
Image-Text Contrastive Loss
:对齐图像和文本表征,和 CLIP
的对齐方式类似,不同的是 BLIP
引入了 Momentum Model
,可以使得训练更加稳定
Image-Text Macthing Loss
:图像和文本匹配损失,输出 True
或 False
,本质是交叉熵损失
Language Modeling Loss
:语言建模损失,预测下一个词(大模型范式),用于文本内容生成
- 从上图可以看出,模型实际包含四个部分:
Image Encoder
:图像编码器,将图像编码为 Image Embedding
Text Encoder
:文本编码器,将文本编码为 Text Embedding
Image-grounded Text Eecoder
:图像驱动文本编码器,用文本特征 Cross-Modal Attention
去索引图像特征,输出文本图像特征是否匹配(True / False
)
Image-grounded Text Decoder
:图像驱动文本解码器,用文本特征 Cross-Modal Attention
去索引图像特征,用逐个 Token
预测的方式生成文本,回答文本对应的问题
- 从实现代码看,
Text Encoder
/ Image-grounded Text Eecoder
/ Image-grounded Text Decoder
实际上共用了一个 Bert
预训练模型的一组参数(仅仅在部分位置不共享参数)
Text Encoder
:
- 原生
Bert
模型,用于文本编码
- 不做
Cross-Modal Attention
,只做 Self-Attention
- 最后输出层为表征层
- 用特殊的
[CLS]
作为任务标识符
Image-grounded Text Eecoder
:
- 魔改
Bert
模型,加入 Cross-Modal Attention
- 这种状态处于
encoder
和 decoder
之间,比 encoder
多了 Cross-Modal Attention
,比 decoder
少了 Causal Self-Attention
- 用文本特征去索引图像特征
- 最后输出层为二分类层
- 用特殊的
[Encoder]
作为任务标识符
Image-grounded Text Decoder
:
- 魔改
Bert
模型,将其转化成一个完全的 decoder
形态,主要包括两点:
- 加入
Cross-Modal Attention
,用文本特征去索引图像特征
- 由于是生成任务,所以需要用
Causal Self-Attention
取代 Bert
默认的 Bidirection Self-Attention
- 最后输出层为
vocab prob
层,用于生成文本(下一个文本在词表中的概率)
- 用特殊的
[Decoder]
作为任务标识符
- 三个模型仅仅在
Head
层和 Attention
层参数上有所不同,其余参数共享
Bootstrapping 策略
BLIP
中的 B
就是 Bootstrapping
的意思,即自举,表示此算法有一种自我增强的方式
- 自我增强的方式主要是通过
CapFilt
方法实现的:
Captioner
:用于为图像生成高质量的文本描述
Filter
:用于过滤掉低质量的图像-文本对,保留高质量的对用于训练
CapFilt
工作流程:
- 生成伪标签:使用
Captioner
为无标签或弱标签图像生成文本描述,形成伪标签
- 过滤伪标签:使用
Filter
评估生成的伪标签的质量,保留高质量的伪标签
- 更新训练数据集:将过滤后的高质量伪标签与原始训练数据集合并,形成新的训练数据集
- 重新训练模型:使用更新后的训练数据集重新训练模型,从而改进模型的性能
Thoughts
- 在某种程度上,
BLIP
统一了几乎所有的图文多模态任务,除了无法做图像生成任务外,其他任务都可以通过 BLIP
的不同模块组合实现
BLIP
的 Bootstrapping
策略是一种自我增强的方式,可以使得模型在无监督的情况下不断提升性能,如今这几乎是多模态预训练算法的标配
- 从实验的角度告诉我们,
encoder
和 decoder
做充分的参数共享是可行的,仅仅在少量的位置上不共享参数,就可以实现完全不同任务的模型