主要问题:

近年来视觉余元预训练模型变得越来越昂贵,主要是因为,训练模型的规模越来越大。需要端到端的训练,计算成本有点高,对于我们这种本科生很不友好,相信大多数课题组的经费都不支持研究吧。所以论文提出了BLIP2,降低训练成本,同时能保持性能。

模型采用两阶段的训练策略,先从冻结的编码器中学习视觉语言表征。再从冻结的大语言模型中学习视觉到语言的生成能力。通过冻结部分参数的模型,来减少训练的成本。

端到端(模型从输入到输出整个过程都是完全自动化,不需要人工额外干预中间步骤)。

创新与优势:

VLP(视觉语言预训练),单模态模型在视觉和语言领域都有广泛应用(大语言模型LLMs),能否利用这些现有的预训练模型提高VLP。

模态对齐的难题:冻结LLM后,如何使其理解视觉信息?

BLIP2提出了一种高效的通用的提升VLP的方法,通过利用冻结的单模态模型(预训练视觉模型+预训练语言模型)减少计算成本,通过Querying Transformer解决模态对齐问题。

第一阶段是视觉语言表征学习,使用Q-Former学习视觉表征,并使其与文本高度相关,将图像特征转化为LLM能理解的模式,并作为输入传输给LLM。主要目的是根据输入的视觉特征生成自然语言文本。

相关工作:

目前主流的视觉语言预训练(VLP):旨在学习多模态基础模型,提升在视觉语言任务中的表现。大多数VLP方法采用端到端预训练,需要大规模的图文数据集。难以灵活的利用现成的单模态模型。

模块化的VLP利用已有的预训练模型,在训练过程中保持她们冻结。虽然使用冻结模型,但是仍然面对着跨模态对齐的挑战。传统都是使用单模态的对齐,而我们就不一样了,同时利用冻结的图像编码器和冻结的语言编码器,同时引用Q-Former,将视觉特征映射到LLM可理解的文本空间,解决跨模态对齐的方法。

 

方法:

主要是Q-Former,主要用于弥合冻结图像编码器和冻结LLM之间的模态差距。

核心组件是两部分的Transformer子模块:
图像Transformer:负责与冻结的图像编码器相互交互,以提取视觉特征。
文本Transformer:既可以作为文本编码器又可以作为文本解码器。

可学习查询向量:
作为图像Transformer的输入,利用自注意力机制进行信息交互,通过交叉注意力连接冻结的图像编码器。
查询向量可以与文本交互,通过不同的自注意力掩码控制交互方式。

Q-Former仅从图像编码器中提取固定数量的特征,与输入图像分辨率无关。

训练细节,采用瓶颈结构,强迫查询向量仅仅提取最关键的视觉信息,从而提高对文本的相似性。

自注意力机制:神经网络的一种计算方式,允许输入序列的每个元素关注序列中的其他元素。

torch.matmul表示相乘

def self_attention(x,wq,xk,wv):
    Q=torch.matmul(x,wq)#计算查询矩阵Q
    K=torch.matmul(x,wk)#计算键矩阵K
    V=torch.matmul(x,wv)#计算值矩阵V
    dk=K.shape[-1]
    attention_scores=torch.matmul(Q,K.T)/torch.sqrt(torch.tensor(d_k))#计算QK*T/sqrt(d_k)
    attention_weights=F.softmax(attention_scores,dim=-1)#计算注意力分数并进行归一化
    output=torch.matmul(attention_weights,V)#计算最终的输出
    return output

交叉注意力:CA用于处理两个不同模态之间的信息交互,例如视觉语言(将图像特征传递给语言特征)和文本文本。计算的是目标序列的查询与原序列的键和值进行计算。

自注意力掩码:限制Transformer在计算注意力时访问特定信息的方法。在自注意力机制计算的时候,人为的控制某些元素进行交互。用来屏蔽无关信息。

在BLIP2视觉语言模型中,我们是从图像特征--Q-Former--语言模型。
我们希望前几层只让图像特征自注意力,不与文本交互。后几层让图像特征和文本特征交互。

scores=scores.masked_fill(mask==0,float('-inf'))

瓶颈结构旨在减少特征表示的维度,让模型提取更重要的信息,从而提高计算效率。
 

class Bottleneck(nn.Module):
    def __inti__(self,input_dim,bottleneck_dim):
        super().__init__()
        self.fc1=nn.Linear(input_dim,bottleneck_dim)#降维
        self.fc2=nn.Linear(bottleneck_dim,input_dim)#还原
        self.relu=nn.ReLU()
    def forward(self,x):
        bottleneck=self.fc1(x)
        bottleneck=self.relu(bottleneck)
        output=self.fc2(bottleneck)
        return output

 

概念 定义 作用 BLIP-2 应用
自注意力(Self-Attention) 计算序列中每个元素对其他元素的重要性 提取全局依赖关系 Q-Former 让查询向量自交互
交叉注意力(Cross-Attention) 计算两个不同序列之间的注意力 让视觉特征适配语言模型 Q-Former 连接图像编码器和 LLM
自注意力掩码(Self-Attention Masking) 限制自注意力访问信息 控制查询向量和文本交互 Q-Former 预训练使用不同掩码策略
瓶颈结构(Bottleneck Architecture) 降低特征维度,提取关键信息 提高计算效率,避免冗余 Q-Former 仅提取 32 × 768 维度视觉信息

自注意力掩码的使用方法:
双向自注意力用于图文匹配(判断图文是否匹配,是0/1分类的问题),全白表示完全可见。
多模态因果掩码用于基于图像的文本生成,查询可以看到完整的图像,但是文本只能看到之前的部分。单模态掩码用于图文对比学习,各自只关注自己。

BLIP-2 第一阶段的核心是 Q-Former 在冻结图像编码器的基础上进行视觉-语言学习,同时优化 ITC, ITG, ITM 三个任务:

任务 目标 方法 注意力掩码
ITC (图文对比学习) 让匹配的图文对靠近,不匹配的远离 计算 图像查询向量 Z & 文本 [CLS] 之间的相似度,优化对比损失 单模态掩码(Queries & Text 互不可见)
ITG (基于图像的文本生成) 训练模型生成文本 查询向量提取信息,并传递给 LLM 生成文本 多模态因果掩码(Queries 互相可见,文本只能看过去信息)
ITM (图文匹配) 预测图像和文本是否匹配 计算 图像查询向量 Z 作为匹配得分 双向掩码(Queries & Text 互可见)

第二阶段,从冻结的大模型学习从视觉到语言生成能力。

为了让LLM能够接受视觉信息,BLIP2使用Q-Former作为视觉信息提取器,并采用全连接层进行向量转化。

BLIP2兼容两种LLM,第一种是基于解码器的LLM,采用语言建模损失,上图中上半部分,生成完整的文本,和基于编码解码器的LLM,采用前缀语言建模损失,将文本分为前缀+后缀,前缀文本+视觉特征作为LLM编码器的输入,后缀文本作为LLM解码器的输出。

 

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐