Qwen2.5 VL 通读

Qwen2.5 VL 通读

本文通读 Qwen2.5 VL 在模型结构、数据、训练方法方面的改进。主要改进总结:

  1. 在 vision encoder 中引入了 window attention,提升推理效率;
  2. 使用动态 FPS 采样,将动态分辨率采样扩展到时间维度,以适应不同的视频帧率;
  3. MRoPE 时间维度升级,对齐绝对时间值,从而能进行更复杂的空间序列学习
  4. 进一步扩展训练数据,总量从 1.2T tokens 增加至 4.1T tokens

模型结构

总览

Qwen2.5 VL 整体上还是经典的 MLLM 三件套:Vision Encoder + Adapter + LLM。

在这里插入图片描述

LLM 就是使用了 Qwen2.5 LM 的权重作为初始化。这里的关键点是位置编码的调整,需要将原本 LM 的 1D RoPE 调整为 MRoPE,并且 Qwen2.5 VL 还进一步对齐了绝对时间。

Vision Encoder 是 Qwen 2.5 VL 模型结构上改进的重点,在沿用 Qwen2 VL 使用 2D RoPE 来支持任意分辨率图像输入的基础上,进一步引入了 window attention 来提高推理效率

Adapter 同 Qwen2 VL 一样,还是采用简单高效的 Merger + MLP 结构, 将相邻的 4 个 token 为一组拼接起来。随后送入到一个两层 MLP 中,对齐 LLM 的特征维度。在图片 token 可变的情况下灵活方便地压缩视觉 token 数量。

具体的结构参数如下表所示。可以看到 Qwen2.5 VL 三个模型(3B、7B、72B)的结构设计基本保持完全一致,只有层数、头数、隐层维度这些规模相关的不同。与之相比,DeepSeek VL2 则不同规模的模型之间差异较大,除规模相关的参数外,词表大小、训练数据规模,甚至模型结构(MLA or not)也都不同。

在这里插入图片描述

Vision Encoder

Qwen2 VL 中,将 ViT 的位置编码替换为 2D RoPE,配合 NaViT 实现了任意分辨率的图像输入,然而这也带来了一个问题,就是输入图片的原生分辨率可能太大,导致视觉 token 特别多,而我们知道,Transformer 随 token 数是平方的计算复杂度,这就导致计算开销大大增加。为了解决这个问题,Qwen2.5 VL 在 ViT (的大多数层)中,引入了 window attention,来使得 ViT 随 token 数大致是线性的计算复杂度。使用的最大窗尺寸(window size)为 112 × 112 112\times 112 112×112)(相当于 8 × 8 8\times 8 8×8 个 patches),小于这个窗尺寸的区域也不用进行 padding,保持原始分辨率即可。这样引入了 window attention 的模型处理的就还是原生分辨率和长宽比,而没有变形。

ViT 的位置编码,还是用 2D RoPE,这样来更好地感知二维图像空间的位置信息。对于图片,就是标准的 patch 切分,将 14 × 14 14\times 14 14×14 的相邻区域切成一个 patch;对于视频,则会进一步将时序相邻的两帧合成一个 group,从而进一步缩减输入到语言模型的 token 数。

Qwen2.5 VL 还对 ViT 结构的一些细节进行了调整,在 ViT 中采用了 RMSNorm 作为标准化方法,并使用了 SwiGLU 作为激活函数,从而使 ViT 与语言模型的细节设计保持一致。

这次 ViT 的结构改动比较大,需要从头进行 CLIP 预训练,然后再与 Adapter 和 LLM 一起进行训练。Qwen2-VL 中的 ViT 是在换用了 2D RoPE 后进行了微调。

为了增强 ViT 对不同输入分辨率的鲁棒性,训练时对输入图片进行了保持长宽比的动态分辨率采样,这样既能提升模型对不同分辨率的适应性,又能稳定模型在不同视觉数据上的训练效率。

原生分辨率和帧率

在空间维度上,Qwen2.5 VL 的 ViT 将原生分辨率的图像转换为一个变长的视觉 token 序列。不同于之前的工作(包括 Qwen1/2 VL)将坐标进行了归一化(比如 [ 0 , 1000 ] [0,1000] [0,1000]),Qwen2.5 VL 直接使用真实的坐标值来表示边界框、位置点等空间特征。这使得模型能够隐式地学习到空间位置信息,提升对不同分辨率下的空间定位能力。

对于视频输入,Qwen2.5 VL 提出了动态帧率和绝对时间编码两项改进。通过适应多种帧率,模型可以更好地捕捉视频的时间动态。与其他结合文本时间戳或利用额外 head 来实现时间定位的方法不同,Qwen2.5 VL 采用了一种新策略:将 MRoPE 的 ID 直接与时间戳对齐。这样模型可以通过时间维度 ID 之间的间隔来感知时序节奏,而无需任何额外的计算开销。

对齐绝对时间的 MRoPE

引入 MRoPE 来表征多模态模型的位置编码,是 Qwen2-VL 的重要改进,Qwen2.5 VL 则进一步扩展了 MRoPE 在视频时序信息上的能力。

Qwen2 VL 中,MRoPE 分为三个独立的分量(时间、高度和宽度)组成。

  • 对于文本输入的每个 token,所有三个分量都使用相同的位置 ID(如 ( 1 , 1 , 1 ) , ( 2 , 2 , 2 ) (1,1,1), (2,2,2) (1,1,1),(2,2,2)),使 MRoPE 在功能上 fallback 到原始的 1D RoPE;
  • 对于单张图片中的每个 token,时间维度的 ID 还是保持不变,而高度和宽度则按照每个 token 所对应 patch 的空间位置来设置;
  • 对于视频帧序列,时间维度的 ID 会随着每一帧而递增,而高度和宽度分量遵循与单张图片的设置方式相同。

然而,在 Qwen2 VL 中,MRoPE 中的时间位置 ID 与输入帧的数量相关,这没有考虑到实际视频内容的动态速度或视频中事件的绝对时间。为了解决这一限制,Qwen2.5 VL 提出将 MRoPE 的时间分量与绝对时间对齐(见上图)。通过利用时间 ID 之间的间隔,使得模型能够见到过不同的视频帧率,从而更好地理解视频时序。

预训练

数据

Qwen2.5 VL 中,预训练数据相较于前代大幅增加,从 1.2T tokens 增加到 4T tokens。预训练数据的构建方法也是多种多样,有从网络上爬取并清洗的数据,也有合成的数据。涵盖了多种数据类别,包括图像描述、图文交错数据、OCR 数据、视觉知识类(名人、地标等)数据、多模态学术数据、定位数据、文档解析数据、视频描述、定位数据,以及 agent 相关数据等。在训练过程中,对不同阶段的数据配比也进行了详尽的研究,以达到最优的性能。

图文交错数据

图文交错数据是多模态模型训练的重点之一,有了图文交错理解的能力,模型就能进行多模态的 in-context learning 了。并且,模型的纯文本能力能更好地保留。然而,目前的开源图文交错数据很多都质量很差,图片和文本之间的关联性不强,对于提升模型的复杂推理和创意生成能力的提升很有限。

为了保证图文交错训练数据的质量,Qwen2.5 VL 搭建了一个数据清洗 pipeline,首先进行常规的标准数据清洗(参考 OmniCorpus),然后使用自有的打分模型对图文交错数据从四个维度进行打分:1)文本本身的质量;2)图文相关性;3)图文互补性;4)图文信息密度均衡性。其中后三者是针对图文内容之间的打分标准:

  1. 图文相关性:期望图片和文本之间具有较强的相关性,图片应该对文本是有意义地补充、解释或者扩展,而非仅是修饰作用;
  2. 图文互补性:期望图片和文本之间有更好的信息互补性,图片和文本应当各自提供一些独特的信息,整体形成一个完整的表述;
  3. 信息均衡性:期望来自图片和文本之间的信息密度较为均衡,避免信息全部来自文本或图片的情况。

这是一套非常精细的清洗策略了,对模型的复杂推理和生成能力有很大帮助。

基于绝对位置坐标的定位数据

之前我们提到,Qwen2.5 VL 采用了原生分辨率训练,作者认为归一化的相对坐标无法有效地表示原始尺寸和图片中物体的位置。因此 Qwen2.5 VL 使用真实值来表示边界框和点的坐标。

定位数据的构建包括了开源数据、in-house 数据和 Grounding DINO 合成数据,涵盖了超过 1w 个类别和 REC 表述。

文档解析数据

文档解析数据部分,主要是合成数据。传统的文档内容解析方法通常包含多个分步子模型来处理各自处理布局分析、文本提取、图表解释和插图处理。而 Qwen2.5-VL 做的则是端到端的通用文档解析和理解。合成的文档中包括了各种各样的元素,比如表格、图表、方程式、自然或合成图像、乐谱和化学公式。Qwen2.5 VL 指定了一种统一格式的 HTML,将文档布局框信息和插图描述集成到 HTML 中。从而可以进行标准化、统一化的文档解析。

OCR 数据

OCR 数据的来源也是包括了开源、in-house 和机造合成,涵盖多种语言,包括自然场景的 OCR 和合成的文字图片。对于图表类数据,用 python 的 matplotlib、plotly 和 seaborn 合成了 1M 数据;表格类数据则是用表格识别模型对 6M 真实表格数据进行处理,并加以清洗过滤。

视频数据

为了增强模型的鲁棒性,Qwen2.5 VL 对帧率进行动态采样,来保证不同帧率的视频数据在训练集内的分布尽量均匀。此外,针对长视频视频(> 30min),专门通过特定的的合成 pipleine 来合成多帧字幕。对于视频定位数据,制定了秒级和时分秒帧(hmsf)两种格式的时间戳,确保模型能够准确理解和输出各种格式的时间。

Agent 数据

Qwen2.5-VL 增强了感知和决策能力,以支持 Agent 功能。对于感知,收集了移动端、Web 和桌面平台上的屏幕截图。通过数据合成,来生成屏幕截图 caption 和 UI 元素的 grouding 标注。captioning 任务帮助 Qwen2.5-VL 理解图形界面,而 grounding 任务帮助它理解元素的外观和功能。对于决策,首先将移动端、Web 和桌面平台上的操作,设计统一的共享操作空间的函数调用格式。收集开源数据并由 Agent 框架在虚拟环境中合成的一组带标注的多步轨迹,再转换为统一函数格式。进一步通过人类和模型标注为每一步生成一个推理过程。具体来说,给定一个真实操作,在屏幕截图上显示出来,然后将原 query 以及操作前后的截图提供给标注者,要求他们编写推理内容来解释此操作背后的意图。再使用模型过滤掉低质量的推理内容。最终得到高质量的 Agent 数据。

训练

Qwen2.5 VL 的预训练分为视觉预训练、多模态预训练和长上下文预训练三个阶段,各阶段的数据、序列长度等细节如下表所示。

在这里插入图片描述

采用原生分辨率输入后,图片和文本的 token 数都是可变的,这可能会导致训练时的计算负载不均衡。由于 vision encoder (with window attention) 的计算量相对 LLM 要小得多,因此重点还是要平衡 LLM 在不同 GPU 上的计算负载。具体来说,根据样本送入到 LLM 的序列长度(visual tokens + text tokens),来动态地进行 packing,从而保证 LLM 计算负载的均衡。在预训练的前两个阶段,packing 到 8K,在第三个阶段,由于在做长上下文的训练,因此 packing 到 32K。

后训练

Qwen2.5 VL 的后训练阶段旨在对齐人类偏好,增强模型的对话指令遵循能力和推理能力,包含 SFT 和 DPO 两个阶段。

指令数据与过滤

SFT 阶段,与 Qwen2-VL 一样,采用了 ChatML 的对话模板,该模板引入了对话角色(system/user/assistant)标识,且能够保持图文交错内容的相对位置关系。SFT 阶段使用了精心构造的指令遵循对话数据,主要由中英文构成,共约 2M 条,其中纯文本数据和多模态数据(图文/视文)各约占 50%,当然,视觉相关的 token 占比会比文本多不少。既有单轮对话也有多轮,既有单图输入也有多图,既有开源的 query 也有采买的,模拟了真实世界中各种各样的对话场景。在数据的任务类型,也涵盖种类甚多,包括 VQA、image captioning、doc/ocr、video、agent、math、coding 以及安全相关的 query 等。

数据质量是 SFT 阶段训练的重中之重,Qwen2.5 VL 中搭建了一套二阶段的数据过滤流程,首先对数据领域进行分类,然后基于不同的领域特点进行特定的数据过滤。

第一阶段,使用 Qwen2-VL-instag(基于 Qwen2-VL 72B 训练的分类模型)来对 QA 数据进行多级分类,第一级分为 8 个基础类别(如 Coding、Planning 等),第二级分为了更细粒度的 30 个子类(如 Code_Debugging、Code_generation 等)。有了这种多级的类别领域结构,我们就能更有针对性的基于每个领域不同的特点来优化数据清洗的方案。

第二阶段基于第一阶段的领域分类结果,进行数据过滤,包括基于规则的过滤和基于模型的过滤。根据特定领域(如文档解析、OCR、视觉定位等)的不同特点,采用不同的过滤策略。

基于规则的过滤是指预定义一些启发式的规则,来过滤掉本身质量低或有问题的样本。具体来说,对于与文档处理、OCR 和视觉基础任务相关的数据集,会识别并删除出现重复的情况。此外,包含不完整、截断或格式不正确的样本和不相关或可能有害的样本也会被过滤掉。

基于模型的过滤是指通过训练多模态奖励模型,并据其进一步优选 SFT 数据集。奖励模型会在多个维度上对多模态 QA 数据进行评估,对于 query 主要评估其相关性和复杂度,保留更困难的问题;对于 answer 主要评估其正确性、完整性、清晰度、与查询的相关性以及是否有帮助。在基于视觉的任务中,特别注意要评估是否准确理解并利用了视觉信息。

Qwen2.5 VL 还采用了拒绝采样来进一步提升 CoT 数据的质量,该方法对于那些需要复杂推理的任务(如数学题、代码生成、特定域 VQA 等)至关重要。具体来说,Qwen2.5 VL 的拒绝采样数据构造过程是,在一个有标注的数据集上,使用中间版本的模型进行 CoT 推理,对比其输出结果与真实标注是否一致,仅将结果正确的输出结果保留下来,作为模型进一步的训练数据。从而保证数据都是准确的、高质量的。此外,对于结果正确的输出结果,还要过滤掉过长、重复等存在问题的 CoT 结果,进一步保证数据的质量。

对于多模态模型来说,CoT 推理中一个额外的关键问题是同时依赖于文本和视觉信息,推理步骤可能对视觉信息利用不充分,甚至忽略掉视觉信息。为了解决这个问题,Qwen2.5 VL 设计了基于规则和模型驱动的过滤策略来验证中间推理步骤的准确性,从而确保 CoT 流程中的每个步骤都能有效地整合视觉和文本模态。(这里也没说很多细节)

训练

Qwen2.5 VL 的后训练过程包括 SFT 和 DPO 两个阶段,均冻结了 ViT 的参数。在 SFT 阶段,模型针对各种多模态数据进行微调,包括图文对、视频和纯文本,这些数据来源于通用 VQA、Rejection Sampling、Doc/OCR、Grounding、Video 和 Agent 相关任务等专门数据集。DPO 阶段专注于图文和纯文本数据(无视频数据),利用偏好数据使模型与人类偏好保持一致,每个样本仅处理一次以确保高效优化。这个简化的过程增强了模型的跨模态推理和任务特定性能,同时保持与用户意图的一致性。

实验

本来想看看消融,但好像全都是性能展示和对比,没消融,很遗憾。

总结

Qwen 系列比较稳健,一直是每次都有一定创新,且一直保持开源。现在应该是全球范围内(最)领先的开源多模态模型了,最近几个 VLM R1 相关的项目基本全都是用 Qwen 2/2.5 VL 作为基座,都取得了不错的结果。

import gradio as gr from openai import OpenAI from utils.utils import send_qwenvl, mathml2latex client = OpenAI( api_key="sk-86ec70f3845c46dd937f9827f9572b81", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", ) # Send Qwen2.5-72B-vl def submit_qwenvl(stem, analysis, score, student_answer, model): stem = mathml2latex(stem) analysis = mathml2latex(analysis) scoring = send_qwenvl(client, analysis, score, student_answer, model, stem) # Determine word problem return [stem, analysis, scoring] # Clean up input and output def clean(): return [None, None, None, None, None, 'qwen2.5-vl-72b-instruct'] type_chioes = ['llm', '多模态'] def update_dropdown(choice): if choice == 'llm': return [ ('72b', 'qwen2.5-72b-instruct'), ('32b', 'qwen2.5-32b-instruct'), ('14b', 'qwen2.5-14b-instruct'), ('7b', 'qwen2.5-7b-instruct'), ('3b', 'qwen2.5-3b-instruct'), ('1.5b', 'qwen2.5-1.5b-instruct'), ('0.5b', 'qwen2.5-0.5b-instruct') ] else: return [ ('72b', 'qwen2.5-vl-72b-instruct'), ('32b', 'qwen2.5-vl-32b-instruct'), ('7b', 'qwen2.5-vl-7b-instruct'), ('3b', 'qwen2.5-vl-3b-instruct') ] with gr.Blocks(title="测学练") as demo: gr.Markdown("<center><h1>测学练</h1></center>") with gr.Row(): # input with gr.Column(): with gr.Row(): type_choice = gr.Dropdown(label='类型', choices=type_chioes) model_choice = gr.Dropdown(label='模型') stem_input = gr.Textbox(label="题干", lines=5) analysis_input = gr.Textbox(label="标准答案", lines=5) score = gr.Slider(label="分值", minimum=1, maximum=50, step=1) student_answer = gr.Textbox(label="学生作答", lines=5) with gr.Row(): submit_btn = gr.Button(value="提交") clean_btn = gr.Button(value="清除") # output with gr.Column(): stem_output = gr.Textbox(label="题干", lines=5) analysis_output = gr.Textbox(label="标准答案", lines=5) scoring_output = gr.Text(label="评分结果") gr.on(triggers=[type_choice.change], fn=update_dropdown, inputs=type_choice, outputs=model_choice) submit_btn.click(fn=submit_qwenvl, inputs=[stem_input, analysis_input, score, student_answer, model_choice], outputs=[stem_output, analysis_output, scoring_output]) clean_btn.click(fn=clean, inputs=None, outputs=[stem_input, analysis_input, scoring_output, score, student_answer, model_choice]) demo.launch( server_name="0.0.0.0", server_port=7860, share=False )
最新发布
04-05
<think>好的,我现在需要帮助用户理解他们提供的Gradio代码。首先,我会先通读整个代码,了解其结构和各个部分的功能。代码的主要目的是创建一个名为“测学练”的Web应用,用于评分学生答案,可能用于教育或测试场景。 首先,用户导入了必要的库:gradio和openai,还有一些自定义的工具函数,比如send_qwenvl和mathml2latex。这提示应用可能涉及到与OpenAI的API交互,特别是Qwen模型的不同版本,包括视觉语言模型(VL)。接下来,初始化了OpenAI客户端,但注意到base_url指向阿里云的地址,这可能说明使用的是定制或特定部署的模型服务。 然后,定义了一个submit_qwenvl函数,负责处理题干、标准答案、分数和学生答案,通过调用send_qwenvl函数来获取评分结果。这里用到了mathml2latex转换,可能用户输入的是MathML格式,需要转为LaTeX以便模型处理。 接下来是clean函数,用于清除输入输出内容。然后是update_dropdown函数,根据用户选择的类型(llm或多模态)更新模型下拉菜单的选项。这显示了界面允许用户选择不同的模型版本,可能根据任务需求选择适合的模型大小。 在Gradio的界面构建部分,使用了gr.Blocks来创建布局,包含输入和输出两个列。输入部分有类型选择、模型选择、题干、标准答案、分数滑块、学生作答输入框以及提交和清除按钮。输出部分显示处理后的题干、标准答案和评分结果。 事件处理部分,type_choice的变化触发update_dropdown,更新模型选项。提交按钮触发submit_qwenvl函数,清除按钮则调用clean函数。最后,应用启动在本地服务器的7860端口。 接下来,我需要将这些分析转化为用户容易理解的中文解释,分步骤说明各部分的功能,以及整个应用的工作流程。需要注意的是,用户可能对Gradio和OpenAI API的使用不太熟悉,所以需要用简洁的语言说明,同时保持结构清晰。 另外,需要检查是否有潜在的问题或改进点,比如API密钥硬编码在代码中,存在安全风险,应该提醒用户注意;或者模型版本的选择是否合理等。不过根据用户的问题,主要是介绍代码,可能不需要深入讨论这些,但如果有明显的问题,可以提及。 最后,确保回答符合用户要求的格式,特别是数学表达式使用$...$,但当前代码中似乎没有涉及数学内容,可能在send_qwenvl或mathml2latex中处理,但用户提供的代码中没有这部分细节。因此,在解释时不需要特别处理数学公式,除非在题干或答案中有涉及,但用户提供的示例代码中没有明显数学内容,所以可能不需要使用LaTeX格式。 总结回答的结构:先整体介绍应用用途,然后分解代码各部分的功能,包括导入库、OpenAI客户端设置、核心函数、界面布局、事件绑定,最后总结应用的工作流程和潜在注意事项。</think>这是一个基于Gradio构建的AI评分系统,主要用于处理数学类题目的自动评分。我分模块帮你解析代码结构和工作原理: $$\text{系统架构图:} \quad \text{用户界面} \rightarrow \text{处理逻辑} \rightarrow \text{Qwen大模型API}$$ 一、核心功能模块 1. **模型对接层**: - 使用阿里云部署的Qwen2.5系列大模型 - 支持两种类型模型: - 纯文本模型(`llm`):7种参数量可选(0.5B-72B) - 多模态模型(`vl`):4种参数量可选(3B-72B) - API密钥硬编码存在安全隐患(生产环境建议使用环境变量) 2. **数据处理流程**: ```mermaid graph TD A[用户输入题干] --> B[MathML转LaTeX] C[标准答案] --> B D[学生作答] --> E[模型评分] B --> E E --> F[返回评分结果] ``` 二、界面设计解析 $$\begin{cases} \text{输入侧} & \text{输出侧} \\ \hline • \text{题型选择下拉菜单} & • \text{标准题干展示} \\ • \text{动态模型选择器} & • \text{格式化答案展示} \\ • \text{滑动评分区间(1-50分)} & • \text{最终评分结果} \\ • \text{清除/提交按钮组} & \end{cases}$$ 三、关键技术点 1. **动态组件更新**: - 当用户切换`llm`/`多模态`类型时,使用`update_dropdown`函数实时更新可用模型列表 - 示例代码片段: ```python def update_dropdown(choice): return [ ('72b', 'qwen2.5-72b-instruct'), ... # 动态生成模型选项 ] ``` 2. **数学公式处理**: - 内置`mathml2latex`转换器,支持将MathML格式转换为LaTeX - 确保模型接收标准数学表达式,如:$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$ 四、系统运行方式 1. 本地启动命令: ```bash python app.py ``` 2. 访问地址: - 本地访问:http://localhost:7860 - 局域网访问:http://[服务器IP]:7860 五、改进建议 1. 安全性优化:建议通过环境变量注入API密钥 2. 错误处理:增加异常捕获机制,特别是API调用失败时的回退策略 3. 历史记录:添加评分记录存储功能,便于后续分析 这个系统适合教育机构用于: $$自动化批改 \propto \frac{\text{模型精度} \times \text{题目复杂度}}{\text{响应时间}}$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值