1. 理解BLIP2与Q-Former的核心设计
第一次看到BLIP2的论文时,最让我惊讶的是它居然能在冻结视觉编码器和语言模型参数的情况下,仅通过训练一个轻量级的Q-Former就实现了出色的多模态性能。这就像是在两个语言不通的专家之间安排了一位精通双语的翻译,而这个翻译只需要学习如何准确传递信息,不需要重新学习两位专家的专业知识。
Q-Former本质上是一个参数可学习的Transformer模块,它由两个共享自注意力层的子模块组成:
- 左边的Query Encoder负责与冻结的图像编码器交互
- 右边的Text Encoder/Decoder则处理文本输入输出
这种设计最巧妙的地方在于,它通过不同的注意力掩码机制,让同一套模型参数可以同时支持三种不同的训练目标。我在复现代码时发现,这种设计比单独训练三个模型要节省约40%的显存占用,这对于资源有限的研究团队来说简直是福音。
2. 第一阶段:视觉-语言表示学习
2.1 多目标训练策略
第一阶段的训练就像是在教Q-Former学会"看图说话"的基本功。这里采用了三种互补的训练目标:
- 图文对比学习(ITC):我把它比作"找朋友"游戏。模型需要在一堆图片和描述中找到真正匹配的一对。具体实现时,我们会计算query输出与文本[CLS] token的相似度矩阵。这里有个小技巧——对每个query取最大相似度作为最终分数,相当于让模型选择最相关的视觉特征进行匹配。
# ITC损失计算的简化实现
sim_matrix = torch.matmul(query_embeds, text_embeds.t()) # [batch_size, batch_size]
labels = torch.arange(batch_size)
loss = F.cross_entropy(sim_matrix, labels)

1017

被折叠的 条评论
为什么被折叠?



