ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

视觉预训练如何破解ARC抽象推理难题:从自然图像到网格规则

视觉预训练如何破解ARC抽象推理难题:从自然图像到网格规则

1. ARC挑战到底难在哪里

ARC(Abstraction and Reasoning Corpus,抽象与推理语料库)这两年几乎成了AI推理能力的试金石。它长得很朴素:给模型两三个小网格,网格里有不同颜色的色块,模型要根据这几个例子总结出变换规则,然后生成新输入对应的输出网格。规则可能是翻转、镜像、补全、计数、颜色替换,也可能是更复杂的组合逻辑。人做这种题几乎不费脑子,扫一眼就能确认规则,但模型表现往往惨不忍睹。

最近有一支做视觉技术出名的研究团队,提出了一个反直觉的思路:先让模型大规模地“看”日常图像——网上不少人调侃成“看猫片”——再去挑战ARC任务,效果出人意料地好。这个思路真正有意思的地方不在于“猫”本身,而在于它回答了AI圈子里争论很久的一个问题:抽象推理能力到底是凭空产生的,还是从大量感知经验里长出来的?

这篇文章我会结合自己做基准实测和模型训练的体会,把ARC的难点、视觉预训练为什么有效、完整的复现方案,以及实际执行中容易踩的坑一次讲清楚。如果你想搞懂这类推理基准,或者正打算上手做类似的视觉推理实验,这篇内容可以直接当参考手册用。

1.1 任务定义:看起来是“找规律”,实际是“当场学会一项新技能”

先具体说说ARC长什么样。每个任务包含若干组“输入-输出”网格样例,网格尺寸通常不超过30×30,颜色种类也有限。模型看完这些样例后,会拿到一个新的输入网格,需要输出预期结果。关键设计在于:评测集里的任务与训练集里的任务刻意保证规则不重叠。模型不可能靠背题得分,必须在推理时从两三个样例中当场提炼规则。

打个比方,这就像你从没见过“把一个物体的轮廓变成它的边框”这种变换,但看了两三个例子后就得立刻学会,并且在下一个新例子上用出来。人类能通过视觉经验快速类比,机器却经常抓错重点。有的模型把颜色当作核心规律,有的模型把样例里偶然出现的位置关系当成规则,结果一换输入就全错。

另一个难点是ARC没有给模型试错的机会。标准答案只有一份,输出必须和答案完全一致才算对,不存在“部分得分”。所以模型即使每个格子的预测准确率到了九成以上,只要错一个格子,整个任务就等于失败。这种全对全错的性质,直接让很多依赖统计平滑的模型暴露出结构性缺陷。

1.2 为什么传统方法一直卡着

早期研究者习惯用程序合成的方式解ARC,也就是搜索可能的变换程序,让程序输出符合所有样例。这个思路符合直觉,但规则组合空间爆炸式增长,网格里任何位置、颜色、形状差异都可能产生一条候选规则。实际跑下来,经常是搜索超时或者找到的程序过拟合了样例。

后来大语言模型火起来,有人把网格序列化成文本,靠上下文学习去推理。这比程序合成灵活,但问题也很明显:二维空间结构被压扁成一维字符串后,位置关系、对称性、邻接性这些关键信息大量丢失。语言模型擅长处理符号序列,却不擅长在脑海里重建一个二维几何空间。用人类的体验来类比,相当于让一个只看过文字描述、没见过真实图形的人去做几何题,能做,但很勉强。

这两类方法的失败共同指向一个事实:ARC要求的不是单纯的模式识别,也不是单纯的符号搜索,而是把“视觉感知”和“规则抽象”接起来。感知端要能从色块中识别出对象、轮廓、方向、对称性,抽象端要能从两三个例子中提炼出“变换”。过去的方法把这两端割裂了,视觉预训练的思路则恰好是把两者串起来的那条路。

2. “看猫学规则”的思路从哪来

2.1 自然图像里其实藏着大量抽象先验

你可能会疑惑:猫的照片、汽车的照片,和抽象网格题有什么关系?表面上毫无关系,但往深层看,自然图像里包含了大量人类认知世界的基础结构:对象有边界、物体之间有空间关系、整体由局部组成、对称和重复无处不在。一只猫的脸存在左右对称,这本身就是一种抽象规则;猫和背景的分隔,对应着对象与背景的区分。

模型在海量自然图像上做预训练时,不会真的去记“猫长什么样”,而是会学习到这些基础结构规律。等到它去看ARC网格时,就不会把网格当成孤立的颜色点阵,而会更自然地组织成“物体”“区域”“轮廓”这样的高层概念。这个能力在传统从零训练中很难出现,因为ARC任务本身的样例太少,模型根本没机会建立这些基础感知结构。

我用一个比较贴近生活的例子来解释:一个从小看过各种实物照片的孩子,拿到积木图形题时,即使积木只是抽象的色块,也会本能地去想象“这是一个正方形旋转了”“这是把左边的物体复制到右边”。一个完全没有任何视觉经验的人,看到同样的题目,就只能看到“一堆颜色块”,连找规律都无从下手。自然图像预训练的作用,就是让模型先拥有这种“看什么都像物体关系”的经验基础。

2.2 “猫片”只是表象,网格抽象才是核心

回到那个让人们讨论的细节:团队用了大量日常图像,其中包含大量猫图、狗图、建筑图。调侃归调侃,背后的技术设计其实很有讲究。他们不是直接拿自然图像预训练模型然后就去微调ARC,而是在预训练阶段专门设计了一些中间任务,让模型学着从自然图像中提取网格级别的结构摘要。也就是把真实图片抽象成低分辨率的色块图,让模型学会忽略纹理和细节,抓住布局和结构。

这一步很像人类学习简笔画的过程。儿童从复杂照片走向简笔画,需要学会概括;模型从自然图像走向抽象网格,也需要类似的过渡。如果直接把自然图像的特征迁移到ARC上,中间还是有落差;但有了“把图像压缩成结构摘要”的训练目标,模型就更容易把在自然图像中学到的空间关系知识,迁移到ARC这种简化网格世界中。

从这个角度看,“看猫片”真正提供的不是猫本身,而是一个无比丰富的物体关系样本库。猫片里有眼睛和脸的相对位置,ARC里有色块之间的相对位置;猫片里有对称结构,ARC里有镜像规则。这些结构性知识是跨域通用的,也是视觉预训练成功的根本原因。

2.3 为什么这比语言模型路线更对路

对比一下就清楚了。ARC的输入本质是二维网格,核心信息全部编码在“空间关系”里:某个色块在另一个色块的上方,某个图形绕中心旋转了九十度,某个模式左右对称。卷积网络和视觉Transformer天然就在建模这种空间关系,位置编码和局部感受野都是为此设计的。

语言模型路线则把网格拆成字符串,本质上是把空间关系转译成符号序列关系。这个转译过程是有损的,就像把一张地图用文字逐行描述出来,读者很难在脑子里还原地形。视觉模型直接吃像素和色块,保留了所有空间线索。所以视觉预训练方案在ARC上的优势不是调参带来的,而是模型结构本身就匹配任务特性。

3. 从零搭建一套“视觉预训练+ARC微调”方案

这一节我把自己实测过的流程拆开讲。需要说明的是,完整复现一支明星团队的全部实验需要很大的算力,但思路和框架完全可以带着自己的设备做一轮小规模验证。你先跑通闭环,再逐步放大规模,收获会远大于直接看论文。

3.1 数据准备与增强策略

第一步是准备两类数据。第一类是ARC官方数据,包含大约八百个任务,其中一部分用于算法开发,另一部分用于最终评测。这里要特别强调:开发期间不要用评测集做任何调参,否则结果会虚高到失去参考价值。第二类是自然图像数据,可以从公开图像数据集里抽取一个子集。如果你的算力有限,选几万张起步就够验证效果了。

数据增强是第一个容易出问题的地方。ARC规则对位置非常敏感,如果你在微调阶段做随机旋转、缩放,很可能把本来就稀少的规则样例变得面目全非。我的做法是预训练阶段用常规增强(随机裁剪、翻转、颜色抖动),微调阶段设定成只做输入网格的轻微扰动,或者干脆不做。你要记住一个原则:ARC需要的是精确映射,不是增强多样性。

3.2 模型结构与输入表示

模型推荐用视觉Transformer,理由前面说过,它对二维结构建模更自然。具体操作时,把每个网格编码成token序列:每个格子按照颜色类别映射成对应的类别嵌入,再加上位置编码。网格尺寸不大,序列长度通常能控制在几百个token以内,推理成本很低。解码器逐格输出颜色类别的概率分布,用交叉熵损失训练。

更关键的设计是把“输入样例”和“输出样例”同时送入模型,让模型学习的是输入到输出的映射关系,而不是单独记忆某个网格的特征。测试时给出新输入,模型预测输出网格。我画一个简易的数据流示意:

# 把一组ARC样例构造成模型输入 # 样例组: [(input_grid1, output_grid1), (input_grid2, output_grid2)] # 新输入: test_grid def build_batch(demo_pairs, test_grid): demo_tokens = [] for in_grid, out_grid in demo_pairs: demo_tokens.append(grid_to_tokens(in_grid)) demo_tokens.append(grid_to_tokens(out_grid)) # 拼接演示样例后接上测试输入 input_seq = concat(demo_tokens, grid_to_tokens(test_grid)) return input_seq

这只是示意,实际工程实现还要考虑mask机制,让模型在预测阶段看不到输出token。但核心思路是明确的:模型看到的是一串“渐变过程”,而不是孤立的输入。

3.3 训练流程与参数选择

整个训练分成两个阶段。预训练阶段在自然图像上完成,目标可以是图像重建、掩码恢复或者结构摘要生成,目的是让编码器获得对空间关系的基本感知。微调阶段固定大部分编码器参数,只训练解码器和少部分高层参数,在ARC任务上做适配。这种分阶段策略能有效防止微调阶段数据太少导致的过拟合。

训练阶段数据来源输入形式主要目标建议学习率
预训练自然图像子集图像块序列结构重建/掩码恢复1e-4
微调ARC训练任务网格token对网格颜色交叉熵5e-5

批大小按显存调整,32到64都可以。优化器用AdamW,配合warmup和余弦衰减。微调时如果任务数不多,冻结底层特征提取层非常关键。我见过不少复现项目因为微调层开放太多,模型快速在训练集上过拟合,评测集任务成功率反而一路走低。

3.4 评估口径:别被单格准确率骗了

ARC的官方评分标准很严格:模型输出的整个网格必须和标准答案逐格一致,才算该任务做对。所以评估时一定要按任务维度计算成功率,而不是看平均每个格子的准确率。我见过有项目报告单格准确率超过95%,实际任务成功率却只有百分之十几。原因就是ARC规则具有级联性,一个格子错了,后面的输出逻辑往往也会跟着错,最终整个结果作废。

正确做法是同时跟踪两个指标:任务成功率和每格准确率。任务成功率用来判断模型是否真正领悟规则,每格准确率用来定位问题出现在哪类规则上。如果任务成功率很低但每格准确率不低,说明模型大部分位置预测对了,只是偶尔在关键格子上犯错,这种情况后期调优空间很大。反过来,如果每格准确率都很低,说明模型可能压根没接住任务的核心结构。

4. 实操中的典型问题与排查经验

4.1 模型学会了“抄答案”而不是“学规则”

我第一次复现这个思路时,训练集任务成功率一路涨到五十多,当时还挺高兴。结果唤醒到评测集,成功率直接掉到个位数。翻看预测输出才发现,模型大量输出基本是“把输入原样复制”或者“把常见颜色填满网格”。仔细一想就明白了:训练集中不少任务确实存在输入输出相似的情况,模型学到的不是变换,而是“输入和输出差不多”这个统计规律。

排查方法很直接:把标准答案和预测结果并排打印出来,肉眼扫几十个样本就能看出是不是复制粘贴。更严谨的做法是构造对抗样本,比如把测试输入里色块的位置轻微打乱,看看模型输出是否跟着变了。如果模型无论怎么调整输入,输出都保持稳定,那基本可以断定它对位置信息不敏感,只是在按颜色分布瞎猜。

4.2 不同类型任务训练进度严重不均衡

ARC任务种类很多,几何类任务通常学得快,逻辑运算类的任务学得慢,甚至一直学不会。如果不加干预,模型会倾向于把所有任务都简化成自己擅长的那种处理方式,导致整体成功率被难任务拖垮。我在训练日志里增加了按任务类型分组的统计,很快定位到问题出在“计数类”和“条件逻辑类”任务上。

解决办法是动态调整采样权重。简单任务收敛后降低采样比例,把更多训练步数分配给困难任务。还有一种做法是做课程学习:先用几何变换类任务热身,再逐步加入逻辑类任务。这两种手段可以结合使用,效果比固定采样好很多。

4.3 显存占用不大,但训练时间被数据处理卡住

ARC网格本身很小,模型也轻量,显存不会有太大压力。真正耗时间的是数据管线。ARC任务以JSON格式存放,每次训练都要解析JSON、完成网格到token的转换。数据量一大,CPU处理速度跟不上GPU消费速度,训练就成了等数据的空转。

我的优化方案是预处理阶段把所有任务一次性转成tensor字节流,存成二进制缓存文件。训练时直接按索引读取,省掉了大量重复解析。这一步看起来不起眼,实际可以把训练速度提升好几倍。尤其是做多组超参对比实验时,数据管线的效率直接决定了你能试多少个配置。

4.4 常见问题速查表

现象可能原因建议操作
训练集成功率尚可,评测集暴跌过拟合训练任务,学到统计偏好冻结底层参数,加强正则,按规则类型做数据增广
输出网格尺寸总是不对解码器输出长度对齐错误检查位置编码和序列长度映射逻辑
模型输出永远是同一个颜色类别严重不平衡,模型学偏了调整损失函数权重,按颜色类别重新采样
损失下降但任务成功率不涨单格精度提升,结构规则没抓住可视化失败样例,检查是否对齐规则关键点
训练时GPU利用率很低数据解析成为瓶颈离线预处理数据,使用缓存机制

5. 个人体会与后续扩展方向

ARC这类任务目前不会有满分模型,但它的价值一直不在分数本身,而在于逼着研究者把感知、归纳、推理这几个能力真正串起来。视觉预训练方案给我的启发是:模型完全可以从大量“无关”经验里获得抽象推理的基础能力,关键是怎么设计中间任务,让这些经验能被顺利迁移到目标场景。

后续我觉得有两个方向很有潜力。第一个是自动生成“伪ARC任务”,从自然图像中自动提取结构关系,批量生成类似ARC的网格题目,让模型有更多自监督训练材料。第二个是视觉模型与程序合成结合:视觉模型负责从样例中提出候选规则,程序搜索负责验证规则是否可靠,两者互补,很可能比单一方法稳定得多。

最后分享一个做这类复现实验的小技巧:一定要把评测脚本和训练脚本解耦。先把评测逻辑固定死,用一批已知任务跑通,再开始迭代训练方案。否则你改一次训练代码就要重新确认一次评测链路,很容易在混乱中得出虚高或虚低的结论。ARC挑战对模型而言是抽象推理测试,对做工程的人来说也一样——先把“正确答案”定义清楚,再全力追求解法。

返回列表