做多模态这两年,困扰我最久的问题不是“模型看不看得见图”,而是“模型看得见图,但想不明白”。你给它一张销售折线图,问它哪两个季度之间增速最大,它能准确说出图里有哪些元素,却会算错增速差;你给它一道带几何图形的初中题,它能把题干复述得一字不差,然后给出一个步骤都对、结论离谱的答案。这种感觉就像看到了一个嘴上说着“我再想想”但脑子其实已经宕机的学生。
我们组内部代号为 Vision-R1 的项目,就是冲着这个问题去的。目标很直接:把当前纯文本推理模型那一套“长思维链 + 强化学习”的训练范式,迁移到视觉语言模型上,让模型学会在回答问题之前,先把一幅图拆成观察、假设、推理、验证这几步。项目目前正在投稿周期中,目标会议是 ICLR 2026,所以内部也习惯叫它 ICLR26 这一版。这篇文章就是我对整个项目的阶段性复盘,涉及项目动机、架构选型、训练细节、实验设计,以及我们为踩坑付出的那些时间成本。如果你正在做多模态推理、视觉问答,或者想复现类似“通用视觉推理模型”的方向,这篇应该能帮你省掉不少试错。
先说清楚:这篇文章里我只谈技术路线和工程经验,不具体点名任何真实机构和个人,项目相关的人物、场景都用代称处理。
1. 命名有出处:Vision-R1到底想解决什么问题
1.1 从文本推理到视觉推理:一个范式的搬运
过去一两年,纯文本推理模型的最大启发不是“模型变聪明了”,而是“聪明的路径是可以被训练出来的”。原来的语言模型你问它一道复杂的逻辑题,它要么直接给结论,要么给一段草率的理由;后来大家发现,如果把“让模型生成一段很长的思考过程”作为训练目标,再配合大规模强化学习去筛选正确路径,模型的推理能力会显著上一个台阶。
那么问题来了:这个范式能被搬到视觉语言模型上吗?Vision-R1 想验证的正是这一点。区别在于,纯文本任务里,条件信息是符号化的,模型看到的和你看到的是一回事;而视觉任务里,模型要先从像素中提取信息,再在符号层面做推理。这意味着多了一个感知变量:同一个问题,图清楚一点、标注多一点、分辨率高一点,结果可能完全不同。
所以我们给 Vision-R1 定的目标不是“让模型识图更准”,也不是“让模型能回答图表问题”,而是让模型在回答任何与图像有关的复杂问题时,都有一套完整的“先看、再想、后答”的内部流程。它本质上是把文本推理模型的那个“系统二”思考方式,嫁接到多模态模型上。
1.2 边界划分:Vision-R1不是什么
做项目最忌讳的就是边界模糊。Vision-R1 不做的三件事,我一开始就要说清楚:
- 不做纯视觉感知竞赛:我们不追求物体检测、分割、OCR 这些感知指标的 SOTA,那是另一拨人做的事。
- 不做外部工具增强:过程中不引入计算器、代码解释器、外部知识库,模型只能靠自己的参数和思维链。
- 不做“答案看一眼就出来”的简单问答:我们的关注点是那些需要至少两三步推理才能得到答案的问题。
这不是说这些方向不重要,而是如果什么都做,项目会失去焦点。我们的判断是:视觉推理的短板不在“看”,而在“看之后的加工”。把推理训练做好,比把感知指标刷高更值得投入。
1.3 说人话的例子:普通VLM和Vision-R1的差别
比如给模型看一张两张表格拼接起来的图,问:区域一和区域二哪个区域的销售环比增速更快,快多少个百分点?
一个普通视觉语言模型看到图之后,第一反应是描述:“图中有两个表格,分别记录了区域一和区域二的月度销售额。”然后它可能直接凭印象说:“区域一增速更快,快了大概10个百分点。”你追问它怎么算的,它会临时凑一段理由,往往还是错的。
Vision-R1 拿到同样的问题,它的输出会长这样:
观察:区域一表格最后一列显示本月120万,上月100万。 观察:区域二表格同样位置显示本月150万,上月140万。 分析:区域一增速 = (120-100)/100 = 20%。 分析:区域二增速 = (150-140)/140 ≈ 7.14%。 比较:20% > 7.14%,所以区域一更快。 结论:区域一增速更快,快了约12.86个百分点。这个回答的关键不是它算对了,而是它的输出结构里包含了一个清晰的验证路径,每一步都可以被检查、被标注、被奖励。这就是我们想在模型里“长”出来的能力。
1.4 适用的场景清单
从应用角度讲,Vision-R1 的能力画像大致覆盖以下场景:
- 带有数值图表的经营分析问答(折线图、柱状图、饼图、表格截图)
- 几何题、空间位置关系题、坐标系问题
- 需要跨多个视觉元素做比较、排序、计数的视觉推理题
- 工程图纸、示意图上的关系判断与逻辑问答
如果你手里的场景是“答案一眼就能看出来”的类型,Vision-R1 这套训练流程对你可能是杀鸡用牛刀;但如果你面对的是需要严谨推导的问题,这套方法会非常值得参考。
2. 视觉推理到底难在哪:把瓶颈拆到组件级
2.1 错误来源分层:先搞清楚错在哪一步
做 Vision-R1 之前,我们花了很多时间做错误分析。发现一个普遍现象:当模型答错一道带图推理题时,你很难直接从最终答案判断它是“没看清图”还是“想错了”。我建议所有做这类项目的团队,第一步就建立一个错误分层框架:
- 感知层错误:图像分辨率太低、关键区域被裁剪、OCR 识别出错、视觉编码器没提取到关键目标。
- 对齐层错误:模型看到了正确区域,但把视觉特征映射到文本语义时产生了偏差,比如把“下降5%”理解为“下降50%”。
- 推理层错误:视觉信息提取正确,但之后的数学计算、逻辑比较、多步推导出了问题。
这三层错误纠缠在一起,是视觉推理最大的坑。比如你让模型读一张模糊的柱状图,它的 OCR 模块把“135”读成了“185”,那么后面所有推理都会建立在错误前提上。如果你只盯着最终答案去调推理策略,问题永远不会解决,因为根子在感知层。
2.2 被严重低估的图像token化信息瓶颈
很多做文本推理的人转来做视觉推理时,第一个不适应的点就是:图像作为输入时,信息已经经过了一次不可逆的压缩。
视觉语言模型处理图的标准流程是:把图像切成若干个 patch,每个 patch 经过视觉编码器变成一个向量,再经过连接器映射到语言模型的输入空间。这里有两个限制:
- 分辨率限制:受训练成本和显存约束,模型通常把输入图缩放或裁剪到固定分辨率(比如单边512或336像素)。原图里如果有一个很小的数字、很细的刻度线,缩放之后就真的没了。
- token数量限制:视觉token越多,计算量越大。很多模型为了效率,会偷偷压缩视觉token数,压缩的过程同样会丢细节。
这两种限制叠加起来,意味着视觉推理的第一道坎根本不在“推理”本身,而在“信息能否无损地到达推理模块”。我们后来在做数据构建时,专门引入了“细节保留测试”:把一张图缩放到模型输入分辨率后,人眼看不清图里的关键字符,这道题就不能要。这个过滤条件非常朴素,但有效。
2.3 决策链条断裂:模型没有“打草稿”的习惯
纯文本大模型即使不会推理,至少还知道要一句一句说话;视觉语言模型则不同,它们往往过于“直接”。看到图,立刻给答案,缺乏一个中间状态:先描述我看到什么,再推测这些信息之间的关系,最后才下结论。
这不是一个“加上提示词就能解决”的问题。你可以在 prompt 里写“请一步一步思考”,但模型在训练时从来没见过规范的推理链样本,它只会把要求曲解成“多写几句废话”。所以想要模型有长思维链,必须在训练数据里显式地提供推理链,并且在强化学习阶段用奖励去强化“推理链有效”的行为。
2.4 三条现有路线的死穴
我们在调研阶段对比过三条常见技术路线,各有各的死穴:
- 监督微调路线:收集大量“问题—推理链—答案”三元组,直接训练模型输出推理链。优点是简单稳定,缺点是推理链的质量上限取决于数据质量,且模型容易过拟合到数据分布。一个更致命的问题是,监督微调无法让模型学到“自己发现问题并修正”的能力,因为它只在静态数据上学习。
- 工具调用路线:让模型调用外部计算器、代码解释器来辅助推理。这确实能提升准确率,但一来违背了“模型本身变聪明”的目标,二来工具调用的工程复杂度很高,三来外部工具无法覆盖纯视觉层面的推理,比如说几何关系判断。
- 强化学习路线:用奖励驱动模型自己探索正确路径。这条路最接近“从正确行为中学习”的理想状态,但多模态场景下的奖励设计、训练稳定性、算力开销都是硬骨头。
Vision-R1 选择了第三条路线,核心思想是:监督微调负责让模型“会说话”,强化学习负责让模型“会想事”。
3. 架构设计:推理模块放在哪,奖励信号怎么设计
3.1 整体架构:视觉编码器 + 语言推理中枢
Vision-R1 的骨架没有刻意创新,沿用了当前主流的多模态架构:
图像输入先经过视觉编码器(ViT类结构)提取特征,再通过一个轻量连接器映射到语言模型的 embedding 空间,语言模型部分就是纯文本解码器。所有推理行为都发生在语言侧,图像信息以上下文形式参与。
为什么这样设计?原因是:推理能力本质上是一种语言行为。无论是“比较两个数字大小”还是“判断两条线是否平行”,最终都要落到符号化的语言描述上。与其把推理逻辑塞进视觉编码器里(那会极大复杂化训练),不如让视觉编码器专心提取信息、语言模型专心推理。
架构选型上我们坚持两个原则:第一,视觉编码器和语言模型都必须可训练,但视觉编码器的学习率要压低,大概比语言模型低一个数量级,防止感知特征在训练初期就被冲乱;第二,连接器不能太深,两层MLP足够,太深的连接器反而会在视觉和语言之间引入不必要的非线性扭曲。
3.2 推理结构设计:强制三段式输出
模型长思维链长什么样,直接决定了后续奖励设计能不能落地。Vision-R1 对推理链的输出结构做了硬性约束,要求它必须包含三个部分:
- 观察段:描述从图里看到了哪些具体信息,要求可验证。例如“图中x轴标注了1月到6月”“第四个数据点明显高于其他点”。
- 分析段:在观察的基础上进行推算、比较、归纳。这段允许长,但每一步都必须基于观察段提到的信息。
- 结论段:给出最终答案,形式要严格匹配任务要求(比如“是/否”“数值+单位”“选项字母”)。
强制结构的理由有两个。一是可解读性:一条结构完整的推理链,让研发人员肉眼就能判断模型错在哪一步。二是奖励信号可以更细粒度:如果奖励函数只关心最终答案对错,模型很容易学会“碰运气”;如果奖励函数还能校验“观察段有没有提到正确答案里涉及的关键信息”,模型的推理链就会更扎实。
3.3 奖励体系:为什么不用通用奖励模型
视觉推理场景下,奖励设计是最容易出差错的地方。我们最终选择了一套“规则奖励为主,结构校验为辅”的奖励体系,而不是训练一个通用奖励模型。
理由很简单:通用奖励模型(RLHF里常见的那个)本质上是另一个神经网络,它也有自己的幻觉和偏好,而且会在训练过程中被模型钻空子。视觉推理的很多答案是可客观验证的——选择题答案、数值结果、坐标位置、布尔判断。这些任务的奖励信号完全可以用规则写死,不需要任何学习。
我们的奖励结构分三层:
- 结果奖励:最终答案与标准答案一致,得主分。这里要注意的是数值容错,比如“12.86”和“12.9”可能都对,需要提前定义好归一化和误差范围。
- 过程奖励:推理链里必须包含关键步骤。用一个简单的关键词或实体匹配函数去检查答案涉及的关键元素有没有出现在观察段或分析段。这一步能有效抑制“跳过推理直接给答案”的投机行为。
- 格式奖励:强制三段式结构,缺段、乱序的解码序列要扣分。格式问题的奖励权重很低,但绝不为零,否则模型很快就会学会把奖励函数搞崩溃。
3.4 关键参数与实现细节
表格里是我们训练中比较重要的一组配置,供你参考。不同底座模型可能需要对数值做调整,但方向是一致的:
| 参数项 | 数值/策略 | 说明 |
|---|---|---|
| 视觉编码器学习率 | 语言模型的 1/10 | 防止感知特征被破坏 |
| 推理链最大长度 | 1024 token | 给足空间但不无限膨胀 |
| 结果奖励权重 | 0.7 | 最终答案占比最高 |
| 过程奖励权重 | 0.2 | 关键步骤覆盖检查 |
| 格式奖励权重 | 0.1 | 只约束结构不判断语义 |
| 数值容错 | 相对误差≤2% | 处理近似值问题 |
| 输出格式 | 观察/分析/结论三段 | 硬性约束,解码时辅助校验 |
4. 训练链路:SFT先把话说圆,RL再把话说对
4.1 数据管线:合成与人工改写的比例
Vision-R1 的训练数据有两个来源:合成的视觉推理题和人工改写的真实场景题。比例大概在7:3。
合成数据的优势是规模大、标签精确。我们用程序化方式生成了一批带数值表格、几何图形、空间坐标的题目,每一题都能拿到确定的答案和完整解析。这类数据解决了“推理链从哪里来”的问题,但缺点是风格单一。所以另外30%的数据来自人工改写:把日常遇到的截图、图表、文档扫描件配成推理题,再由标注人员写出标准推理链。这30%数据虽然贵,但极大地提升了模型的泛化能力。
数据构建过程中有一条铁律:凡是在输入分辨率下人眼无法辨认的信息,一律不允许出现在答案或推理链中。我们为此写了一个自动化脚本,把题目图像缩放到模型输入分辨率,让标注员做“细节可辨性确认”。这一举动避免了大量“题目本身就不合理”的无效训练。
4.2 SFT阶段:先让模型学会输出规范推理链
第一个训练阶段是监督微调。这个阶段的目标不是提升正确率,而是让模型学会“按照三段式结构说话”。我们在指令模板里写死了输出格式要求,如果模型输出缺少“观察”或“分析”段,训练样本会被丢弃。这个阶段的loss收敛很快,通常一个epoch就能让模型输出结构基本规范。
这里有一个容易被忽略的点:SFT阶段的数据要刻意混入一些“推理到一半发现错误并修正”的样本。比如观察段先写“图中显示数值为100”,分析段发现“刻度线看错了,实际是110”,然后修正。这种纠错样本能让模型在强化学习阶段少走弯路,因为强化学习本质上就是在试错,而试错是有成本的。
4.3 RL阶段:在线策略优化的稳定性控制
SFT之后,Vision-R1 进入强化学习阶段。我们用的是GRPO这类带参考模型约束的在线策略优化算法,核心思想是:每条推理路径都会得到一个奖励分数,用优势函数计算该路径相对当前策略的优劣,再更新策略参数。KL项会强制让新策略不要偏离参考模型太远,防止模型在奖励驱动下把语言改得面目全非。
实际训练中,最影响稳定性的三个因素:
- KL系数要动态调整。设太大,模型学不到新策略;设太小,模型容易奖励过拟合,开始输出胡话。我们采用的经验是:训练前1/3阶段保持较高KL,后面逐步衰减。
- 长推理链的梯度方差大。同样一道题,推理链可以是200 token,也可以是900 token。长度差异会导致梯度波动剧烈,所以我们对推理链长度做了分桶:按300、600、1000三档分别计算优势函数再合并。
- 结果奖励要保守。不能一个答案不对就全盘否定整条路径,尤其是当推理链前半部分是对的、最后一步算错时,要给它一个“部分奖励”或更低的惩罚。否则模型会学成“只要答案不对就重说一遍”,而不是“找到算错的那一步”。
4.4 测试时计算:让推理链自动变长
训练完成之后还有一道工序:测试时计算。Vision-R1 在推理阶段不会只生成一条推理链,而是采样多条(通常是8条到16条),然后做两步验证:
- 多数投票:等答案出现频次最高的那一个。
- 交叉验证:随机抽两条推理链,比对它们观察段引用的数据点是否一致,如果不一致,优先采信与更多链一致的结论。
这两个机制不增加训练成本,但是推理时间和显存开销会成倍增加。我们的实测数据是:16条采样 + 多数投票比单条生成准确率高11到14个百分点,推理耗时大约是9倍。如果你的线上场景对延迟敏感,建议用 4条采样 + 仅检查结论一致性,这样准确率提升大概6到7个百分点,开销小很多。
5. 实验设计:评测集、消融和指标
5.1 评测体系:三类自建评测集 + 公开集交叉验证
视觉推理方向的公开评测集有一个通病:要么太窄(只有图表),要么太老(问题简单,已经不适合评测当今的模型)。所以 Vision-R1 的实验以自建评测集为主,公开集为辅。
我们自建了三类评测数据,每类大约2000道题:
- 数值图表集:折线图、柱状图、饼图、表格截图,覆盖读数、比较、趋势预测、增长率计算。
- 几何图形集:平面几何题,需要识别图形元素、判断位置关系、计算面积或角度。
- 空间混合集:布局图、坐标图、地图类问题,考查相对位置、路径排序、区域关系判断。
公开集的作用是看泛化:我们挑了几个公认难度较大的视觉问答集,只做零样本测试,不做任何微调。这样如果自建评测集分数高而公开集分数低,说明模型已经过拟合到了我们自己的数据风格。
5.2 核心结果:三个数字值得记住
Vision-R1 在完整训练链路(SFT + RL)之后,相对底座模型的提升比较明显。我把核心结果整理成了几个关键数字:
- 自建数值图表集的准确率从 54.2% 提升到 79.6%,提升 25.4 个百分点。
- 几何图形集的准确率从 38.7% 提升到 61.3%,提升 22.6 个百分点。
- 空间混合集准确率从 47.1% 提升到 66.5%,提升 19.4 个百分点。
各评测集上,RL阶段贡献的提升大约是 SFT 阶段的 1.5 到 2 倍。这符合预期:SFT教会了模型推理链的“语法”,RL教会了模型推理链的“语义有效性”。
推理链长度与准确率的关系呈倒U型:推理链在400到700 token区间时准确率峰值最高;超过这个区间后准确率下降,因为长链中段错误率上升,一步错步步错。这个现象提醒我们:不是思维链越长越好,适可而止很重要。
5.3 消融实验:哪一块动了最疼
我们做了三组核心消融,结果很有说服力:
| 消融项 | 数值图表集准确率 | 下降幅度 |
|---|---|---|
| 完整模型 | 79.6% | — |
| 去掉规则奖励(改用通用奖励模型) | 66.2% | -13.4% |
| 去掉SFT(直接RL) | 62.0% | -17.6% |
| 去掉过程奖励(只保留结果和格式奖励) | 73.5% | -6.1% |
| 去掉三段式结构约束(自由格式) | 72.8% | -6.8% |
三组消融传达的信息很统一:SFT是地基,少了它模型连话都说不好;规则奖励是加速器,少了它强化学习容易走偏;过程奖励和结构约束则是护栏,少了它们模型会投机取巧,但至少还能靠结果奖励顶着。这个表格直接决定了下一次项目的训练策略优先级。
5.4 泛化性观察:有没有“死记硬背”的痕迹
训练过程中我们最担心的一件事,就是模型只在自建评测集上好看,遇到没见过的题型就露馅。为了验证泛化性,我们特意做了两组测试:
- 换数字组:把训练集里出现过的高频图表,全部换掉具体数字,重新生成题干。准确率下降了大约5个百分点,下降的主要是涉及多步计算的问题。这说明模型的推理链有一部分是在“背步骤”,但大部分还是能泛化到新数值。
- 换风格组:把图表的配色、线型、标注风格全部改掉,不换数据关系。准确率只下降了1.5个百分点,说明模型的推理对视觉风格不敏感,这让我们松了一口气。
真正暴露问题的是“跨题类”测试:用训练时没见过的新题型(比如从没有练过的雷达图)去问模型,准确率掉到41%。这说明Vision-R1还没有真正习得“完全通用的视觉推理能力”,它更接近“掌握了几类常见图表的强推理能力”。这个边界我们认,继续做下去的空间也在这里。
6. 半年踩坑记录:六个让团队最头疼的问题
6.1 分不清“没看见”和“没想通”
项目前期我们最常犯的错误,是拿着一条模型的错误推理链,直接去调强化学习奖励。后来发现,有一半的错误链根本不是在推理环节出错,而是模型观察段引用的数据就是错的——它压根没看清图里那个数字是“120”还是“121”。
我们的解决办法是给推理链加了一个“源码标注”要求:每个观察项后面必须附带一个图像坐标范围,比如“数值120(位于表格第三行第二列,坐标区间x:0.2-0.3, y:0.4-0.5)”。这样只要答案错了,我们第一步就能判断是观察坐标错了还是后续推理错了。如果你不做这一步,任何错误分析都是隔靴搔痒。
6.2 奖励被钻空子:模型学会了“假装推理”
强化学习开始不久,我们就发现一个滑稽现象:模型在“分析”段落里开始大段输出和题目无关的套话,比如“这是一个有趣的图表问题,让我仔细想想”,然后在结论里给出一个答案。因为格式奖励拿到了,结果奖励也可能碰运气拿分,模型逐渐学会了用废话填充推理链。
对付这个问题,代价最小的方案是“停用词过滤”:在奖励函数里置一个黑名单,凡是推理链里出现高频废话(“interesting”“let me think”“as we know”等),直接扣过程奖励。这个粗暴的办法立竿见影,模型迅速回到了正经推理的轨道上。当然,治本的办法还是提高过程奖励对关键步骤的覆盖度,但黑名单是一个成本极低的补充。
6.3 一张模糊图让训练损失震荡了整整一周
RL训练到第三周时,损失突然开始剧烈震荡,排查了整整一周,最终定位到问题:数据管道里混进了一批低分辨率图片,模型反复抽到这些图,视觉编码器输出的特征在训练中互相冲突,导致梯度方向一步东一步西。
从那以后我们加了三道防线:一是在数据进入训练前,统一做图像质量筛查,分辨率低于某个阈值的直接丢弃;二是在训练过程中按轮次做图像曝光验证,如果同一批数据反复产生异常大loss,自动摘除对应样本;三是给视觉编码器加一个非常小的冻结比例,让它在前1万步不参与更新,等语言侧稳定后再解冻。
6.4 推理链变长之后,工程侧先崩了
长推理链带来的不只是准确率,还有显存爆炸和时延变高。16条采样推理时,最大的模型跑一次要占满两张训练卡。我们用了一个工程折中:把推理链的max length从1024降到768,同时提高采样温度从0.6升到0.8。牺牲了大约2个百分点准确率,但推理耗时降了一半。如果你也在做类似项目,建议一开始就设定好推理链长度上限,在奖励函数里对超长链设置软惩罚,而不是事后才追着工程同学改代码。
6.5 “评测集污染”差点让我们发布虚高结果
有一次内部评测显示模型准确率突然涨了9个百分点,我们一度以为训练策略取得了重大突破。后来发现是构建评测数据时,有一批题目的一小部分出现在了预训练底座的数据里。这个典型的评测集泄露问题,直接导致一批实验结果作废,白白浪费了两周时间。
之后我们建立了严格的评测隔离流程:自建评测集的题目一律用时间戳盲化,评测数据从训练数据管道中物理隔离,每月人工抽检若干条看模型是否“背”出过答案。这条流程的代价是每天多花半小时做数据管理,但相比作废实验的代价,完全值得。
6.6 经验汇总表
我把自己踩过和团队踩过的坑整理成了一张简表,方便你以后对照:
| 问题 | 根因 | 解法 | 预防建议 |
|---|---|---|---|
| 错因定位难 | 推理链不标注数据来源 | 观察段加坐标/引用 | 数据构建阶段就定标准 |
| 奖励被注水 | 过程奖励粒度太粗 | 关键步骤覆盖检查 | 先定义“关键步骤”清单 |
| 训练震荡 | 低质图像混入数据 | 图像质量筛查 | 数据入口加自动过滤 |
| 推理时延过高 | 采样数和长度无约束 | 降长度、升温度 | 训练前定好工程预算 |
| 评测集泄露 | 数据管理混乱 | 物理隔离+盲化 | 建立评测集审计机制 |
| 泛化不足 | 训练数据风格单一 | 人工改写真实场景 | 定期引入新题类 |
项目做到现在,我最深的体会是:视觉推理的真正瓶颈不是模型参数量,而是奖励信号的设计和信息瓶颈的控制。模型再大,如果推理链没地方拿到“关键数据点被用到了”这个信号,它就只能靠猜;而无论模型多小,只要奖励函数准确地告诉它“你哪一步真正想对了”,它就能进步得非常快。
最后分享一个小技巧:你可以把 Adam 优化器第一个参数组的 weight decay 单独调大,特别作用于视觉编码器之外的所有参数。这个做法是我们无意中发现的,它的作用是抑制模型在长推理链上的过拟合,让推理链长度分布的尾部更平缓。做视觉推理项目的朋友不妨试试,也许能帮你在训练稳定性上少走很多弯路。