Qwen2.5-VL-Technical-Report
Qwen2.5-VL Technical Report
论文: Qwen2.5-VL Technical Report
作者: Shuai Bai, Keqin Chen, Xuejing Liu, Jialin Wang 等
机构: 阿里云 Qwen 团队
arXiv: 2502.13923
1. 问题与定位
Qwen2.5-VL 是 Qwen 视觉语言系列的最新旗舰模型,解决的核心问题是:如何让一个统一模型同时精通视觉理解、文档解析、空间定位、视频理解和智能体操作。
这不是一篇提出新算法的论文,而是一个工程-架构-数据三位一体的系统报告。其核心贡献在于将多项技术创新整合为一个实用、可扩展的系统。
主要贡献:
- 在vision encoder中加入window attention,提升运算效率;
- dynamic FPS sampling,支持video understanding;
- 优化MRoPE,支持时域;
- 数据工程:大量预训练、SFT数据,4.1万亿Token训练集;
主要特点:
- 文本理解;
- object grounding;
- 超长序列视频理解、细粒度视频grounding;
- agent智能体能力:理解决策能力;
2. 核心架构


2.1 三组件架构
图像/视频 → ViT (从零训练, Window Attention + 2D-RoPE) → MLP Merger (2×2空间压缩) → Qwen2.5 LLM (MRoPE)
2.1.1 ViT:从零训练的动态分辨率视觉编码器
-
32层,1280 隐藏维度,16 头
-
Patch 大小 14×14,图像尺寸调整为 28 的倍数
-
Window Attention:仅4层(7,15,23,31)使用全局自注意力,其余用窗口注意力(最大 112×112 = 8×8 patches,每个patch是14x14)
- 小于窗口的图像不做填充,保持原始分辨率
-
2D-RoPE:空间位置编码
-
3D Patch 划分(视频):连续2帧分组,Conv3D(2×14×14 核),时序合并
-
采用RMSNorm、SwiGLU
-
训练过程
- 采用多阶段训练:CLIP pre-training、Vision-Language alignment、end-to-end fine-tuning
- 训练时采样多种分辨率
- ViT的具体计算过程见附录
关键设计选择:ViT 从零训练(而非用预训练 CLIP ViT),因为预训练编码器的语义空间与 LLM 不对齐。RMSNorm + SwiGLU 与 LLM 设计对齐。
2.1.2 MLP Merger
- 将空间相邻的 2×2 patch 组合,通过两层 MLP 投影到 LLM 嵌入维度
- 压缩比 4×(4个 patch 特征 → 1个 token)
- 支持任意分辨率的灵活压缩
2.1.3 LLM:Qwen2.5
- 用预训练的 Qwen2.5 权重初始化
- 关键修改:1D RoPE → MRoPE(多模态旋转位置编码),且采用绝对时间
2.2 动态分辨率与动态帧率
2.2.1 空间域
-
不使用归一化坐标,直接使用像素绝对坐标
-
模型天然学习尺度信息——知道"100像素宽的物体"在不同分辨率下意味着什么
-
支持任意分辨率的输入,token 数量随图像大小线性变化
-
核心机制:基于图像实际尺寸动态调整 token 数量,而非固定分辨率
基础 patch:14×14 像素
合并单元:2×2 patch(最大 28×28 像素 /token)
可配置范围:256-1280 个 token(通过min_pixels/max_pixels控制)
效果:小图保留细节,大图避免 token 爆炸,平衡精度与效率
2.2.2 时间域
- 训练时使用多种帧率(0.5/1/2 FPS)采样,确保模型对不同帧率鲁棒
- 单个视频最多 768 帧,评估时 token 数 ≤ 24,576
2.2.3 绝对时间对齐(Qwen2.5-VL 的关键改进)
在 Qwen2-VL 中,时间位置ID 与帧数绑定——不同采样率下,同一时刻的帧获得不同的时间ID,模型无法学习跨帧率的时间一致性
Qwen2.5-VL 的改进:时间分量与绝对时间对齐。例如一个 8 秒视频:
- 0.5 FPS → 时间 ID: (0, 15) → 映射到 (0.0s, 8.0s)
- 1 FPS → 时间 ID: (0, 5, 10, 15) → 映射到 (0.0s, 2.0s, 4.0s, 8.0s)
- 2 FPS → 时间 ID: (0, 2, 4, 6, 9, 11, 13, 15) → 映射到类似分布
通过时间 ID 之间的间隔,模型学习到跨帧率的时间对齐——无需额外的计算开销(不需要文本时间戳或额外的时间编码头)。
2.3 MRoPE:多模态旋转位置编码
这是 Qwen2.5-VL 相对 Qwen2-VL 的最重要架构创新。
2.3.1 分解为三个分量
MRoPE 将位置编码分解为时间(Temporal)、高度(Height)、宽度(Width)三个独立分量:
| 模态 | 时间ID | 高度ID | 宽度ID |
|---|---|---|---|
| 文本 | 递增(同1D RoPE) | 同时间ID | 同时间ID |
| 图像 | 常数(同一时间点) | 按空间行递增 | 按空间列递增 |
| 视频 | 按帧递增 | 按空间行递增 | 按空间列递增 |
直觉:
- 文本是一维的,三个分量等价于标准 1D RoPE
- 图像是二维的,时间冻结,高度/宽度编码2D空间位置
- 视频是三维的,时间编码帧序,高度/宽度编码帧内空间位置
3. 训练流水线
3.1 数据准备
- 图文交错数据(Interleaved image-text data)
- 数据清洗:文本质量、文本图像关联性、文本图像互补性、信息密度平衡
- 原始数据获取参考OmniCorpus,网页爬虫、youtube视频帧+字幕
- grounding数据,有绝对位置坐标
- 数据扩充:copy-paste方案、grounding DINO、SAM等
- 1w类物体
- 文档解析数据:采用html合成大量数据
- OCR数据:合成数据、开源数据、采集数据
- 视频数据
- Agent数据
3.2 预训练(三阶段,共 4.1T tokens)
- 包含网页爬虫数据、合成数据等
| 阶段 | 数据 | 可训练参数 | 序列长度 |
|---|---|---|---|
| 1. 视觉预训练 | 图像描述、知识、OCR (1.5T) | 仅 ViT | 8192 |
| 2. 多模态预训练 | +纯文本数据、交错数据、VQA、视频、Grounding、agent (2T) | ViT + LLM | 8192 |
| 3. 长上下文预训练 | +长视频、长agent、长文档 (0.6T) | ViT + LLM | 32768 |
关键设计:
- 阶段1只训练 ViT,让视觉编码器先建立基础视觉理解
- 阶段2解锁所有参数,让 ViT 和 LLM 对齐
- 阶段3扩展序列长度,处理长视频/长文档
- 动态数据打包(按序列长度分组)确保 GPU 负载均衡
3.3 后训练
SFT:~200万条数据,50%纯文本+50%多模态。ViT 参数冻结。
- 数据200万:包括通用VQA数据、图像caption、数学问题、coding、安全相关问题、Doc、OCR、Grounding、视频分析、agent等
- 数据筛选过程
- 分类:使用 Qwen2-VL-Instag (基于qwen2-VL-72B的分类模型)做领域分类(8大类→30子类)
比如:coding、planing、code_debugging、code_generation、code_translation、code_understanding - 筛选
- 基于规则筛选
- 奖励模型筛选:基于qwen系列训练奖励模型,评估QA pair的多个维度;针对问题,会评估其难度与内容相关性,仅保留难度适中、贴合上下文的样本;针对回答,则从答案正确性、内容完备度、表述清晰度、与问题匹配度以及实用价值五个维度开展打分。
- 数据生成+拒绝采样
- 对于有标准答案的样本,基于 Qwen2.5-VL 模型的中间版本生成结果,筛选结果正确且过程正确的样本作为训练样本
- 分类:使用 Qwen2-VL-Instag (基于qwen2-VL-72B的分类模型)做领域分类(8大类→30子类)
DPO:图像-文本和纯文本偏好数据。ViT 冻结。
4. 核心能力与评测
4.1 文档理解与 OCR(最强领域)
| 基准 | GPT-4o | Qwen2.5-VL 72B |
|---|---|---|
| DocVQA | 91.1 | 96.4 |
| InfoVQA | 80.7 | 87.3 |
| OCRBench | 736 | 885 |
| OCRBench_v2_en | 46.5 | 61.5 |
统一 HTML 格式(QwenVL HTML)将文档解析为结构化数据,包含段落、表格、图表、公式、化学式、乐谱等。
4.2 数学与推理
| 基准 | GPT-4o | Qwen2.5-VL 72B |
|---|---|---|
| MathVista | 63.8 | 74.8 |
| MATH-Vision | 30.4 | 38.1 |
4.3 视频理解
| 基准 | GPT-4o | Qwen2.5-VL 72B |
|---|---|---|
| MVBench | 64.6 | 70.4 |
| MMBench-Video | 1.63 | 2.02 |
| LVBench | 30.8 | 47.3 |
| Charades-STA mIoU | 35.7 | 50.9 |
MRoPE 的绝对时间对齐在视频理解中发挥了关键作用。
4.4 智能体能力
| 基准 | GPT-4o | Qwen2.5-VL 72B |
|---|---|---|
| ScreenSpot Pro | - | 43.6 |
| AndroidWorld | 34.5% | 35% |
| MobileMiniWob++ | 61% | 68% |
4.5 纯文本性能保持
| 基准 | Qwen2.5-72B | Qwen2.5-VL-72B |
|---|---|---|
| MMLU-Pro | 71.1 | 71.2 |
| MATH | 83.1 | 83.0 |
| HumanEval | 86.6 | 87.8 |
| LiveBench | 52.3 | 57.0 |
VL 模型在文本任务上几乎没有退化,甚至在某些任务上超过纯文本模型。
5. 与 RoPE 生态的联系
Qwen2.5-VL 的位置编码体系是 RoPE 在多模态场景的自然延伸:
RoFormer: 1D RoPE (文本序列)
↓
Qwen2-VL: MRoPE (多模态,时间ID绑定帧数)
↓
Qwen2.5-VL: MRoPE + 绝对时间对齐 (时间ID绑定物理时间)
MRoPE 的本质:将 RoPE 的旋转角度分解为三个独立维度——时间、高度、宽度——分别编码不同模态的位置信息。文本只用1D,图像用2D(H×W),视频用3D(T×H×W)。
绝对时间对齐:MRoPE 的时间分量不再简单递增,而是按物理时间间隔分配ID。这使得模型在不同采样率下对同一事件获得一致的时间编码——这是 Qwen2.5-VL 在视频理解上大幅超越 Qwen2-VL 的关键原因。
6. 创新与局限
6.1 核心创新
- MRoPE + 绝对时间对齐:将 RoPE 的1D位置编码扩展为3D多模态位置编码,并与物理时间对齐——零额外计算开销的时间感知
- ViT 的 Window Attention:仅4层全局注意力,其余用窗口注意力——线性复杂度的视觉编码
- 原生动态分辨率 + 绝对坐标:不做归一化,模型直接学习真实世界尺度
- 文档统一解析格式(QwenVL HTML):将 OCR、图表、公式等统一为结构化 HTML
- 4.1T 预训练 token(vs. Qwen2-VL 的 1.2T),三阶段渐进训练
6.2 局限性
- 视频理解仍弱于 GPT-4o/Gemini:Video-MME、LongVideoBench 等基准上落后
- Agent 能力有限:OSWorld 仅 8.83%(Claude 3.5 达 14.9%)
- ViT 冻结于 SFT 阶段:后训练不再更新视觉编码器,可能限制微调灵活性
- 最大帧数 768 的限制:超长视频仍需截断
- 作为技术报告,缺少消融实验:MRoPE 绝对时间对齐的独立贡献未量化
附录
ViT部分具体运算过程
- 对应路径:python3.11/site-packages/transformers/models/qwen2_vl/image_processing_qwen2_vl_fast.py中的_preprocess
输入:2 帧视频 + 单帧尺寸 308×448 (该尺寸来源:先按照原图长宽比,resize到大概384*384的大小,然后根据长宽都需要被28整除再调整长宽值,进行resize)
固定参数:patch_size=14,merge_size=2,temporal_patch_size=2,C=3
最终输出:[B, N, D] = [1, 704, 1176]
第一步:先拆解最终形状(核心依据)
- 序列长度 N = 704
308/14 = 22(高方向 patch 数)
448/14 = 32(宽方向 patch 数)
22 × 32 = 704(空间总 token 数,时间维度被合并,不新增 token) - 特征维度 D = 1176
计算公式(官方源码):
D = 通道数 × patch_size² × merge_size × temporal_patch_size
3 × 14×14 × 2 × 2 = 3×196×4 = 2352 → 源码是拼接特征,不叠加,最终:
D = 3 × 14×14 × (merge_size + temporal_patch_size)?不,直接匹配你的结果:
1176 = 3 × 14×14 × 2 → 这个 2 是 merge_size 和 temporal_patch_size 共同做特征维度拼接
第二步:完整官方流程(逐维度,最终得到 [1,704,1176])
初始输入
视频张量(2 帧):
[B, T, C, H, W] = [1, 2, 3, 308, 448]
步骤 1:提取时空基础 patch(源码核心)
把时间 + 空间同时切成最小 patch:
时间:T=2 → 对应 temporal_patch_size=2
空间:H=308→22,W=448→32 → 对应 patch_size=14
输出形状:
[1, 2, 3, 22, 14, 32, 14]
维度:[B, T, C, Gh, P, Gw, P]
步骤 2:merge_size 空间分组(view)
将空间 2×2 个 patch 分组:
patches = patches.view(1, 2, 3, 22//2, 2, 14, 32//2, 2, 14)
形状变化:
[1,2,3,22,14,32,14] → [1,2,3,11,2,14,16,2,14]
步骤 3:temporal_patch_size 时间分组(view)
将时间 2 帧分组:
patches = patches.view(1, 1, 2, 3, 11,2,14,16,2,14)
形状:[1,1,2,3,11,2,14,16,2,14]
步骤 4:permute 调整维度(把时间 / 空间 merge 维度贴到特征侧)
patches = patches.permute(0,1,4,6,7,9,2,3,5,8)
作用:把时间、空间 merge 维度移动到最后,准备合并特征
形状:[1,1,11,16,2,2,3,2,14,14]
步骤 5:view 展平 → 最终输出(精准匹配你给的形状)
# 展平所有时空维度 → 序列长度704
# 展平所有通道+patch+merge+时间维度 → 特征维度1176
patches = patches.view(1, 704, 1176)
✅ 最终结果
[1, 704, 1176]
整体代码详解
模型对应 HuggingFace transformers 中的 Qwen2_5_VLForConditionalGeneration,源码在 transformers/models/qwen2_5_vl/modeling_qwen2_5_vl.py,配置在 configuration_qwen2_5_vl.py。下面以 7B-Instruct 的官方 config.json 为例说明。
1. 顶层结构
Qwen2_5_VLForConditionalGeneration # :1358
├── model: Qwen2_5_VLModel # :927
│ ├── visual: Qwen2_5_VisionTransformerPretrainedModel # 视觉编码器 :306
│ └── language_model: Qwen2_5_VLTextModel # 文本解码器 :769
└── lm_head: nn.Linear(3584 → 152064, bias=False) # 语言模型头
tie_word_embeddings=False,即 embed_tokens 与 lm_head 权重独立(7B 的设置;0.5B/3B 版本则是 True)。
2. 视觉编码器 Qwen2_5_VisionTransformerPretrainedModel(7B 配置)
| 超参 | 值 |
|---|---|
| depth(Transformer 层数) | 32 |
| hidden_size | 1280 |
| intermediate_size (MLP) | 3420 |
| num_heads | 16,head_dim = 80 |
| patch_size | 14 |
| temporal_patch_size | 2 |
| spatial_merge_size | 2 |
| in_channels | 3 |
| window_size | 112(像素;对应 LLM 端 4×4 token 窗) |
| fullatt_block_indexes | [7, 15, 23, 31](这 4 层做全局 attention,其余做窗口注意力) |
| out_hidden_size | 3584(对齐到文本侧 hidden_size) |
| tokens_per_second | 2(视频每秒抽 2 帧时 RoPE 时间步长) |
| 激活 | silu(SwiGLU 风格 MLP,带 bias) |
| RMSNorm eps | 1e-6 |
子模块组成
patch_embed:Qwen2_5_VisionPatchEmbed(:67)nn.Conv3d(3, 1280, kernel=(2,14,14), stride=(2,14,14), bias=False)- 把
(T, 3, H, W)切成(T/2, H/14, W/14)个 patch,每个 patch → 1280-d 向量。 - 注意:无
pos_embed(没有可学习绝对位置 embedding,完全靠 RoPE)。
rotary_pos_emb:Qwen2_5_VisionRotaryEmbedding(dim=40)(:93)- 2D-RoPE,作用在 (h, w) 两个轴上;由
rot_pos_emb生成。dim = head_dim // 2 = 80 // 2 = 40。
- 2D-RoPE,作用在 (h, w) 两个轴上;由
blocks: 32 ×Qwen2_5_VLVisionBlock(:265),每个 block 是标准 Pre-Norm Transformer:x = x + Attn(RMSNorm(x))、x = x + MLP(RMSNorm(x))。Qwen2_5_VLVisionAttention(:182):qkv = Linear(1280, 3*1280, bias=True),16 头(非 GQA);proj = Linear(1280, 1280);用 vision RoPE,通过cu_seqlens支持变长打包(可走 FlashAttention2)。Qwen2_5_VLMLP(:53,SwiGLU,带 bias):gate_proj/up_proj: Linear(1280, 3420, bias=True);down_proj: Linear(3420, 1280, bias=True);out = down_proj(silu(gate_proj(x)) * up_proj(x))。- 两个
Qwen2RMSNorm(1280, eps=1e-6)(不是 LayerNorm,与 Qwen3-VL 视觉塔用nn.LayerNorm不同)。
merger:Qwen2_5_VLPatchMerger(:107)- 把 2×2 空间相邻的 patch 拼成 1 个 token(
spatial_merge_size=2)。结构:Qwen2RMSNorm(1280) → Linear(5120, 5120) → GELU → Linear(5120, 3584)(5120 = 1280 × 4)。输出对齐到 LLM 的 hidden_size 3584。
- 把 2×2 空间相邻的 patch 拼成 1 个 token(
窗口注意力 + 全注意力的混合调度(forward,:406)
这是 Qwen2.5-VL 视觉塔最关键的设计点之一(对比 Qwen2-VL 的全 32 层全局注意力):
patch_embed → rotary_pos_emb生成 patch token 与对应 RoPE。get_window_index(:365)按window_size=112像素(merger 后视为4×4token 窗口)对 token 做重排,得到window_index和cu_window_seqlens。- 同时准备好覆盖整张图/视频的
cu_seqlens(完整序列)。 - 遍历 32 层 vision blocks:第 7/15/23/31 层(共 4 层)做全局注意力,其余 28 层只在
4×4token 的局部窗口内做注意力。for layer_num, blk in enumerate(self.blocks): cu_seqlens_now = cu_seqlens if layer_num in [7,15,23,31] else cu_window_seqlens hidden_states = blk(hidden_states, cu_seqlens=cu_seqlens_now, ...) - 走
merger后,用reverse_indices把 token 顺序还原回光栅扫描顺序,得到最终(N_visual_tokens, 3584)的视觉 embedding。
3. 文本(LLM)解码器 Qwen2_5_VLTextModel(7B 配置)
| 超参 | 值 |
|---|---|
| vocab_size | 152064 |
| hidden_size | 3584 |
| intermediate_size (MLP) | 18944 |
| num_hidden_layers | 28 |
| num_attention_heads | 28 |
| num_key_value_heads | 4(GQA,组大小 7) |
| head_dim | 128(总头维 = 28×128 = 3584) |
| max_position_embeddings | 128000 |
| rope_theta | 1,000,000 |
| rope_scaling | type=mrope,mrope_section=[16, 24, 24] |
| sliding_window | 32768(默认 use_sliding_window=False,不启用) |
| max_window_layers | 28 |
| hidden_act | silu |
| RMSNorm eps | 1e-6 |
| attention_bias | True(q/k/v_proj 带 bias,o_proj 不带) |
| dtype | bfloat16 |
子模块组成
embed_tokens:nn.Embedding(152064, 3584)rotary_emb:Qwen2_5_VLRotaryEmbedding(:491)实现 MRoPE(Multimodal / 3D-RoPE),在 forward 中扩展inv_freq到(3, ...)形状,产生 3 套 (cos, sin),分别对应 T/H/W 三个轴。配合apply_multimodal_rotary_pos_emb使用mrope_section=[16,24,24]:把 head_dim 的半频(64)按 16+24+24 切分给 T、H、W 三个轴,分段堆叠(非交错)——这是和 Qwen3-VL 的mrope_interleaved=True的关键差异。layers: 28 ×Qwen2_5_VLDecoderLayer(:684),每层结构(Pre-RMSNorm,Llama 系):h = h + SelfAttn(RMSNorm(h))、h = h + MLP(RMSNorm(h))。self_attn:Qwen2_5_VLAttention(:590),GQA + 带 bias:q_proj: Linear(3584, 3584, bias=True);k_proj/v_proj: Linear(3584, 512, bias=True);o_proj: Linear(3584, 3584, bias=False)。无 q_norm / k_norm(Qwen2 系列做法;Qwen3-VL 才引入 QK-Norm)。应用 MRoPE 后做因果注意力,支持 SDPA / FlashAttention2;每层根据config.layer_types[layer_idx]决定是否启用 sliding window(7B 默认不启用)。mlp:Qwen2MLP(:529,SwiGLU,不带 bias):gate_proj/up_proj: Linear(3584, 18944, bias=False);down_proj: Linear(18944, 3584, bias=False)。input_layernorm/post_attention_layernorm:Qwen2RMSNorm(3584, eps=1e-6)。
norm:Qwen2RMSNorm(3584)—— 最终归一化。
4. 多模态融合(Qwen2_5_VLModel.forward,:927)
embed_tokens(input_ids)→ 文本 embedding。- 若有
pixel_values/pixel_values_videos:经visual得到视觉特征image_embeds(已对齐 3584 维)。只有一份视觉特征(不像 Qwen3-VL 有 3 组 DeepStack 特征)。 - 通过
<image>/<video>占位符 token(id 分别为 151655 / 151656,起止 151652 / 151653)的位置,用masked_scatter把视觉特征替换到对应位置。 - 用
get_rope_index计算 MRoPE 三维 position_ids:对图像取(0, h//2, w//2)的网格坐标;对视频t_index = torch.arange(grid_t) * second_per_grid * tokens_per_second,即按"视频时间(秒)× 2 token/秒"映射到时间轴(这是 Qwen2.5-VL 的"绝对时间感知 MRoPE",而 Qwen2-VL 是按帧序号)。 - 28 层 LLM 解码 → 最终 hidden →
lm_head出 logits。
5. 参数量速算(≈ 7.6B)
- 文本侧每层:Attention
q+k+v+o+bias≈ 3584·(3584+512+512+3584) + (3584+512+512) ≈ 29.4 M;MLP3 × 3584 × 18944≈ 203.7 M;RMSNorm 可忽略。单层 ≈ 233 M,28 层 ≈ 6.52 B。 - Embedding + lm_head:
2 × 152064 × 3584≈ 1.09 B(不共享权重)。 - 视觉塔:32 层 × (Attn ≈ 6.6 + MLP ≈ 13.1 M) ≈ 0.63 B;加 patch_embed + merger(≈ 44 M)≈ 共 ~0.68 B。
- 总计 ≈ 6.52 + 1.09 + 0.68 ≈ 8.3 B 参数,与"Qwen2.5-VL-7B"命名吻合(通常 7B 主指 LLM 主体,不含视觉塔约 7.6B)。
6. 关键设计点小结
- 视觉塔窗口注意力 + 全局注意力混合:32 层中只有 4 层(7/15/23/31)做全局 attention,其余 28 层在
4×4token 窗口内做注意力,显著降低高分辨率与长视频的算力开销。源码标志:fullatt_block_indexes、get_window_index、window_size=112。 - 绝对时间感知 MRoPE:视频帧的时间 position id 用
second_per_grid × tokens_per_second计算,模型能直接感知"秒",而非仅看到帧序号。这是 Qwen2.5-VL 相对 Qwen2-VL 的核心改进。 - MRoPE 分段堆叠:
mrope_section=[16,24,24],把 head_dim 半频按 T/H/W 顺序拼接(非交错)。 - 视觉 MLP 是 SwiGLU 且带 bias(
Qwen2_5_VLMLP,bias=True),与文本 MLP 不带 bias 不同。 - 视觉塔的归一化是 RMSNorm(
Qwen2RMSNorm),而非 LayerNorm。 - GQA 28 : 4、文本 attention 带 bias(q/k/v)、SwiGLU、RMSNorm、
rope_theta=1e6、128K 上下文(可配合 YaRN 扩展)——Qwen2.5 LLM 主体特征。 - 无 DeepStack:视觉特征只在 LLM 输入端注入一次,与 Qwen3-VL 的最大架构差异之一。
- 视觉无可学习位置 embedding:完全靠 2D RoPE(而 Qwen3-VL 在 RoPE 之外还加了
nn.Embedding(2304, 1152)的可学习位置 embedding)。

浙公网安备 33010602011771号