

1.CLIP#
1.1 CLIP架构#
图中左侧部分展示CLIP的架构,CLIP由两个独立的编码器组成:一个用于处理图像输入,另一个用于处理文本输入。论文中提到对于图像编码器,CLIP使用了ResNet-50和Vision Transformer (ViT)两种架构进行实验,而文本编码器则使用了Transformer架构。这两个编码器将图像和文本分别映射到同一特征空间中,使得它们可以进行对比学习,主要目标就是让相关的图像和文本在特征空间中更接近,而不相关的图像和文本则更远离,
1.2损失函数#
CLIP使用对比损失函数(Contrastive Loss),具体来说是InfoNCE损失,来训练模型。
论文中从行和列两个方向定义了损失函数,行方向的损失函数()鼓励正确的图像-文本对在特征空间中更接近,而列方向的损失函数()则鼓励正确的文本-图像对在特征空间中更接近。最终的总损失函数是这两部分损失的和:
对比损失函数的代码实现:
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 losspython补充 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 losspython2.BLIP#
BLIP 用一套模型,同时带文本编码器 + 解码器,既能做图文匹配检索,又能直接看图生成文字,打通理解和生成。靠三种跨模态损失联合训练,再加自动清洗劣质图文数据,让图文特征对齐更准,实际效果全面变强。
2.1 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#
互联网上的图文对数据质量参差不齐,有很多脏数据,直接训练会导致模型学错。因此BLIP先用一个弱模型对网络爬取的图生成文本描述,然后现在每张图有两个文本描述:一个是原始的网络爬取的文本描述,一个是弱模型生成的文本描述。然后利用模型自身的多模态打分的能力(ITC与ITM),对上面说的这两个文本进行打分,选分数更高的文本作为最终的训练文本。这个过程就是CapFilter,BLIP通过这个自动清洗数据的机制,提升了训练数据的质量,从而提升了模型的性能。
3. BLIP2#
BLIP2 通过引入一个轻量级的Q-Former模块,使用预训练的语言模型作为解码器,并设计了新的预训练任务,实现了更高效的视觉语言理解和生成能力。
3.1 BLIP2架构#
BLIP2的核心创新是引入了一个轻量级的Q-Former模块,它位于视觉编码器和语言模型之间,负责将视觉特征转换为适合语言模型处理的形式。BLIP2使用预训练的语言模型作为解码器,这样可以利用大规模预训练语言模型的强大生成能力。Q-Former就是模态转换器。
3.2 第一阶段——训练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#
LLaVA 通过引入一个轻量级的视觉前缀模块,将图像特征转换为语言模型可理解的形式,实现了更高效的视觉语言理解和生成能力。
LLaVA堪称大道至简