主页:
https://feipengma6.github.io/vlora/
论文:
https://arxiv.org/pdf/2405.20339
代码:
github.com/FeipengMa6/VLoRA
1. 输入空间对齐范式
1.1 介绍
在进入正题之前,我们先简单回顾一下当前主流的MLLM范式。
以最具代表性的LLaVA[1]为例,
Figure 1. LLaVA的结构框图
对于输入的图像
,通过视觉编码器(Vision Encoder)和 映射模块(Projection)提取特征,得到一个由视觉标记(Visual Tokens)组成的视觉序列,然后将视觉序列和文本在序列维度上拼接,一同输入到LLM中进行训练。在训练过程中,视觉序列是在对齐LLM的输入空间以让LLM能够理解视觉信息,我们称这种范式为输入空间对齐范式。
输入空间对齐范式有2个特点:
1. 视觉信息序列化,和文本信息具有相同的表现形式 图像经过视觉编码器之后会变成视觉标记,然后通过映射模块映射到和文本标记(Text Tokens)相同的特征维度,最后形成了和文本信息相同的表现形式,即序列。
2. MLLM中视觉和文本的模态交互通过注意力机制进行 视觉信息序列化之后,会将视觉序列与文本序列在序列维度上拼接,然后同时输入给LLM。在前向传播的过程中,视觉与文本通过注意力机制产生模态交互。
目前主流MLLM遵从输入空间对齐范式,比如Qwen2-VL[2],DeepSeek-VL[3],和InternVL2[4],如Figure 2所示。
Figure 2. 输入空间对齐范式:Qwen2-VL, DeepSeek-VL 和 InternVL2
1.2 问题
输入空间对齐范式使用CLIP可以很容易将视觉特征对齐到LLM输入空间,因为CLIP的视觉特征预先和文本对齐过,本身具备丰富的语义信息,但是在训练和推理时计算效率低。
在输入序列达到一定长度的情况下,LLM的计算量集中在注意力机制部分,当输入序列长度为 n 时,计算复杂度为
,也就是说LLM的计算量随着输入序列长度而平方增长。LLaVA-v1.5的视觉编码器为ViT-L-14,对于单张图像,产生的视觉标记的数量为576。而考虑到高分辨率图像输入,一些工作会将图像切分成多个子图,分别转换成视觉标记,最后产生非常长的视觉序列。比如,Sphinx-2k[5]的视觉序列长度为2890,InternLM-Xcomposer2-4KHD的视觉序列长度甚至可以达到8737。然而,视觉序列长度的增长会导致MLLM的计算量急剧增加。特别是在预训练阶段,MLLM通常在网络爬取的图像文本对上进行预训练,文本长度通常比较短,比如LAION-2B的文本平均长度为10.95,视觉token的数量是文本的20~50倍,这意味着视觉标记引入了绝大部分的计算量,影响了训练效率。
2. 参数空间对齐范式
为了解决上面的问题,我们提出了参数空间对齐范式,将视觉信息表征为模型权重合并到LLM中,从而在不引入额外计算量的情况下使LLM能够感知视觉信息。
Figure 3. 参数空间对齐范式
参数空间对齐范式的核心是将视觉信息表征为模型权重,并融合到LLM的参数中。整体流程如Figure 3 所示。
LLM中Self-attention包含
和
,共4个权重矩阵,Feed-forward Network包含
和
共2个权重矩阵。这里我们用
来表示LLM的权重矩阵,
为隐藏层维度。
对于输入图像
, 先使用视觉编码器
来提取图像视觉特征, 得到
是 visual token的数量,
是视觉特征的维度。
然后,我们设计了感知权重生成模块
来将视觉特征转化为感知权重
,这里值得注意的是, 为了尽可能保持LLM本身的语言能力,
是一个低秩矩阵, 同时, 这也有利于减少生成感知权重的计算开销。
得到感知权重
后, 我们可以直接将其融合到LLM的权重中,
。
通过将从视觉特征转化来的权重整合到LLM的权重中,LLM自然就具备了视觉感知能力。在合并权重后,不会给LLM带来额外的计算开销。对于LLM中每个解码层中的任意类型权重(q, k, v, o, m),我们都可以生成相应的感知权重并将其整合到对应权重中。
3. 感知权重生成模块
Figure 4. 感知权重生成模块
我们设计了感知权重生成模块来将视觉特征转化为感知权重,对于LLM中不同类型的权重,我们用不同的感知权重生成模块来生成对应的感知权重。以下是对单一类型的权重生成的介绍。
如Figure 4(a) 所示, 我们的感知权重生成模块是Decoder-only结构的, 有
层解码层, 每层由 self-attention 模块,cross-attention模块,和feed-forward network组成。首先,感知权重生成模块的self-attention模块的输入是
个感知查询标记(perceptual queries),感知查询标记的数量对应我们想要合并权重的LLM层数,即生成的感知权重的数量。然后,在cross-attention模块中,视觉特征与感知查询标记交互,最后通过feed-forward network,得到
个
,其中
是感知权重模块的 隐藏层维度,并且该特征维度远小于LLM的隐藏层维度
(比如
),有
。我们的目的是获得
个
,而直接使用线性层将
的特征维度从
升维到
会引入极大的参数量,同时,这么一个高维矩阵直接合并到原始权重中可能会影响LLM本身的语言能力。因此,我们先采用一个共享的线性层
,将
个
分别升维到
的维度
,其中
,重整形状为
,称为视觉参数。接下来,对于
个视觉参数
,我们采用
个不同的线性层
分别进行升维,得到感知权重