Qwen2-VL 视觉编码器源码拆解:从像素到 Token 的完整数据流
引言多模态大模型的视觉编码器通常被视为一个黑盒——图像进去token 出来但是当我们需要回答为什么 Qwen2-VL 能处理任意分辨率的图像或它和 Swin Transformer V2 的本质差异在哪等这样细致的问题我们必须打开这个黑盒追踪从像素到 token 的每一行代码因此本文基于 Qwen2-VL 官方源码将从数据流、核心模块、框架对比三个层面逐层拆解数据流分析配置文件我们打开源码的配置文件(通常文件名是包含 Config)看看配置内容是什么从配置文件看可以了解到 Vision Encoder 有 32 层 Transformer每一层输出 1280 维的特征并且会映射到 LLM 的维度是 3584 (说明具有投影层)采用的激活函数是 quick-gelu 等信息下面我们把里面一些关键的信息拿出来做分析Quick-gelu我们可以看到第一个设计点是激活函数的选择采用的是 quick-gelu这个激活函数我基本没有接触过但是从功能上看应该主流大模型都会用这个函数对应的表达式QuickGELU(x) x * sigmoid(1.702 * x)我们把两个函数图像拿出来对比发现基本上是吻合的最大误差只有0.02误差 0.02 在神经网络中间层完全可以忽略但计算速度提升约 30-50%很明显从公式上来看后者的计算明显是更简单用几乎不可见的精度损失换显著的速度提升token 压缩Vision Encoder 处理完一张图后会产生很多 token这个参数表示把相邻 2×2 4 个 token 压成 1 个减少数量为什么要压缩 token原因是 LLM 处理序列的计算复杂度为 O(n²)视觉 token 数量直接决定推理开销将 4 个 patch 压缩为 1 个 token能将序列长度降为 1/4计算量降为约 1/16一般都是采用 reshape 的方法实现时间切片处理视频时不仅要把画面切成空间 patch还要把时间切成小段这个参数表示每 2 帧画面打包成一个时间块那么这样视频就能和图像用同一套流程处理——图像可以看作只有 1 帧的视频时间块数为 1权重初始化的抖动范围神经网络刚开始训练时所有权重不能全是 0也不能太大这个值表示初始权重随机抖动的标准差是 0.02这个步骤很关键原因是如果初始化太大训练初期梯度会爆炸模型学不动如果全是 0所有神经元输出一样模型也学不动图片的预处理接着进入图片的预处理部分实现的功能是将图片转化成 tensor 的格式送进 Vision Encode千问在这边有一个小设计—动态分辨率处理简单来说就是保持原比例进行 resize传统的做法基本都是直接裁剪成为正方形这样做宽屏图被压扁了竖屏图被拉宽了信息可能会变形图像编码图像 Encoder 部分是架构中的核心的内容上图中的代码是功能的定义我们看看 forward 函数对这些功能是怎么编排的可以很直观看出数据的流动方向def forward( self, hidden_states: torch.Tensor, grid_thw: torch.Tensor, **kwargs: Unpack[TransformersKwargs] ) - torch.Tensor: r grid_thw (torch.LongTensor of shape (num_images, 3)): The temporal, height and width dimensions of feature shape for each image. Each row contains [t, h, w] values. position_ids get_vision_position_ids(grid_thw, self.spatial_merge_size, kwargskwargs) cu_seqlens get_vision_cu_seqlens(grid_thw, kwargskwargs) hidden_states self.patch_embed(hidden_states) rotary_pos_emb self.rotary_pos_emb(position_ids) emb torch.cat((rotary_pos_emb, rotary_pos_emb), dim-1) position_embeddings (emb.cos(), emb.sin()) for blk in self.blocks: hidden_states blk( hidden_states, cu_seqlenscu_seqlens, position_embeddingsposition_embeddings, **kwargs, ) merged_hidden_states self.merger(hidden_states) return BaseModelOutputWithPooling( last_hidden_statehidden_states, pooler_outputmerged_hidden_states, )数据流数据进来先被 Patch Embedding同时加上 2D-RoPE 位置编码最后传入 Transformer 模块压缩投影后返回注意一下blk 里面并没有 window_size 的字样也就是注意力采用的大概率是全局注意力Patch Embedding 这个步骤我们通常是用卷积直接实现的切分后直接映射只需要控制两个变量分别是 Kernel_size 和 Stride 就可以直接实现Block这个就是前面循环的 32 层的单个内部结构我们可以看看很标准的一个Pre-Norm 残差连接的模块在初始化定义的时候我们看到 sdpa这个全程是Scaled Dot-Product Attention表示的就是全局注意力机制我们继续看 VisionAttention 这个模块代码中有 self.is_causal False表示的是采用了双向注意力机制因果注意力Causal每个 token 只能看前面的不能看后面的LLM 生成文本时用非因果注意力Non-causal每个 token 可以看所有其他 token视觉特征提取时用这个部分就是一个常规的 qkv 的构造和 ViT 的实现基本上是一致的我们把上述的内容总结到表格上并且列举出来步骤操作输入 shape输出 shape关键源码预处理resize normalizePIL Image(3, H, W)image_processingPatchEmbedConv2d(k14,s14)(B,3,H,W)(B, N, 1280)patch_embed位置编码get_vision_position_idsgrid_thw(N, 2)rotary_pos_emb32层 BlockAttention MLP(B, N, 1280)(B, N, 1280)blocksMerger2×2 压缩 投影(B, N, 1280)(B, N/4, 3584)merger数据流的方向如下图所示框架对比在配置环境的时候会安装一个库叫做 Transformer库transformers 库会预装了几百个模型因此我们找 Swim-v2 直接搜就可以代码放下面python3 -c from transformers import Swinv2Model; import inspect; print(inspect.getsourcefile(Swinv2Model))注意力的不同Swim Transformer 的核心的创新就是引入了窗口注意力机制从而减少了计算量简单描述窗口注意力机制把全图切成小窗口每个 patch 只和窗口内的 patch 算注意力而不是和全图所有 patch 算聪明的你发现了那么不同窗口之间实际上是没有注意力交互的因此 Swim 提出可以使用滑动窗口的方式解决这个部分的问题那为什么 Qwen 敢用全局注意力呢前面我们有提到PatchMerger方法因此实际上在送进 LLM 之前我们已经尽量压缩 token 的个数虽然最后的视觉 token 少但是用全局注意力换更强的全局感知能力位置编码的不同Swin 的注意力只在一个小窗口里算它需要一个位置编码来告诉模型这 49 个 patch 彼此的相对位置是什么而 Qwen 的 Vision Encoder 是全局注意力它不需要知道窗口内的相对位置它需要知道的是每个 patch 在原图中的绝对二维坐标归一化的不同这是Swin V2 论文的核心创新之一Swin V1 用 Pre-Norm但模型变大后训练不稳定深层梯度爆炸因此 Swin V2 改成了Post-Norm论文指出 Post-Norm 能抑制特征方差增长让模型能稳定扩展到 3B 参数Pre-Norm (Qwen): x attn(norm(x)) ← 归一化在残差分支前 Post-Norm (Swin): norm(x attn(x)) ← 归一化在残差分支后为什么 Qwen 不做这样的处理呢因为 Qwen 的 Vision Encoder 只有 32 层、大约是 600M 参数Pre-Norm 足够稳定这个时候就有人问为什么 Qwen 不扩展呢因为多模态模型的瓶颈在 LLM不在视觉编码器视觉编码器的任务是提取特征LLM 的任务是理解、推理、生成因此大头是在后者那Swin 为什么需要扩展到 3B因为 Swin 是纯视觉 Backbone下游任务检测、分割、分类的性能直接取决于视觉特征的表达能力所以会扩展参数

相关新闻

深入解析BERT预训练:从掩码语言模型到工程实践全流程

深入解析BERT预训练:从掩码语言模型到工程实践全流程

1. 项目概述:从“炼丹”到“造炉”的认知跃迁 在自然语言处理这个行当里混了十几年,我见过太多朋友一上来就想直接“开炉炼丹”——拿着别人训练好的BERT模型,在自己的数据上微调一下,就期待能解决所有问题。结果往往是模型表现平…

2026/8/21 6:53:36 阅读更多 →
Matlab 2013b 经典版安装与激活全攻略:从环境准备到功能验证

Matlab 2013b 经典版安装与激活全攻略:从环境准备到功能验证

这次我们来看一个经典技术软件的安装部署:Matlab 2013b。对于很多从事科研、算法开发、信号处理或控制仿真的工程师和学生来说,Matlab 是一个绕不开的工具。虽然新版本层出不穷,但 2013b 作为一个经典且稳定的版本,至今仍在许多实…

2026/8/21 6:53:36 阅读更多 →
AI小镇:开源多智能体沙盒实验平台部署与治理研究指南

AI小镇:开源多智能体沙盒实验平台部署与治理研究指南

这次我们来看一个名为“AI小镇”的开源项目,它不是一个传统的AI治理工具,而是一个模拟多智能体社会协作的沙盒实验平台。项目地址是https://github.com/mewamew/my_ai_town。这个项目的核心价值在于,它通过构建一个由多个AI Agent&#xff08…

2026/8/21 6:53:36 阅读更多 →

最新新闻

MA-VLCM:多模态融合如何革新多智能体策略价值评估

MA-VLCM:多模态融合如何革新多智能体策略价值评估

1. 从单智能体到多智能体:价值评估的范式转变在强化学习领域,评估一个策略的好坏,或者说预测一个状态或状态-动作对的长期回报,是核心任务之一。传统的价值函数,无论是状态价值函数V(s)还是动作价值函数Q(s, a)&#x…

2026/8/21 9:03:49 阅读更多 →
网络安全实战:漏洞扫描器对比——Nessus、OpenVAS、Nuclei 实战评测

网络安全实战:漏洞扫描器对比——Nessus、OpenVAS、Nuclei 实战评测

前言:在自动化的浪潮中寻找那把“尺子” 在渗透测试的项目周期里,有一个环节既让人爱,又让人恨,那就是“漏洞扫描”。爱它,是因为它确实能像收割机一样,快速收割掉那些低垂的果实——那些未打补丁的系统、弱…

2026/8/21 9:03:49 阅读更多 →
冒泡排序算法深度解析:从基础实现到优化策略与面试实战

冒泡排序算法深度解析:从基础实现到优化策略与面试实战

1. 项目概述:为什么我们还在聊冒泡排序?在算法面试和日常的编程基础讨论里,冒泡排序(Bubble Sort)大概是那个最常被提起,也最容易被“轻视”的算法。很多刚入门的朋友会觉得:“这不就是个两层循…

2026/8/21 9:03:49 阅读更多 →
开源Winapp2.ini规则库:打造精准免费的Windows系统清理方案

开源Winapp2.ini规则库:打造精准免费的Windows系统清理方案

在 Windows 系统长期使用后,系统盘空间被各种临时文件、缓存和软件残留占用是开发者和管理员经常遇到的痛点。手动清理不仅效率低下,而且容易误删重要文件。虽然市面上有 CCleaner 等知名工具,但其商业版本需要付费,且部分高级功能…

2026/8/21 9:03:49 阅读更多 →
ORB-SLAM3 MLPnPsolver::Refine()

ORB-SLAM3 MLPnPsolver::Refine()

下面是 MLPnPsolver::Refine() 函数的逐行注释,以及背后数学原理与公式说明。 首先理解函数的作用:在RANSAC过程中,当找到一个比较好的模型(内点数超过历史最佳),会用所有内点重新估计一次位姿,以得到更精确的解。这个过程通常叫做“局部优化”或“Refine”。这里用的是…

2026/8/21 9:03:49 阅读更多 →
独立游戏开发中AI工具合规应用与风险规避指南

独立游戏开发中AI工具合规应用与风险规避指南

最近和几个做独立游戏的朋友聊天,发现一个挺有意思的现象:大家聊起AI工具时,态度变得比以前复杂多了。以前是“哪个AI画图强?”“哪个AI写代码快?”,现在更多是“这个AI生成的内容,平台审核能过…

2026/8/21 9:02:49 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →