多模态大模型 Qwen-VL

1. 概述

随着通用语言大模型的发展,研究者也在多模态大模型上不断探索,Qwen-VL[1] 是阿里巴巴通义千问团队在 2023 年发布的视觉语言大模型,Qwen-VL 将视觉编码器与大语言模型结合,让模型不仅能够理解图片,还能进行视觉问答、文字识别、目标定位等任务,并通过统一的语言模型接口完成这些任务,解决了如何把图像接入 LLM 的问题。

2. Qwen-VL 的原理

2.1. Qwen-VL 的整体架构

先来看下 Qwen-VL 的整体架构,如下图所示:

在 Qwen-VL 的整体架构中,主要的部分分为三个:

  1. 视觉编码器 Vision Encoder,负责将输入的图像信息转换成视觉特征序列
  2. 视觉语言适配器 Vision-Language Adapter,负责生成能与文本特征对齐的视觉特征
  3. 大语言模型 Qwen-LM,融合视觉与文本信息,进行理解、推理并按指令生成

接下来就这三个主要部分详细分析下。

2.2. 视觉编码器

在 Qwen-VL 中的视觉编码器部分采用的是 ViT-bigG,其底层是 ViT[2] 模型,我们先来回顾下 ViT 的基本原理,ViT 的结构如下所示:

对于一张图片,首先需要将图片切成 Patch,假设输入一张 224×224224\times224 的 RGB 图片,每个 Patch 的大小为 16×1616\times16,则所有的 Patch 数量为:

N=22416×22416=196N=\frac{224}{16}\times\frac{224}{16}=196

接下来对每个 Patch 做线性映射,每个 Patch 被映射成一个固定维度的向量,如 768 维,这是时候,原始的图片被转换成 Transformer Encoder 的输入 X∈R196×768X\in\mathbb{R}^{196\times768},即一张二维图像变成了长度为 196 的 Token 序列,每个 Token 的维度是 768。

这样就将输入的图像处理成和文本一样的序列结构,下面就可以像处理文本一样,利用标准的 Transformer Encoder 的流程处理图像,流程包括增加位置信息 Position Embedding,多头注意力 Multi-Head Self-Attention,前馈网络 MLP 等等。其中,Self-Attention 的计算方法如下:

Attention⁡(Q,K,V)=softmax⁡(QK⊤d)V\operatorname{Attention}(Q,K,V) =\operatorname{softmax} \left(\frac{QK^\top}{\sqrt{d}}\right)V

其中,Q,K,V∈R196×768Q,K,V\in \mathbb{R}^{196\times768}。视觉编码器的输出是一组高维特征,后续模块才负责把这些特征转化为语言模型能够理解的输入。

而在 ViT-bigG 中,输入的图片的大小为 448×448448\times 448,每个 Patch 的大小为 14×1414\times 14,则所有的 Patch 数量为:

N=44814×44814=1024N=\frac{448}{14}\times\frac{448}{14}=1024

经过 ViT 的计算,每个 Token 的维度为 16641664。

2.3. 大语言模型

先来介绍大模型,目前绝大部分的 LLM 使用的是 Decoder-only Transformer[3],网络结构如下图所示:

其中 xN 表示的是 N 次重复这个部分。在这个网络结构中主要有两个部分组成,分别为多头注意力(Multi Head Attention,MHA)和前馈神经网络。在多头注意力机制中,注意力的计算公式为:

Attention(Q,K,V)=softmax(QK⊤dk)V\mathrm{Attention}(Q,K,V)=\mathrm{softmax}(\frac{QK^\top}{\sqrt{d_k}})V

其中 Q,K,VQ,K,V 分别是查询、键、值向量。在 Decoder-only Transformer 结构中,需要在 Attention 的计算过程中加入掩码矩阵,以防止前面的 Token 与后面的 Token 做注意力的计算,因此上述的计算公式在 Decoder-only Transformer 结构中应该为:

Maksed_Attention(Q,K,V)=softmax(QK⊤dk+M)V\mathrm{Maksed\_Attention}(Q,K,V)=\mathrm{softmax}(\frac{QK^\top}{\sqrt{d_k}}+M)V

其中,矩阵 M 称为掩码矩阵,格式为:

M=(0−∞−∞−∞−∞−∞00−∞−∞−∞−∞000−∞−∞−∞0000−∞−∞00000−∞000000)M=\begin{pmatrix} 0 & -\infty & -\infty & -\infty & -\infty & -\infty \\ 0 & 0 & -\infty & -\infty & -\infty & -\infty \\ 0 & 0 & 0 & -\infty & -\infty & -\infty \\ 0 & 0 & 0 & 0 & -\infty & -\infty \\ 0 & 0 & 0 & 0 & 0 & -\infty \\ 0 & 0 & 0 & 0 & 0 & 0 \\ \end{pmatrix}

掩码矩阵是一个下三角矩阵,这样经过 softmax 计算后,对角线以上的部分都为 0,保证了前面的 Token 不会看见后面的 Token。Decoder-only Transformer 是一个自回归语言模型,从自回归语言模型的角度看,后面的文本的生成依赖于所有前面的文本:

P(y∣Xv,x)=∏t=1TP(yt∣Xv,x,y<t)P(y\mid X_v,x) =\prod_{t=1}^{T} P(y_t\mid X_v,x,y_{<t})

其中:XvX_v 为图像经过视觉编码器和连接器得到的视觉表示;xx 为用户的问题或指令;y<ty_{<t} 为已经生成的前文。那么图像特征 XvX_v 和文本的特征 xx 在 Qwen-VL 中是以什么样的形式输入到大语言模型中的呢?这就需要使用到视觉语言适配器 Vision-Language Adapter。

2.4. 视觉语言适配器

视觉语言适配器 Vision-Language Adapter 的作用是对视觉编码器的输出向量压缩,首先我们来看一下完整的对话应该是什么样子的。假设有如下的对话,其中,System Prompt 为“You are a helpful assistant.”,用户给出一张 448×448448\times 448 的图片并提问“请描述这张图片”,助手需要回答。经过 chat template 和 Processor 展开后,送入 LLM 的文本序列大致如下:

<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
<|vision_start|><|image_pad|><|image_pad|>...<|image_pad|><|vision_end|>请描述这张图片<|im_end|>
<|im_start|>assistant

这里 <|vision_start|> 和 <|vision_end|> Token 之间的 <|image_pad|> 就是给图像预留的 Token 位置,且在 Qwen-VL 中这是一个固定的值,为 256256,但是视觉编码器产出的有 10241024 个 Token 的向量,此时就需要对其压缩, Qwen-VL 中使用了 Position-aware Vision-Language Adapter。

其核心思想是基于交叉注意力的压缩机制,具体来说,假设视觉编码器输出 Xv∈RN×dvX_v\in\mathbb{R}^{N\times d_v},在连接器准备一组可学习的 Query 为 Q∈RM×dqQ\in\mathbb{R}^{M\times d_q},目标是使得 MM 为一固定的值为 256256。这时就是用了交叉注意力 Cross-Attention,其中的 QQ 来自可学习的 Query,而 KK 和 VV 来自视觉编码器的输出,具体如下:

Q′=QWQ,K=XvWK,V=XvWVQ'=QW_Q,\quad K=X_vW_K,\quad V=X_vW_V

Z=Softmax⁡(Q′K⊤dk+Bpos)VZ=\operatorname{Softmax} \left( \frac{Q'K^\top}{\sqrt{d_k}}+B_{\mathrm{pos}} \right)V

其中,BposB_{\mathrm{pos}} 为位置相关的信息,用于帮助模型保留空间位置关系。

3. Qwen-VL 的训练

Qwen-VL 的训练分成了三个阶段,如下图所示:

其中,阶段一是视觉语言基础预训练,此时,固定语言模型 Qwen-7B,优化视觉编码器和连接器,让视觉表示逐渐适配已有的语言模型,训练目标可以概括为条件语言建模损失:

LLM=−∑t=1Tlog⁡Pθ(yt∣Xv,x,y<t)\mathcal L_{\mathrm{LM}} =-\sum_{t=1}^{T} \log P_\theta(y_t\mid X_v,x,y_{<t})

其中,yty_t 是训练样本中正确的文本 Token。

阶段二是多任务视觉语言预训练,包括图像描述、视觉问答、定位、区域描述和 OCR 等。这个阶段就是让模型能够见到足够多的任务,教会模型把视觉特征用于特定任务。

阶段三是监督指令微调(SFT),这个阶段是让模型学会遵循人类指令并进行多轮对话,通过多模态指令、问答、定位和对话样本训练,得到交互能力更强的 Qwen-VL-Chat。

5. Qwen-VL 能处理的视觉问题

Qwen-VL 将视觉编码器与大语言模型结合,让模型不仅能够理解图片,还能进行视觉问答、文字识别、目标定位等任务,并通过统一的语言模型接口完成这些任务,但是并不是 Qwen-VL 能够解决所有的视觉问题,根据 Qwen-VL 的 GitHub README[4],除了生成文本类问题,如图像描述,通用视觉问答,OCR 与文字理解以及图表与文档理解之外,有一类问题必须要单独拿出来讲的,那就是目标定位(Visual Grounding)问题,简单来说就是模型需要找出句子中短语所指向的图像区域,并生成相应位置,在 Qwen-VL 中依旧是把坐标编码成语言模型可以生成的文本序列。

熟悉生成式目标检测的读者可能对 Pix2Seq[5] 或者 Florence-2[6] 熟悉,我们以目标检测为例,通常输出 b=(xmin⁡,ymin⁡,xmax⁡,ymax⁡)b=\left(x_{\min},y_{\min},x_{\max},y_{\max}\right),其中 (xmin⁡,ymin⁡)\left(x_{\min},y_{\min}\right) 为边界框左上角的坐标,(xmax⁡,ymax⁡)\left(x_{\max},y_{\max}\right) 为边界框右下角的坐标,如下图所示:

以及对应的类别 cic_i 和置信度。类别本身就是离散的 Token,这里主要要处理边框的坐标,在 Pix2Seq 中,采用均匀量化(Uniform Quantization),将坐标映射到有限数量的离散区间。具体的操作步骤为:

第一步,把边框坐标归一化到 [0,1]\left[0,1\right]。假设输入图像的宽为WW,高为HH,对上面边框坐标归一化为:

(xmin⁡′,ymin⁡′,xmax⁡′,ymax⁡′)\left(x'_{\min},y'_{\min},x'_{\max},y'_{\max}\right)

其中:

xmin⁡′=xmin⁡Wx'_{\min}=\frac{x_{\min}}{W}

ymin⁡′=ymin⁡Hy'_{\min}=\frac{y_{\min}}{H}

xmax⁡′=xmax⁡Wx'_{\max}=\frac{x_{\max}}{W}

ymax⁡′=ymax⁡Hy'_{\max}=\frac{y_{\max}}{H}

归一化之后,边框坐标都处于 00 到 11 的范围内。

第二步,将归一化后的边框坐标量化为离散的整数,采用的公式为:

q=⌊x′(N−1)⌋q=\left\lfloor x'\left(N-1\right)\right\rfloor

其中,NN 是离散的 bins 的数量,x′x' 表示的是上述的归一化的坐标,最终输出的整数的范围为 00 到 N−1N-1。这样便得到了最终的坐标的离散化 Token。在训练的时候,每个目标被编码成55个离散的 Token,如下所示:

[qymin⁡,qxmin⁡,qymax⁡,qxmax⁡,c]\left[q_{y_{\min}},q_{x_{\min}},q_{y_{\max}},q_{x_{\max}},c\right ]

其中,cc 是类别的 token。如果一个图片中存在多个目标,就把各个目标的 55 个 Token 依次串接起来,最后添加一个 EOS Token,表示结束。

在 Florence-2 中也基本一致,不同的是上述的 NN 为10001000,取值为 [0,999]\left[0,999\right],这样,一个任意实数坐标就映射为了一个 0∼9990\sim 999 的整数,不同的是,Florence-2 不再像 Pix2Seq 中量化为离散的正式,而是对应一个 <loc_n> Token。

在 Qwen-VL 中,采取的方法又有点不同,首先也是与 Florence-2 中一样,对坐标归一化到 [0,1000)[0,1000),后直接以整数作为一个 Token,而不是像 Florence-2 中那样专门转换到一个特征的 Token <loc_n>。具体例子如下:

<ref>穿红色衣服的人</ref>
<box>(120,80),(430,920)</box>

其中,<box> 和 </box> 等特殊标记包围边界框,<ref> 和 </ref> 标记被引用的目标描述。参考文献[1]中给出了更多其他在训练时的数据格式,如下图所示:

6. 总结

放眼多模态大模型的发展过程,Qwen-VL 的提出无疑是一个重要的里程碑。纵观 Qwen-VL 的整个网络架构,包含了三个组成部分:1. 视觉编码器,用于将图像转换成视觉特征;2. 视觉语言对齐,通过连接器将视觉特征转换成 LLM 可以接收的表示;3. 大语言模型,用于根据用户指令生成对应的结果。当然这里面还有很多可以优化的地方,这也正是后续模型发力的地方。

参考文献

[1] Bai, Jinze et al. “Qwen-VL: A Versatile Vision-Language Model for Understanding, Localization, Text Reading, and Beyond.” (2023).

[2] Dosovitskiy A, Beyer L, Kolesnikov A, et al. An image is worth 16x16 words: Transformers for image recognition at scale[J]. arXiv preprint arXiv:2010.11929, 2020.

[3] Vaswani A , Shazeer N , Parmar N ,et al.Attention Is All You Need[J].arXiv, 2017.DOI:10.48550/arXiv.1706.03762.

[4] https://github.com/QwenLM/Qwen-VL/blob/master/README_CN.md

[5] Chen T, Saxena S, Li L, et al. Pix2seq: A language modeling framework for object detection[J]. arXiv preprint arXiv:2109.10852, 2021.

[6] Xiao B, Wu H, Xu W, et al. Florence-2: Advancing a unified representation for a variety of vision tasks[C]//2024 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, 2024: 4818-4829.