qwen2.5vl学习

qwen2.5vl通过增强的视觉识别,精确的目标定位,强大的文档解析和长视频理解,在理解和与世界交互方面实现了重大飞跃

突出特性:能够使用边界框或点准确地定位物体。它可以从发票、表格和表单中提取结构化数据,以及对图表、示意图和布局进行详细分析

为了处理复杂输入,qwen2.5vl引入动态分辨率处理绝对时间编码,能够处理不同尺寸的图像和超长时长的视频,长达数小时,并实现秒级事件定位,使得模型可以原生感知空间尺度和时间动态,而无需依赖传统的归一化技术

架构优化:通过从头训练原生动态分辨率的Vision Transformer(ViT)并融入Window Attention机制

QWEN2.5VL提供了三种尺寸:Qwen2.5-VL-72B(旗舰模型):与GPT-4o和Claude 3.5 Sonnet等最先进模型相媲美,特别擅长文档和图表理解

◦ Qwen2.5-VL-7B 和 Qwen2.5-VL-3B(较小模型):优于同类竞争对手,即使在资源受限环境中也能提供强大能力

现在为止的疑问的地方:使用边界框或点定位 动态分辨率处理 绝对时间编码 window Attention机制

multimodal 多模态

qwen2.5vl在各个benchmark上取得很好的结果

引言部分

LVLMs标志着多模态理解和交互方式的变革,但是在各种人物上都能胜任,但是达不到卓越的水平。

底层(基础):是细粒度视觉任务,在Qwen2.5VL中,致力于探索细粒度感知能力

顶层:是多模态推理 ,通过利用最新的Qwen2.5大语言模型,并结合多模态问答(QA)数据的构建,来增强这一能力

一系列的研究工作推进了多模态大模型的发展,

架构创新:现有范式通常是由视觉编码器、跨模态投影器、和LLM组成

细粒度感知模型是另一个关键

Omni全能 和 MoE mixture of experts 全能架构和混合专家架构也为LVLNMs

视觉编码器的增强和分辨率缩放 整理具有更多样化场景和更高质量的数据

然而,尽管取得了显著进展,当前的视觉语言模型仍面临一些发展瓶颈,包括:计算复杂度高,上下文理解有限,细粒度视觉感知能力较差以及在不同序列长度下性能不一致

Qwen2.5VL在技术层面的贡献主要是:

在视觉编码器中实现了窗口注意力机制,优化推理效率

引入了动态FPS(帧率)采样,将动态分辨率扩展到了时间维度,从而能够全面理解不同采样率的视频

在时间域升级了MRope 多维旋转位置编码,通过将其与绝对时间对齐,促进了更复杂的时序学习

我们在预训练和监督微调的数据整理方面pay effort

总结了qwen2.5VL的能力: 可以看懂复杂文档;不仅可以看到物体,还可以指出物体;能看长视频,且知道具体时间发生了什么;能当手机电脑助手(agent)

看这个架构图:RMSnorm,跟之前的batchnorm和layernorm不一样 还有window attention 还有SwiGLU 这三点都不一样。我看图注里面还说了多维旋转位置编码

看到这个部分是有多维旋转位置编码和动态帧率采样的

动态采样:在图像方面,比如siglip,不管输入是啥图,都是强行剪裁为固定的。Qwen2.5

VL的图像编码器会根据图片实际长宽比,动态将其切割为不同数量的patch.在视频方面,对于时长两小时的,动态稀疏抽帧;对于一段5s的体育进球集锦,模型会密集抽帧

多维旋转位置编码:如果是图像或者是文字,跟旋转位置编码差不多。如果是视频,涉及到时间了,就会加上一个时间参数

详细介绍Qwen2.5VL整体架构:

大语言模型:是由Qwen LLM的预训练权重进行初始哈,将一维旋转位置编码 修改为了与绝对时间对齐的多模态旋转位置编码

视觉编码器:采取重新设计的VIT transformer,引入了2D-Rope和窗口注意力机制,以支持原生的输入分辨率,同时加速整个视觉编码器的计算。在训练和推理期间,输入图像的高度和宽度会被调整为28的倍数,然后输入到VIT中,视觉编码器通过步长为14的方式将图像分割为图块,

基于MLP的视觉-语言融合器,为了解决长图像特征序列带来的效率挑战,采取简单有效的方法,在将特征序列输入大语言模型(llm)之前对齐进行压缩,也就是,不是直接使用VIT提取的原始图块特征,而是首先将空间上相邻的四个图块特征进行分组。然后,将这些分组后的特征拼接起来,并通过一个两层的MLP(多层感知机),将其投影到与LLM中使用的文本嵌入维度相匹配的维度。动态压缩不同长度的图像特征序列 【巧妙解决 (2x2 压缩):它采用了一个非常聪明的"打包"策略。把相邻的 4 个 小图块特征捆绑在一起,然后用一个两层的小神经网络 (MLP) 把它们"压缩"成 1 个 特征向量】

这个full attention block indexes的意思就是在这几个层是使用完整注意力的,不是窗口注意力了

输入通道数,输出通道数 这个的作用就是将视觉编码器的维度投影到大语言模型所需要的维度

介绍视觉编码器.重新设计vit,引入窗口注意力机制,只有四层使用了全自注意力,其余层使用最大窗口尺寸为112*112(patch是14*14 对应8*8个图像块)的窗口注意力,对于小于112*112的,不填充进行处理 (注意patch指的是图像块大小,8*8图像块的数目,要注意区分)

在位置编码方面,涉及到2drope 和 3drope。3d是为了处理视频的输入,14*14的图像块作为基本单元,对于视频数据,将连续的两帧分组到一起【对于这个将连续两帧分组到一起,减少token数量说实话我没看懂】

使用RMSnorm进行归一化,使用SwiGLU作为激活函数

RMS:之前都是使用layernorm,先计算均值,减去均值,在计算方差,除以标准差。研究人员发现,只要将数据尺度缩放到合理范围,模型就能很好地学习

RMS: root mean square 均方根,然后除以这个均方根

看均方根的计算:

SwiGLU(swish-gated linear unit) ,是前馈神经网络中的核心结构。代替传统的relu或者gelu激活函数

传统FFN 输入 升维 relu激活 降维 输出。swiglu 引入门控机制

如何做到门控的呢?其实就是swish得到的范围使得左侧的那个linear1的特征是放大或者缩小的

原生动态分辨率与帧率

Qwen2.5-VL在空间和时间两个维度上引入了改进,

在空间维度上,Qwen2.5-VL能够将不同尺寸的图像动态转换为对应长度的token(词元)序列,与传统方法对坐标进行归一化不同,Qwen2.5-VL直接使用输入图像的实际尺寸来表示边界框、点以及其他空间特征。

对于视频输入,Qwen2.5-VL结合了动态帧率训练和绝对时间编码。通过适应可变的帧率,将Mrope的id直接与时间戳对齐,使得模型能够通过时间维度id之间的间隔来理解时间的节奏

问题一:是怎么进行动态转换的?怎么就可以将不同尺寸的图像进行动态转换了?是使用了什么?

传统的模型(如早期的 CLIP)处理图像时,不管你是 4K 长图还是手机小图,都会**暴力缩放(Resize)** 或**裁剪(Crop)** 成一个固定的正方形(比如 224x224)。这会导致图像变形或细节丢失。

Qwen2.5-VL 能够实现"动态转换",主要依赖于以下**三个核心技术的组合**:

1. 动态 Patch 切割(不缩放,只切块)

模型不再改变图片的原始长宽比,而是设定一个**最小切割单位(Patch Size = 14x14 像素)**。

* **做法**:输入一张图片,模型先把它的高和宽调整为 14 的倍数(论文中提到是 28 的倍数,即 14 的偶数倍)。然后,直接用 14x14 的网格去切这张图。

* **结果**:一张 280x560 的长图,会被切成 20 \\times 40 = 800 个 Patch;一张 280x280 的方图,会被切成 20 \\times 20 = 400 个 Patch。**图片的序列长度(Token 数量)是根据图片实际尺寸动态变化的。**

2. 窗口注意力机制(Window Attention)------ 解决"不同长度导致显存爆炸"的问题

如果图片很大,切出了几万个 Patch,传统的"全局注意力"会让计算量呈平方级爆炸。

* **做法**:论文 2.1.1 节提到,模型引入了**窗口注意力**。它把图像划分成一个个最大 **112x112 像素(即 8x8 个 Patch)** 的"小窗口"。

* **结果**:注意力计算被限制在窗口内部。无论原图多大,模型每次只处理 64 个 Patch 的关系。对于小于 112x112 的区域,甚至**不进行 Padding(不补零)**,直接保留原始分辨率计算。这就让模型能够"原生"处理任意尺寸的图片,而不会撑爆显存。

3. MLP 动态压缩(2x2 合并)

为了进一步控制输入给大语言模型的 Token 数量,模型在视觉编码器和语言模型之间加了一个"压缩器"。

* **做法**:把空间上相邻的 **4 个 Patch(2x2)** 的特征拼接起来,通过一个两层 MLP 网络,压缩成 **1 个 Token**。

* **结果**:Token 序列长度直接**缩减为原来的 1/4**。这种压缩是动态的,图大就多压缩点,图小就少压缩点,完美适配语言模型的输入限制。


问题二:怎么就可以动态适应改变帧率了?

这里需要澄清一个概念:模型并不是在推理时去"改变"视频的帧率,而是**在训练阶段,通过"动态抽帧策略"逼迫模型学会适应不同的帧率**。

1. 训练时的"动态抽帧"(Dynamic FPS Sampling)

* **做法**:在训练数据预处理时,对于同一个视频,模型不会固定每秒抽 1 帧。而是**随机采用不同的帧率(FPS)进行抽帧**。比如这个 Batch 里,视频 A 按 1 FPS 抽帧,视频 B 按 5 FPS 抽帧。

* **目的**:如果模型只见过固定帧率的视频,它就会把"动作快慢"和"帧数多少"绑定死。通过动态抽帧,模型被迫明白:**不能靠数帧数来判断时间,必须依靠注入的"时间戳"信息。**

2. 3D Patch 划分(连续两帧打包)

* **做法**:如论文 2.1.1 节所述,对于视频数据,模型将**连续的两帧**在时间维度上打包,形成一个 **14x14x2(高x宽x时间)** 的 3D Patch。

* **结果**:这相当于把视频的 Token 数量直接**砍半**。配合动态抽帧,模型就能在有限的算力下,处理长达数小时的视频。


问题三:怎么就将 ID 与时间戳进行对齐了?(MRoPE 的魔法)

这是 Qwen2.5-VL 最精妙的设计。传统的视频模型,时间位置编码(ID)是**相对的序号**;而 Qwen2.5-VL 把它变成了**绝对的物理时间**。

1. 传统做法(相对序号 ID)

假设一个视频抽了 4 帧,传统模型给它们分配的时间 ID 是:

`0, 1, 2, 3` (代表第 0 帧、第 1 帧...)

* **缺陷**:模型只知道"画面 2 在画面 1 后面",但不知道中间过了 0.1 秒还是 10 秒。

2. Qwen2.5-VL 的做法(绝对时间戳 ID)

模型在计算 **MRoPE(多维旋转位置编码)** 时,时间维度(T)的 ID 不再使用整数序号,而是**直接使用这一帧对应的真实物理时间戳(秒数)**。

假设抽帧的时间点是 0秒、1.5秒、3.2秒、5.0秒,那么分配的时间 ID 就是:

`0.0, 1.5, 3.2, 5.0`

3. "对齐"是如何在数学上生效的?

在 Transformer 计算注意力(Attention)时,Query (Q) 和 Key (K) 会乘上 RoPE 旋转矩阵。RoPE 的核心特性是:**两个 Token 的注意力得分,只取决于它们位置 ID 的"差值"。**

* 当模型计算"画面 1 (1.5s)"和"画面 2 (3.2s)"的注意力时,时间维度的 ID 差值是 3.2 - 1.5 = 1.7

* 当模型计算"画面 2 (3.2s)"和"画面 3 (5.0s)"的注意力时,时间维度的 ID 差值是 5.0 - 3.2 = 1.8

**"对齐"的本质就在这里:**

MRoPE 的旋转矩阵直接接收这些**浮点数的时间差值**作为输入。模型在训练时,通过注意力机制,直接学习到了"ID 差值 1.7 代表过了 1.7 秒,画面里的物体应该移动了多远"。

总结

* **动态分辨率**:靠的是 **14x14 动态切块 + 窗口注意力 + MLP 压缩**,不缩放、不补零。

* **动态帧率**:靠的是**训练时的随机抽帧策略**,逼迫模型放弃数帧数,转而依赖时间信息。

* **ID 与时间戳对齐**:靠的是**把 MRoPE 时间维度的整数索引,替换成了真实的物理时间戳(秒数)**,让模型在底层数学计算上直接感知物理时间的流逝。

我的问题:

我是不是可以理解为,首先这个图是会先弄成28的倍数的,然后会按照14*14的分割为图像块。但是最多不会超过64个,如果超过的话 那剩下的数据是如何进行处理的呢?然后还使用了2*2的的将patch合并在一起。我想知道这个先后顺序是啥?到底是如何发挥作用的,窗口注意力是咋运行的,一张大的图片输入进入,都经过了什么样子的处理

qwen的回答

你的理解非常接近真相了,但有一个关键的误解需要纠正:**"窗口最多包含 64 个 Patch" 并不意味着 "一张图片最多只能有 64 个 Patch"。**

如果一张图片非常大,它会被切成几百甚至上千个 Patch,然后**划分到多个窗口中**去处理。

为了让你彻底明白一张大图输入后到底经历了什么,我们按照**严格的先后顺序**,用一个具体的例子(假设输入一张 **1120 x 560** 像素的宽屏大图)来走一遍全流程:


第一步:尺寸调整(Resize to multiples of 28)

* **操作**:模型不会把这张图强行压缩成正方形,而是保持它的长宽比,把长和宽调整为 **28 的倍数**。
* **为什么是 28?** 因为后面有个 2x2 合并的操作,Patch 大小是 14,14 × 2 = 28。这样能保证切出来的 Patch 刚好能被 2 整除,不用补零。
* **结果**:假设这张图刚好是 1120 x 560,已经是 28 的倍数了,不需要调整。

第二步:图像分块(Patching,切成 14x14)

* **操作**:用 14x14 的网格去切这张图。
* **计算**:
* 横向:1120 ÷ 14 = 80 个 Patch。
* 纵向:560 ÷ 14 = 40 个 Patch。
* **结果**:这张大图被切成了 **80 × 40 = 3200 个 Patch**。
* *(注意:这里已经有 3200 个 Patch 了,远超 64 个!)*

第三步:进入视觉编码器(ViT)与 窗口注意力(Window Attention)

这是最核心的一步。如果让这 3200 个 Patch 互相计算注意力,计算量是 3200 \\times 3200 \\approx 1000 万次,显存会直接撑爆。所以**窗口注意力**登场了。

* **划分窗口**:模型设定窗口最大为 **112 x 112 像素**。因为每个 Patch 是 14x14,所以一个窗口正好装下 **8 x 8 = 64 个 Patch**。
* **多窗口并行处理**:
* 对于这张 1120 x 560 的图,模型会把它划分成多个 112x112 的"小房间"(窗口)。
* 横向有 1120 ÷ 112 = 10 个窗口,纵向有 560 ÷ 112 = 5 个窗口。
* 整张图被分成了 **10 × 5 = 50 个窗口**。
* **注意力计算(小组讨论)**:
* 在每一个窗口内部,只有 64 个 Patch。模型只计算这 64 个 Patch 之间的注意力(计算量 64 \\times 64 = 4096 次)。
* 50 个窗口各自独立计算,互不干扰。
* **穿插全局注意力(全班大会)**:
* 如果一直只在窗口里算,模型就看不到整张图的全貌了。
* 所以,在 ViT 的 32 层网络中,**第 7、15、23、31 层**会突然打破窗口限制,让这 3200 个 Patch 进行一次**全局注意力计算**。
* 其他 28 层则继续使用高效的窗口注意力。

第四步:2x2 合并压缩(MLP Merger)

* **先后顺序**:这个操作发生在 **ViT 提取完特征之后**,**输入给大语言模型(LLM)之前**。
* **操作**:ViT 输出了 3200 个 Patch 的特征向量。为了不让后面的 LLM 累死,模型把空间上相邻的 **4 个 Patch(2x2)** 捆绑在一起。
* **计算**:3200 个 Patch ÷ 4 = **800 个合并后的特征**。
* **MLP 投影**:这 4 个特征拼接后,通过一个两层神经网络(MLP),被压缩并转换成 LLM 能看懂的维度(比如从 1280 维变成 8192 维)。

第五步:喂给大语言模型(LLM)

* **结果**:原本如果直接输入,LLM 需要处理 3200 个视觉 Token。经过 2x2 压缩后,LLM 只需要处理 **800 个 Token**。
* 这 800 个 Token 和用户的文本问题(比如"图里有几个人?")拼接在一起,送入 LLM 进行最终的推理和回答。


总结你的疑惑

  1. **"最多不会超过64个,如果超过的话剩下的数据是如何进行处理的呢?"**
    * **解答**:不是整张图不超过 64 个,而是**每个窗口内**不超过 64 个。如果图很大,就会划分出**多个窗口**(比如 50 个窗口),每个窗口各自处理自己的 64 个 Patch。
  2. **"2*2的将patch合并在一起,先后顺序是啥?"**
    * **解答**:顺序是:**先切块 (14x14) -> 进 ViT 提取特征 (使用窗口注意力) -> 出来后再进行 2x2 合并压缩 -> 最后给 LLM**。
  3. **"窗口注意力是咋运行的?"**
    * **解答**:就像把一个大班级(3200人)分成 50 个小组(每组 64 人)。平时讨论问题(计算注意力)只在小组内进行,极大地节省了精力(算力)。但每隔一段时间(第 7,15,23,31 层),全班会开一次大会(全局注意力),确保大家没有脱离整体目标。
相关推荐
铅笔侠_小龙虾2 小时前
Rust 学习(8)-切片类型
学习·rust·c#
自信不摆烂美女2 小时前
从0开始学习3个月进入网络安全行业
学习
AOwhisky11 小时前
Python 学习笔记(第一期与第二期)——基础语法——核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发
STLearner12 小时前
ICML 2026 | LLM×Graph论文总结[1]【图基础模型,文本属性图,多模态属性图,图对齐,图提示学习,关系深度学习
论文阅读·人工智能·python·深度学习·学习·机器学习·数据挖掘
什巳13 小时前
JAVA练习278- 和为 K 的子数组
java·学习·算法·leetcode
碎光拾影14 小时前
CPU与MCU核心区别揭秘
单片机·学习·51单片机
我命由我1234516 小时前
复利极简理解
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
AOwhisky16 小时前
Python 学习笔记(第三期)——流程控制核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发·流程控制
tyqtyq2216 小时前
药品说明书解读 —— AI 安全用药助手,鸿蒙原生应用深度解析
人工智能·学习·华为·生活·harmonyos