type
status
date
slug
summary
tags
category
icon
password
该工作个人主观打分:6.5
打分理由:作为CLIP后续工作,主要通过在任务复杂度方面的scale up去对效果的提升。其中两阶段优化策略指导出了工程上的优化思路。但写作有点混乱,读起来不像CLIP那么畅快淋漓。huggingface上开源是个加分项,但实际在后续图像生成等工作中follow的并不多。算是一篇值得花 2h~4h去阅读文章和代码的工作。
BLIP & BLIP-2
BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation Jan 28, 2022
BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models Jan 30, 2023
推荐读transfomers的:https://huggingface.co/docs/transformers/model_doc/blip-2
学习资料【Video】
创新点
BLIP

相较于 CLIP,BLIP 不仅采用
contrastive loss,还增加了 match loss 和 language loss。同样颜色的模块之间 share weights,可以看到这里有几个模块- Image Encoder
- Text Encoder
- Image-Grounded Text Encoder (其实就是之前的 Text-Encoder,只不过多了一个 CrossAttn 的对齐模块)
- Image-Grounded Text decoder,为了生成任务,把 Image-grounded Text encoder 里的
Bi Self-Att替换成了Causal Self-Att
- 单模态编码器Bert:分别对图像和文本进行编码。文本编码器与 BERT(Devlin 等,2019)相同,在文本输入的开头附加一个 [CLS] 标记,用于概括句子内容。
- 基于图像的文本编码器:通过在文本编码器的每个 Transformer 块中,将自注意力(SA)层与前馈网络(FFN)之间插入一个额外的跨模态注意力(CA)层来注入视觉信息。在文本中附加一个任务特定的 [Encode] 标记,其输出嵌入表示图像-文本对的多模态表示。
- 基于图像的文本解码器:将基于图像的文本编码器中的双向自注意力层替换为因果自注意力层。用 [Decode] 标记信号标记序列的开始,并使用一个序列结束标记信号其结束。
视觉 Transformer (ViT):
这里初始化ViT后,用了预训练好的权重,作为
self.visual_encoder ,后续又初始化一个新的,self.visual_encoder_m 和其作为对应这里取得是ImageEmbedding中的第一个Token
MED 模型:MED 模型的核心在于通过三种模式实现对多模态任务的支持:
- 单模态编码器:分别处理图像和文本输入,文本部分直接采用 BERT 方法。
- 基于图像的文本编码器:通过跨模态注意力层结合图像和文本信息,使得模型可以生成具有语义关联的多模态表示。
- 基于图像的文本解码器:将文本解码过程调整为因果关系(只能关注过去的序列),以支持生成任务。
BLIP 2
The BLIP-2 model was proposed in BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models by Junnan Li, Dongxu Li, Silvio Savarese, Steven Hoi. BLIP-2 leverages frozen pre-trained image encoders and large language models (LLMs) by training a lightweight, 12-layer Transformer encoder in between them, achieving state-of-the-art performance on various vision-language tasks. Most notably, BLIP-2 improves upon Flamingo, an 80 billion parameter model, by 8.7% on zero-shot VQAv2 with 54x fewer trainable parameters.
主要就是引入了 pretrain 的 model,中间揉了个 QFormer 来做中介去拼接两个 pretrain 的 models
QFormer主要用来对视觉输出的Token进行提取和压缩。也就是让VisionEncoder输出的Token长度变小,从而节省后面的LLM输入token数量,降低计算开销。

技术细节
BLIP
Image Encoder:Visual Transformer 从头训练的,但还是利用了预训练好的ViT(来自Deit或者Google)
MED:Multimodal mixture of encoder-decoder
- Unimodal Encoder: Text-encoder 是 Bert (
[CLS]token 代表整个句子)。Image Encoder 是 Visual Transformer。
- Image-grounded text encoder: 视觉特征通过插入额外的
cross-attention(在self-attention和feed-forward-network)之间),在每个 text-encoder 的 transformer block。
- Image-grounded text decoder: A
[Decode]token is used to signal the beginning of a sequence, and an end-of-sequence token is used to signal its end.
BLIP 2
Frozen Image Encoder❄️:CLIP
Frozen LLM❄️:Flan-T5
Adaptor:🔥QFormer
只有QFormer可训练。但是和他图里展示的不同,代码显示,QFormer实际上不接受text或者text-embedding的输入。
伪代码:
关键模块说明
- Vision Encoder: 提取图像特征,通常基于 CLIP Vision Transformer。
- Q-Former (Query Transformer): 学习性查询嵌入与图像特征交互,用于提取相关信息。
- Language Model: 结合图像信息和文本输入,生成自然语言文本。
- 数据流: 图像 → 编码特征 → 查询特征 → 文本生成。
预训练目标
BLIP
Image-Text Contrastive Loss (ITC)

这里的contrastive learning 就是和CLIP中一样的。有一点细节不一样的是把哪个token当做整个text的表征。CLIP选择的是末尾Token [EOS], 这里选择的是开头的[CLS]。其他都一样
Image-Text Matching Loss (ITM)
- Binary classification loss with hard sample mining,这里就和siglip中一样。然后这里选择negative pairs。这里利用一个困难pair挖掘的策略,当contrastive similarity比较高但确实是negative pairs的时候,更有可能选择作为negative pair 来作为ITM的目标
Language Modeling Loss (LM)
- cross-entropy loss in auto-regression manner。用一个标签平滑策略(0.1)。
标签平滑(Label Smoothing)是一种正则化技术,通过将目标标签分布稍微“平滑”以降低模型过度自信的风险,从而提高泛化能力。具体实现是将一个“硬”标签分布(例如 [0, 1, 0])调整为一个更“软”的分布(例如 [0.05, 0.9, 0.05])。
在 BLIP 中的语言建模损失中,标签平滑的作用是对目标文本的概率分布施加正则化,减少模型在训练时对单一正确答案过于自信的现象。
label_smoothing参数:这是一个控制标签平滑程度的超参数,通常设置为 0.1。
smooth_value:计算每个非目标类别分配的概率,由label_smoothing / vocab_size得出。
- 目标分布的平滑:
- 正确类别的概率被减少到
1 - label_smoothing。 - 其余类别的概率被均匀分配到
label_smoothing / vocab_size。
- Log-Softmax:对预测的 logits 进行数值稳定的 log-softmax 转换。
- 损失计算:交叉熵计算中乘上了“平滑后”的目标分布,从而实现标签平滑。
二阶段训练
CapFilt:

先用前面的数据训练一个初版的 BLIP,然后基于 COCO 数据集去基于不同的训练目标来搞成两个模型,一个是 Captioner ,一个 Filter。
a captioner to generate captions given web images, and a filter to remove noisy image-text pairs.
训练好后,用外部数据,来过 captioner,然后用 filter 过一遍,然后继续提升 MED 这个模型
BLIP 2
和BLIP-1 一样, 用了 ITC,ITM和ITG
也用了CapFilt
数据集
BLIP
训练数据集:
- COCO (Common Objects in Context)
- # images: 113K
- # text: 567K
- Visual Genome (VG)
- # images: 100K
- # text: 769K
- SBU Captions
- # images: 860K
- # text: 860K
- Conceptual Captions (CC) 3M
- # images: 3M
- # text: 3M
- Conceptual Captions (CC) 12M
- # images: 10M
- # text: 10M
- LAION
- # images: 115M
- # text: 115M
评估数据集:
- COCO Test Set
- 用于评估Image-Text Retrieval和Image Captioning任务。
- Flickr30K
- # images (train/validation/test): 29k/1k/1k
- 用于评估Image-Text Retrieval任务。
- NoCaps Validation Split
- 用于评估Image Captioning任务。
- VQA2.0
- # images (train/validation/test): 83k/41k/81k
- 用于评估Visual Question Answering (VQA)任务。
- NLVR2
- 用于评估Natural Language Visual Reasoning任务。
- VisDial v1.0
- 用于评估Visual Dialog任务。
BLIP 2
训练数据集:
- COCO (Common Objects in Context)
- 用于图像-文本检索、图像描述生成和视觉问答(VQA)任务的预训练和微调。
- Visual Genome
- 用于图像-文本检索、图像描述生成和视觉问答(VQA)任务的预训练和微调。
- CC3M (Conceptual Captions 3M)
- 用于图像-文本检索、图像描述生成和视觉问答(VQA)任务的预训练。
- CC12M (Conceptual Captions 12M)
- 用于图像-文本检索、图像描述生成和视觉问答(VQA)任务的预训练。
- SBU (SBU Captions)
- 用于图像-文本检索、图像描述生成和视觉问答(VQA)任务的预训练。
- LAION400M
- 用于图像-文本检索、图像描述生成和视觉问答(VQA)任务的预训练。
- NoCaps
- 用于图像描述生成任务的零样本评估。
评估数据集:
- VQAv2
- 用于视觉问答(VQA)任务的零样本评估。
- GQA
- 用于视觉问答(VQA)任务的零样本评估。
- OK-VQA
- 用于视觉问答(VQA)任务的零样本评估。
- Flickr30K
- 用于图像-文本检索任务的零样本评估。
数据集:和 BLIP 一样,但经过了一些处理
pretrain 模型结构选择
BLIP2 中间的模型进行了两阶段的学习,第一个阶段是 vision-language representation learning,从冻结参数的 pretrain image encoder 中学,第二个阶段是 vision-to-language 任务,从 LLM 中学。

在 BLIP2 中的 Q-former 实际上是个bert的Encoder,也是 用bert-base来进行权重初始化,但 crossAttn 部分的权重是随机初始化的。
总的来说,Q-former 含 188 Million 个参数。
第一阶段的学习(Bootstrap Vision-Language Representation Learning from a Frozen Image Encoder)
Image-Text Contrastive Learning (ITC)

这里应该是 query 产出的 token 被认为是 text 的某种表示,长度 32,和真正的 ground truth text 去得到 ITC,本质上是个多分类任务。问题是 label 从哪儿来啊。。。
ITG Loss(Image-grounded Text Generation)
目标是让这个 Q-former 具有文字生成的功能。由于该结构不允许 image encoder(frozen)直接和 text token 接触,所以输入的可学习 queries 必须得通过学习来拥有为了 text 输出而抓取 image 特征的能力。这里用了个 multimodal causal self-attention mask 来控制。这里每一个 query 都可以看到彼此但看不到 text tokens。text tokens 可以看到所有的 query 和其之前的 text tokens。这里还将
[CLS] 这个特殊的 token 换成了 [DEC]Image-Text Matching (ITM)
是一个二元的 classifier,来预测 image-text pair 是否成对.本质上就是siglip
样例代码
BLIP
BLIP2
BLIP和BLIP2的主要区别
架构区别
VisionEncoder部分,BLIP 和 BLIP2的主要区别:
权重来源和更新机制:
- BLIP: vision_encoder 中的一个ViT 权重来自于 Deit或者Google的,一个初始化啥也没有,然后用momemtum的方式来更新。
- BLIP2:来自于CLIP的ViT-L,直接用,不对其进行训练
输出要素:
- BLIP:只取vision_encoder的每个输出的第0个的embedding来表征整个图
- BLIP-2:取所有的除了第0个输出,要后面的所有token,用来和QFormer进行交叉attention。
Text部分,BLIP 和 BLIP2的主要区别:
- BLIP:基于Bert的Encoder和Decoder,都用了
- BLIP2:QFormer是Bert-base,LLM增加了模型的生成能力,这里是用的Flan-T5 / opt
- Author:Yixin Huang
- URL:https://yixinhuang.cn/article/blip_blip2
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts








