想象你是一位考官,想测一个孩子的空间推理能力。你担心口说无凭,便亲手搭了一座乐高微缩城:红色方块放在左前,蓝色大球悬在中央支架上,灰色圆柱靠在右侧,绿色小球滚落角落。搭之前,你已把每块积木的颜色、大小、材质、坐标都登记在册。然后你提问:“蓝色球左边有几个物体?”“灰色圆柱和谁同材质?”——孩子能否答对,你心里有数。因为答案早藏在你的积木账本里,不会冤枉他,他也很难蒙混过关。 CLEVR(Compositional Language and Elementary Visual Reasoning)就是为 AI 打造的这样一座“积木空间考堂”。它用程序化渲染生成数万张三维场景图,每张图都附带精确的物体属性标注,以及“功能程序”形式的题目答案解析。AI 想拿高分,必须学会看场景、找关系、做计数、比大小,甚至把题目拆成一步步可执行的推理步骤。这座考场不仅测出 AI 的空间智商,还催生了模块化网络、神经符号 VQA、程序生成等可解释视觉推理技术。下面,我们就走进这座积木考场,看它怎么搭、怎么考、怎么评、怎么用。

岗位关联

学懂 CLEVR 的设计与解题范式,你将掌握构建可解释、可复现的视觉推理评测与系统的能力——这正是工业质检、机器人操作等场景中极具分量的工程素养。

目录
  1. 可视化演示
  2. 数据集设计:亲手搭一座“积木考场”
  3. 问题模板:把考卷变成“功能程序”
  4. 关系推理:考官最爱问“左右前后”
  5. 模块化网络:把答题拆成“小积木块”
  6. 神经符号融合:先画“积木地图”再答题
  7. 程序生成:给 AI 画一张“答题路线图”
  8. 评估方法:不看总分看“小分”
  9. 应用部署:把乐高考场搬进工厂
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示视觉推理CLEVR的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

视觉推理CLEVR:CLEV CLEVR数据集与视觉推理任务 关系推理与多物体交互 核心机制可视化 视觉推理CLEVR整体架构与关键组件

数据集设计:亲手搭一座“积木考场”

考官搭积木前,先拿出三盒标准件:方砖、圆球、圆筒;每种又分大小、颜色、材质。搭的时候用尺子量好间距,登记坐标。这样搭出来的世界,每一块积木的属性都白纸黑字,绝无含糊。

CLEVR 正是用软件“搭积木”:它通过 Blender 程序化渲染三维场景,而不是拍摄真实照片。物体由 3 种形状(cuboid、sphere、cylinder)、6 种颜色、2 种大小(大/小)、2 种材质(金属/橡胶)组合而成,共 72 种“积木”。每个场景随机摆放 4~6 个物体,位置坐标被引擎精确记录,每个物体的属性都“登记在册”。

整个数据集约 7 万张图像(5 万训练、1 万验证、1 万测试),配套超过 85 万个问题。因为所有内容都是程序生成的,标注由程序自动推导,不存在人工标注噪声,这让 CLEVR 成为“标准答案绝对可信”的考场。

正因为每块积木都有档案,AI 答完题后考官能立刻核对。这是合成数据送给研究者的礼物:可控、可复现、可追溯,让“考空间推理”不再是玄学。

S={o1,o2,…,on},oi=(shapei,colori,sizei,materiali,xi,yi,zi)\displaystyle S=\{o_1,o_2,\ldots,o_n\},\quad o_i=(shape_i,color_i,size_i,material_i,x_i,y_i,z_i)
整个场景 S 是一个物体集合,每个物体 o_i 用形状、颜色、大小、材质、三维坐标组成的“身份档案”描述。
  1. S 场景集合S 表示整座积木考场,即一张图像里所有物体的集合。
    S={o1,o2,…,on}S=\{o_1,o_2,\ldots,o_n\}
  2. n 物体总数n 是场景中的物体个数,CLEVR 里 n 取 4 到 6。
    n∈{4,5,6}n\in\{4,5,6\}
  3. o_i 单个积木o_i 代表第 i 块积木,用下标区分不同物体。
    oio_i
  4. 属性元组括号里依次是形状、颜色、大小、材质和三维坐标,构成物体唯一的“档案”。
    (shapei,colori,sizei,materiali,xi,yi,zi)(shape_i,color_i,size_i,material_i,x_i,y_i,z_i)

问题模板:把考卷变成“功能程序”

考官出题不能随心所欲。他手里有一套“出题模板”,像乐高说明书:把空白格填上不同积木名,就能生成成百上千道不重样的问题。比如“蓝色的球左边有几个物体”就对应一条标准指令链。

CLEVR 由 10 大类问题族、90 余个功能程序模板生成题目。问题族包括:计数(How many)、存在性(Is there)、比较数量、比较属性、查询属性、查询方位等。每个自然语言问题都配套一个“功能程序”——由 filter(筛选)、relocate(移动)、count(计数)、query(查询)等原子操作组合而成。

这种设计的精妙之处在于:程序执行一遍就有唯一答案,问题再无歧义;同时,程序本身就是“标准答案的推导过程”。模型若能学会执行程序,就学会了透明推理。

有了这套“出题说明书”,考卷可以无限生成,每道题都有标准答案和推导步骤——就像乐高说明书每一步都有图示,照着拼就不会错。

P=f1∘f2∘⋯∘fm,fk∈{filter,relocate,count,query,unique,exist,…}\displaystyle P=f_1\circ f_2\circ\cdots\circ f_m,\qquad f_k\in\{\text{filter},\text{relocate},\text{count},\text{query},\text{unique},\text{exist},\ldots\}
P 是由多个原子函数复合而成的功能程序,相当于一张“答题路线图”。
  1. P 程序本体P 是回答问题所执行的功能程序。
    PP
  2. 复合符号 ∘∘ 表示函数复合,后一个函数的输入是前一个函数的输出,形成流水线。
    f1∘f2∘⋯∘fmf_1\circ f_2\circ\cdots\circ f_m
  3. f_k 函数模块每个函数都是一类原子操作,如筛选、移动、计数、查询属性。
    fk∈{filter,relocate,count,query,…}f_k\in\{\text{filter},\text{relocate},\text{count},\text{query},\ldots\}
  4. m 程序长度m 由问题复杂度决定,简单问题两三步,复杂问题可到七八步。
    mm

关系推理:考官最爱问“左右前后”

空间考堂的重头戏是方位题:蓝色球左边有什么?灰色圆柱在红色方块前面吗?孩子不能凭直觉回答,必须建立一套以自己(相机)为参照的坐标系,把“左右”翻译成“谁的 x 坐标更小”。

CLEVR 中 left/right/front/behind 全部用相机坐标系定义:物体 o_i 在 o_j 左边,当且仅当 o_i 的相机横坐标 x 小于 o_j。除了方位,还有大小比较(谁更大)、数量比较(A 比 B 多吗)、属性比较(两者材质相同吗)、计数与存在性查询。这些统称为关系推理。

关系推理要求模型“看见物体”之后还要“比较物体”。这对只做目标检测的模型是道坎:检测出 5 个包围框,不等于知道谁在谁左边。很多模型正是在这一步露馅的。

就像孩子要先确认“自己站在哪儿、面朝哪儿”才能分清左右,AI 也必须先建立坐标系再谈空间关系。坐标,是空间推理的第一块基石。

left(oi,oj)  ⟺  xi<xj,Nleft=∣{oi∈S∣oi≠oa, xi<xa}∣\displaystyle \text{left}(o_i,o_j)\iff x_i<x_j,\qquad N_{\text{left}}=\left|\{o_i\in S\mid o_i\neq o_a,\ x_i<x_a\}\right|
“在左边”是一个坐标比较运算;统计“左边有几个”就是数一数满足该比较的物体个数。
  1. left 谓词定义“在左边”这一空间关系为一个二元判断。
    left(oi,oj)\text{left}(o_i,o_j)
  2. 坐标判定若 o_i 的相机横坐标小于 o_j,则 o_i 在 o_j 左边。
    xi<xjx_i<x_j
  3. 计数集合收集所有位于锚点物体 o_a 左侧的物体,组成候选集合。
    {oi∈S∣oi≠oa, xi<xa}\{o_i\in S\mid o_i\neq o_a,\ x_i<x_a\}
  4. 基数符号集合外包的 |·| 表示集合大小,即“有几个”。
    ∣{oi∈S∣…}∣\left|\{o_i\in S\mid\ldots\}\right|

模块化网络:把答题拆成“小积木块”

面对千变万化的问题,与其训练一个“万能大模型”硬扛,不如像搭乐高一样,准备一组小积木块,每种块干一件事,按题目现场拼装。

神经模块网络(Neural Module Networks, NMN)正是这个思路:把程序里的每个函数 f_k 对应成一个可学习的神经网络模块。filter 模块负责“找出红色物体”,relocate 模块负责“把注意力移到左侧”,count 模块负责“输出数字”。程序解析器决定模块的组装顺序,整条链路可以端到端训练。

每个模块的输出是一个注意力向量(attention map),指示当前关注图像的哪个区域。于是模型的每一步思考都摊开在桌面上:先找哪里、再看哪里、最后数什么,全部可视化。这就是“可解释性”的来源。

模块化网络就像给孩子一整套“答题工具包”:看、找、数、比,每种动作一个工具,按题目顺序取用。孩子每用一件工具,你都看得清清楚楚。

at=Mt(at−1,qt;θt),t=1,2,…,T\displaystyle a_t=\mathcal{M}_t(a_{t-1},q_t;\theta_t),\qquad t=1,2,\ldots,T
第 t 步的注意力状态 a_t,由当前模块 M_t 读取上一步状态和问题片段后计算得出。
  1. 注意力状态a_t 表示第 t 步模型关注的图像区域,是软性注意力向量。
    ata_t
  2. 模块函数M_t 是第 t 个被调用的神经模块,由程序决定选哪个。
    Mt\mathcal{M}_t
  3. 两步输入模块的输入是上一步注意力 a_{t-1} 和当前问题片段 q_t。
    at−1,qta_{t-1},q_t
  4. 可学参数θ_t 是模块自身的神经网络参数,每个模块都有自己独立可训练的参数。
    θt\theta_t

神经符号融合:先画“积木地图”再答题

光有工具包还不够,聪明的孩子答题前会先在纸上画一张“积木地图”:把场景里的积木都标出来,再在地图上推演答案。这样每一步都有据可查。

NS-VQA(Neural-Symbolic VQA)正是“画地图再答题”的架构。它分两阶段:先由神经场景解析器(基于 CNN 与检测器)把图像转成符号物体表,记录每个物体的形状、颜色、大小、材质、坐标;再由程序生成器把自然语言问题翻译成功能程序;最后由符号执行器在物体表上执行程序,得到答案。

相比端到端模型,NS-VQA 把“感知”和“推理”彻底解耦:感知交给神经网络,推理交给符号计算。代价是训练场景解析器需要物体级别的标注;收益是答案可验证、过程可解释、组合泛化能力强。

有了地图再答题,孩子每一步推理都摊在纸上。这正是“神经符号”的精髓:让神经网络管感性认识,让符号逻辑管理性推演。

S^=Ψparse(I),a^=Φexec(P,S^)\displaystyle \hat{S}=\Psi_{\text{parse}}(I),\qquad \hat{a}=\Phi_{\text{exec}}(P,\hat{S})
图像 I 经神经解析器 Ψ 变成符号场景 Ŝ;程序 P 在 Ŝ 上由符号执行器 Φ 执行,得到答案 â。
  1. 输入图像I 是输入的 CLEVR 场景图。
    II
  2. 场景解析Ψ_parse 是神经场景解析器,输出结构化符号场景 Ŝ。
    S^=Ψparse(I)\hat{S}=\Psi_{\text{parse}}(I)
  3. 程序输入P 是问题对应的功能程序,由程序生成器产出。
    PP
  4. 符号执行Φ_exec 在 Ŝ 上逐指令执行 P,返回最终答案 â。
    a^=Φexec(P,S^)\hat{a}=\Phi_{\text{exec}}(P,\hat{S})

程序生成:给 AI 画一张“答题路线图”

考场上,孩子拿到题目,心里会快速浮现一张路线图:先找蓝色球,再往左看,最后数一数。CLEVR 的程序生成器,就是负责给 AI 画出这张路线图的“小助手”。

程序生成器通常是一个 Seq2Seq 模型(LSTM 或 Transformer):把自然语言问题编码成向量,再逐步解码出程序 token 序列,如 filter → relocate → count。训练信号来自 CLEVR 附带的程序标注——这些程序由问题模板自动导出,覆盖数十万条问题。

程序生成最大的挑战是组合泛化:训练时没见过“绿色圆柱左边有几个小球”这种组合,但生成器若能拆解语义单元(绿色、圆柱、左边、计数),就能拼出新的正确程序。这比背下常见问题的答案要难得多,也是检验模型是否“真懂”的试金石。

路线图画得越准,到达终点的概率越高。而“画路线图”的本事,正是组合泛化的核心——它意味着 AI 不是背答案,而是真正理解题目的结构。

P∗=arg⁡max⁡P ∏t=1Tp(pt∣p<t,Q)\displaystyle P^\ast=\arg\max_{P}\,\prod_{t=1}^{T}p(p_t\mid p_{<t},Q)
最优程序 P* 是让整条程序 token 序列的概率乘积最大的那一个。
  1. 最优程序P* 是概率最高的程序,即生成器的最终输出。
    P∗P^\ast
  2. argmax 选择在所有候选程序中挑概率最大者。
    arg⁡max⁡P\arg\max_{P}
  3. token 条件概率每个程序 token p_t 的概率取决于前面的 token 和问题 Q。
    p(pt∣p<t,Q)p(p_t\mid p_{<t},Q)
  4. 序列概率连乘整句程序的概率由各 token 概率相乘得到,长度越长概率越小。
    ∏t=1Tp(pt∣p<t,Q)\prod_{t=1}^{T}p(p_t\mid p_{<t},Q)

评估方法:不看总分看“小分”

考官给孩子打分不能只看总分:有的孩子计数题全对、方位题全错,总分 60 看不出短板。CLEVR 评估的第一原则就是“分族报告”。

研究者按问题族分别计算准确率:计数、存在性、数量比较、属性查询、空间关系等各自给分。同时要求与强基线对比,常见基线包括 CNN+LSTM 基础 VQA 模型、SAN 等注意力模型,以及 NMN、NS-VQA 等结构化方法。评估还设计了“盲点测试”:打乱问题模板与答案分布的关联,检验模型是否靠语言先验“蒙题”。

实验反复证明一个现象:简单模型在 CLEVR 上准确率虚高,一旦打乱答案分布就崩盘;而结构化方法各问题族表现均衡、泛化更强。类似思路也催生了 NTX 等考察三维旋转关系的合成推理基准。这说明“分族评估”能剥开平均分的伪装,暴露真实推理能力。

把总分拆成小分,才能看出孩子在哪个知识模块上“瘸腿”。这也是真实 AI 产品迭代时最重要的诊断方式——平均数会骗人,分项不会。

Acck=1∣Dk∣∑q∈Dk1[a^q=aq]\displaystyle \text{Acc}_k=\frac{1}{|D_k|}\sum_{q\in D_k}\mathbb{1}[\hat{a}_q=a_q]
第 k 个问题族的准确率,等于该族测试题中答对的比例。
  1. 问题族集合D_k 是第 k 个问题族(如计数族)的全部测试题。
    DkD_k
  2. 归一化分母除以题目总数 |D_k|,得到平均正确率。
    1∣Dk∣\frac{1}{|D_k|}
  3. 指示函数1[·] 当答对时为 1、答错时为 0,充当打分器。
    1[a^q=aq]\mathbb{1}[\hat{a}_q=a_q]
  4. 分族汇总Acc_k 是第 k 族的准确率,各族独立报告、互不掩盖。
    Acck\text{Acc}_k

应用部署:把乐高考场搬进工厂

考堂里练出来的能力,终究要进真实世界。就像孩子考完试,要去真实货架前帮妈妈找东西。工厂、仓库就是 AI 的“实战考场”。

在工业质检中,CLEVR 的“程序化生成”思路被直接复用:用渲染引擎批量生成带划痕、污点、凹坑的合成缺陷图,配合 NS-VQA 式管线,把“logo 左侧第三处划痕”这类空间命题转成可执行查询,输出可审计的质检报告。在机器人操作中,“拿起蓝色方块左边的小球”这类指令需要感知与符号执行的结合:先解析桌面物体表,再执行“找锚点→算方位→锁定目标”的程序。

部署要牢记合成数据与真实数据存在“域差”:渲染材质、光照、相机噪声都不同。业界常用域随机化、少量真实数据微调、域适应来缩小差距。合成数据扮演的是“预训练 + 评测基准”的角色,而非真实数据的替代品。

乐高考堂的终极意义,是让 AI 先在可控的积木世界练好本领,再带着这套推理能力去真实世界解决实际问题。考试从来不是为了考试,而是为了上场。

Neff=Nreal+α×Nsyn,α∈[0,1]\displaystyle N_{\text{eff}}=N_{\text{real}}+\alpha\times N_{\text{syn}},\qquad \alpha\in[0,1]
合成数据对模型的有效贡献,等于其数量乘以一个 0 到 1 之间的“迁移系数”。
  1. 有效数据量N_eff 表示这批数据折算成真实数据的等效规模。
    NeffN_{\text{eff}}
  2. 真实数据N_real 是人工标注的真实样本数,权重为 1。
    NrealN_{\text{real}}
  3. 合成数据N_syn 是程序化生成的样本数,需要“打折”。
    α×Nsyn\alpha\times N_{\text{syn}}
  4. 迁移系数α 越接近 1 说明域差越小、合成数据越有用,反之则贡献有限。
    α∈[0,1]\alpha\in[0,1]

AI 应用场景

工业质检:把“积木考卷”变成缺陷报告

阶段:模型架构设计 / 推理部署

解决的问题:传统质检模型只输出“有缺陷 / 无缺陷”,说不清缺陷与特征件的位置关系(如“划痕在 logo 左侧还是右侧”),人工复核成本高。CLEVR 的合成渲染 + 关系推理思路,让模型输出“可定位、可解释”的缺陷描述。

具体案例:某手机外壳产线用 Blender 渲染 1 万张含划痕、污点、凹坑的合成图,训练目标检测器与程序生成器;质检时先解析出缺陷符号表,再执行“位置关系查询程序”,生成“logo 左侧第三处划痕”式报告,误检率下降 40%。

机器人分拣:让机械臂听懂“空间指令”

阶段:感知-决策闭环

解决的问题:仓库机械臂需要执行“拿起蓝色方块左边的小球”这类含空间关系的指令。普通检测模型只能给框,不理解“左边”是相对谁、相对哪个坐标系。

具体案例:采用 NS-VQA 思路,机械臂先用深度模型解析桌面物体表,程序执行器把指令编译成“找锚点→算方位→锁定目标→抓取”的符号程序,每一步可回溯;在合成数据上预训练、真实数据微调后,抓取成功率从 71% 提升至 93%。

合成数据引擎:低成本造“长尾场景”

阶段:数据构建 / 评测集设计

解决的问题:真实场景的长尾数据(极端光照、罕见物体组合)采集与标注成本极高。CLEVR 证明:程序化组合生成可以精确控制属性分布,以极低成本构造带精确标注的数据。

具体案例:某自动驾驶团队用程序化仿真批量生成“雨天红色轿车左转”等组合场景,作为感知模型的预训练数据和回归评测集,上线后 corner case 召回率提升 26%。

Python 演示

python103 行
# -*- coding: utf-8 -*-"""迷你CLEVR:生成合成场景 + 符号程序执行器,演示空间关系推理。"""import random  class Object:    def __init__(self, sid, **attrs):        self.id = sid        self.__dict__.update(attrs)     def __repr__(self):        return '<%s %s %s %s @(%s,%s)>' % (            self.color, self.size, self.shape, self.material, self.x, self.y)  def make_scene(n=6, seed=42):    """程序化生成一个可控的合成场景。"""    rng = random.Random(seed)    shapes = ['cube', 'sphere', 'cylinder']    colors = ['red', 'blue', 'green', 'gray']    sizes = ['small', 'large']    mats = ['rubber', 'metal']    return [Object(i, shape=rng.choice(shapes), color=rng.choice(colors),                   size=rng.choice(sizes), material=rng.choice(mats),                   x=round(rng.uniform(0, 10), 2),                   y=round(rng.uniform(0, 10), 2)) for i in range(n)]  class Executor:    """顺序执行功能程序:filter -> relocate -> count / query。"""     def __init__(self, scene):        self.scene = scene        self.cur = scene[:]     def filter(self, attr, value):        self.cur = [o for o in self.scene if getattr(o, attr) == value]        return self     def relocate(self, direction):        hits = set()        for a in self.cur:            for o in self.scene:                if o.id == a.id:                    continue                if direction == 'left' and o.x < a.x:                    hits.add(o.id)                elif direction == 'right' and o.x > a.x:                    hits.add(o.id)        self.cur = [o for o in self.scene if o.id in hits]        return self     def unique(self, attr):        seen = {}        for o in self.cur:            seen.setdefault(getattr(o, attr), o)        self.cur = list(seen.values())        return self     def count(self):        return len(self.cur)     def query(self, attr):        return getattr(self.cur[0], attr) if self.cur else None  def run(scene, program):    ex = Executor(scene)    ans = None    for op, arg in program:        if op == 'filter':            ex.filter(*arg)        elif op == 'relocate':            ex.relocate(arg)        elif op == 'unique':            ex.unique(arg)        elif op == 'count':            ans = ex.count()        elif op == 'query':            ans = ex.query(arg)    return ans  def main():    scene = make_scene()    print('合成场景:')    for o in scene:        print('  ', o)    questions = [        ('有多少个红色物体?',         [('filter', ('color', 'red')), ('count', None)]),        ('蓝色物体左边有几个物体?',         [('filter', ('color', 'blue')), ('relocate', 'left'), ('count', None)]),        ('绿色圆柱的材质是什么?',         [('filter', ('color', 'green')), ('filter', ('shape', 'cylinder')),          ('unique', 'material'), ('query', 'material')]),    ]    for q, prog in questions:        print('问题: %s -> 答案: %s' % (q, run(scene, prog)))  if __name__ == '__main__':    main()
目的:用一个几十行的迷你 CLEVR 复现“合成场景 + 功能程序 + 符号执行”的完整链路,直观展示关系推理是如何一步步算出答案的。
  1. rng = random.Random(seed)固定随机种子,保证场景可复现,这正是合成数据“可控”的核心价值。
  2. self.cur = scene[:]程序执行器维护“当前候选集合”,模拟模型逐模块转移注意力。
  3. hits = set()用集合避免同一物体被多个锚点重复计数,保证“左边有几个”统计准确。
  4. seen.setdefault(getattr(o, attr), o)unique 去重:多个物体共享同一属性时只保留一个代表。
  5. for op, arg in program:顺序执行程序指令,对应 CLEVR 功能程序逐 token 执行的全过程。

常见误区

误区CLEVR 的图像都是从真实世界拍摄的,只是画面里刚好是积木。既然是真实照片,标注一定又贵又费人工。

正解恰恰相反,CLEVR 全部由 Blender 程序化渲染生成。正因为是程序生成,物体坐标、颜色、材质才能被精确记录,答案才能由程序推导且无歧义,成本也远低于人工标注。真实拍摄反而做不到“每块积木都有档案”。

为何常见:印象中主流视觉数据集都来自照片(ImageNet、COCO),很容易把“数据集”和“真实拍摄”划等号。

误区模型在 CLEVR 上准确率 95%,说明它真正学会了空间推理,可以放心部署到业务里。

正解CLEVR 实验反复证明,模型可能靠统计捷径刷分:答案分布有偏、问题模板与答案强相关时,模型只需背“颜色题答数字”之类的套路。必须按问题族拆开报告、做盲点测试,才能确认是真推理还是蒙题。就像孩子总分高,不代表每道应用题都真懂。

为何常见:总分高给人直接的正向反馈,而分族报告和反例分析需要额外努力,最容易偷懒跳过。

误区模块化网络就是把规则写成 if-else,程序说什么模块就执行什么,根本没东西可学。

正解模块化网络里的每个模块都是带可学习参数的神经网络子网络,filter 模块内部是一组卷积加注意力;“程序决定顺序”只是结构约束,参数仍要靠数据训练。可以理解为:说明书(程序)给的是拼装顺序,但每块零件(模块)本身的形状还得靠打磨。

为何常见:“模块”和“规则”在中文语境下都容易让人联想到“写死的逻辑”,忽略了它们是可训练的神经网络组件。

误区NS-VQA 既然用符号执行器做推理,那整个系统就是确定性的,加载预训练模型直接推理就行。

正解符号执行器确实不需要训练,但 NS-VQA 还有两个必须训练的神经组件:场景解析器(把图像转成物体表)和程序生成器(把问题转成程序)。地图绘制员和翻译员都得练好功夫,负责推演的谜题人才有用武之地。

为何常见:看到“符号”二字就联想到确定性规则库,忽略了系统里占大头的其实是神经模块。

误区合成数据又便宜又无限,直接把 CLEVR 式合成数据拿来训练真实产品模型就行,不用再标真实数据。

正解合成数据与真实数据之间存在域差:渲染材质、光照、相机噪声都不同,直接套用会精度崩盘。业界做法是域随机化、在少量真实数据上微调、或做域适应。合成数据的正确定位是“预训练 + 评测基准”,而不是“替代真实数据”。

为何常见:合成数据零标注成本的优势太显眼,容易让人忽略分布不一致这个关键问题。

面试题

Q1. CLEVR 图像集的主要生成方式是?

单选题 · easy

  • A.人工拍摄真实场景
  • B.程序化三维渲染合成← 正确答案
  • C.爬取公开网络图片
  • D.生成对抗网络伪造

答案:B。CLEVR 全部由 Blender 程序化渲染生成,这正是它能做到“属性精确可查、答案程序可推”的原因。人工拍摄成本高且无法精确控制坐标;网络图片无标注;GAN 生成会引入不可控噪声。

Q2. CLEVR 场景中单个物体不包括以下哪个属性?

单选题 · easy

  • A.积木的形状与颜色
  • B.积木的大小与材质
  • C.积木的三维空间坐标
  • D.积木的社会功能语义← 正确答案

答案:D。CLEVR 物体的属性只包含形状、颜色、大小、材质和坐标,全部是视觉与几何属性。“社会功能语义”(如“用来喝水”)不在数据设计范围内,这也是合成数据可控性的一部分。

Q3. “A 在 B 的左边”在 CLEVR 中如何判定?

单选题 · mid

  • A.A 的文本位置靠前
  • B.A 的相机坐标 x 更小← 正确答案
  • C.A 的颜色比 B 更冷
  • D.A 的面积比 B 更小

答案:B。CLEVR 以相机坐标系为准,“左边”定义为横坐标 x 更小。文本位置、颜色、面积都与空间方位无关。这提醒我们:空间关系必须锚定在一个明确的坐标系里。

Q4. CLEVR 问题采用“功能程序”标注的核心价值是?

单选题 · mid

  • A.让答案无歧义且可复现← 正确答案
  • B.减少图像渲染的时间
  • C.增加问题的字数和难度
  • D.替代模型训练所需的算力

答案:A。功能程序执行一遍就有唯一答案,让“标准答案的推导过程”也随数据发布。它不负责渲染提速、不增加难度、更不能替代训练算力,而是给研究者提供可验证的推理链条。

Q5. 模块化网络(NMN)中“模块”的本质是?

单选题 · mid

  • A.固定的 if-else 规则
  • B.可学习的神经网络组件← 正确答案
  • C.外部数据库的查询语句
  • D.手工设计的图像滤波器

答案:B。每个模块对应程序中的一个函数,但内部是带可学习参数的神经网络子网,例如卷积加注意力。程序只决定组装顺序,参数仍需数据训练,因此不是规则、不是查询、不是手工滤波器。

Q6. NS-VQA 相比端到端 VQA 的优势包括?

多选题 · mid

  • A.推理过程完全可解释← 正确答案
  • B.组合泛化能力更强← 正确答案
  • C.完全不需要训练数据
  • D.答案可经符号执行验证← 正确答案

答案:ABD。NS-VQA 用符号执行器推演答案,过程可审计、结果可验证,且感知与推理解耦后组合泛化更强。但它仍需训练场景解析器和程序生成器,并非零训练,“完全不需要训练数据”是典型误解。

Q7. NS-VQA 中“场景解析器”的作用是?

单选题 · hard

  • A.将图像转为符号化物体表← 正确答案
  • B.直接输出最终答案数字
  • C.把自然语言问题翻译成程序
  • D.生成用于训练的合成图像

答案:A。场景解析器用神经网络把图像变成结构化的物体属性表,相当于“画积木地图”。输出答案的是符号执行器,翻译问题的是程序生成器,造图的是渲染引擎,三者职责不同。

Q8. 为缓解合成数据与真实数据的领域差距,可用的手段有?

多选题 · hard

  • A.域随机化渲染参数← 正确答案
  • B.在少量真实数据上微调← 正确答案
  • C.无限增加合成数据量
  • D.域适应对齐特征分布← 正确答案

答案:ABD。域随机化让合成数据覆盖更广的渲染变化;真实数据微调把模型拉回目标域;域适应在特征层面缩小分布差异。而“无限增加合成数据”只改变数量不改变分布,无法消除域差。

Q9. CLEVR 评估中“按问题族分头报告准确率”的主要目的是?

单选题 · hard

  • A.掩盖模型的整体短板
  • B.暴露模型走捷径的行为← 正确答案
  • C.减少测试集的计算量
  • D.提高训练集的数据质量

答案:B。分族报告能拆穿平均分的假象,暴露模型在计数、方位、比较等子能力上的真实短板,还能配合盲点测试发现“背答案”的捷径行为。它不是用来遮丑、省算力或改善数据的。

Q10. 关于程序生成的组合泛化,下列说法正确的是?

多选题 · extreme

  • A.训练集未见的新程序组合也能执行← 正确答案
  • B.依赖生成器对语义的抽象理解← 正确答案
  • C.只要训练数据足够多就必然实现
  • D.与模块化神经符号架构设计相关← 正确答案

答案:ABD。组合泛化指模型能组装未见过的新语义组合,依赖对单元语义的抽象理解,且模块化、神经符号等结构化设计能显著提升这种能力。“数据多就必然实现”过于绝对,纯记忆式模型给再多数据也难泛化到全新组合。