QwenVL 系列

Jun 11, 2025
6 views
Large Model

Qwen-VL

模型框架

Qwen-VL的整体网络架构由三个组件组成:

  • LLM:使用 Qwen-7B 的预训练权重进行初始化。
  • 视觉编码器:Qwen-VL 的可视化编码器使用ViT 架构,使用 Openclip 的 ViT-bigG 的预训练权重进行初始化。在训练和推理过程中,输入图像的大小都会调整为特定分辨率。视觉编码器通过以 14 步幅将图像分割成块来处理图像,生成一组图像特征。
  • 位置感知视觉语言适配器:为了缓解长图像特征序列带来的效率问题,Qwen-VL 引入了一种视觉语言适配器来压缩图像特征。类似QFormer,该适配器包括一个随机初始化的单层交叉注意力模块。使用一组可训练向量(嵌入)作为query,并将视觉编码器中的图像特征作为交叉注意力作的key。该机制将视觉特征序列压缩到固定长度 256。
    image

模型训练

如下图所示,qwen-vl的训练包含三个阶段:Pretraining、Multi-task Pretraining和SFT

image

Pre-training

  • 对于第一个阶段的预训练,训练时冻结LLM,只训练视觉编码器和适配器;
  • 输入图像的大小将调整为 224 × 224;
  • 训练数据经过对5b原始数据的清洗,一共包含1.4b图像文字对,训练数据如下图所示
  • 数据清洗的流程:

Multi-task Pre-training

  • 在多任务预训练的第二阶段,作者引入了具有更大输入分辨率的高质量、细粒度的VL标注数据和交错的图文数据。如下表所示,同时训练 Qwen-VL 执行 7 个任务。对于文本生成,使用内部收集的语料库来维护 LLM 的能力。caption数据与pretrain 相同,只是样本少得多且不包括 LAION-COCO
    image

  • 将视觉编码器的输入分辨率从 \(224×224\) 提高到 \(448×448\),减少了图像下采样造成的信息损失;

  • 该阶段解冻了LLM并训练了整个模型。训练目标与预训练阶段相同;
  • 该阶段对应的训练数据组织如下图所示,包含所有 7 个任务,其中黑色文本作为前缀序列,不做los,只对蓝色部分的文本做loss。

SFT

在此阶段,通过指令微调对Qwen-VL预训练模型进行了微调,以增强其指令跟随和对话能力,从而产生了交互式Qwen-VL-Chat模型。

  • 多模态指令调优数据主要来自caption数据或通过LLM指令生成的对话数据,通常只针对单图对话和推理,仅限于图像内容理解。
  • 作者通过手动标注、模型生成和策略串联来构建一组额外的对话数据,将定位和多图像理解能力融入Qwen-VL模型中。
  • 在训练过程中混合了多模态和纯文本对话数据,以确保模型在对话能力上的通用性。指令调优数据一共有 350k。
  • 在这个阶段,冻结了视觉编码器,只去训练LLM和适配器模块。
  • 此阶段的数据格式如下图所示,为了更好地适应多图像对话和多个图像输入,在不同图像之前添加字符串“Picture id:”,其中 id 对应图像输入对话的顺序。在对话格式方面,使用了 ChatML(Openai)格式构建了指令调优数据集,其中每个交互的语句都标有两个特殊的标记(),以方便对话终止。

Qwen2-VL

Update

  • Qwen2-VL 将视觉编码器修改为朴素动态分辨率机制(NaViT),使模型能够将不同分辨率的图像动态处理为不同数量的视觉tokens。
  • 集成了多模态旋转位置编码(M-RoPE),促进了文本、图像和视频中位置信息的有效融合。
  • 采用统一的范式来处理图像和视频,增强模型的视觉感知能力。Qwen2-VL 能够理解超过 20 分钟的视频,增强其执行高质量的基于视频的问答、对话、内容创建等的能力。
  • 多语言支持:为了服务英语和中文以外的全球受众,Qwen2-VL 现在支持图像中的多语言上下文理解,包括大多数欧洲语言、日语、韩语、阿拉伯语、越南语等。

模型框架

和 Qwen-VL的框架一致,该框架集成了视觉编码器和语言模型。其中语言模型选用了最新的Qwen2系列,视觉编码器采用了一个675M参数的ViT。

image

Naive Dynamic Resolution

Qwen2-VL 的一个关键架构改进是引入了朴素动态分辨率支持(NaViT)。与其前身不同,Qwen2-VL 现在可以处理任何分辨率的图像,将它们动态转换为可变数量的视觉tokens。

为了支持这一特性,作者通过删除原始的绝对位置编码并引入 2D-RoPE 来修改 ViT,捕获图像的二维位置信息。在推理阶段,不同分辨率的图像被打包成一个序列,并控制打包长度以限制 GPU 内存使用。此外,为了减少每个图像的视觉tokens,在ViT之后采用一个简单的MLP层,将相邻的2×2 token压缩为单个token,并将特殊的<|vision_start|>和<|vision_end|> token放置在压缩后的视觉token的开头和结尾。因此,分辨率为 224 × 224 的图像,使用 patch_size=14 使用 ViT 编码,在进入 LLM 之前将被压缩为 64+2 个tokens。

M-RoPE

另一个关键的架构增强是多模态旋转位置编码 (M-RoPE) 的创新。与LLM中传统的1D-RoPE仅限于对一维位置信息进行编码不同,M-RoPE有效地对多模态输入的位置信息进行了建模。这是通过将原始rope解构为三个部分来实现的:时间、高度和宽度。

image

如上图所示,对于文本部分使用了相同的三个ids,使 M-RoPE 在功能上等同于 1D-RoPE。在处理图像时,每个视觉标记的时间 ID 保持不变,而不同的 ID 则根据标记在图像中的位置分配给高度和宽度分量。对于被视为帧序列的视频,时间 ID 会随着每一帧递增,而高度和宽度分量遵循与图像相同的 ID 分配模式。在模型输入包含多种模态的场景中,每个模态的位置编号是通过将前一个模态的最大位置 ID 递增 1 来初始化的。M-RoPE 不仅增强了位置信息的建模,还降低了图像和视频的位置 ID 的值,使模型能够在推理过程中外推到更长的序列。

统一图像和视频理解

Qwen2-VL 采用结合图像和视频数据的混合训练方案,确保熟练掌握图像理解和视频理解。为了尽可能完整地保留视频信息,以每秒两帧的速度对每个视频进行采样。此外,我们还集成了深度为2的3D卷积来处理视频输入,使模型能够处理3D tubes 而不是2D patches,从而使其能够在不增加序列长度的情况下处理更多的视频帧。为了保持一致性,每个图像都被视为两个相同的帧。为了平衡长视频处理的计算需求和整体训练效率,动态调整每个视频帧的分辨率,将每个视频的 token 总数限制为 16384。这种训练方法在模型理解长视频的能力和训练效率之间取得了平衡。

补充作者在github issue中的介绍:

模型训练

与Qwen-VL相同,Qwen2-VL同样采用了三阶段的训练方法。

  • 在第一阶段,我们专门专注于训练视觉(ViT) 组件,利用大量的图像-文本对语料库来增强大型语言模型 (LLM) 中的语义理解。
  • 在第二阶段,解冻所有参数,并使用更广泛的数据进行训练,以实现更全面的学习。
  • 在最后阶段,冻结 ViT 参数,并使用指令数据集对 LLM 进行独占微调。
    SFT部分用的训练数据形式和Qwen-VL一致,如下图所示:

image

针对grounding和Agent数据,Qwen2-VL,增加了特殊的token来强化这两个任务的训练,数据形式如下面两张图所示:

image

image

Qwen2.5-VL

概述

Qwen2.5-VL 增强的能力

  • 强大的文档解析功能:QWEN2.5-VL升级文本识别到综合分析,在处理多场景,多语言和各种内置(手写,表,图表,化学公式,化学公式和音乐表)文档方面表现出色。
  • 跨格式Grouding:QWEN2.5-VL解锁了检测,poingting和计数对象的精度,增强了空间推理的绝对坐标和JSON格式输出的能力。
  • 超长的视频理解和细粒度的视频Grounding:模型将天然动态分辨率扩展到时间维度,从而增强了在以秒为单位提取事件段的持续时间的能力。
  • 增强计算机和移动设备的Agent功能:利用Grouding,推理和决策能力,通过智能手机和计算机上的优越Agent功能来提高模型。

模型架构

image

模型架构还是由三个核心组件构成:LLM,MLP, Vision Encoder。

  • 大型语言模型 (LLM)
  • 视觉编码器 (Vision Encoder)
  • 基于 MLP 的视觉-语言融合器 (MLP-based Vision-Language Merger)
    具体的模型参数如下表所示:

image

快速高效的视觉编码器

核心挑战:多模态大语言模型(MLLMs)在处理原生分辨率输入时面临计算负载不平衡,传统方法处理不同大小图像时的计算复杂度呈二次方增长,所以作者在大部分layer种引入了窗口注意力机制使计算成本与patch数量呈线性关系,而非二次方关系

  • 窗口注意力机制(windowed attention)
  • 位置编码改进
  • 网络结构优化
  • 训练策略
  • 动态原生分辨率采样

原生动态分辨率和帧率

  • 空间维度处理:将不同大小的图像转换为相应长度的token序列,直接使用实际尺寸,而不是像传统方法那样标准化坐标。使用输入图像的实际尺寸来表示边界框、点和其他空间特征,使模型能够内在地学习比例信息,提高跨不同分辨率处理图像的能力
  • 视频输入处理:动态帧率(FPS)训练,适应可变帧率,更好地捕获视频内容的时间动态。采用绝对时间编码,将MRoPE ID直接与时间戳对齐,这样做的好处是可以让模型通过时间维度ID之间的间隔理解时间的节奏,无需额外的计算开销,区别于其他需要文本时间戳或额外头部的方法

多模态旋转位置编码

  • Qwen2-VL 中的MRoPE
  • Qwen2.5-VL的改进

技术整合与优势

  1. 计算效率
  2. 分辨率适应性
  3. 时间理解能力
  4. 模态融合
    这些技术创新使Qwen2.5-VL能够高效处理多种模态的输入,特别是在处理不同分辨率的图像和不同帧率的视频时表现出色,同时保持计算效率和模型性能的平衡。

代码分析

图像与视频预处理

  1. 对图像或视频帧序列做 resize,scale和normalize
  2. 对图像和视频帧整合和patchify,这里temporal_patch_size 是时间维度的patch大小,定义为2,对于单个图像,为了跟视频输入兼容,把每张图片看成是一模一样的两帧。 这么操作的主要目的还是为了增强模型对video的理解能力,对video的精细理解要求帧数要足够多才能避免遗漏关键信息,以 $2\times14\times14 $ 的tube作为最小处理单位是一种非常cheap的处理方式,它可以在不增加seq_length的情况下提高模型处理帧数的上限。在前期实验里作者也发现以$2\times14\times14 $ tube相较于$1\times14\times14 $ patch在video任务上有一定提升;

Patch Embedding

class Qwen2_5_VisionPatchEmbed(nn.Module):
    def __init__(
        self,
        patch_size: int = 14,
        temporal_patch_size: int = 2,
        in_channels: int = 3,
        embed_dim: int = 1152,
    ) -> None:
        super().__init__()
        self.patch_size = patch_size
        self.temporal_patch_size = temporal_patch_size
        self.in_channels = in_channels
        self.embed_dim = embed_dim

        kernel_size = [temporal_patch_size, patch_size, patch_size]
        self.proj = nn.Conv3d(in_channels, embed_dim, kernel_size=kernel_size, stride=kernel_size, bias=False)

    def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
        target_dtype = self.proj.weight.dtype
        hidden_states = hidden_states.view(
            -1, self.in_channels, self.temporal_patch_size, self.patch_size, self.patch_size
        )
        hidden_states = self.proj(hidden_states.to(dtype=target_dtype)).view(-1, self.embed_dim)
        return hidden_states