Qwen-VL系列的动态分辨率技术是如何实现的?

Qwen2-VL采用的"Naive Dynamic Resolution"策略包含三个关键步骤:

  1. 架构改造:移除ViT中的绝对位置嵌入,引入2D-RoPE(Rotary Position Embedding)捕捉图像的二维空间信息,使模型能够自然处理不同尺寸的图像。
  2. 序列打包:推理阶段将不同分辨率图像打包为单个序列,通过控制打包长度限制GPU内存占用
  3. Token压缩:在ViT后添加简单MLP层,将相邻2×2的视觉token压缩为单个token,配合特殊标记(和)标记边界
    • 例如:224×224分辨率图像经14×14补丁编码后,会被压缩至66个令牌输入LLM(64个压缩token + 2个特殊标记)

所谓的Naive Dynamic Resolution来自NaVit这篇论文(https://arxiv.org/pdf/2307.06304),核心操作叫作Patch n’ Pack,“Patch n’ Pack” 并不是一个传统意义上的缩写,而是对 “Patch and Pack” 的简写,它形象地概括了NaViT模型的一项核心技术思想。下表清晰地展示了其核心概念与组成:

组成概念核心含义类比参考
Patch (图像块)将每张输入图像分割成多个小块(patches),每个块被视为一个基本单元。类似于自然语言处理中将一句话拆分成多个单词。
n’ (and, 和)连接词,表示将多个图像的 Patch 进行组合。-
Pack (打包)将来自不同图像的、数量不等的 Patch 序列紧密地打包合并成一个长的、统一的序列,作为模型的一次输入。类似于将多个长短不一的句子打包成一个段落,以提高处理效率。

在这里插入图片描述

Qwen2.5-VL在动态分辨率技术上进一步创新

  1. 智能分辨率调整算法
    通过smart_resize函数实现自适应的分辨率调整,smart_resize函数保持宽高比的同时确保尺寸可被factor整除

  2. 多模态旋转位置编码(M-RoPE)
    将位置编码分解为时间、高度、宽度三个维度:

    • 对于文本输入:三个组件使用相同的位置ID,功能上等效于1D-RoPE
    • 对于图像:每个视觉标记的时间ID保持不变,高度和宽度组件根据标记在图像中的位置分配
    • 对于视频:每一帧的时间ID为增量,高度和宽度组件遵循与图像相同的ID分配模式
  3. 窗口注意力机制
    在视觉编码器中引入窗口注意力机制,确保计算成本随图像块数量线性增长而非二次增长,显著优化推理效率。

  4. 时空维度扩展
    动态分辨率不仅应用于空间维度,还扩展到时间维度:

    • 动态FPS采样:视频处理中引入动态帧率采样
    • 绝对时间编码:通过与绝对时间对齐的M-RoPE,模型能理解视频的时间动态,实现秒级事件定位

来看一下Qwen2.5 VL是怎么实现的

以verl/utils/dataset/rl_dataset.py里这段代码为例,process_image调用了qwen_vl_utils的fetch_image,fetch_image函数里写了一大堆if else没有进去,以下代码的中文注释要注意:

    def __getitem__(self, item):
        """
        Note that we also return the raw_input_ids so that it can be combined with other chat template
        """
        row_dict: dict = self.dataframe[item]
        messages = self._build_messages(row_dict)
        model_inputs = {}

        if self.processor is not None:
            from verl.utils.dataset.vision_utils import process_image, process_video

            raw_prompt = self.processor.apply_chat_template(
                messages, add_generation_prompt=True, tokenize=False, **self.apply_chat_template_kwargs
            )
            multi_modal_data = {}

            images = None
            row_dict_images = row_dict.pop(self.image_key, None)
            if row_dict_images:
                # 如果ckpt内的preprocessor_config.json用small_pixels这一步没有smart_resize,没有走到相应if else分支
                images = [process_image(self.try_fix_image_path(image)) for image in row_dict_images]

                multi_modal_data["image"] = images

            videos = None
            row_dict_videos = row_dict.pop(self.video_key, None)
            if row_dict_videos:
                videos = [process_video(video) for video in row_dict_videos]
                multi_modal_data["video"] = [video.numpy() for video in videos]

            # 如果ckpt用samll_pixels这一步进行了resize
            model_inputs = self.processor(text=[raw_prompt], images=images, videos=videos, return_tensors="pt", padding_side='left')

            input_ids = model_inputs.pop("input_ids")
            attention_mask = model_inputs.pop("attention_mask")

            if "second_per_grid_ts" in model_inputs:
                model_inputs.pop("second_per_grid_ts")

            # 但ckpt用small_pixels这一步还是resize前的尺寸
            # There's a trap here, multi_modal_inputs has to be a dict, not BatchFeature
            row_dict["multi_modal_data"] = multi_modal_data

还有哪些动态分辨率的方法?

动态分辨率一般有几种策略,同时要兼顾位置编码

  1. Multi-scale / Progressive resizing:训练时随机调整输入图像分辨率,使模型对不同尺寸的输入鲁棒;推理时根据算力选择高/低分辨率平衡性能。
  2. Feature Pyramid / Hierarchical Patch Embedding:将图像划分成多尺度 patch embedding,模型内部进行特征融合。
  3. Adaptive Token Pruning / Token Pooling:对于大图,将不重要的 patch token 合并或丢弃,减小 Transformer 计算量。

多模态大语言模型如何构建interleave的数据?

构建多模态大语言模型(Multimodal Large Language Model, MLLM)中的 interleaved data(交错数据)是实现模型理解图文混合内容、进行跨模态推理的关键步骤。所谓 interleaved data,是指文本和图像(或其他模态,如音频、视频等)在序列中以交替方式组织的数据格式,例如:

[Image1] 今天天气真好![Image2] 我们去公园野餐了。

这种结构让模型能像人类一样,在阅读一段文字时“看到”穿插其中的图片,并理解图文之间的语义关联。

以下是构建 interleaved 数据的主要方法和关键考虑点:

一、数据来源

  1. 原生图文交错网页/文档

    • 社交媒体(如微博、Instagram 帖子)
    • 博客、新闻文章(带图说明)
    • 教科书、维基百科(图文混排)
    • PDF 或 HTML 页面(可解析为文本+图像块)
  2. 人工构造数据

    • 将图像插入到已有文本中(需保证语义连贯)
    • 使用指令微调模板,如:“描述下图:[IMG]。接着写一段故事。”
  3. 合成数据生成

    • 利用文生图模型(如 Stable Diffusion)根据文本生成图像,再组合成 interleaved 格式
    • 反向:用图像 caption 模型为图像生成描述,插入原文

二、数据预处理流程

  1. 文档解析与分块

    • 使用工具(如 BeautifulSoup、PDFMiner、DocTR)提取 HTML/PDF 中的文本段落和图像位置
    • 保留原始顺序,记录每个元素类型(text / image)
  2. 图像嵌入表示

    • 使用视觉编码器(如 CLIP ViT、SigLIP、DINOv2)将图像转换为 token 序列或单个特征向量
    • 常见做法:将图像编码为若干视觉 tokens(如 256 个),作为 LLM 输入的一部分
  3. Tokenization 与序列拼接

    • 文本使用标准 tokenizer(如 Llama tokenizer)
    • 图像通过特殊 token(如 <image>)占位,实际输入时替换为视觉 tokens
    • 最终输入序列为:[text tokens][visual tokens][text tokens]...
  4. 对齐与标注(可选但重要)

    • 添加指代消解标签(如“这张图显示的是…” → 关联前一张图)
    • 构建 QA 对:问题涉及某张图的内容,答案在后续文本中

三、典型格式示例

{
  "id": "post_123",
  "interleaved_sequence": [
    {"type": "text", "content": "昨天我去了动物园,看到了一只大熊猫。"},
    {"type": "image", "path": "panda.jpg"},
    {"type": "text", "content": "它正在吃竹子,非常可爱!"},
    {"type": "image", "path": "panda_eating.jpg"},
    {"type": "text", "content": "你觉得它胖吗?"}
  ]
}

训练时,该序列会被转换为:

[text_ids] + [img_tokens_1] + [text_ids] + [img_tokens_2] + [text_ids]

四、挑战与解决方案

挑战解决方案
图文语义不匹配人工审核 / 使用 CLIP 相似度过滤低质量配对
图像顺序歧义保留 DOM 结构或添加位置编码
视觉 token 数量大,增加计算负担使用 token 压缩(如 HiFormer、TokenFusion)
缺乏高质量交错语料合成数据 + 强化学习奖励(如基于 CLIP reward 的 RLHF)

五、代表性工作参考

  • Flamingo(DeepMind):首个大规模 interleaved 训练的 MLLM,使用 Perceiver Resampler 压缩图像 tokens
  • Kosmos-2 / Kosmos-2.5(Microsoft):支持图文交错输入,用于文档理解
  • LLaVA-NeXT / LLaVA-1.6:虽主要用单图+文本,但已探索多图交错
  • Chameleon(Meta):直接在 token 级别混合图像和文本,实现真正 interleaved 生成

总结

构建 interleaved 数据的核心在于:

  1. 保持图文原始顺序与语义关联
  2. 将图像有效转化为 LLM 可处理的 token 序列
  3. 确保训练数据的图文一致性与多样性

这类数据是通向通用多模态智能(如能读图写文、看图说话、图文推理)的基础,也是当前 MLLM 前沿研究的重点方向。

Qwen3 VL相比Qwen2.5 VL的改进

以下转载自 https://www.xiaohongshu.com/explore/69748894000000000a02b911?xsec_token=ABOt8TL3IGqlMRXdyI5F9EUaaAbAD0MjzkycZR3d3vWHE=&xsec_source=pc_search&source=web_search_result_notes

改进一:改用MRoPE-Interleave

在这里插入图片描述
在这里插入图片描述

改进二:引入DeepStack技术

在这里插入图片描述

改进三 低分辨率直接注入LLM最底层,高分辨率注入后续几层

在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐