Qwen3-VL-Technical-Report

Qwen3-VL 技术报告深度分析

论文: Qwen3-VL Technical Report
团队: Qwen Team, Alibaba
日期: 2025年12月1日
arXiv: 2511.21631v2
模型规模: 2B / 4B / 8B / 32B (Dense) + 30B-A3B / 235B-A22B (MoE)


  • 支持256K token
  • 主要能力:(1)更强的纯文本能力,超过其他LLM模型;(2)更强长文本理解能力,256K token;(3)更强的多模态理解能力;
  • 主要优化点:(1)interleaved-MRoPE结构;(2)DeepStack integration;(3)text-based time alignment;
  • 整体架构:
    1. 基本模型结构(vision encoder、merger、llm)
    2. 数据策略
    3. 训练策略:预训练、后训练(SFT、RL)
    4. 加速策略(Infrastructure)

一、问题与动机:VLM 的三重困境

1.1 核心问题

Qwen3-VL 试图同时解决视觉语言模型(VLM)领域的三个根本性矛盾:

矛盾一:多模态能力与纯文本能力的零和博弈
传统 VLM 训练中,引入视觉数据往往会侵蚀 LLM 已有的语言能力。论文的雄心是让 Qwen3-VL 在语言基准上不仅不退化,还要超越同等规模的纯文本 LLM(Qwen3)。这不是一个自然的结果——视觉训练的数据和梯度更新本质上在跟文本能力"争抢"模型容量。

矛盾二:短上下文感知与长上下文推理的割裂
现有 VLM 大多擅长单图理解,但在长视频(小时级)、长文档(百页级)场景下迅速退化。核心障碍不在于上下文窗口本身,而在于位置编码在长序列上的表达能力退化——特别是在视频时间维度上,位置 ID 随时长膨胀变得极其稀疏。

矛盾三:感知精度与推理深度的分层缺失
传统 VLM 仅将 ViT 最后一层特征喂入 LLM,相当于只给语言模型"看了一眼总结"而非"逐层审视细节"。精细感知(OCR、grounding)和高层推理(数学、逻辑)需要不同抽象层级的视觉信息,但单一层级的注入无法同时满足两者。

1.2 为什么 Qwen2.5-VL 不够?

Qwen3-VL 的每个架构创新都是对 Qwen2.5-VL 具体缺陷的回应:

Qwen2.5-VL 的局限 Qwen3-VL 的应对
MRoPE 中 t/h/w 分区导致频率谱不均衡,长视频理解退化 Interleaved MRoPE:交错分配 t/h/w 到高低频段
仅用 ViT 最后一层特征,精细感知能力不足 DeepStack:多层 ViT 特征注入多层 LLM
T-RoPE 用位置编码表示时间戳,长视频产生超大稀疏位置 ID 文本时间戳:显式文本 token 表示时间
逐样本损失,文本/多模态数据贡献不平衡 平方根重加权:逐 token 归一化损失

二、核心方法:三大架构创新 + 一个训练技巧

2.1 整体模型架构

_attachments/Qwen3-VL-Technical-Report/file-20260606120543867.png

  • 包含3个组成部分:visoin encoder、MLP-based vision-language merger、LLM
    • LLM:基于qwen3系列
    • vision encoder:基于SigLIP-2架构训练,加入动态分辨率,采用2D-RoPE、插值绝对位置embeddings(CoMP)
    • Merger:2层MLP,把2x2区域的vision特征压缩为1个visual token,对齐LLM的隐空间;同时设计特殊merge支持DeepStack

2.2 Interleaved MRoPE — 位置编码的频率均衡

背景与问题

MRoPE(Multimodal Rotary Position Embedding)是 Qwen2-VL 引入的统一位置编码方案,将嵌入维度均分为三组:时间维度 \(t\)、水平维度 \(h\)、垂直维度 \(w\),每组独立使用 RoPE 的旋转频率。

问题在于:RoPE 的频率谱是从低到高排列的(\(\theta_i = 10000^{-2i/d}\)),当嵌入维度被机械切分为 \(t|h|w\) 三段时,\(t\) 分到了低频段,\(w\) 分到了高频段。这意味着:

  • 时间维度几乎只有低频信号——无法精确区分相邻帧
  • 垂直维度几乎只有高频信号——对长距离垂直位置不敏感
  • 对于长视频,\(t\) 的位置 ID 急剧膨胀,低频信号更无法提供足够的分辨力

Interleaved MRoPE 的设计

核心思想极其简洁:不再机械分区,而是将 \(t, h, w\) 交错排列到嵌入维度上:

\[\text{dim}_0 \to t,\ \text{dim}_1 \to h,\ \text{dim}_2 \to w,\ \text{dim}_3 \to t,\ \text{dim}_4 \to h,\ \text{dim}_5 \to w,\ \ldots \]

这样每个空间-时间轴都均匀覆盖了从低频到高频的全部频段。

直觉理解:想象你在听一段音乐。原始 MRoPE 相当于把低音全部给了时间、高音全部给了垂直方向——你无法用低音节拍精确定位一个 0.1 秒的瞬间。Interleaved MRoPE 则是给每个方向都分配了完整的频段,既保留长程的周期性感知,又具备短程的精确定位能力。

为什么有效:RoPE 的本质是通过不同频率的旋转来编码相对位置。低频对应长程关系("这两帧相隔很远"),高频对应短程关系("这两帧几乎相邻")。每个维度都需要同时具备这两种能力,才能在长视频场景中既理解叙事脉络又精确定位事件。

2.3 DeepStack — 多层视觉特征的跨层融合

背景与问题

传统 VLM 架构中,ViT 的视觉 token 仅从最后一层输出,经 MLP 压缩后拼接到 LLM 输入序列前端。这存在一个根本缺陷:ViT 不同层捕获了不同层级的视觉信息,但最后一层丢失了低层细节。

ViT 的层级特征有清晰的语义分工:

  • 浅层(Layer 1-8):边缘、纹理、颜色等底层特征 → 对 OCR、grounding 至关重要
  • 中层(Layer 9-16):部件、形状等中层特征 → 对图表理解、结构识别有帮助
  • 深层(Layer 17-24):语义概念、物体类别等高层特征 → 对推理、问答有用

仅用最后一层,等于让 LLM 只能看到"高层摘要"而无法审视"底层证据"。

DeepStack 的设计

Qwen3-VL 的 DeepStack 实现与原始 DeepStack 论文有所不同:

  1. 从 ViT 的三个不同层级提取特征(浅、中、深)
  2. 每个层级配备独立的 MLP merger,将特征投影到 LLM 的隐藏维度
  3. 投影后的视觉 token 直接加到 LLM 前三层的隐藏状态上(残差连接),而非拼接到输入序列

关键设计选择的深层原因:

  • 为什么用残差加法而非序列拼接? 拼接会增加上下文长度,三层的视觉 token 将使序列长度膨胀三倍。残差加法在不增加序列长度的前提下注入多层级信息——这是一个非常实际的工程权衡。
  • 为什么注入前三层而非更深层? LLM 的浅层负责基础特征处理,深层负责高级语义推理。在浅层注入多层视觉信息,让 LLM 自行在后续层中逐步消化和整合,比在深层直接注入更自然。这也符合"早融合"优于"晚融合"的经验。
  • 为什么选三个层级? 这是在信息丰富度和计算开销之间的平衡点。更多层级意味着更多 merger 参数和计算量,但收益可能边际递减。

消融实验验证:Table 12 显示,DeepStack 在 AI2D、InfoVQA、DocVQA、ChartQA 等需要精细视觉理解的任务上带来 1-2 个点的提升,平均提升 1.3 个点。虽然绝对数字不大,但这些任务恰好是低层视觉特征最关键的领域。

2.4 文本时间戳 — 从隐式编码到显式表示

Qwen2.5-VL 的 T-RoPE 方案

Qwen2.5-VL 用 T-RoPE(Time-synchronized RoPE)来编码视频时间:帧的时间戳直接映射为位置 ID,注入 RoPE 的旋转角度。

两个致命问题:

  1. 位置 ID 膨胀:一段 30 分钟的视频,以 1fps 采样就是 1800 帧,时间维度的位置 ID 就要到 1800。如果视频更长(2 小时 = 7200 帧),位置 ID 极其稀疏,模型从未在如此大的位置 ID 上训练过,外推能力差。
  2. 训练数据构造困难:要让模型学会 T-RoPE,需要覆盖各种帧率(fps)的均匀采样,数据构造成本极高。

Qwen3-VL 的文本时间戳方案

改为在每帧/帧组前插入文本形式的时间戳 token,如 <3.0 seconds> 或 <01:23:45>。

为什么更好?

  1. 位置 ID 不再膨胀:时间信息由文本 token 的语义而非位置编码承载。RoPE 只需编码序列内的相对位置,不需要编码绝对时间。
  2. 利用 LLM 已有的数字理解能力:LLM 天然理解"3.0 秒"比"2.0 秒"晚、"01:23"是一分二十三秒。这是复用已有能力,而非从零学习新的编码规则。
  3. 训练数据构造简化:不再需要遍历各种 fps 采样,只需在文本层面插入不同格式的时间戳。
  4. 代价是上下文长度增加:每帧多几个 token,但对 256K 上下文来说可以接受。

训练细节:同时使用秒数(<3.0 seconds>)和 HMS 格式(<00:03:00>),确保模型学会解读多种时间表示。

2.5 平方根重加权 — 文本与多模态的梯度平衡

问题:训练数据中,纯文本样本和多模态样本的 token 数量差异巨大。一条纯文本指令可能只有几百 token,而一张高分辨率图像可能产生数千个视觉 token。如果使用逐样本损失(per-sample loss),多模态样本的梯度贡献远大于纯文本样本,导致语言能力被侵蚀。

方案:从逐样本损失改为逐 token 损失的平方根归一化:

\[\mathcal{L} = \frac{1}{\sqrt{N}} \sum_{i=1}^{N} \ell_i \]

其中 \(N\) 是单个样本的 token 数,\(\ell_i\) 是第 \(i\) 个 token 的损失。

直觉:不加归一化时,长序列(多模态)的梯度是短序列(纯文本)的 \(\sim N\) 倍;除以 \(\sqrt{N}\) 后,梯度贡献降低到 \(\sim \sqrt{N}\) 倍,但并非完全消除长度差异——否则多模态数据的有效信号也会被过度压制。平方根是一个折中:既防止长序列主导训练,又保留足够的长度信号让模型区分不同长度的输入。


三、训练流程:从对齐到超长上下文的四阶段预训练

  • pretraining
    • warm-up阶段,只优化merger部分,优化vision=language projection
    • full-parameter训练:渐进式训练8K、32K、256K的上下文
  • post-training
    • SFT阶段:长cot数据训练
    • Knowledge distillation:从teacher模型中蒸馏
    • RL

3.1 预训练的渐进式设计

3.1.1 训练流程

阶段 目标 可训练参数 Token 量 序列长度 数据范围
S0 视觉-语言对齐 仅 Merger 67B 8K 高质量image-caption、视觉知识数据、OCR等
S1 多模态预训练 全参数 ~1T 8K VL数据和纯文本数据,交错图文数据、visual grounding、VQA、STEM、少量video数据等
S2 长上下文预训练 全参数 ~1T 32K 长序列数据,包括长文本数据、大量视频数据、agent数据等
S3 超长上下文适应 全参数 100B 256K 超长序列数据,包括长视频、长文档理解数据等

S0 的设计哲学:冻结 ViT 和 LLM,仅训练 MLP merger。这是"桥梁先行"策略——先让 merger 学会翻译视觉特征到语言空间,再让整个模型联合优化。如果不做这一步,随机初始化的 merger 会产生噪声梯度,干扰已预训练好的 ViT 和 LLM。

S3 的必要性:256K 的序列长度在 S1/S2 的 8K/32K 训练中从未出现,直接在该长度下推理会导致位置编码外推失败。S3 用专门的长序列数据(长视频 + 长文档)在 256K 长度上微调,让模型学会在极端长度下保持注意力有效性。

3.1.2 数据设计

  1. Image caption、Interleaved图文数据
    • Image caption数据:从网络爬取图文数据,采用微调的Qwen2.5-VL-32B对图像进行recaption,保证描述的丰富性和合理性;基于文本描述进行去重;
    • Interleaved图文数据:从web、书本收集多模态数据,通过轻量Qwen模型进行打分过滤,采用微调Qwen2.5-VL-7B对齐书籍数据的文本和图片;
  2. 世界知识
    • 定义entity,涵盖十余类别,包括动物、植物、地标、食物,以及车辆、电子设备和服装等日常物品;对于长尾分布;多阶段筛选,过滤低质量数据,LLM进行recaption
  3. OCR、Document Parsing and Understanding数据
  4. Grouding and counting:包括box-based grounding、point-based grounding、计数任务,采用归一化坐标[0, 1000]
  5. 空间理解和3d识别:空间理解包括空间关系理解、物体的可交互性等
  6. code:包括text-only coding、multimodel coding,将UI截图转换为响应式HTML/CSS、从图像生成可编辑的SVG代码、Latex转录代码
  7. video:dense caption synthetic、spatio-temporal video grounding(筛选并合成大规模数据,标注对象、动作和人物层级)
  8. STEM(Science、Technology、Engineering、Mathematics):基于code构建图形描述数据集、练习题解题数据、Qwen3的纯文本STEM推理数据
  9. Agent:GUI数据、用户输入queries+图像 -> function调用trajectory数据、以及对应的online search调用过程

3.2 后训练的三阶段分离

  1. SFT:分为 non-thinking(直接回答)和 thinking(Chain-of-Thought)两条路线,用不同格式的数据训练;训练时先采用32k context训练,再用256k context长序列训练;

  2. 强到弱蒸馏:关键发现——仅用纯文本数据蒸馏 LLM 骨干即可提升多模态任务的推理能力。这说明推理能力本质上是语言能力的外溢,而非视觉特有的。

    • Off-policy distillation:采用teacher模型生成轨迹,student模型学习,为student模型提供一个基础的推理能力

    • on-policy distillation(OPD):student模型生成自身轨迹 → teacher模型提供 token 级监督 → 最小化反向 KL 散度对齐分布(On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes, 2024, ICLR)

      特性 OPD 传统 RL off-policy 蒸馏
      数据来源 学生自生成(on-policy) 学生自生成 教师预生成(off-policy)
      监督信号 逐 token 密集 logits 稀疏 episode 奖励 固定教师输出
      分布对齐 完美对齐 完美对齐 严重偏移
      训练成本 极低 极高 中
      能力迁移 完整推理 + 模式控制 依赖奖励设计 仅输出分布
  3. 强化学习:分为 Reasoning RL(可验证任务:数学、代码、grounding)和 General RL(指令遵循、偏好对齐)。使用 SAPO(Soft Adaptive Policy Optimization)算法。

    • Reasoning RL:保证结果可以通过规则、代码执行进行确定性校验
      • 基于Qwen3-VL模型,采样16次,剔除所有响应均不正确的、正确率>90%的,构造初始训练数据
      • 构建奖励系统,整合多种奖励
      • 采用SAPO算法(Swarm Sampling Policy Optimization)
    • General RL
    • 构建multi-task RL架构,包括VQA、caption、OCR、文档解析等各类任务
    • 主要reward评价维度:
      1. 指令遵从:包括格式、长度、内容遵从
      2. 偏好对齐:评估回答的有用程度、准确度、风格等
    • 混合奖励体系:
      • Rule-Based Reward:基于规则的奖励,结果可准确核验,包括格式、指令跟随等
      • Model-Based Reward:无固定判断标准,基于Qwen2.5-VL-72B、Qwen3作为judger,进行开放性打分评判

3.2.1 SFT数据

在qwen2.5-VL SFT数据集(8个大类,30个细粒度子类)上基础补充,包括具身智能的空间推理能力、细粒度视觉理解、视频目标追踪定位、长文档理解、交错图文数据、agent数据

  • 包含120w样本,1/3为纯文本、2/3为图像文本和视频文本数据
  • 256k上下文,分阶段训练,先采用32k context训练,再用256k context长序列训练;

数据筛选过程

  1. Query Filtering:基于Qwen2.5-VL预筛选
  2. Response Filtering
    • Rule-Based Filtering:剔除重复、不完整、格式不当、伦理问题等内容
    • Model-Based Filtering:基于Qwen2.5-VL的reward model,评价正确性、清晰度、有用性等

3.2.1 CoT数据

  • 纯文本数据、视觉文本数据比例1:1,高质量、高挑战性的CoT数据
  • 包含VQA、OCR、2D/3D grouding、Video理解、以及STEM、agent
  • 多阶段筛选
    • Difficulty curation:选择难样本、易错样本
    • Multimodal Necessity Filtering:剔除Qwen3-30B-nothink模型在无视觉输入情况下仍能正确解答的样本
    • Response Quality Control:剔除答案错误、过度重复等样本

3.3 Thinking with Images — 视觉代理的雏形

这是论文中一个有趣但篇幅有限的创新。Qwen3-VL 被赋予了"边想边看"的能力:在推理过程中主动调用视觉工具(如 crop、zoom)来获取更细粒度的信息。

训练采用两阶段:

  1. 先在 Qwen2.5-VL-32B 上用 ~10k 简单 grounding 样本做 SFT + 工具集成 RL
  2. 再用第一阶段模型生成 ~120k 多轮交互数据,在 Qwen3-VL 上做 SFT + RL

三个互补奖励信号:

  • Answer Accuracy Reward:最终答案是否正确
  • Multi-Turn Reasoning Reward:推理过程是否连贯
  • Tool-Calling Reward:工具调用次数是否合理(防止只调一次工具"hack"前两个奖励)

四、数据工程:从量到质的系统化重构

Qwen3-VL 的数据策略不是简单地"堆更多数据",而是在每个维度上做了精细的质量控制:

4.1 图像描述(Caption)的升级

用 Qwen2.5-VL-32B 对原始粗略描述进行重写(recaptioning),生成更细致的描述。关键在于不是从零生成,而是以原始文本为条件增强——这避免了幻觉,同时补充了原始描述遗漏的视觉细节。

去重策略也很巧妙:仅在文本空间做语义去重,保留视觉多样性。这意味着两张视觉上不同但描述相似的图片会同时保留。另外,在图片embedding空间进行聚类,识别稀疏部分进行针对性增广。

4.2 长文档数据的精心构造

为了支撑 256K 上下文,需要自然的长序列数据。论文的做法是把书籍的连续页合并成 256K token 的序列,并要求:

  • 最少页数阈值
  • 最低图文比例(确保视觉元素充分)

这两条规则确保长序列中确实存在跨页的图文交互,而非纯文本堆砌。

4.3 STEM 数据的分治策略

"先分治后融合":先独立发展精细视觉感知和语言推理,再在多模态推理数据中整合。这避免了端到端训练中感知和推理互相干扰的问题。

视觉感知数据用代码渲染生成几何图形(100 万点定位样本 + 200 万 VQA 对 + 600 万图表描述),确保了标注的精确性和多样性。多模态推理数据包含 6000 万 K-12 和本科习题,1200 万长 CoT 推理样本,通过拒绝采样保留难题。

4.4 多语言 OCR 的跨越

从 Qwen2.5-VL 的 10 种语言扩展到 39 种。在自建测试集上,32/39 种语言的准确率超过 70%(实用化阈值)。这是通过合成 3000 万多语言 OCR 样本 + 100 万真实多语言图像实现的。


五、实验设计的逻辑与解读

5.1 对比策略:多层级的参照系

论文的实验设计围绕三个对比维度:

  1. 横向对比:与 Gemini-2.5-Pro、GPT-5、Claude-Opus-4.1 等闭源旗舰竞争
  2. 纵向对比:Qwen3-VL vs. 对应的纯文本 Qwen3 骨干(验证多模态训练不损害文本能力)
  3. 跨代对比:Qwen3-VL-32B vs. Qwen2.5-VL-72B(验证新一代小模型是否超越上一代大模型)

最有说服力的结果:

  • Qwen3-VL-235B-A22B-Instruct 在 AIME-25 上得分 74.7,超过纯文本的 Qwen3-235B-A22B-Instruct-2507(70.3)。多模态训练不仅没有损害推理能力,反而可能因为更丰富的训练信号而增强了它。
  • Qwen3-VL-32B 在多项基准上超越 Qwen2.5-VL-72B——参数量减半,性能反超,体现了架构进步的价值。

5.2 Thinking vs. Non-Thinking 的分离

论文提供了两种模型变体,这是对"推理效率 vs. 推理深度"这一工程权衡的务实回应:

  • Non-thinking (Instruct):直接输出答案,低延迟,适合生产部署
  • Thinking:先输出 CoT 再给答案,高延迟但更强推理

关键观察:在某些基准上(如 DocVQA、OCRBench),Instruct 版本反而优于 Thinking 版本。这说明 CoT 推理并非万能——对于以感知和检索为主的任务,额外推理可能引入不必要的噪声。

5.3 Needle-in-a-Haystack 验证

视频版的 Needle-in-a-Haystack 测试非常关键:在长达 2 小时的视频中随机位置插入一帧"针",测试模型能否定位并回答。

结果令人印象深刻:

  • 30 分钟以内(256K token):100% 准确率
  • 2 小时(~1M token,通过 YaRN 外推):99.5% 准确率

这验证了 Interleaved MRoPE + 文本时间戳的组合在超长视频场景下的有效性。

5.4 消融实验的不足

消融实验覆盖了三个组件(ViT、DeepStack、Needle-in-a-Haystack),但存在不足:

  • Interleaved MRoPE 没有独立的消融实验,仅引用了外部论文(Huang et al., 2025)作为理论依据
  • 文本时间戳 vs. T-RoPE 没有直接的对比实验
  • 平方根重加权 vs. 其他归一化方案没有对比
  • DeepStack 的消融仅在预训练模型(无后训练)上做,未展示后训练后的差异

六、创新与局限

6.1 新贡献

  1. Interleaved MRoPE:虽然思想简单(交错排列),但它是从频率分析的角度出发解决位置编码问题,比单纯调参更深刻。这可能成为后续 VLM 位置编码设计的标准做法。

  2. 文本时间戳替代 T-RoPE:这不是一个"新技术",而是一个重要的设计洞察——利用 LLM 已有的语义理解能力来编码时间,而非依赖位置编码的隐式学习。这个洞察的普适性可能超出视频领域。

  3. VLM 文本能力超越纯文本 LLM:这是一个里程碑式的结果。它证明了经过精心设计的多模态训练不仅不会损害文本能力,还可以增强它——可能是因为视觉数据提供了额外的"世界知识"和"空间推理"信号。

  4. 强到弱蒸馏仅用文本即可提升多模态:这揭示了推理能力在语言和视觉之间的共享本质,对后续的模型设计有指导意义。

6.2 局限

  1. 视频帧数限制:尽管支持 256K token,但单视频最多 2048 帧,每帧最多 768 token。这意味着超长视频必须以极低分辨率或极低帧率处理——256K 的长上下文更适用于多图/多文档场景而非单视频。

  2. OmniDocBench 分数异常:Qwen3-VL 在 OmniDocBench 上的分数(0.143-0.207)显著低于某些竞品(GPT-5: 0.347, Claude: 0.356),论文未解释这一异常。可能的原因包括:评估指标的特殊性、该基准对特定输出格式的偏好等。

  3. 计算成本的缺失:论文完全没有报告训练的计算量(FLOPs、GPU 时等),也没有报告推理延迟。对于一个 235B 参数的 MoE 模型,部署成本是实际应用的关键考量。

  4. 多模态生成的缺失:Qwen3-VL 仅支持理解(understanding),不支持图像/视频生成。论文在结论中提到"统一理解-生成架构"是未来方向,但未讨论为何当前版本未纳入。

  5. 数据规模的模糊性:预训练声称约 2T token(S1 + S2),但数据配比(VL vs. 文本)、各数据类别的具体 token 数均未披露,使得复现困难。


七、核心启示

7.1 位置编码需要频率分析视角

Interleaved MRoPE 的成功说明,在多模态场景下,位置编码不能只考虑"怎么区分不同位置",还要考虑"每个维度需要什么样的频率覆盖"。这是一个信号处理视角的贡献,可能启发更多基于频域分析的位置编码设计。

7.2 多层特征注入是 VLM 的正确方向

DeepStack 虽然带来的绝对提升不大(~1.3 点平均),但它的方向是正确的:VLM 需要的不是"更多信息",而是"更多层级的信息"。当前实现用残差加法避免序列膨胀是工程上的巧思,未来可能有更优雅的多层融合方式。

7.3 让 LLM 做它擅长的事

文本时间戳的核心洞察是:不要让位置编码做它不擅长的事(表示绝对时间),而是让 LLM 做它擅长的事(理解文本语义)。这个"用语义替代编码"的思路可能适用于其他类型的位置/属性信息。

7.4 多模态训练可以增强而非损害文本能力

这是本论文最重要的发现。传统观点认为多模态训练会"稀释"文本能力,但 Qwen3-VL 的结果表明,经过精心设计的数据配比(平方根重加权)和训练策略(渐进式扩展),多模态训练实际上可以增强推理能力。这可能改变社区对 VLM 训练的范式认知。


八、总结

Qwen3-VL 不是一项单一技术的突破,而是一次系统性的工程集成:每个组件(Interleaved MRoPE、DeepStack、文本时间戳、平方根重加权)单独看都是增量改进,但组合在一起,配合精心设计的数据工程和训练流程,产生了显著的整体增益。

论文最大的贡献可能不是任何一个架构创新,而是展示了一种可行的 VLM 训练范式——在保持甚至增强文本能力的同时,系统性地推进多模态理解的上限。这种"不做取舍,全都要"的思路,正是 VLM 从专用工具走向通用智能体所必需的。


附录(代码结构内容详解)

模型对应 HuggingFace transformers 中的 Qwen3VLForConditionalGeneration,源码在 transformers/models/qwen3_vl/modeling_qwen3_vl.py,配置在 transformers/models/qwen3_vl/configuration_qwen3_vl.py。下面同时给出 8B-Instruct 的官方 config.json 中的具体超参,以及代码层面的模块组成。

1. 顶层结构

Qwen3VLForConditionalGeneration                       # modeling_qwen3_vl.py:1271
├── model: Qwen3VLModel                               # modeling_qwen3_vl.py:887
│   ├── visual: Qwen3VLVisionModel                    # 视觉编码器  modeling_qwen3_vl.py:564
│   └── language_model: Qwen3VLTextModel              # 文本解码器  modeling_qwen3_vl.py:762
└── lm_head: nn.Linear(4096 → 151936, bias=False)     # 语言模型头

tie_word_embeddings=False,即 embed_tokens 与 lm_head 权重独立(8B 的设置)。

2. 视觉编码器 Qwen3VLVisionModel(8B 配置)

超参 值
depth(Transformer 层数) 27
hidden_size 1152
intermediate_size (MLP) 4304
num_heads 16,head_dim = 72
patch_size 16
temporal_patch_size 2
spatial_merge_size 2
in_channels 3
num_position_embeddings 2304(≈ 48×48 网格)
out_hidden_size 4096(对齐到文本侧 hidden_size)
deepstack_visual_indexes [8, 16, 24]
激活 gelu_pytorch_tanh
LayerNorm eps 1e-6

子模块组成

  1. patch_embed: Qwen3VLVisionPatchEmbed(modeling_qwen3_vl.py:59)
    • nn.Conv3d(3, 1152, kernel=(2,16,16), stride=(2,16,16), bias=True)
    • 把 (T, 3, H, W) 切成 (T/2, H/16, W/16) 个 patch,每个 patch → 1152-d 向量。
  2. pos_embed: nn.Embedding(2304, 1152) + fast_pos_embed_interpolate(modeling_qwen3_vl.py:642)
    • 用 2304(即 48×48)个可学习位置 embedding 通过双线性插值到任意分辨率,再加到 patch 特征上。
  3. rotary_pos_emb: Qwen3VLVisionRotaryEmbedding(dim=36)(modeling_qwen3_vl.py:79)
    • 2D-RoPE,作用在 (h, w) 两个轴上;由 rot_pos_emb 生成。
  4. blocks: 27 × Qwen3VLVisionBlock(modeling_qwen3_vl.py:251),每个 block 是标准 Pre-Norm Transformer:
    x = x + Attn(LN(x))
    x = x + MLP(LN(x))
    
    • Qwen3VLVisionAttention(modeling_qwen3_vl.py:168):qkv = Linear(1152, 3*1152, bias=True),16 头多头自注意力(非 GQA),用 vision RoPE;通过 cu_seqlens 支持变长打包(可走 FlashAttention2)。
    • Qwen3VLVisionMLP(modeling_qwen3_vl.py:46):两层 Linear,激活 gelu_pytorch_tanh,带 bias。
    • 两个 nn.LayerNorm(1152, eps=1e-6)。
  5. merger: Qwen3VLVisionPatchMerger(最终输出 merger,modeling_qwen3_vl.py:93)
    • 把 2×2 空间相邻的 patch 拼成 1 个 token(spatial_merge_size=2)。
    • 结构:LayerNorm(1152) → Linear(4608, 4608) → GELU → Linear(4608, 4096)。
    • 4608 = 1152 × 4。输出对齐到 LLM 的 hidden_size 4096。
  6. deepstack_merger_list: 3 × Qwen3VLVisionPatchMerger(use_postshuffle_norm=True)
    • 分别接在 vision 第 8、16、24 层后(deepstack_visual_indexes = [8, 16, 24])。
    • 每层抽取的视觉特征经过独立的 merger,产生 3 组 deepstack 特征,后续注入到 LLM 的前 3 层。这是 DeepStack 论文 的做法。

视觉前向(forward)流程(modeling_qwen3_vl.py:703):patches → patch_embed → + pos_embed → 27 vision blocks(同时在第 8/16/24 层抽特征过 deepstack merger)→ final merger → (image_embeds, deepstack_feature_lists)。

3. 文本(LLM)解码器 Qwen3VLTextModel(8B 配置)

超参 值
vocab_size 151936
hidden_size 4096
intermediate_size (MLP) 12288
num_hidden_layers 36
num_attention_heads 32
num_key_value_heads 8(GQA,组大小 4)
head_dim 128(总头维 = 32×128 = 4096)
max_position_embeddings 262144(256K context)
rope_theta 5,000,000
rope_scaling mrope_interleaved=true,mrope_section=[24, 20, 20]
hidden_act silu
RMSNorm eps 1e-6
attention_bias False
dtype bfloat16

子模块组成

  1. embed_tokens: nn.Embedding(151936, 4096)
  2. rotary_emb: Qwen3VLTextRotaryEmbedding(modeling_qwen3_vl.py:278)
    • 实现 MRoPE(Multimodal / 3D-RoPE),把 head_dim 的频率分给 T、H、W 三轴:mrope_section=[24,20,20],即半 head_dim(64)= 24 + 20 + 20。
    • mrope_interleaved=True:用 apply_interleaved_mrope 把三轴频率交错排列(THTHWHTHW…),而非分段堆叠。
  3. layers: 36 × Qwen3VLTextDecoderLayer(modeling_qwen3_vl.py:476),每层结构(Pre-RMSNorm,Llama 系):
    h = h + SelfAttn( RMSNorm(h) )
    h = h + MLP    ( RMSNorm(h) )
    
    • self_attn: Qwen3VLTextAttention(modeling_qwen3_vl.py:385),GQA:
      • q_proj: Linear(4096, 32×128=4096), bias=False
      • k_proj: Linear(4096, 8×128=1024), bias=False
      • v_proj: Linear(4096, 8×128=1024), bias=False
      • o_proj: Linear(4096, 4096), bias=False
      • q_norm / k_norm: RMSNorm(head_dim=128) —— QK-Norm,只在 head_dim 上做(Qwen3 系列的特征,可稳住长上下文训练)。
      • 应用 MRoPE 后做因果注意力,支持 SDPA / FlashAttention2。
    • mlp: Qwen3VLTextMLP(modeling_qwen3_vl.py:460,SwiGLU):
      • gate_proj: Linear(4096, 12288, bias=False)
      • up_proj: Linear(4096, 12288, bias=False)
      • down_proj: Linear(12288, 4096, bias=False)
      • out = down_proj( silu(gate_proj(x)) * up_proj(x) )
    • input_layernorm / post_attention_layernorm:RMSNorm(4096, eps=1e-6)
  4. norm: RMSNorm(4096) —— 最终归一化。

DeepStack 视觉注入到 LLM 前几层

在 Qwen3VLTextModel.forward(modeling_qwen3_vl.py:849)中:

for layer_idx, decoder_layer in enumerate(self.layers):
    hidden_states = decoder_layer(...)
    if deepstack_visual_embeds is not None and layer_idx in range(len(deepstack_visual_embeds)):
        hidden_states = self._deepstack_process(
            hidden_states, visual_pos_masks, deepstack_visual_embeds[layer_idx],
        )

即:从视觉塔第 8/16/24 层抽出的 3 组特征,经过对应 deepstack merger 后,在 LLM 的第 0/1/2 层之后加到对应视觉 token 的位置上(hidden[visual_pos] += visual_embed)。这就是 Qwen3-VL 相对 Qwen2-VL 引入的 DeepStack 视觉特征多层注入。

4. 多模态融合(Qwen3VLModel.forward)

流程(modeling_qwen3_vl.py:1108):

  1. embed_tokens(input_ids) → 文本 embedding。
  2. 若有 pixel_values / pixel_values_videos:经 visual 得到主视觉特征 image_embeds(已对齐 4096 维)和 3 组 deepstack_image_embeds。
  3. 通过 <image> / <video> 占位符 token(id 分别为 151655 / 151656,起止 151652 / 151653)的位置,用 masked_scatter 把视觉特征替换到对应位置。
  4. 用 get_rope_index 计算 MRoPE 三维 position_ids(对图像取 (t, h//2, w//2) 的网格坐标,视频用时间戳分帧),并把视觉位置 mask 与 deepstack 特征传入 language_model。
  5. LLM 36 层解码 + DeepStack 注入前 3 层 → 最终 hidden → lm_head 出 logits。

5. 参数量速算(≈ 8B)

  • 文本侧每层主要参数:
    • Attention:q + k + v + o + q/k Norm ≈ 4096·(4096+1024+1024+4096) + 256 ≈ 41.9 M / 层
    • MLP:3 × 4096 × 12288 = 150.99 M / 层
    • 两个 RMSNorm 可忽略。
    • 单层 ≈ 193 M,36 层 ≈ 6.95 B。
  • Embedding + lm_head:2 × 151936 × 4096 ≈ 1.24 B(不共享权重)。
  • 视觉塔:27 层 × (Attn ≈ 1152·(3·1152+1152) + MLP 2·1152·4304) ≈ 5.3 + 9.9 ≈ 15.3 M/层 → 约 0.41 B;加 patch_embed + pos_embed + 4 个 merger(主 merger ≈ 4608·4608 + 4608·4096 ≈ 39 M,3 个 deepstack merger 同量级)≈ 共 ~0.55 B。

总计 ≈ 6.95 + 1.24 + 0.55 ≈ 8.7 B 参数,与 "Qwen3-VL-8B" 命名吻合(通常 8B 仅按 LLM 主体计,不含视觉塔的话刚好 ~8 B)。

posted @ 2026-06-06 12:05  kiyoxi  阅读(976)  评论(0)    收藏  举报