type
status
date
slug
summary
tags
category
icon
password
写在前面:
智谱发的 VLM,只有 9B,但效果已经比 Qwen2.5-VL-72B 要好了(但这是 thinking 模型,和 Qwen2.5 是 non-thinking,对比还是有点不公平的),这里主要卖点是把 LLM 领域大火的 thinking 模式迁移到 VLM 领域了(前面也有很多其他工作了)。
论文看完感觉干货非常多,核心创新点之一 RLCS 在 LLM 领域应该是常规做法(很多技术点是从 DAPO 来的),RLCS 的动机是增强训练效率,这里主要想法是动态调整样本的采样权重,给模型更多难度适中的 prompt,太难和太简单的 prompt 都降低采样概率,细节上可能会有的差别,大体思路会差不多,Kimi 的 K1.5 的 2.3.4 Sampling Strategies 就有类似的逻辑,他们会实时记录 problem 的解答成功率,成功率越大,采样到的概率越小。
ViT 部分用了 AIMv2,这个已经做过模态对齐了,所以 GLM 这里不像 Qwen 有个 stage 是只训练 ViT 的,从论文看,好像 GLM 所有的 stage 都是训练全参的。
论文几个重点:
- 如何清洗数据:很细
- Reward system 的构建:也很细
- RL 各种 trick和经验:也也很细
下面来看看他们具体是怎么做的吧
GLM-4.1V-Thinking: Towards Versatile Multimodal Reasoning with Scalable Reinforcement Learning (2025-07)
一、模型结构

几个重点:
- 模型采用了很多 Qwen2-VL 的配置:
- 用 3D 卷积来把两张图片/两帧合成一个 grid
- LLM 部分用 3D 位置编码,是 Qwen2-VL 的 M-Rope(但是看源码,注释用的 Qwen2.5-VL,逻辑其实是 Qwen2-VL 的。。。两者的差别可以参考 Qwen-VL系列源码解析)
- vision encoder 部分:
- 用的 AIMv2Huge 做初始化:在 MM1 中介绍了 AIMv1,这里 AIMv2 先比 v1 版本从单图像领域扩展到图文的自回归预训练(ViT 部分就作为 vision encoder,后面再接一个 LLM ),vision 部分还是用的 MSE loss,GLM 这里应该是把 ViT 部分单独拿过来了;这里有个好处是 AIMv2 是做图文预训练的,所以已经做过模态对齐了
- 为了支持任意分辨率,对位置编码这里做个魔改:
- 加入 2D-RoPE
- 同时为了保持原有 ViT 位置能力,原来的可学习位置编码做了插值。逻辑大概是:
对于一张任意尺寸的新图片 -> 将它切块 -> 对每个块的整数坐标(w,h)
使用公式(1)计算出[-1, 1]
范围之间的标准坐标g_norm
-> 将g_norm
和原始位置编码表P_orig
喂给双三次插值函数I_bicubic
-> 输出为该块定制的、新的位置编码P_adapted
。
- Connector 部分:从源码看,也是和 Qwen 类似,把 2✖️2 的 patch 合并成一个 patch 给到 LLM
- LLM 部分:
- 位置编码:3D-RoPE,但是 Qwen2-Vl 里面的,不像 2.5 里面一样在位置编码里面加入时间信息
- 视频加入时间信息:将 time index 作为字符串,加到每一帧后面。(这里没细看源码,感觉这种方式有点太浪费 token 了吧,视频本来占用 token 量就多,这一操作 token 量都不止翻倍了)
二、预训练
预训练数据
图像 caption 数据
从各种来源收集了 100亿 的 <image, text> 的 pairs 数据,来源包括 LAION[34], DataComp [10], DFN[6], and Wukong 等等。然后做了多 stage 的清洗:
- 规则相关性过滤:最小图像分辨率、纯色检测、标题长度限制以及图像级别去重。
- 相似度过滤:用 CLIP 计算相似度,低于 0.3 的过滤掉
- Concept-balanced 采样:基于视觉概念和专有名词做采样。这里应该基于 text 部分做的加权,让数据在涉及到概念、名词方面尽量均衡一些
- caption 重写:这里目的是让 caption 更丰富一些。训了一个 “factual-centered recaptioning model”。这里没具体说怎么做的,有可能是拿前面的 GLM checkpoint 或者开源的 VLM 做个微调。最终数据会包括原始数据和重写后的数据(比例没说),不是全部用重写的。
图文交错数据
图文交错数据网上能爬到很多,但往往质量低下,比如图片和文本相关度低,GLM 针对这块也做了大量清洗工作:
- Web 数据清洗:
- 去除低相关度数据:基于 CLIP 计算图片和上下文的相关度
- 去噪:比如广告、二维码,这里会基于规则 + 图片分类模型来做
- 去除大部分都是图片、文本很少的数据,比如在线相册这种数据
- 提高中 “高信息价值” 数据的占比,比如学术图表、科学插图、工程示意图、教学图和地图,这里也是训练一个“highknowledge-density”分类模型,
- 学术(电子书)相关数据清洗:
收集了超过 1 亿本电子书,保留一些关键领域,比如科学、技术、工程和数学(STEM),然后用 PDF 解析器来解析成图文交错数据
OCR 数据
构建超过 220 million 图片,包括三种类型:
- 合成文档:用不同的字体、大小、颜色和方向,还使用LAION 里面的图片作为图像背景
- 真实数据:用 Paddle-OCR 来处理
- 学术文档:从 arXiv 获取论文,然后做解析
Grounding 数据(视觉定位)
- Natural image grounding: 基于 LAION-115M 来合成 grounding 数据,一共会有 40 million 的数据,具体的:
- 先提取 caption 中名词
- 基于 GLIPv2 预估名词的位置
- 过滤存在至少两个有效位置的图片
- GUI grounding:
- 从 CommonCrawl 获取 URL,通过自动化工具获取网页截图
- 通过 Playwright 与网页做交互,来得到网页上所有 DOM 元素和边界框
合成了 1.4 亿的 GUI grounding 数据()
Video data
- 数据源:学术、网络和私有来源(这里有灰色地带吧。)
- 数据格式:
- 一个视频文件: 来自各种渠道(学术、网络等)。
- 一段高质量的文本: 这段文本经过了精细的人工标注,以确保其准确性,主要包含以下信息:
- 精细的动作和场景内文字描述: 比如视频里人物的具体动作、背景里出现的文字等,以解决普通字幕描述不准或遗漏信息的问题。
- 专业的电影元素标注: 比如运镜方式(推、拉、摇等)和镜头构图,以捕捉更深层次的视觉叙事信息。
- 清洗流程:
- 基础完整性检查:确保视频文件可以正常读取
- 多模态去重:视频和文本都转 embedding,如何两个视频的两个 embedding 都和相似,那就去掉
Instruction tuning data
最终构建了 5000万条样本条指令微调数据,做了三个处理:
- 平衡不同类型数据:比如“问答”、“推理”、“编程”
- 合成一些复杂场景类型的数据:比如 GUI 操作、长文本理解
- 数据污染:去除测试集里面的数据
训练方案
两个 stage 的预训练:
- 多模态预训练:
- 120000 个 step,两路 tensor 并行,
- 上下文长度 8192,bs 1536
- 数据包括前面所有的数据,精调过混合比例
- 会做 data packing
- Long-context 继续预训练:
- 目的:提升模型对高分辨率图像、视频、长文本的能力
- 数据:在 stage1 类型数据的基础上,增加了超过 8K 的视频和图文交错数据
- 增加到 32,768 上下文。2路张量并行 + 4路上下文并行 (context parallelism)
- 10,000 步,bs 1536 不变
三、SFT
当成 long-CoT 能力的冷启动
数据
prompt 构成
- 主要是可验证答案的数据,比如 code、数学,也包括少量无标准答案数据
- 去除太简单、太难的 prompt
Response formatting
格式是这样,大差不差
<think> {think_content} </think> <answer> {answer_content} </answer>
有一个点是,对于标准答案的数据,最终答案会放到 <|begin_of_box|> and <|end_of_box|> 之间
response 构建
SFT 数据质量对后续 RL 对稳定性影响很大
- 保证格式正确
- 去除 reasoning 过程中有矛盾、错误、混合语言的 response
- 去除思考过程过于繁琐的 response
数据迭代
SFT 的数据会反复从 RL checkpoint 来合成,内部训了好几轮,每次用最新、性能最好的 checkpoint 来合成数据
Training Recipe
- 上下文长度 32,768 tokens, bs 32(这么小?)
- 除了多模态数据,还会有纯文本数据,包括多轮对话、agent planning、指令跟随
- 观察:哪怕数据有噪音,对后续的 RL 依然有帮助(错误的 CoT 过程也能起到冷启动的作用),但越高质量数据对后续 RL 训练会更稳定些
四、RL
RL 这里 “可验证” 类数据为主(RLVR), RLHF 为辅
数据准备
- stage1 - 任务定义:从不同的多模态子领域中定义出 “可验证” 的子任务。比如 “视频描述” 任务比较难评估,但是对一些 “视频时间定位” 任务会比较好验证,比如 “视频中人物在什么时候开门?”
- stage2 - 数据构造:从 stage1 的 task 中保留哪些有精确答案的数据,同时也会把多选题改成填空题
- stage3 - 难度评估:用先前版本的 RL 模型跑 pass@K,结合难度 label 来综合评估问题的难度
- stage4 - 初步强化学习实验:在每个子领域的数据上单独跑 RL,来确认这种子领域的数据质量和增益(这个数据在后面是有用的)
Reward System
吃瓜:这里引用了一篇论文,说是用错误的奖励也能给模型带来提升,Qwen 系列模型这种情况很明显(但是 GLM 依然坚持错误的奖励会导致模型训练崩塌),但是这前两天出了篇新论文打架 Qwen 系列有数据污染,太搞了
这里主要强调准确、鲁棒的 Reward 系统对训练 RL 的稳定性影响非常大。这里有个实验发现,在 multi-image QA task 领域的 reward hacking 会导致模型在其他领域的能力坍塌

reward 系统设计这里,几个重点(挑战):
- 答案的提取:通常是两种方式:规则提取或者 LLM 提取,前者可能覆盖场景不全后者可能会出错,GLM 这里是设计了答案放在
<|begin_of_box|>{FINAL_ANSWER}<|end_of_box|>
里面。不放在\boxed{}
里面是因为有些答案输出格式会有 funciton calls,放到 boxed 里面导致不好解析
- 奖励作弊 (Reward Hacking):这里提了一个很有意思的 reward hacking 的情况,他们有些基于 LLM 的 reward 模型,会让模型输出 “a correct number between 0 and 10” 这种话,来让 reward 模型输出高分。
- 不同子领域中,reward system 是会不同的:比如在 OCR 里面 “43” 和 “43.0” 是不一样的,但是在数学的 QA 任务里面它们是一样的
Reinforcement Learning with Curriculum Sampling (RLCS 基于课程采样的强化学习)
RLCS 这里主要动机是提升训练效率
训练过程中发现的问题:很多样本比较简单,超过一半的 prompt 在训练 200 个 step 之后准确率就超过 90% 了,这种样本提供不了多少信息量和梯度,所以考虑将 “课程学习” 融入到 RL 中,逻辑就是训练过程中给太简单或者太难的 prompt 做降采样。
另外之前做数据准备的时候,stage4 验证了每个子领域的训练难度,RL 的时候会参考难度来分配领域数据的比例。(这里我理解动机和上面类似,尽量学习对当前时刻模型难度适中的样本,那么到领域这里,比如领域 A 在实验中单独训练要 1000 个 step 才能收敛,领域 B 训练 2000 个 step 收敛,那么领域 B 就比较难收敛,可能考虑领域 B 的样本多采样一点?)
具体的 RL 分两个方向
效果提升
几个 trick:
- 大 batch size:相对大一点的 bs 效果会更好
- batch 中样本数量动态调整:
- 问题:“GRPO 训练过程中常常会出现全对或者全错的 group”,那这种情况就会降低 “有效 batch size”,导致训练过程中 bs 其实不稳定、动态变化的,
- 解决方案:它这里设置了一个参数
expansion_ratio = 1/(1 − not_valid_sample_rate)
过采样率,每次采用bs * expansion_ratio
条样本,其中not_valid_sample_rate
表示上一次迭代中“全对”或“全错”样本所占的比例,但这个参数是用指数移动平均值(EMA)来动态更新的,保证稳定性。
- 强制输出答案:
- 问题:RL 过程有些 rollout thinking 过程会比较长导致超过长度限制,导致模型没有输出答案,然后给 reward 0,但是这些 thinking 不一定就是错的,给 reward 0 就降低它的概率,这样做法浪费了资源也有可能会加入噪音
- 解决方案:强制加个
</think><answer>
来输出答案
- 去掉 KL 散度 loss:DAPO 里面提出来的,逻辑是: KL 散度本来是抑制模型不要脱离 SFT 模型太远,但是在训练 thinking 模型的时候,它本来就和原模型有明显偏离了,所以 KL 散度没有必要再加了。
- Clip-higher:也是 DAPO 的方法,缓解熵坍塌的问题,GRPO 或者 PPO 容易出现 token 的熵迅速降低的问题,导致模型失去探索能力(token 概率变得机制,概率采样都接近贪心采样)
观察:
- SFT 模型的性能不一定和 RL 的最终性能强相关:SFT1 模型性能差一点,SFT2 模型性能好一点,但最终经过 RL 之后性能可能差不多。大概说明 SFT 只负责冷启动就好了,学会基本模式就行
- RL 的跨领域泛化能力比 SFT 强
稳定性提升
- SFT 训练数据对 RL 稳定性影响很大
- entropy loss 容易让模型产生垃圾输出,所以去掉了(这里应该是只 PPO 中鼓励模型输出概率尽量均匀的 entropy 奖励项)
- rollout 用 top-p=1 更好一点,top-p=0.9 多样性不够
- per-sample 和 per-token 的 loss 对最终 reward 影响不大,但是 per-sample 训练会更稳定一点(DAPO 是采用了 per-token 来解决长 thinking 的情况下 loss 被稀释的问题)
- format-based rewards 容易让模型训练不稳定
Infrastructure 就不看了。
评估
感觉评估这里不太全,很多论文中给的设定也消融实验。
评估这里有个有意思的实验:验证在一个领域内做 SFT 之后对其他领域的影响:

后续优化方向
- CoT 过程奖励:目前会有模型生成的 CoT 过程是错的,但结果是对的情况,可能是因为模型只对结果有 reward,训练过程中可能会对错误的 CoT 也有奖励,导致出现这种情况,带来的负面影响是模型容易出幻觉。
- 提高 RL 训练的稳定性:论文中提到不少提高训练稳定性的 trick,比如提示冷启动数据质量、提高 reward 质量(避免 reward hacking),但 large-scale RL 依然很难
- 对复杂场景的感知、推理能力:涉及杂乱图像、遮挡物体或模糊视觉细节的情况可能导致模型产生感知错误,从而削弱其推理能力。这种情况,模型就倾向做猜测或做一些假设而不是严谨的推理。
- 探索多模态训练对 text-only 任务的提升:或者说模态 A 训练对模态 B 对提升,这种跨模态泛化能力或许可以进一步提升模型的通用思考能力
- 更强的 benchmark:模型能力越强,现有的 benchmark 就反应不出来模型能力的提升了。特别是 thinking 过程的评估。
再加一个问题,文本多容易出现复读机