Qwen3 VL揭秘:视觉信息如何无缝融入语言模型的深度解析!

张开发
2026/4/18 3:41:23 15 分钟阅读

分享文章

Qwen3 VL揭秘:视觉信息如何无缝融入语言模型的深度解析!
本文梳理了Qwen3 VL视觉信息进入语言模型的关键路径编码、压缩、拼接、跨层注入与位置编码。重点分析数据操作过程比较图像与视频分支在建模上的差异并说明DeepStack与RoPE/M-RoPE在多模态对齐中的作用帮助读者对Qwen3 VL有个整体了解。1模型结构概览Qwen3-VL是Qwen系列新一代视觉-语言模型面向图文理解、视频理解、多模态推理与智能体交互等场景。 官方形态同时覆盖Dense与MoE并提供Instruct/Thinking等版本支持从边缘端到云端的灵活部署。以Qwen3-VL-32B-Instruct和Qwen3-VL-235B-A22B-Instruct为例来了解模型主体结构。1.1 Qwen3-VL-32B-Instruct高清图https://github.com/CalvinXKY/InfraTech/tree/main/models/qwen3_vl模型结构描述类型视觉-语言指令模型Instruct架构Qwen3VLForConditionalGeneration模型类型qwen3_vl参数规模32B以模型命名为准文本上下文长度262144文本层数64文本隐藏维度5120文本FFN中间层维度25600文本注意力头数Q64KV8head_dim128文本词表大小151936RoPE参数rope_theta5000000mrope_section[24,20,20]视觉编码器层数27视觉隐藏维度1152视觉头数16视觉FFN中间层维度4304图像Patch大小16时序Patch大小2视觉输出映射维度5120与文本隐藏维度对齐1.2 Qwen3-VL-235B-A22B-Instruct高清图https://github.com/CalvinXKY/InfraTech/tree/main/models/qwen3_vl模型结构描述类型视觉-语言指令模型Instruct架构Qwen3VLMoeForConditionalGeneration模型类型qwen3_vl_moe参数规模235B激活参数22B以模型命名为准文本上下文长度262144文本层数94文本隐藏维度4096文本FFN中间层维度12288文本注意力头数Q64KV8head_dim128文本词表大小151936专家总数128每token激活专家数8moe\_intermediate\_size1536RoPE参数rope_theta5000000mrope_section[24,20,20]视觉编码器层数27视觉隐藏维度1152视觉头数16视觉FFN中间层维度4304图像Patch大小16时序Patch大小2视觉输出映射维度4096与文本隐藏维度对齐2图片到tokens的编码过程视觉图片类数据在进入语言模型前需要先转化为tokens序列。不同尺寸的图片经过视觉编码器Vision Encoder后得到的tokens长度通常不同。 在Qwen3VL的技术报告中有几张示意图展示了常见场景例如H×W32×256这种宽高比较大的图片。 这些图片最终会映射为不同长度的tokens。图像数据如何与tokens序列对应编码过程一般包含网格分块与压缩两步。网格分块用于重排图像数据压缩用于降低序列长度。2.1 图片patch化下面以Height800、Width1440的图片为例输入形状为[800, 1440, 3]。 在Qwen3VL中相关patch参数如下patch_size16图片块的高宽temporal_patch_size2时间维度块大小主要用于视频in_channels3图片通道数对图片进行网格化处理时间维度会补齐到2再除以temporal_patch_sizegrid_t 2⁄2 1grid_h 800⁄16 50grid_w 1440⁄16 90进入VisionEncoder前的序列长度L_pre grid_t * grid_h * grid_w 1*50*90 4500每个patch向量维度D 3*2*16*16 1536得到数据pixel_values 形状[1, 4500, 1536]image_grid_thw[1, 50, 90]最后一个维度的变化与映射方式相关进入VisionEncoder后会先经过PatchEmbed处理末端再经过Merger映射运算。2.2 PatchEmbed/Merger处理最后一个维度的变化与映射方式相关进入VisionEncoder后会先经过PatchEmbed处理末端再经过Merger映射运算。PatchEmbed处理PatchEmbed包含一个3D卷积映射Conv3d将维度从1536映射到hidden_size因此pixel_values形状变为[1, 4500, 1152]。示例代码如下class Qwen3VLVisionPatchEmbed(nn.Module): def __init__(self, config) - None: super().__init__() self.patch_size config.patch_size self.temporal_patch_size config.temporal_patch_size self.in_channels config.in_channels self.embed_dim config.hidden_size kernel_size [self.temporal_patch_size, self.patch_size, self.patch_size] self.proj nn.Conv3d(self.in_channels, self.embed_dim, kernel_sizekernel_size, stridekernel_size, biasTrue) 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(dtypetarget_dtype)).view(-1, self.embed_dim) return hidden_statesMerger处理Merger计算中会压缩序列长度。相关配置spatial_merge_size2视觉压缩融合尺寸。out_hidden_size5120语言模型的hidden维度大小。模型规模不同时该参数会变化。class Qwen3VLVisionPatchMerger(nn.Module): def __init__(self, config: Qwen3VLVisionConfig, use_postshuffle_normFalse) - None: super().__init__() self.hidden_size config.hidden_size * (config.spatial_merge_size**2) self.use_postshuffle_norm use_postshuffle_norm self.norm nn.LayerNorm(self.hidden_size if use_postshuffle_norm else config.hidden_size, eps1e-6) self.linear_fc1 nn.Linear(self.hidden_size, self.hidden_size) self.act_fn nn.GELU() self.linear_fc2 nn.Linear(self.hidden_size, config.out_hidden_size) def forward(self, x: torch.Tensor) - torch.Tensor: x self.norm(x.view(-1, self.hidden_size) if self.use_postshuffle_norm else x).view(-1, self.hidden_size) x self.linear_fc2(self.act_fn(self.linear_fc1(x))) return x在最后的Merger计算时self.use_postshuffle_normTrue输入x会先调整形状x.view(-1, self.hidden_size)其中self.hidden_size config.hidden_size * (spatial_merge_size**2)。所以压缩后的序列计算方式L_final L_pre / ((spatial_merge_size**2) 4500 / 4 1125得到输出的序列长度与嵌入维度的shape[1125, 5120]3视频数据的编码过程视频数据与图片数据的主要差异在于增加了时间维度。视频会先抽帧降低数据量再进行时序patch划分。 以Qwen3VL示意图中的视频为例分辨率H448、W736时长8秒。默认参数配置fps2temporal_patch_size2patch_size16merge_size2计算过程采样帧数num_frames ≈ 8 * 2 16时间网格grid_t 16 / 2 8空间网格grid_h 448 / 16 28grid_w 736 / 16 46得到数据pixel_values 形状[1, 10304, 1536]image_grid_thw[[8, 28, 46]]L_pre grid_t * grid_h * grid_w 10304与图片流程相同视频也需要经过PatchEmbed和Merger处理最终得到shape[2576, 5120]4数据的拼接文本、图片、视频tokens最终会一起送入LLM处理因此需要拼接。其做法是先在输入构造阶段通过placeholder预留图片/视频tokens位置再在视觉分支计算完成后回填拼接。其中图片/视频数据会引入一些额外tokens。继续以上面的视频为例上一步得到的视觉序列长度为2576。实际构造输入时每个grid_t都会拼接一段每一段分为四块”{curr_time:.1f} seconds“文本会被分词成若干 token时间戳文本vision_start_token一段视频placeholder本例中长度为2576/8 322vision_end_token所以总长度上除了2576个视觉占位外还会额外增加vision_start/end共2*grid_t16个特殊token以及8段时间戳文本会进一步分词。5DeepStack操作DeepStack原理不把所有视觉token都“横向串成一长串”塞进LLM输入而是把额外的高分辨率视觉token按层“纵向堆叠” 分配到LLM的多个早期/中期层里用残差方式逐层注入从而在不显著增加上下文长度的前提下让模型有效处理更多视觉细节。 DeepStack在保留更多视觉信息的同时能够有效控制上下文长度。Qwen3VL使用了DeepStack技术在vision encoder中从指定层deepstack_visual_indexes取出hidden_states并分别经过deepstack_merger 将空间merge后的视觉特征整理到可注入语言模型的维度。Qwen3VL配置中指定了[8, 16, 24]层。操作过程vision decoder中间层特征多尺度/不同语义深度先各自经过merger得到deepstack_features这些特征后续会在文本模型前几层按视觉位置加回_deepstack_process。注意VisionDecoder最后一层的Merger与DeepStack分支中的Merger存在差异最后一层Merger的LayerNorm位置不同且需要进行尺寸压缩。6位置编码的处理在Qwen3VL中位置编码采用RoPERotary Position Embedding但视觉与文本在位置ID构造上存在差异 视觉分支通常使用2D/3D坐标构造位置在多模态统一建模时会通过M-RoPEMultimodal Rotary Position Embedding把t/h/w信息映射到不同通道分组。 其核心差异主要体现在嵌入维度head_dim分量的分配方式与位置索引的组织方式上。6.1 视觉塔中的2D编码对图片数据而言每个token有二维索引(h, w)对应视觉塔中的row/col若head_dim128其分频逻辑是128先分为64对二维向量构成独立的平面前32对的频率分量由row索引决定后32对的频率分量由col索引决定。更具体一点每个维度的归属如下然后cos emb.cos()sin emb.sin()形状都是(seq_len, 128)。规律前32个旋转对覆盖q[0:32]与q[64:96]由行坐标 决定相位。后32个旋转对覆盖q[32:64]与q[96:128]由列坐标 决定相位。其中与由token在图片中的行列位置决定。row与col共用freqsmax_len通常取max(R,C)其中R、C分别为row与col方向的最大索引。6.2 文本模型的M-RoPE视觉3D位置编码是在2D位置编码的基础上进一步引入了时间维度。在M-RoPE中有三个独立的角度时间维度角度angle_t t * theta_i高度维度角度angle_h h * theta_i宽度维度角度angle_w w * theta_iQwen3 VL采用了Interleaved-MRoPE其核心思想如下在1D RoPE中嵌入层分成了d/2组每一对连续元素(x[2j], x[2j1])视为一个二维子空间j 0, 1, …, d/2 - 1。确定第个子空间应使用t、h、w中的哪一个轴进行旋转采用轮询Round‑Robin分配axis()mod3其中定义映射0→t1→h2→w。因此当j % 3 0时该子空间用t轴的旋转角度angle t * θ_j当j % 3 1时该子空间用h轴的旋转角度angle h * θ_j当j % 3 2时该子空间用w轴的旋转角度angle w * θ_j这种方式将时间、高度、宽度三个维度的信息交错融入整个特征空间从而使多模态模型能更全面、更高效地理解数据中的复杂时空结构。最后唠两句为什么AI大模型成为越来越多程序员转行就业、升职加薪的首选很简单这些岗位缺人且高薪智联招聘的最新数据给出了最直观的印证2025年2月AI领域求职人数同比增幅突破200% 远超其他行业平均水平整个人工智能行业的求职增速达到33.4%位居各行业榜首其中人工智能工程师岗位的求职热度更是飙升69.6%。AI产业的快速扩张也让人才供需矛盾愈发突出。麦肯锡报告明确预测到2030年中国AI专业人才需求将达600万人人才缺口可能高达400万人这一缺口不仅存在于核心技术领域更蔓延至产业应用的各个环节。那0基础普通人如何学习大模型 深耕科技一线十二载亲历技术浪潮变迁。我见证那些率先拥抱AI的同行如何建立起效率与薪资的代际优势。如今我将积累的大模型面试真题、独家资料、技术报告与实战路线系统整理分享于此为你扫清学习困惑共赴AI时代新程。我整理出这套 AI 大模型突围资料包【允许白嫖】✅从入门到精通的全套视频教程✅AI大模型学习路线图0基础到项目实战仅需90天✅大模型书籍与技术文档PDF✅各大厂大模型面试题目详解✅640套AI大模型报告合集✅大模型入门实战训练这份完整版的大模型 AI 学习和面试资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】①从入门到精通的全套视频教程包含提示词工程、RAG、Agent等技术点② AI大模型学习路线图0基础到项目实战仅需90天全过程AI大模型学习路线③学习电子书籍和技术文档市面上的大模型书籍确实太多了这些是我精选出来的④各大厂大模型面试题目详解⑤640套AI大模型报告合集⑥大模型入门实战训练如果说你是以下人群中的其中一类都可以来智泊AI学习人工智能找到高薪工作一次小小的“投资”换来的是终身受益应届毕业生‌无工作经验但想要系统学习AI大模型技术期待通过实战项目掌握核心技术。零基础转型‌非技术背景但关注AI应用场景计划通过低代码工具实现“AI行业”跨界‌。业务赋能 ‌突破瓶颈传统开发者Java/前端等学习Transformer架构与LangChain框架向AI全栈工程师转型‌。获取方式有需要的小伙伴可以保存图片到wx扫描二v码免费领取【保证100%免费】

更多文章