BLIP论文笔记

论文地址:BLIP

代码地址:BLIP

Abstract

视觉-语言预训练(VLP)已经提升了许多视觉-语言任务的性能。然而,大多数现有的预训练模型只在理解类任务或生成类任务中表现出色。此外,性能提升主要通过扩大从网络收集的噪声图像-文本对数据集来实现,这是一个次优的监督来源。在本文中,我们提出了BLIP,一个新的VLP框架,可以灵活地迁移到视觉-语言理解和生成任务。BLIP通过自举标题的方式有效利用噪声网络数据,其中标题生成器生成合成标题,过滤器移除噪声标题。 我们在广泛的视觉-语言任务上取得了最先进的结果,如图像-文本检索(平均recall@1提升2.7%)、图像标题生成(CIDEr提升2.8%)和视觉问答(VQA得分提升1.6%)。BLIP还展现了强大的泛化能力,可以零样本直接迁移到视频-语言任务。

!tip

这个摘要其实体现了很多当时研究的问题所在,尤其是在阅读了CLIP与VILT论文之后,存在的问题很明显:

专业化困境: 现有模型要么擅长理解(如检索),要么擅长生成(如描述),缺乏统一性

数据质量瓶颈: 依赖网络爬取的噪声数据,存在大量不准确的图像-文本配对

扩展性限制: 简单的数据量扩展并不能解决根本的数据质量问题

BLIP模型在此基础上提出了他们的解决方案:

  1. 统一架构: 设计了能同时处理理解和生成任务的模型架构
  2. 数据自举: 用模型自身来清洗和改善训练数据质量
  3. 双模块协作: Captioner负责生成,Filter负责筛选,形成闭环优化

Introduction

视觉-语言预训练最近在各种多模态下游任务上取得了巨大成功。然而,现有方法存在两个主要局限性:

(1) 模型视角: 大多数方法要么采用基于编码器的模型,要么采用编码器-解码器模型。然而,基于编码器的模型不太容易直接迁移到文本生成任务(如图像描述生成),而编码器-解码器模型尚未成功应用于图像-文本检索任务。

(2) 数据视角: 大多数最先进的方法在从网络收集的图像-文本对上进行预训练。尽管通过扩大数据集规模获得了性能提升,但我们的论文表明噪声网络文本对于视觉-语言学习是次优的。

为此,我们提出了BLIP:用于统一视觉-语言理解和生成的自举语言-图像预训练。 BLIP是一个新的VLP框架,能够支持比现有方法更广泛的下游任务。它分别从模型和数据角度引入了两个贡献:

(a) 多模态编码器-解码器混合架构(MED): 一种用于有效多任务预训练和灵活迁移学习的新模型架构。MED可以作为单模态编码器、图像引导的文本编码器或图像引导的文本解码器运行。该模型通过三个视觉-语言目标进行联合预训练:图像-文本对比学习、图像-文本匹配和图像条件语言建模。

(b) 标题生成与过滤(CapFilt): 一种从噪声图像-文本对中学习的新数据集自举方法。我们将预训练的MED微调为两个模块:一个标题生成器用于为网络图像生成合成标题,一个过滤器用于从原始网络文本和合成文本中移除噪声标题。

此处Claude4给出一个分析很好,也在下面补充:

!info

编码器模型的局限性:

典型代表: CLIP、ALBEF等

擅长任务: 图像-文本检索、分类等理解任务

局限性: 无法直接生成连贯的文本序列,因为缺乏自回归生成能力

具体问题: 当需要生成图像描述时,编码器只能产生固定长度的表示,无法逐词生成文本

下面是BLIP的模型架构MED,如下:

整体可以分为四个主要部分,从左到右分别为:

  1. 图像编码器
  2. 文本编码器
  3. 视觉文本编码器
  4. 视觉文本解码器

图像编码器

将文本分割为多个Patch,然后输入编码器得到image embedding,此处仍然采取的是ViT架构(遵循VILT的设计),完全不使用卷积神经网络,而是用Transformer架构进行替代。

![[Drawing 2025-05-21 19.57.03.excalidraw|1000]]

文本编码器

图片上看的不是很真切,但是查了别的博客,这里直接使用的BERT的架构,BERT本身就是Transformer的编码器部分。大致结构如下图所示:

第二部分的Bi self-attention再级联前向传播的结构与论文《Attention is all you need》中的网络结构类似:

ITC损失

此处的 ITC 全称是 Image-Text Contrastive Loss(图像-文本对比损失),这是BLIP模型中三个预训练目标之一。

1. 特征提取
  • 图像通过视觉编码器(Vision Transformer)得到图像特征 f v f_v fv
  • 文本通过文本编码器得到文本特征 f t f_t ft
2. 相似度计算

计算图像特征和文本特征之间的余弦相似度:
s ( v , t ) = f v ⋅ f t ∣ ∣ f v ∣ ∣ ⋅ ∣ ∣ f t ∣ ∣ s(v,t) = \frac{f_v \cdot f_t}{||f_v|| \cdot ||f_t||} s(v,t)=∣∣fv∣∣⋅∣∣ft∣∣fv⋅ft

3. 对比损失公式

ITC损失包含两个方向:
图像到文本方向:
L i 2 t = − 1 N ∑ i = 1 N log ⁡ exp ⁡ ( s ( v i , t i ) / τ ) ∑ j = 1 N exp ⁡ ( s ( v i , t j ) / τ ) L_{i2t} = -\frac{1}{N}\sum_{i=1}^{N} \log \frac{\exp(s(v_i, t_i)/\tau)}{\sum_{j=1}^{N} \exp(s(v_i, t_j)/\tau)} Li2t=−N1i=1∑Nlog∑j=1Nexp(s(vi,tj)/τ)exp(s(vi,ti)/τ)
文本到图像方向

L t 2 i = − 1 N ∑ i = 1 N log ⁡ exp ⁡ ( s ( v i , t i ) / τ ) ∑ j = 1 N exp ⁡ ( s ( v j , t i ) / τ ) L_{t2i} = -\frac{1}{N}\sum_{i=1}^{N} \log \frac{\exp(s(v_i, t_i)/\tau)}{\sum_{j=1}^{N} \exp(s(v_j, t_i)/\tau)} Lt2i=−N1i=1∑Nlog∑j=1Nexp(s(vj,ti)/τ)exp(s(vi,ti)/τ)

总的ITC损失:

L I T C = 1 2 ( L i 2 t + L t 2 i ) L_{ITC} = \frac{1}{2}(L_{i2t} + L_{t2i}) LITC=21(Li2t+Lt2i)

其中:

  • N N N是批次大小
  • τ \tau τ是温度参数
  • ( v i , t i ) (v_i, t_i) (vi,ti)是匹配的图像-文本对
    在BLIP中,视觉文本编码器和视觉文本解码器是模型的核心组件,我来详细解释它们的实现原理和设计思路:

视觉文本编码器(Multimodal Encoder)

实现方式
复制代码
输入:图像特征 + 文本特征
架构:基于BERT的Transformer编码器
关键组件:Cross Attention + Self Attention
具体结构
  • 输入处理

    • 图像特征:

      C L S \] i m g , p a t c h 1 , p a t c h 2 , . . . , p a t c h N \] \[CLS\]_{img}, patch_1, patch_2, ..., patch_N\] \[CLS\]img,patch1,patch2,...,patchN

    • 文本特征:

      C L S \] t x t , t o k e n 1 , t o k e n 2 , . . . , t o k e n M \] \[CLS\]_{txt}, token_1, token_2, ..., token_M\] \[CLS\]txt,token1,token2,...,tokenM

    • 拼接成:

      C L S \] i m g , p a t c h e s , \[ C L S \] t x t , t o k e n s \] \[CLS\]_{img}, patches, \[CLS\]_{txt}, tokens\] \[CLS\]img,patches,\[CLS\]txt,tokens

  • Transformer层

    • Self Attention:处理图像和文本的联合表示
    • Cross Attention:显式建模图像-文本交互
    • 前馈网络:特征变换
作用
  • 学习图像和文本的深层交互
  • 为ITM(Image-Text Matching)任务提供融合特征
  • 输出用于判断图像-文本对是否匹配

视觉文本解码器(Multimodal Decoder)

实现方式
复制代码
输入:图像特征 + 部分文本序列
架构:基于GPT的Transformer解码器
关键组件:Causal Self Attention + Cross Attention
具体结构
1. Causal Self Attention
  • 对文本序列进行因果自注意力
  • 确保生成时只能看到前面的token
  • 掩码矩阵防止信息泄露
2. Cross Attention机制
python 复制代码
# 伪代码示例
class CrossAttention:
    def forward(self, text_hidden, image_features):
        # Query来自文本特征
        Q = self.query_proj(text_hidden)
        # Key和Value来自图像特征
        K = self.key_proj(image_features)
        V = self.value_proj(image_features)
        
        # 计算注意力
        attention_weights = softmax(Q @ K.T / sqrt(d_k))
        output = attention_weights @ V
        return output
3. 为什么需要Cross Attention

信息流向

  • Query(Q):来自当前生成的文本特征
  • Key(K)和Value(V) :来自图像编码器的输出
    作用机制
  1. 视觉引导:文本生成过程中动态关注图像的不同区域
  2. 内容对齐:确保生成的文本与图像内容一致
  3. 细节捕获:根据生成进度关注图像的相关细节

一个需要注意的点是:相同颜色的部分是参数共享的,即视觉文本编码器和视觉文本解码器共享除 Self-Attention 层之外的所有参数。每个 image-text 在输入时,image 部分只需要过一个 ViT 模型,text 部分需要过3次文本模型。

接入前面图像编码器输出的原因

1. 分层特征利用
复制代码
图像编码器输出 → 提供视觉特征基础
文本编码器输出 → 提供语言特征基础
多模态编码器 → 融合交互特征
多模态解码器 → 生成任务特征
2. 信息传递路径
  • 直接连接:保留原始单模态信息
  • 交叉连接:建立跨模态关联
  • 层次融合:从浅层到深层逐步融合
3. 任务特化设计
python 复制代码
# 不同任务使用不同组件
if task == "Image-Text Retrieval":
    use_unimodal_encoders()  # ITC损失
elif task == "Image-Text Matching":
    use_multimodal_encoder()  # ITM损失
elif task == "Image Captioning":
    use_multimodal_decoder()  # LM损失

CapFilt模块

模块主要解决数据质量困境:

  • 高质量人工标注数据:数量有限,如COCO数据集,标注成本极高
  • 网络爬取数据:规模庞大但质量参差不齐,alt-text往往不能准确描述图像内容,存在大量噪声
    核心思想
    通过自举学习(Bootstrapping 的方式,利用少量高质量数据训练模型,再用训练好的模型来改善大规模网络数据的质量。
    数据符号说明
  • I h , T h I_h, T_h Ih,Th:人工标注的图像-文本对(高质量,小规模)
  • I w , T w I_w, T_w Iw,Tw:网络爬取的图像-文本对(低质量,大规模)
  • T s T_s Ts:模型生成的合成文本
  • T ~ w , T ~ s T̃_w, T̃_s T~w,T~s:经过过滤的高质量文本

具体工作流程:

第一阶段:模型初始化

使用人工标注数据 I h , T h {I_h, T_h} Ih,Th → 预训练基础MED模型

第二阶段:专门化微调

从同一个预训练模型分别微调出两个专门化模块:

  1. Captioner(描述生成器)
    本质: 图像引导的文本解码器(Image-grounded Text Decoder)
    微调目标: 语言建模(LM)目标
    功能: 为网络图像 I w I_w Iw生成高质量的合成描述 T s T_s Ts
    训练数据: COCO等人工标注数据集
  2. Filter(质量过滤器)
    本质: 图像引导的文本编码器(Image-grounded Text Encoder)
    微调目标: ITC(图像-文本对比)+ ITM(图像-文本匹配)目标
    功能: 判断图像-文本对是否匹配,过滤噪声数据
    过滤标准: ITM头预测为"不匹配"的文本被视为噪声
第三阶段:数据增强与过滤
伪代码流程
python 复制代码
for web_image in web_images:
    # 1. 生成合成描述
    synthetic_caption = captioner.generate(web_image)
    
    # 2. 过滤原始网络文本
    if filter.is_matched(web_image, original_web_text):
        keep_original_text()
    
    # 3. 过滤合成文本
    if filter.is_matched(web_image, synthetic_caption):
        keep_synthetic_text()

第四阶段:数据集重构

最终数据集组成:
D = { I h , T h } + { I w , T ~ w } + { I w , T ~ s } D = \{I_h, T_h\} + \{I_w, T̃_w\} + \{I_w, T̃_s\} D={Ih,Th}+{Iw,T~w}+{Iw,T~s}

即:原始人工标注数据 + 过滤后的网络文本 + 过滤后的合成文本

第五阶段:模型重新预训练

使用增强后的高质量数据集D重新预训练新的BLIP模型

相关推荐
蜗牛快跑213几秒前
使用 Cursor 从 0 到 1 开发一个全栈 chatbox 项目
前端·人工智能·ai·ai编程
眠修1 分钟前
Python 实现web请求与响应
开发语言·python
鸡鸭扣8 分钟前
leetcode hot100:十四、解题思路大全:真·大全!
数据结构·python·算法·leetcode·力扣·笔试
ruxue.feng13 分钟前
机器学习的一些基本概念
人工智能·机器学习
郜太素20 分钟前
深度学习实战:从图像分类到文本生成的完整案例解析
人工智能·pytorch·rnn·深度学习·神经网络·计算机视觉·自然语言处理
爱凤的小光34 分钟前
Opencv常见学习链接(待分类补充)
人工智能·opencv·学习
钢铁男儿36 分钟前
C# 深入理解类(析构函数和this关键字)
java·python·c#
python算法(魔法师版)39 分钟前
云计算,大数据,人工智能
大数据·人工智能·云计算
折戟不必沉沙39 分钟前
python使用pycharm和conda 设置默认使用清华镜像
python·pycharm·conda
Relissc_Cao43 分钟前
线性回归中涉及的数学基础
机器学习·概率论