Qwen2-VL模型由视觉编码器、适配器和语言模型三部分组成,核心创新包括Naive Dynamic Resolution机制处理任意分辨率图像,2D-RoPE替代传统位置编码,动态Token生成及2×2压缩层优化内存。训练分三阶段:先冻结LLM训练ViT,再全参数开放训练,最后冻结ViT微调LLM。模型采用特殊token区分视觉和文本内容,支持多模态输入处理。
- 模型架构
=======
Qwen2-VL仍然是由Vision Encoder,Adaper,LLM三部分组成,
1.1 Vision Encoder
- 使用了675M参数的Vision Transformer (ViT)
- 引入了Naive Dynamic Resolution机制
- 移除了原始的绝对位置嵌入,改为2D-RoPE
- 能处理任意分辨率的图像
- 采用2x2的压缩层将ViT的输出token进行压缩(动态 Token 生成机制)
1.1.1 Naive Dynamic Resolution
- 面临问题:传统 ViT 的绝对位置编码是为固定分辨率预设的(如 16×16 网格对应 256 个位置编码)。当输入分辨率变化时,这些编码完全失效。
- 核心思想:完全保留原始图像分辨率与长宽比,根据图像实际尺寸动态生成不同数量的视觉 token。
- 关键修改:完全移除 ViT 原有的绝对位置嵌入(Absolute Position Embeddings),代之以 2D 旋转位置编码(2D-RoPE)
2D-RoPE 的工作原理
将位置编码分解为水平(x)和垂直(y)两个独立维度,并通过旋转矩阵实现空间关系建模:
其中 m = x/P, n = y/P(P 为 patch size),θ 为预设频率。这种设计使模型能:
- 精确计算任意两点间的空间关系(无论分辨率多大)
- 通过插值自然支持未见过的分辨率
- 保持位置编码的周期性特性(如 CNN 的平移不变性)
def rot_pos_emb(self, grid_thw): pos_ids = [] for t, h, w in grid_thw: # 遍历每个图像的时间、高度、宽度 # 计算高度方向的位置ID hpos_ids = torch.arange(h).unsqueeze(1).expand(-1, w) # [h, w] 每行是0到h-1 hpos_ids = hpos_ids.reshape( h // self.spatial_merge_size, # 分割成块 self.spatial_merge_size, # 每块的高度 w // self.spatial_merge_size, # 分割成块 self.spatial_merge_size, # 每块的宽度 ) hpos_ids = hpos_ids.permute(0, 2, 1, 3) # 重新排列: [h_block, w_block, h_in_block, w_in_block] hpos_ids = hpos_ids.flatten() # 展平成一维 # 计算宽度方向的位置ID wpos_ids = torch.arange(w).unsqueeze(0).expand(h, -1) # [h, w] 每列是0到w-1 wpos_ids = wpos_ids.reshape( h // self.spatial_merge_size, self.spatial_merge_size, w // self.spatial_merge_size, self.spatial_merge_size, ) wpos_ids = wpos_ids.permute(0, 2, 1, 3) # 重新排列 wpos_ids = wpos_ids.flatten() # 展平成一维 # 将高度和宽度位置ID堆叠,并重复时间维度 pos_ids.append(torch.stack([hpos_ids, wpos_ids], dim=-1).repeat(t, 1)) pos_ids = torch.cat(pos_ids, dim=0) max_grid_size = grid_thw[:, 1:].max() # 获取最大高度和宽度 rotary_pos_emb_full = self.rotary_pos_emb(max_grid_size) # 生成完整的旋转位置嵌入 rotary_pos_emb = rotary_pos_emb_full[pos_ids].flatten(1) # 根据位置ID提取对应的嵌入 return rotary_pos_emb1.1.2 动态 Token 生成机制
处理流程:
保持图像原始分辨率输入 ViT
ViT 按实际尺寸生成视觉 token 序列:
例如:224×224 图像 → (224/14) × (224/14) = 16×16 = 256 tokens1920×1080 视频帧 → 137×77 ≈ 10,549 tokens- 通过 min_pixels 和 max_pixels 参数控制分辨率边界:
最低限制 min_pixels=100×28×28:太小图像会被上采样,保证基础信息量最高限制 max_pixels=16384×28×28:超大图像自动分段处理1.1.3 推理阶段的内存优化技术
为解决高分辨率图像 token 激增导致的内存爆炸问题,Qwen2-VL 在 ViT 输出后增设2×2 令牌压缩层:
压缩流程:
- ViT 输出原始 token 网格(如 137×77)
- 通过 MLP 层将每 2×2 邻近 token 压缩为 1 个 token→ 网格尺寸缩小为原尺寸 1/4(如 68×38)
- 在压缩序列首尾添加特殊标记:
- 起始标记 (等价于
<img>):标识视觉 token 序列的开始位置 - 结束标记 (等价于
</img>):标记视觉 token 序列的终止点
1.2 Adapter
从架构图中并没有看到有Adapter,那么Qwen2-VL是如何做融合呢? 其实并没有去掉,是放到了VE当中。
下面这段代码定义了PatchMerger类,是 Qwen2-VL 模型视觉编码器中的一个关键组件,用于将多个图像补丁合并成统一的表示。
class PatchMerger(nn.Module): def __init__(self, dim: int, context_dim: int, spatial_merge_size: int = 2) -> None: super().__init__() # 计算合并后隐藏层的大小:context_dim * (spatial_merge_size^2) # 这表示将 spatial_merge_size x spatial_merge_size 的空间区域合并为一个表示 self.hidden_size = context_dim * (spatial_merge_size**2) # 对输入进行层归一化,eps=1e-6 防止除零错误 self.ln_q = LayerNorm(context_dim, eps=1e-6) # 定义多层感知机,用于执行补丁合并操作 self.mlp = nn.Sequential( # 第一个线性层:从合并后的补丁维度映射到相同维度 nn.Linear(self.hidden_size, self.hidden_size), # GELU 激活函数引入非线性 nn.GELU(), # 第二个线性层:从隐藏维度映射到目标维度 dim nn.Linear(self.hidden_size, dim), ) def forward(self, x: torch.Tensor) -> torch.Tensor: # 将输入 x 重塑为 (-1, self.hidden_size) 形状 # 这里将多个补丁的特征展平成一个向量 x = self.mlp(self.ln_q(x).view(-1, self.hidden_size)) return x1.2.1. 参数说明
dim: 输出维度,合并后特征的最终维度context_dim: 上下文维度,单个补丁的特征维度spatial_merge_size: 空间合并大小,默认为2,表示将2x2的补丁区域合并
1.2.2. 工作原理
- 计算隐藏大小:
self.hidden_size = context_dim * (spatial_merge_size**2)
- 例如,如果
context_dim=1152,spatial_merge_size=2,则hidden_size = 1152 * 4 = 4608 - 这表示将 2x2 = 4 个相邻补丁的特征合并在一起
- 层归一化:
self.ln_q = LayerNorm(context_dim, eps=1e-6)
- 对输入进行归一化处理,稳定训练过程
- 多层感知机:包含两个线性层和一个GELU激活函数
- 第一个线性层:将合并后的特征维度映射到相同维度
- GELU激活:引入非线性变换
- 第二个线性层:将特征映射到目标维度
1.2.3. 前向传播过程
def forward(self, x: torch.Tensor) -> torch.Tensor: x = self.mlp(self.ln_q(x).view(-1, self.hidden_size)) return x- 首先对输入
x进行列归一化 (self.ln_q(x)) - 然后将其重塑为
(-1, self.hidden_size)形状,即将多个补丁的特征展平 - 最后通过MLP进行特征变换和维度映射
1.2.4 应用场景
PatchMerger在视觉编码器中的作用是:
- 降维: 将多个相邻补丁的特征合并,减少序列长度
- 特征融合: 将空间邻近的补丁特征进行融合,捕获局部空间关系
- 维度对齐: 将视觉特征的维度与文本模型的维度对齐,便于后续处理
这种设计允许模型在保持空间结构信息的同时,减少计算复杂度,是连接视觉编码器和语言模型的重要桥梁。
1.3. LLM
- 小规模模型Qwen2-VL-2B(总参数2B)由675M ViT+1.5B LLM构成,专为端侧设备优化;
- Qwen2-VL-7B模型搭配7.6B 参数 LLM,是性能优化版本
- Qwen2-VL-72B则搭配72B参数的Qwen2语言模型,面向复杂推理任务
- 使用了Multimodal Rotary Position Embedding (M-RoPE)来处理多模态输入的位置编码
1.3.1 M-RoPE
三维解耦设计
- 将位置编码拆分为三个正交维度
- 公式:
- 时间维度 (t):用于序列顺序与视频帧序
- 高度维度 (h):表征图像垂直坐标
- 宽度维度 (w):表征图像水平坐标
多模态自适应编码逻辑
| 输入类型 | 时间维度 | 高度维度 | 宽度维度 |
|---|---|---|---|
| 纯文本 | 单调递增 | 同值 | 同值 |
| 静态图像 | 恒定值 | 像素y坐标 | 像素x坐标 |
| 视频帧 | 帧序递增 | 像素y坐标 | 像素x坐标 |
| 多模态混合 | 顺序递增 | 按图像规则 | 按图像规则 |
长序列外推能力
- 如图5所示,训练长度16K token → 推理长度80K token 仍保持75%+准确率
- 训练
=====
2.1. 阶段一:冻结 LLM,训练 ViT
- 目标:仅训练视觉编码器(Vision Transformer, ViT)。
- 数据:大规模图像-文本对(image-text pairs)。
- 目的:让 ViT 学习高质量的视觉表示,并通过对比学习或对齐任务,使 LLM 能够“理解”图像语义。
- 实现方式:固定 LLM 参数,只更新 ViT 和连接层(如投影层)。
- 意义:避免在早期训练中破坏预训练语言模型的语言能力,同时建立初步的图文对齐能力。
2.2. 阶段二:全参数开放训练
- 目标:解冻所有参数(包括 ViT 和 LLM),进行端到端联合训练。
- 数据:更广泛的数据类型,包括图文混合内容、视觉问答、OCR、视频对话等。
- 目的:提升模型对多模态交互的综合理解能力,强化图文联合推理。
- 关键点:此阶段是“知识融合”阶段,使视觉与语言系统深度耦合。
2.3. 阶段三:冻结 ViT,微调 LLM
- 目标:锁定 ViT 参数,仅对 LLM 进行指令微调(instruction tuning)。
- 数据:指令式数据集(instructional datasets),如对话、任务指令等。
- 目的:提升模型遵循人类指令的能力,尤其是在多模态场景下的响应能力(如看图回答、文档解析等)。
- 优势:防止在指令微调过程中破坏已学得的视觉表征。
3.数据格式
和Qwen-VL一样,Qwen2-VL仍然采用特殊token区分vision和text,<|vision_start|>和<|vision_end|>在图像特征序列的开头和结尾插入,以划分图像内容。
3.1 对话数据
在对话格式方面,使用 ChatML 格式构建指令调优数据集,其中每个交互语句都用两个特殊标记(<|im_start|>和<|im_end|>)标记,以便于结束对话。蓝色标记的部分表示监督学习部分。
3.2 Visual Grounding
为赋予模型视觉定位能力,边界框坐标归一化至 范围,并表示为 “”。采用<|box_start|>与<|box_end|>标记以分隔边界框文本。为精确关联边界框与其文本描述,引入<|object_ref_start|>与<|object_ref_end|>标记,用以指示边界框所引用的内容,从而使模型能够有效解读并生成特定区域的精准描述。
3.3 Visual Agent
为将Qwen2-VL打造为通用型视觉语言代理(VL-Agent),将各类代理任务(如用户界面操作、机器人控制、游戏及导航)定义为序贯决策问题,使Qwen2-VL能够通过多步骤动作执行完成任务闭环。具体实现路径如下:
- 任务规则定义:针对每项任务预先设定许可动作集合与函数调用关键词模式
- 动态决策流程:模型通过以下循环完成任务
- 观测分析:解析当前环境视觉输入
- 推理规划:生成分步执行策略
- 动作执行:调用预定义操作接口
- 环境交互:获取执行反馈并更新观测状态
- 闭环迭代机制:上述流程持续循环直至任务成功完成
通过整合多模态工具链并深度利用大型视觉语言模型(LVLMs)的场景感知能力,Qwen2-VL可逐步完成从简单界面操作到复杂现实世界交互的递进式任务。
如何系统的学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一直在更新,更多的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇
01.大模型风口已至:月薪30K+的AI岗正在批量诞生
2025年大模型应用呈现爆发式增长,根据工信部最新数据:
国内大模型相关岗位缺口达47万
初级工程师平均薪资28K(数据来源:BOSS直聘报告)
70%企业存在"能用模型不会调优"的痛点
真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!
02.大模型 AI 学习和面试资料
1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工
📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。