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 里面的也太像了。
这个图和 Qwen2-Vl 里面的也太像了。
几个重点:
  • 模型采用了很多 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 的清洗:
  1. 规则相关性过滤:最小图像分辨率、纯色检测、标题长度限制以及图像级别去重。
  1. 相似度过滤:用 CLIP 计算相似度,低于 0.3 的过滤掉
  1. Concept-balanced 采样:基于视觉概念和专有名词做采样。这里应该基于 text 部分做的加权,让数据在涉及到概念、名词方面尽量均衡一些
  1. caption 重写:这里目的是让 caption 更丰富一些。训了一个 “factual-centered recaptioning model”。这里没具体说怎么做的,有可能是拿前面的 GLM checkpoint 或者开源的 VLM 做个微调。最终数据会包括原始数据和重写后的数据(比例没说),不是全部用重写的。
 

图文交错数据

图文交错数据网上能爬到很多,但往往质量低下,比如图片和文本相关度低,GLM 针对这块也做了大量清洗工作:
  1. Web 数据清洗:
    1. 去除低相关度数据:基于 CLIP 计算图片和上下文的相关度
    2. 去噪:比如广告、二维码,这里会基于规则 + 图片分类模型来做
    3. 去除大部分都是图片、文本很少的数据,比如在线相册这种数据
    4. 提高中 “高信息价值” 数据的占比,比如学术图表、科学插图、工程示意图、教学图和地图,这里也是训练一个“highknowledge-density”分类模型,
  1. 学术(电子书)相关数据清洗:
    1. 收集了超过 1 亿本电子书,保留一些关键领域,比如科学、技术、工程和数学(STEM),然后用 PDF 解析器来解析成图文交错数据
 

OCR 数据

构建超过 220 million 图片,包括三种类型:
  • 合成文档:用不同的字体、大小、颜色和方向,还使用LAION 里面的图片作为图像背景
  • 真实数据:用 Paddle-OCR 来处理
  • 学术文档:从 arXiv 获取论文,然后做解析
 

Grounding 数据(视觉定位)

  • Natural image grounding: 基于 LAION-115M 来合成 grounding 数据,一共会有 40 million 的数据,具体的:
    • 先提取 caption 中名词
    • 基于 GLIPv2 预估名词的位置
    • 过滤存在至少两个有效位置的图片
  • GUI grounding:
    • 合成了 1.4 亿的 GUI grounding 数据()
    • 从 CommonCrawl 获取 URL,通过自动化工具获取网页截图
    • 通过 Playwright 与网页做交互,来得到网页上所有 DOM 元素和边界框
 

Video data

 
  • 数据源:学术、网络和私有来源(这里有灰色地带吧。)
  • 数据格式:
    • 一个视频文件: 来自各种渠道(学术、网络等)。
    • 一段高质量的文本: 这段文本经过了精细的人工标注,以确保其准确性,主要包含以下信息:
      • 精细的动作和场景内文字描述: 比如视频里人物的具体动作、背景里出现的文字等,以解决普通字幕描述不准或遗漏信息的问题。
      • 专业的电影元素标注: 比如运镜方式(推、拉、摇等)和镜头构图,以捕捉更深层次的视觉叙事信息。
  • 清洗流程:
    • 基础完整性检查:确保视频文件可以正常读取
    • 多模态去重:视频和文本都转 embedding,如何两个视频的两个 embedding 都和相似,那就去掉
 

Instruction tuning data

最终构建了 5000万条样本条指令微调数据,做了三个处理:
  1. 平衡不同类型数据:比如“问答”、“推理”、“编程”
  1. 合成一些复杂场景类型的数据:比如 GUI 操作、长文本理解
  1. 数据污染:去除测试集里面的数据
 

训练方案

两个 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 会导致模型在其他领域的能力坍塌
notion image
 
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 之后对其他领域的影响:
notion image
 

后续优化方向

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