Linxii's Blog
VLM 基础Blur image

1.CLIP#

Arxiv ID 2103.00020
幻觉翻译 2103.00020

CLIP通过对比学习将图像和文本映射到同一特征空间,使得模型能够理解和关联视觉和语言信息

推荐指数:

1.1 CLIP架构#

CLIP架构   图中左侧部分展示CLIP的架构,CLIP由两个独立的编码器组成:一个用于处理图像输入,另一个用于处理文本输入。论文中提到对于图像编码器,CLIP使用了ResNet-50和Vision Transformer (ViT)两种架构进行实验,而文本编码器则使用了Transformer架构。这两个编码器将图像和文本分别映射到同一特征空间中,使得它们可以进行对比学习,主要目标就是让相关的图像和文本在特征空间中更接近,而不相关的图像和文本则更远离,

1.2损失函数#

  CLIP使用对比损失函数(Contrastive Loss),具体来说是InfoNCE损失,来训练模型。

  论文中从行和列两个方向定义了损失函数,行方向的损失函数(Limage-to-text\mathcal{L}_{\text{image-to-text}})鼓励正确的图像-文本对在特征空间中更接近,而列方向的损失函数(Ltext-to-image\mathcal{L}_{\text{text-to-image}})则鼓励正确的文本-图像对在特征空间中更接近。最终的总损失函数是这两部分损失的和:

L=Limage-to-text+Ltext-to-imageLi2t=E[logesim(Ii,Ti)/τjesim(Ii,Tj)/τ]Lt2i=E[logesim(Ti,Ii)/τjesim(Ti,Ij)/τ]\begin{align} \mathcal{L} &= \mathcal{L}_{\text{image-to-text}} + \mathcal{L}_{\text{text-to-image}} \\[10pt] \mathcal{L}_{\text{i2t}} &= -\mathbb{E}\left[ \log \frac{e^{\mathrm{sim}(I_i,T_i)/\tau}}{\sum_j e^{\mathrm{sim}(I_i,T_j)/\tau}} \right] \\[18pt] \mathcal{L}_{\text{t2i}} &= -\mathbb{E}\left[ \log \frac{e^{\mathrm{sim}(T_i,I_i)/\tau}}{\sum_j e^{\mathrm{sim}(T_i,I_j)/\tau}} \right] \end{align}

对比损失函数的代码实现:

import torch
import torch.nn.functional as F

def clip_contrastive_loss(image_features, text_features, temperature=0.07):
    """
    实现 CLIP 原论文的对称 InfoNCE 损失
    :param image_features: 图像特征 [batch_size, dim]
    :param text_features: 文本特征 [batch_size, dim]
    :param temperature: 温度系数 τ
    :return: 总损失 L = (L_i2t + L_t2i) / 2
    """
    batch_size = image_features.shape[0]

    # 1. 计算相似度矩阵 sim(I_i, T_j) [N, N]
    sim_matrix = torch.matmul(image_features, text_features.T) / temperature

    # 2. 图像→文本损失 (image-to-text)
    # 对每一张图,在所有文本里找匹配的正样本(对角线)
    labels = torch.arange(batch_size, device=image_features.device)
    loss_i2t = F.cross_entropy(sim_matrix, labels)

    # 3. 文本→图像损失 (text-to-image)
    # 对每一段文本,在所有图像里找匹配的正样本(转置矩阵后对角线)
    loss_t2i = F.cross_entropy(sim_matrix.T, labels)

    # 4. 总损失(论文:取平均)
    loss = (loss_i2t + loss_t2i) / 2
    return loss
python

  补充 F.cross_entropy具体实现

def cross_entropy(input, target):
    """
    计算交叉熵损失
    :param input: 预测的相似度矩阵 [N, N]
    :param target: 真实标签 [N],每个元素是正确匹配
    :return: 平均交叉熵损失
    """
    # 1. 计算 log-softmax
    log_probs = F.log_softmax(input, dim=1)
    # 2. 选择正确匹配的 log-probabilities
    selected_log_probs = log_probs[torch.arange(input.size(0)), target]
    # 3. 计算平均损失
    loss = -selected_log_probs.mean()
    return loss
python

2.BLIP#

Arxiv ID 2201.12086
幻觉翻译 2201.12086

BLIP 用一套模型,同时带文本编码器 + 解码器,既能做图文匹配检索,又能直接看图生成文字,打通理解和生成。靠三种跨模态损失联合训练,再加自动清洗劣质图文数据,让图文特征对齐更准,实际效果全面变强。

推荐指数:

2.1 BLIP架构#

BLIP架构

  在BLIP出现之前,视觉语言模型通常不能兼顾理解生成两大功能。CLIP在图文匹配上表现很好(理解),但是不能够直接生成对于图像的文本描述(生成),因此BLIP的第一个核心目标就是用一个模型,同时搞定理解与生成。

视觉编码器

  • 主干:ViT
  • 输入:一张图片
  • 输出:图像特征(分为局部图像patch特征和全局图像表征img_feat(cls token))

文本编码器

  • 主干:Transformer编码器
  • 输入:一段文本
  • 输出:全局文本特征text_feat

给理解任务使用的,ITC、ITM

文本解码器

  • 主干:带交叉注意力的Transformer解码器
  • 输入:图像特征(局部patch特征和全局img_feat)和已生成的文字
  • 输出:下一个token

给生成任务使用的,LM

2.2 三大预训练任务#

  BLIP设计了三大预训练任务,分别是图文对比(ITC)图文匹配(ITM)语言建模(LM)

  • 图文对比(ITC)

  这部分与CLIP基本完全相同,只是更新逻辑不是单纯由ITC损失来更新,而是由ITC、ITM和LM三种损失共同更新。BLIP的ITC损失也是对比损失,鼓励正确的图文对在特征空间中更接近,而不相关的图文对则更远离。

  • 图文匹配(ITM)

  ITM是一个二分类任务,输入是一对图文(图像和文本),模型需要判断它们是否匹配。正样本是正确匹配的图文对,负样本是随机配对的图文对。

  是用视觉局部特征+文本token特征,同时使用跨模态交叉注意力做深度融合,最后通过一个MLP分类头输出2维的logits。

  • 语言建模(LM)

  LM的目的是生成人物,给一张图,然后自动生成一段描述这张图的文本。BLIP使用了一个带交叉注意力的Transformer解码器来实现这个功能,输入是图像特征(局部patch特征和全局img_feat)和已生成的文字,输出是下一个token。

2.3 CapFilter#

CapFilter架构   互联网上的图文对数据质量参差不齐,有很多脏数据,直接训练会导致模型学错。因此BLIP先用一个弱模型对网络爬取的图生成文本描述,然后现在每张图有两个文本描述:一个是原始的网络爬取的文本描述,一个是弱模型生成的文本描述。然后利用模型自身的多模态打分的能力(ITC与ITM),对上面说的这两个文本进行打分,选分数更高的文本作为最终的训练文本。这个过程就是CapFilter,BLIP通过这个自动清洗数据的机制,提升了训练数据的质量,从而提升了模型的性能。

3. BLIP2#

Arxiv ID 2301.12597
幻觉翻译 2301.12597

BLIP2 通过引入一个轻量级的Q-Former模块,使用预训练的语言模型作为解码器,并设计了新的预训练任务,实现了更高效的视觉语言理解和生成能力。

推荐指数:

3.1 BLIP2架构#

BLIP2架构   BLIP2的核心创新是引入了一个轻量级的Q-Former模块,它位于视觉编码器和语言模型之间,负责将视觉特征转换为适合语言模型处理的形式。BLIP2使用预训练的语言模型作为解码器,这样可以利用大规模预训练语言模型的强大生成能力。Q-Former就是模态转换器

3.2 第一阶段——训练Q-Former#

Q-Former   在第一阶段,冻结视觉编码器,只训练Q-Former。Q-Former最下层有一个可学习的查询向量Learned Queries,这是Q-Former的核心。然后Q-Former是一个双Transformer设计,左侧带有Cross Attention,Learned Queries通过这个与图像特征进行交互,同时可以通过共享的自注意力层与右侧文本特征进行交互,右侧是一个标准的Transformer,接收输入文本。

  训练时,同时优化ITC、ITM、ITG三个损失,倒逼可学习 Queries,提取出和文本语义高度相关的视觉特征。图中右侧部分展示的是在训练时,BLIP2使用了不同的掩码策略

  • 双向自注意力掩码(对应ITM图文匹配)

所有的Q、T之间全部相互可见,做完整的图文语义匹配判断

  • 多模态因果掩码(对应ITG图文生成)

Q之间全程双向可见,文本T只能看向之前的位置,看不到未来的token(就是为了防止文本生成时作弊,原始transformer解码器的掩码就是这样的)

  • 单模态掩码(对应ITC图文对比)

Q与T完全隔离,互不可见,只允许模态内部做注意力交互,让图文各自独立地学习自己的特征表示,从而进行图文对比学习。

3.3 第二阶段——视觉→语言生成对齐#

视觉语言生成对齐   在第二阶段中,视觉编码器与LLM都冻结,仅训练:Q-Former + 末尾全连接投影层,其中全连接投影层是为了把 Q-Former 输出的 Query 特征维度,映射匹配成 LLM 能接收的词嵌入维度,总的就是让 Q-Former 输出的视觉前缀特征,完美适配冻结 LLM 的语言空间,让 LLM 看懂图像、直接做图文生成。

  图中是两种LLM大模型架构,当前主流的大模型均使用Decoder架构(如GPT系列)。BLIP2的设计使得它能够兼容不同架构的LLM。ps:当前的通用大模型几乎没有Encoder-Decoder架构,然后当前的通用大模型大多都是Decoder+MoE。

4.LLaVA#

Arxiv ID 2304.08485
幻觉翻译 2304.08485

LLaVA 通过引入一个轻量级的视觉前缀模块,将图像特征转换为语言模型可理解的形式,实现了更高效的视觉语言理解和生成能力。

推荐指数:

LLaVA堪称大道至简

VLM 基础
https://tyuou2.github.io/blog/vlm-base/
Author 林夕夕
Published at April 24, 2026
Comment seems to stuck. Try to refresh?✨