Qwen VL问题汇总
Qwen-VL系列的动态分辨率技术是如何实现的?
Qwen2-VL采用的"Naive Dynamic Resolution"策略包含三个关键步骤:
- 架构改造:移除ViT中的绝对位置嵌入,引入2D-RoPE(Rotary Position Embedding)捕捉图像的二维空间信息,使模型能够自然处理不同尺寸的图像。
- 序列打包:推理阶段将不同分辨率图像打包为单个序列,通过控制打包长度限制GPU内存占用
- 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在动态分辨率技术上进一步创新
-
智能分辨率调整算法
通过smart_resize函数实现自适应的分辨率调整,smart_resize函数保持宽高比的同时确保尺寸可被factor整除 -
多模态旋转位置编码(M-RoPE)
将位置编码分解为时间、高度、宽度三个维度:- 对于文本输入:三个组件使用相同的位置ID,功能上等效于1D-RoPE
- 对于图像:每个视觉标记的时间ID保持不变,高度和宽度组件根据标记在图像中的位置分配
- 对于视频:每一帧的时间ID为增量,高度和宽度组件遵循与图像相同的ID分配模式
-
窗口注意力机制
在视觉编码器中引入窗口注意力机制,确保计算成本随图像块数量线性增长而非二次增长,显著优化推理效率。 -
时空维度扩展
动态分辨率不仅应用于空间维度,还扩展到时间维度:- 动态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
还有哪些动态分辨率的方法?
动态分辨率一般有几种策略,同时要兼顾位置编码
- Multi-scale / Progressive resizing:训练时随机调整输入图像分辨率,使模型对不同尺寸的输入鲁棒;推理时根据算力选择高/低分辨率平衡性能。
- Feature Pyramid / Hierarchical Patch Embedding:将图像划分成多尺度 patch embedding,模型内部进行特征融合。
- Adaptive Token Pruning / Token Pooling:对于大图,将不重要的 patch token 合并或丢弃,减小 Transformer 计算量。
多模态大语言模型如何构建interleave的数据?
构建多模态大语言模型(Multimodal Large Language Model, MLLM)中的 interleaved data(交错数据)是实现模型理解图文混合内容、进行跨模态推理的关键步骤。所谓 interleaved data,是指文本和图像(或其他模态,如音频、视频等)在序列中以交替方式组织的数据格式,例如:
[Image1] 今天天气真好![Image2] 我们去公园野餐了。
这种结构让模型能像人类一样,在阅读一段文字时“看到”穿插其中的图片,并理解图文之间的语义关联。
以下是构建 interleaved 数据的主要方法和关键考虑点:
一、数据来源
-
原生图文交错网页/文档
- 社交媒体(如微博、Instagram 帖子)
- 博客、新闻文章(带图说明)
- 教科书、维基百科(图文混排)
- PDF 或 HTML 页面(可解析为文本+图像块)
-
人工构造数据
- 将图像插入到已有文本中(需保证语义连贯)
- 使用指令微调模板,如:“描述下图:[IMG]。接着写一段故事。”
-
合成数据生成
- 利用文生图模型(如 Stable Diffusion)根据文本生成图像,再组合成 interleaved 格式
- 反向:用图像 caption 模型为图像生成描述,插入原文
二、数据预处理流程
-
文档解析与分块
- 使用工具(如 BeautifulSoup、PDFMiner、DocTR)提取 HTML/PDF 中的文本段落和图像位置
- 保留原始顺序,记录每个元素类型(text / image)
-
图像嵌入表示
- 使用视觉编码器(如 CLIP ViT、SigLIP、DINOv2)将图像转换为 token 序列或单个特征向量
- 常见做法:将图像编码为若干视觉 tokens(如 256 个),作为 LLM 输入的一部分
-
Tokenization 与序列拼接
- 文本使用标准 tokenizer(如 Llama tokenizer)
- 图像通过特殊 token(如
<image>)占位,实际输入时替换为视觉 tokens - 最终输入序列为:
[text tokens][visual tokens][text tokens]...
-
对齐与标注(可选但重要)
- 添加指代消解标签(如“这张图显示的是…” → 关联前一张图)
- 构建 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 数据的核心在于:
- 保持图文原始顺序与语义关联
- 将图像有效转化为 LLM 可处理的 token 序列
- 确保训练数据的图文一致性与多样性
这类数据是通向通用多模态智能(如能读图写文、看图说话、图文推理)的基础,也是当前 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最底层,高分辨率注入后续几层

更多推荐


所有评论(0)