Wsh's blog Wsh's blog
首页
  • Agent基础
  • Agent设计模式
  • Agent多模态
  • 基础知识
  • ArkUI
  • UIAbility
  • 组件通信方式
  • 前端缓存
  • React
  • typescript
  • javascript
  • flutter
  • node
  • webpack
web3D😉
宝库📰
  • 分类
  • 标签
  • 归档
龙哥的大🐂之路 (opens new window)
GitHub (opens new window)

wsh

今日状态:想退休,等退休
首页
  • Agent基础
  • Agent设计模式
  • Agent多模态
  • 基础知识
  • ArkUI
  • UIAbility
  • 组件通信方式
  • 前端缓存
  • React
  • typescript
  • javascript
  • flutter
  • node
  • webpack
web3D😉
宝库📰
  • 分类
  • 标签
  • 归档
龙哥的大🐂之路 (opens new window)
GitHub (opens new window)
  • Agent基础
  • Agent模式
  • Agent多模态
  • Qwen-VL
    • Qwen-VL系列视觉编码器的核心演进路径及每代解决的问题?
    • Qwen2-VL中提出的M-RoPE如何统一处理文本、图像和视频的位置编码?
    • Qwen-VL系列模型的三阶训练范式的具体运作机制与各阶段数据策略?
    • Qwen2.5-VL使用绝对位置坐标相比归一化坐标在目标检测中的优势?
    • Qwen2.5-VL 使用动态FPS采用与3D patch划分如何协同提升视频理解?
    • Qwen2.5-VL后训练阶段如何结合监督微调(SFT)和直接偏好优化(DPO)?
    • Qwen-VL系统模型中多模态统一序列化格式的具体实现方式?
    • Qwen2-VL之后模型使用的Native Dynamic Resolution极致的原理与效果?
    • Qwen2.5-VL预训练数据构建的核心质量策略?
    • 从Qwen-VL到Qwen2.5-VL的多语言支持演化?
    • 解释Qwen3-VL中 MRoPE-Interleave的设计原理?
    • Qwen3-VL引入的DeepStack 技术如何实现ViT多层次特征融合?
  • aiAgent
2026-02-12
目录

Qwen-VL

# Qwen-VL~Qwen2.5VL

# Qwen-VL系列视觉编码器的核心演进路径及每代解决的问题?

Qwen-VL系列的视觉编码器演进,清晰地体现了团队在追求更好视觉理解精度和更低开销之间的权衡与创新。

第一代Qwen-VL搭建了一个稳健的基线。它采用了基于OpenClip的Vit-bigG架构,但处理方式相对传统:将所有输入图像固定缩放到448*448分辨率。这样做虽然保证了处理速度,但高分辨率图像的细节信息损失是无法避免的。为了将漫长的图像特征序列适配到语言模型,它引入了一个非常关键的设计-位置感知视觉-语言适配器。这个适配器通过256个可学习的查询,通过交叉注意力机制从图像特征中提炼出256个token的”视觉摘要“。同时,它在这个适配器中保留了2D绝对位置编码,确保了空间信息的不丢失。这个阶段的核心是验证架构可行性并建立基础的视觉-语言关联。

第二代Qwen2-VL的核心突破是动态分频率支持。模型不再对图像机械能强制缩放,而是允许高分辨率图像生成更多的视觉token,从而保留更丰富的细节,这对于理解图表中的小字或图像中的微小物体至关重要。随之而来的问题是序列长度可能变得非常长。为此,它采用了一个轻量级的MLP压缩器,将相邻的2x2个视觉token合并为1个,高效地减少了序列长度。更重要的是,它在ViT中集成了2D-RoPE,这是一种将旋转位置编码扩展到二维空间的方法,让模型能更精确地理解像素之间的空间相对关系。这一代的核心人物是提高分辨率图像的细节感知并优化计算效率。

第三代Qwen2.5-VL的视觉编码近乎是一次重构。它支持原生分辨率输入,并引入到窗口注意力机制,使得计算复杂度与序列长度呈线线性关系而非二次增长,从而能高效处理手机全屏截图或高清海报等超高分辨率输入。对于视频模态,它创新性地使用了3D patch划分,将连续两帧的图像组合成一个处理单元,极大地提升了对视频时序信息的理解效率。这一代的使命是突破分辨率和序列长度的极限,为模型处理长视频、复杂文档等现实场景扫清架构障碍。

# Qwen2-VL中提出的M-RoPE如何统一处理文本、图像和视频的位置编码?

M-RoPE的核心思想是为多模态数据构建一个统一的、分解式的时空坐标系。

传统的RoPE是为文本这种一维度设计的,它通过旋转矩阵为每个token赋予一个基于顺序的位置信息。但图像是二维的,视频是三维的(时间+空间)的,直接套用一套编码会丢失大量信息。

M-RoPE的解决方案是将位置嵌入分解为**时间(t)、高度(h)、宽度(w)**三个正交的分量。

  • 对于纯文本输入,这三分量被赋予完全相同的值,此时M-RoPE在数学上完全等价于一维RoPE,实现了完美的向后兼容。
  • 对于图像输入,将时间分量置为一个常数,而高度和宽度分量则根据每个视觉token在图像中的具体坐标(x,y)进行赋值。这样,模型就能精确地知道一个token是来自图像的左上角还是右下角
  • 对于视频输入,时间分量会随着帧序号的增加而递增,而每一帧内的空间信息依旧由高度和宽度分量编码。这就自然地同时编码了时空信息。

这种分解的设计,使得模型可以用同一套数学机制来理解单词在句子中的顺序、像素在图像中的位置、以及帧在视频的顺序,是一种极其优雅和统一的解决方案。

# Qwen-VL系列模型的三阶训练范式的具体运作机制与各阶段数据策略?

Qwen-VL的三阶段训练是一个先训练,再解锁(多任务预训练),后精修(指令微调(SFT))d的经典范式,后续迭代也基于此进行优化。

第一阶段:

  • 目标:在海量图像-文本对上,让模型学习视觉表征与语言概念的最基本关联。此时,大型语言模型的参数是被冻结的,只训练视觉编码器和视觉-语言适配器。这相当于先给模型植入视觉神经元。
  • 数据:规则巨大,约50亿,但经过严格清晰后保留14亿高质量对,清洗保留率28%。数据来源多样。

第二阶段:

  • 目标:引入高质量、细粒度的标注数据,解锁所有模型参数,激发模型的多任务能力
  • 数据:约77M样本,任务类型多达7种,包括说明、VQA、对齐、引用对齐、接地说明、OCR、纯文本自回归。
  • 在此阶段,图像分辨率会提升至448*448,并移除窗口注意力以捕捉更多细节。

第三阶段:

  • 目标:让模型学会遵循人类指令进行对话和任务执行。此时,视觉编码器被冻结,只微调LLM和适配器,生成最终的Chat版本。
  • 数据:使用约350K指令数据,包含模型自生成的描述、人工标注的定位数据、以及多轮对话,旨在让模型变得有用和易用。

Qwen-2.5-VL在此基础上进一步细化,将预训练拆分成视觉预训练、多模态预训练、长上下文预训练三个阶段,并引入了拒绝采样等高级技术来极致化数据质量,但其核心思想仍源于此范式。

# Qwen2.5-VL使用绝对位置坐标相比归一化坐标在目标检测中的优势?

核心目的是让模型建立起对真实物理世界的尺度感知能力。 传统的归一化坐标(将边界框坐标除以图像宽高,缩放到0-1之间)是一种与设备无关的表示方式,但它丢失了图像的绝对尺度信息。对于模型而言,一个在19201080图像中归一化坐标(0.5,0.5)的点,和一个在224224图像中同样为(0.5,0.5)的点,在抽象意义上没有区别。但现实中,前者可能代表一个巨大的广告牌上的一个像素,而后者可能代表手机屏幕上的一个图标,他们的实际物理尺寸天差地别。

Qwen2.5-VL改用绝对坐标,即直接使用图像的真实宽高来表示边界框。这样做的好处是:

  • 消除分辨率缩放偏差:模型无需再去猜测输入图像是否被缩放或如何缩放,定位精度更高。
  • 增强现实世界理解:模型能逐渐学习到”100像素宽“的物体在屏幕上大概有多大,从而更好地理解UI界面,文档布局等场景
  • 简化预处理流程:无需为了训练和推理的一致性而进化复杂的图像预处理,流程更直接。

这个改动是模型迈向更通用、更实用的智能体应用的关键一步,因为它需要精确理解屏幕上每个UI元素的真实大小和位置才能执行点击等操作。

# Qwen2.5-VL 使用动态FPS采用与3D patch划分如何协同提升视频理解?

处理长视频的核心挑战在于如何在有限的序列长度内,尽可能保留完整的时序信息和每帧的空间细节。Qwen2。5-VL通过这两项技术形成了一个高效的组合拳。

动态采样FPS是一种时间维度的自适应策略。对于一段长时间的视频,如果每秒都采样,会产生3600帧,序列长度会爆炸。动态采用允许模型根据视频的总长度来智能调整采样率。

3D patch 划分是一种空间-时间维度的联合压缩技术。传统的做法是将每一帧独立编码成视觉token,然后拼接起来,这样序列长度与帧数成线性增长。Qwen-2.5-VL的创新在用,它将连续的两帧图像在patch层面进行组合,形成一个3D的patch立方体,然后一次性输入给ViT编码器。

这样做有两个巨大优势:

  • 序列长度减半:两帧被压缩成一组特征,极大减少了输入后续语言模型的视觉token数量。
  • 原生时序建模:ViT在编码的最底层就能同事看到相邻两帧的信息,从而更早、更有效地捕捉到帧与帧之间的微小变化。

协同效应:动态采样FPS负责输入ViT的帧数量,而3D patch 划分负责压缩每两帧产生的token数量。两者共同作用,使得模型能够以前所未有的效率处理长达数十分钟甚至小时级的视频,并同时理解其中的空间细节和复杂的时间动态。

# Qwen2.5-VL后训练阶段如何结合监督微调(SFT)和直接偏好优化(DPO)?

Qwen2.5-VL的后训练采用了一种非常精细的双阶段优化范式,旨在先提升能力,再对齐偏好。整个后训练阶段,视觉编码器的参数都是被冻结的。 首先是监督微调(SFT)阶段,核心人物是使用约 200w条高质量的指令数据来充分激发模型在预训练中获得的各种能力。这批数据是精心配比的,包含50%的纯文本数据和50%的多模态数据。为了保证数据质量,引入了一个基于Qwen2-VL的分类模型对海量数据进行智能分类和过滤。

最关键的一部是采用了拒绝采样技术。具体来说,使用一个中间版本的Qwen2.5-VL模型,对一批带有标准答案的书记进行推理,生成模型的响应。然后,将模型的输出与标准答案进行严格对比,只保留那些模型输出与正确答案匹配的样本,而自动丢弃那些生成错误、冗余、存在代码切换或重复模式的低质量样本。

这个过程就像一个极其严格的考官,只有交出满分答卷的样本才能进入最终的高质量SFT数据集。通过这种方式,确保了用于微调的数据都是最高效、最准确的教学材料,从而让模型的性能提升事半功倍。

在随后的直接偏好优化(DPO)阶段,目标从提升能力转向修正行为,既让模型的输出更符合人类的偏好和价值观。使用人工标记的偏好数据,对模型进行训练。值得注意的是,此阶段只要使用图文更符合人类的偏好和价值观。使用人工标记的偏好数据,对模型进行训练。值得注意的是,此阶段主要使用图文和纯文本数据,暂不涉及更复杂的视频模态。通过DPO,模型学会了输出更受欢迎,更有帮助且更安全的回答,完成了从能力强大到行为友善的转变。

# Qwen-VL系统模型中多模态统一序列化格式的具体实现方式?

该问题触及多模态模型的核心设计哲学,模型需要处理图像、视频和文档等多种模态的输入,解决方案是采用一种基于特殊标记的序列化格式,将所有模态都转化为语言模型所熟悉的token序列,从而实现无缝的统一处理。

整个模型的处理流程可以概括为:视觉编码器(ViT)将像素转化为视觉token,连接器(Adapter/MLP)进行压缩和投影,最终所有模态的token被拼接成一个统一的序列输入给LLM。

具体来说:

  • 对于图像:图像经过视觉编码器处理后产生的视觉特征序列,会被包裹在一对特殊的标记之中。这相当于告诉语言模型:接下来的这一串token,是从一张图片里来的。
  • 对于视频:视频被作为一系列图像帧的集合。每一帧都会像上述图像一样被处理。同时,会在帧的特征序列前插入时间戳标记,来明确指示该帧的时间位置。
  • 对于复杂稳定:为了统一处理文档中的表格、图表、公式等元素,将其全部转为HTML格式的温恩。HTML本身是一种文本标记语言,因此可以直接被语言模型理解和处理。图像等非文本元素则依旧用”标签嵌入到HTML文本序列中“。

这种设计的好处是极致的简介和灵活。语言模型不需要为不同模态准备不同的处理模块,它只需要学会理解这些特殊的模态标记和时间戳标记,就能以一种近乎相同的方式处理各种输入,大大降低了架构的复杂性。

# Qwen2-VL之后模型使用的Native Dynamic Resolution极致的原理与效果?

朴素动态分辨率机制-Native Dynamic Resolution 是一种直观但非常有效的设计,其核心思想是让视觉token的数量与输入图像的分辨率动态适配,从而在计算资源允许的范围内最大限度地保留原始信息。

工作流程:

  1. 动态分词:模型不在将所有图像强制缩放到一个固定的尺寸,而是根据图像的原生分辨率,通过视觉编码器将其转换为响应数量的视觉token。
  2. 智能压缩:为了避免产生的token序列过长,随后使用一个轻量的MLP压缩器,将空间上相邻的2x2个视觉token合并为1个token。这相当于将图像的分辨率在特征孔家里降低了2倍,从而将序列长度减少到原来的1/4.

这个过程之所以能提升细节理解,关键在于第一步。对于高分辨率图像,即使经过后续的2x2合并压缩,其最终保留的视觉token数量仍然高于低分辨率图像直接处理的结果。例如:一张4K图像最初可能生成上万token,压缩后仍能保留数千token;而一张低分辨率图像最初只能产生数百token。更多的token意味着更多的信息承载量,使得模型能够分辨出图像中更细微的元素,如文档里的小号字体、网页上的图表细节或街景中的远处路牌。

这种机制让模型在面对不同质量的输入时具备了弹性,既能细致入微地分析高清图片,也不会对低分辨率图片进行不必要的过度计算。

# Qwen2.5-VL预训练数据构建的核心质量策略?

Qwen2.5-VL的性能飞跃,很大程度上源于在数据质量上进行的精耕细作。不再仅仅追求数据规模,而是通过一系列系统性的策略来构建一个精英数据集。 核心策略主要包括以下几个方面:

  • 交错图文数据的精细化清洗:从海量原始数据中,通过基于CLIP模型的数据评分和一系列去重、去汇的清洗流程,筛选出真正高质量、图文高度相关的样本。这确保了基础视觉-语言相关学习的可靠性。

  • grounding数据的绝对化坐标:正如之前提到的,在检测和定位数据中兵器2了归一化坐标,采用基于图像真实尺寸的绝对坐标。这一改动虽然微小,但让模型学习到的空间关系是基于真实世界的尺度,极大提升了其在现实应用中的泛化能力。

  • 文档数据的结构化合成:合成了大量包含表格、图表、公式、乐谱等复杂元素的文档数据,并统一用HTML格式来标注。这种结构化的表示方式让模型能无缝地理解和推理文档总的多模态元素之间的关系。

  • 视频数据的时序精细化标注:对于视频数据,不仅动态采样帧,还构建了详细的长视频标题描述,并以时分秒针的格式精确标注时间戳,让模型能够建立精确的时序理解。

  • 智能体数据的多维构建:为了训练模型成为屏幕智能体,收集了移动端、web和桌面的截图,并利用合成引擎生成了对UI元素的精准接地注释。这使得模型能够理解可点击的按钮在屏幕上的具体位置。

所有这些策略的共同点在于:不仅提供数据,更提供数据的精确上下文和结构化信息。是在为模型构建一个标注清晰、结构严谨的教科书,而不仅仅是提供一堆阅读材料。

# 从Qwen-VL到Qwen2.5-VL的多语言支持演化?

多语言能力的扩展是一个系统工程,从数据和模型两个层面稳步推进。

  • 多语言OCR数据的系统整合:广泛收集和整合了来自不同来源的OCR数据,包括合成数据、开源数据和内部收集的数据,并重点覆盖了日语、韩语、阿拉伯语等更多语言。这教会了模型如何阅读全世界的文字。
  • 多语言指令微调数据的构建: 在SFT阶段,注入了包含多种语言的问答对和指令数据。这使得模型不仅能看懂多语言文字,还能用相应的语言进行思考和回答,实现了端到端的多模态多语言对话。
  • 绝对坐标的间接增益:之前提到的绝对坐标标注策略,同样惠及多语言场景。例如:一个中文网页和一个阿拉伯网页的UI元素位置分布可能不同,绝对坐标能帮助模型更好地理解这种与文化或语言书写方向相关的布局差异,从而做出更准确的定位。

# 解释Qwen3-VL中 MRoPE-Interleave的设计原理?

MRoPE-Interleave是Qwen3-VL在位置编码方面的核心创新之一。传统的MRoPE将特征维度按照时间、高度、宽度的顺序分块划分,这导致时间信息全部集中在高频维度上,对长视频理解能力有限。

核心改进思路: Qwen3-VL采用t、h、w交错分布,实现对时间、高度和宽度的全频率覆盖。这种设计使得位置编码更加鲁邦。(英文 Robust 的音译,通常翻译为稳健性或强壮性)在保证图片理解能力的同时,显著提升了对长视频的理解能力。

代码实现分析: 在Qwen3VLTextRotaryEmbedding类中,核心实现体现在apply_interleaved_mrope方法:

def apply_interleaved_mrope(self, freqs, mrope_section):
    freqs_t = freqs[0]
    for dim, offset in enumerate((1,2), start=1):
        length = mrope_section[dim]*3
        idx=slice(offset,length,3)
        freqs_t[...,idx]=freqs[dim, ..., idx]
    return freqs_t

关键技术点:

  1. 三维位置编码生成:首先为T,H,W三个维度分别生成位置编码频率
  2. 交错重组:通过slice(offset, length, 3) 实现步长为3的交错采样,将原来分块的[TTT...HHHH...WWW]重组为[THTHWHTHW...]
  3. 频率覆盖:这种交错方式确保每个维度的信息都分布在低频到高频的完整频谱上。

达到的功能:这种设计使得模型在处理长视频时,时间信息不会被局限在高频维度,而是与空间信息在整个频率范围内均匀分布,提升了模型对食品时序关系的建模能力。

# Qwen3-VL引入的DeepStack 技术如何实现ViT多层次特征融合?

DeepStacck是Qwen3-VL的第二大创新,它打破了传统多模态大模型单层输入视觉tokens的缺点,改为在LLM的多层中注入来自ViT不同层的视觉特征,实现更精细化的视觉理解。 核心设计思想:

  1. 多层提取:从ViT的不同深度提取视觉特征
  2. 多层注入:将这些特征分别注入到LLM的对应层
  3. 层级对齐:保留从底层(low-level)到高层(hight-level)的丰富视觉信息

视觉编码器实现

在Qwen3VLVistionModel中,通过 Deepstack_visual_indexs 配置指定提取特征的层:

def _init_(self, config, *inputs, **kwargs) -> None:
    super()._init_(config, *inputs, **kwargs)

    self.deepseek_visual_indexes = config_deepstack_visual_indexs

    self.deepstack_merge_list = nn.ModuleList([
        Qwen3VLVistionPatchMerger(
            config=config,
            use_postssuffle_norm=True,
        )
        for _in range(len(config.deepstack_visual_indexes))
    ])

在前向传播中提取多层特征:

    def _init_(self, config, *inputs, **kwargs) -> None:
        super()._init_(config, *inputs, **kwargs)

        self.deepstack_visual_indexs = config.deepstack_visual_indexs

        self.deepstack_merge_list = nn.ModuleList([
            Qwen3VLVistionPatchMerge(
                config=config,
                use_postshuffle_norm=True
            )
            for _ in range(len(config.deepstack_visual_indexs))
        ])

在前向传播中提取多层提取:

def forward(self, hidden_States: torch.Tensor, grid_thw: torch.Tensor, **kwargs) -> torch.Tensor:
    deepstack_feature_lists=[];
    for layer_num, blk in enumerate(self.blocks):
        hidden_states=blk(
            hidden_states,
            cu_seqlens=cu_seqlens,
            postion_embeddings=position_embeddings,
            **kwargs
        )
        if layer_num in self.deepstack_visual_indexes:
            idx=self.deepstack_visual_indexes.index(layer_num)
            deepstack_feature=self.deepstack_merger_list[ids](hidden_states)
            deepstack_feature_lists.append(deepstack_feature)
        
        hidden_states = self.merger(hidden_states)

语言模型端的特征注入: 在Qwen3VLTextModel中,通过_deepstack_process方法将视觉特征注入到对应层:

def forward(
    self,
    input_ids:Optional([torch.])
    visual_pos_masks:Optional[torch.Tensor] = None,
    deepstack_visual_embeds:Option[list[torch.Tensor]] = None,
    **kwargs
)-> Union[tuple, BaseModelOutputWithPast]:
    for layer_idx, decoder_layer in enumerate(self.layers):
        layer_outputs=decoder_layer(
            hidden_states,
            attention_mask=attention_mask,
            postion_ids=position_ids
             past_key_values=past_key_values,
            cache_position=cache_position,
            position_embeddings=position_embeddings,
            **kwargs,
        )
        hidden_states = layer_outputs
        
        # 在前几层注入视觉特征
        if deepstack_visual_embeds is not None and layer_idx in range(len(deepstack_visual_embeds)):
            hidden_states = self._deepstack_process(
                hidden_states,
                visual_pos_masks,
                deepstack_visual_embeds[layer_idx],
            )
    
    return BaseModelOutputWithPast(...)

特征注入的具体实现:

def _deepstack_process(
    self, hidden_states:torch.Tensor,
    visual_pos_masks: torch.Tensor,
    visual_embeds: torch.Tensor
):
    visual_pos_masks=visual_pos_masks.to(hidden_states.device)
    visual_embeds=visual_embeds.to(hidden_states.device, hidden_states.dtype)

    # 克隆避免原地修改
    hidden_states=hidden_states.clone()

    # 在视觉token位置进行特征相加
    local_this=hidden_states.clone()

    # 在视觉token位置进行特征相加
    local_this=hidden_states[visual_pos_mask, :] + visual_embeds
    hidden_states[visual_pos_mask, :] = local_this
    return hidden_states
Agent多模态

← Agent多模态

最近更新
01
Agent多模态
01-13
02
Agent基础
01-13
03
Agent模式
01-13
更多文章>
Theme by Vdoing | Copyright © 2022-2026 Wsh | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式