想象你是一所特殊学校的命题老师。这所学校只收一种学生——AI 模型,考试内容只有一门:视觉推理。你用真实世界照片当考卷时发现一个麻烦:背景太乱、光线太杂,学生究竟是“看懂了”还是“蒙对了”根本分不清。于是你干脆自己搭了一间“积木玩具房”:桌上摆着红方块、蓝球、绿圆柱,每种物体的颜色、大小、材质、位置都由你说了算。考题也由你精心设计——数一数有几个绿色方块;最大的物体是什么;蓝球右边的物体又是什么。每道题都附上标准解题步骤。考完不公布总分,只出一份“分题型体检报告”:哪类题错得多,AI 的推理短板就暴露在哪。这座积木考场,就是多模态推理领域大名鼎鼎的诊断基准——CLEVR。

岗位关联

对 AI 从业者来说,学会读懂 CLEVR,就等于拿到一套给多模态模型做“能力体检”的标准模板:它教你用控制变量、程序化标注与分层报告,精确定位模型的推理短板,为改进提供可执行的方向。

目录
  1. 可视化演示
  2. CLEVR设计理念:一场“只考能力、不考运气”的诊断考试
  3. 物体属性系统:考卷上的“标准积木”
  4. 问题类型体系:覆盖四种“推理肌肉”
  5. 程序化标注:每道题都附“标准解题步骤”
  6. 空间推理测试:考“方位感”的试金石
  7. 模型诊断报告:读出体检单上的“偏科清单”
  8. 影响与局限:积木考场的边界
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示CLEVR视觉推理评测:图像与问题到答案的推理流程、属性/比较/关系问题类型、诊断模型推理能力短板,通过交互理解诊断性视觉推理基准。

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

视觉推理:图像+问题→答案 合成图像含几何物体 依据问题推理作答 Img+Q→Ans 评估空间与逻辑推理

CLEVR设计理念:一场“只考能力、不考运气”的诊断考试

以往的真实世界视觉问答考试,就像一份语文数学合卷,最后只给一个总分。翻开真实照片的卷子,背景里有人有猫有树,光看问句里的高频词搭配,学生甚至不用看图就能蒙对一半——这种“运气分”让老师没法判断学生到底懂不懂。命题老师想要一场纯净的考试:环境完全受控、每题单独计分、答案有标准推导。

于是 Johnson 等人在 2017 年提出 CLEVR(Compositional Language and Elementary Visual Reasoning,组合式语言与基础视觉推理)。它用 Blender 三维渲染引擎“搭积木”,合成出成千上万张场景图。因为图像是程序生成的,考场上的每一个变量——物体有几个、摆在哪、什么颜色——都由命题老师说了算。这种控制变量思想,是 CLEVR 一切设计的基石。

CLEVR 的定位不是训练集,而是诊断型评测基准。它把“视觉推理”这个大学科拆成若干子题型分别计分,模型在哪类题上失分,哪里就是短板。这正好击中传统 VQA 的两大痛点:其一,自然图像混入大量无关视觉信息,难以归因;其二,真实问答语料存在语言先验(language prior),模型不“看图”,仅凭问句的统计偏差就能猜出答案。合成场景把这两类噪声都清除了,让“每一分都有据可查”成为可能。

就像体检报告把“视力、听力、心肺”分开打分,CLEVR 用分类别准确率取代一个总分——学生哪一科弱,老师一眼就能看到,后续“补课”也有了方向。

Accc=1Nc∑i=1NcI(y^i=yi)\text{Acc}_c = \frac{1}{N_c}\sum_{i=1}^{N_c} \mathbb{I}(\hat{y}_i = y_i)
这个公式说明“体检报告怎么打分”:按问题类别 c 分别统计正确率,而不是只看一个总分。
  1. 类别下标 c先把问题按推理类型分组,下标 c 指其中某一类(属性查询、计数、比较、空间关系)
    C={query,count,compare,relate}\mathcal{C} = \{\text{query}, \text{count}, \text{compare}, \text{relate}\}
  2. 逐题判对对第 c 类中的第 i 题,比较模型输出 $\hat{y}_i$ 与标准答案 $y_i$,一致记 1、不一致记 0
    I(y^i=yi)={1,y^i=yi0,y^i≠yi\mathbb{I}(\hat{y}_i = y_i) = \begin{cases} 1, & \hat{y}_i = y_i \\ 0, & \hat{y}_i \neq y_i \end{cases}
  3. 求平均得分类成绩把判对结果求和后除以该类总题数 $N_c$,就得到该类准确率
    Accc=第 c 类答对题数Nc\text{Acc}_c = \frac{\text{第 } c \text{ 类答对题数}}{N_c}

物体属性系统:考卷上的“标准积木”

好的考卷不会出现超纲词汇。命题老师把积木限定为 3 种形状、8 种颜色、2 种材质、2 种大小——词汇表固定,每个学生才可能被公平考查。如果桌上忽然冒出一只猫,学生答错就分不清是“不认识猫”还是“不会推理”了。

在 CLEVR 中,每个物体由四类属性精确刻画:形状(正方体、球体、圆柱体)、颜色(灰、红、蓝、绿、棕、紫、青色、黄色共 8 种)、材质(金属、橡胶)、大小(大、小)。此外每个物体都有精确的三维坐标,空间位置也是受控属性。整张图像就是一份完整标注的场景图(scene graph),模型看到的一切“考题素材”都在考纲内。

这套属性系统带来两个好处。一是控制变量,真实世界里的狗、猫、树、人等杂乱概念全部排除,评测目标始终聚焦“空间推理与逻辑组合”。二是组合复杂度可控且透明:每个积木都能明确归入 96 种类型之一,模型认不出哪种,报告里一目了然——就像体检单上“色盲测试”一栏直接亮红灯。

考纲越透明,偏科判定越精准——若模型连“金属大正方体”都认不出,说明最基础的属性识别这关就没过,后面的组合推理更无从谈起。

Ntype=Cshape×Csize×Cmaterial×Ccolor=3×2×2×8=96N_{\text{type}} = C_{\text{shape}} \times C_{\text{size}} \times C_{\text{material}} \times C_{\text{color}} = 3 \times 2 \times 2 \times 8 = 96
这是乘法原理的简单应用:每类属性独立选择,把所有属性的可选个数乘起来,就是物体的全部类型数。
  1. 因子列出先把四个属性的可选个数分别写出来,它们是乘法公式中的四个因子
    Cshape=3,Csize=2,Cmaterial=2,Ccolor=8C_{\text{shape}} = 3,\quad C_{\text{size}} = 2,\quad C_{\text{material}} = 2,\quad C_{\text{color}} = 8
  2. 逐项相乘从左到右依次相乘,3 种形状乘 2 种大小得 6,再乘 2 种材质得 12,最后乘 8 种颜色
    3×2=6,6×2=12,12×8=963 \times 2 = 6,\quad 6 \times 2 = 12,\quad 12 \times 8 = 96
  3. 结果解读$N_{\text{type}}=96$ 表示场景中任意一个积木都能归入 96 种类型之一,考纲完全透明
    Ntype=96N_{\text{type}} = 96

问题类型体系:覆盖四种“推理肌肉”

一份好的诊断卷子不会只出一种题型。命题老师设计了四大类问题,每一类都像一块独立的“推理肌肉”:属性查询练“认物”,计数存在练“扫描”,比较练“量级判断”,空间关系练“方位感”。四块肌肉分别打分,才能看出 AI 是“偏科”还是“全才”。

CLEVR 的问题由模板化引擎批量生成,全部属于四个大类:属性查询(蓝色球是什么颜色?)、计数与存在(图中有几个绿色方块?有没有大的金属球?)、比较推理(左边的球比右边的大吗?),以及空间关系(蓝色球左边的物体是什么?)。每类问题还可以层层嵌套成多跳问句,比如“红色正方体左边的蓝色金属球右边的大正方体是什么颜色”,需要先定位、再过滤、再查询。

问题类型的设计体现了两个原则。一是均衡性:模板与实例数量在不同类型间大致平衡,防止模型靠“多数类”蒙混过关——就像考试不能全是选择题。二是组合性:语言模板刻意使用相近句式,让“换了问法就不会答”的模型暴露语言先验。模型如果只记住了句子结构而没有真正看懂图,换个表达方式准确率就会骤降。

四种题型就像四块不同的“推理肌肉”,CLEVR 把它们分开练、分开考。模型在哪种题上失分,就等于告诉老师哪块肌肉需要加练。

At={∣{o∈S:ϕ(o)}∣,t=countTrue / False,t=existattr(o∗),t=query{o∈S:left_of(o,b)},t=relateA_t = \begin{cases}\left|\{o \in S : \phi(o)\}\right|, & t = \text{count} \\[4pt]\text{True / False}, & t = \text{exist} \\[4pt]\text{attr}(o^{\ast}), & t = \text{query} \\[4pt]\{o \in S : \text{left\_of}(o, b)\}, & t = \text{relate}\end{cases}
这个分段公式展示四种题型的“答案签名”:有的答案是数字,有的是布尔值,有的是属性字符串,有的是一组物体——不同类型,对应不同的推理出口。
  1. 计数分支$t=\text{count}$ 时,答案是对场景 $S$ 中满足条件 $\phi$ 的物体做集合计数,$|\{\}|$ 表示集合大小
    ∣{o∈S:ϕ(o)}∣=满足条件的物体个数\left|\{o \in S : \phi(o)\}\right| = \text{满足条件的物体个数}
  2. 存在分支$t=\text{exist}$ 时,答案退化为布尔值,只回答“有没有”
    ∃o∈S:ϕ(o)  ⇒  True\exists o \in S : \phi(o) \;\Rightarrow\; \text{True}
  3. 查询分支$t=\text{query}$ 时,先找到唯一目标 $o^{\ast}$,再取出它的某个属性值
    attr(o∗)=目标物体的颜色/形状/材质/尺寸\text{attr}(o^{\ast}) = \text{目标物体的颜色/形状/材质/尺寸}
  4. 关系分支$t=\text{relate}$ 时,返回以 $b$ 为参照物、满足 left\_of 关系的物体集合,可被后续模块继续消费
    left_of(b)={o∈S:xo<xb}\text{left\_of}(b) = \{o \in S : x_o < x_b\}

程序化标注:每道题都附“标准解题步骤”

好考卷不光给标准答案,还附解题步骤。CLEVR 的命题老师在出题时就写好了每一步推理:先过滤出蓝色球,再找它左边的物体,最后数一数有几个。学生就算蒙对了答案,老师也能拿步骤对照,看它是真懂还是瞎猜。

这一设计对应 CLEVR 最核心的机制——功能程序(Functional Program)。每个问题都对应一串模块化函数,比如 filter(shape=sphere) → filter(color=blue) → relate(left) → count。程序在场景图上逐步执行,最终输出标准答案。与自然语言问句不同,程序没有歧义:每一步操作、每个参数都严格定义,因此它是“可解释的推理路径”。

具体生成流程是“先推理、后造句”:先从约 60 种函数原语(scene、filter、unique、count、exist、query、relate、and/or 等)组合出程序模板,再把程序反写为一句自然语言问题。这样保证了问题文本与标准答案严格对齐,也能自动化批量生成海量样本——这正是 CLEVR 能产出超过 100 万道题的秘密。

就像考试附带答题步骤一样,程序的每一环都有据可查。模型若在某个模块上出错,错误可以被精确锁定到“哪一步”,而不是笼统的一句“答错了”。

A=P(S),P=fL∘fL−1∘⋯∘f1A = P(S), \qquad P = f_L \circ f_{L-1} \circ \cdots \circ f_1
功能程序就是“函数流水线”:一个函数的输出作为下一个函数的输入,从右往左依次执行,最后得到答案 A。
  1. 输入场景图$S$ 是完整的场景图,包含每个物体的属性与三维坐标
    S={o1,o2,…,on},oi=(shapei,colori,sizei,materiali,xi,yi,zi)S = \{o_1, o_2, \dots, o_n\},\quad o_i = (\text{shape}_i, \text{color}_i, \text{size}_i, \text{material}_i, x_i, y_i, z_i)
  2. 函数组合 $\circ$程序是函数的复合,从右往左执行,前一个函数的输出喂给后一个
    (fL∘fL−1)(S)=fL(fL−1(S))(f_L \circ f_{L-1})(S) = f_L\big(f_{L-1}(S)\big)
  3. 模块化原语每个 $f_k$ 是一次原子推理(过滤、计数、查询、关系定位),它们像积木一样拼出复杂推理
    A=fL(⋯f1(S)⋯)A = f_L\Big(\cdots f_1(S)\cdots\Big)

空间推理测试:考“方位感”的试金石

空间关系题就像考卷里的“左右手”题:蓝球右边是什么?这类题最容易让模型犯迷糊,因为答题必须分两步走——先锁定参照物,再按方位去搜索场景,任何一步出错都会跑偏。而在真实照片里,物体互相遮挡、角度倾斜,“左右”的判定更是难上加难。

CLEVR 把空间推理放进了完全受控的坐标系。每个物体有精确的三维坐标,left/right/front/behind 等关系由坐标大小严格定义,不依赖任何模糊的视觉线索。更重要的是,空间关系经常与其他能力叠加成多跳问题,比如“红色正方体左边的蓝色金属球右边的大正方体是什么颜色”——这是一条需要连续定位的关系链,考验模型的组合泛化能力(compositional generalization)。

此外,空间条件还常与逻辑操作融合:问句可能要求“在……左边 且 是金属的 或 蓝色的”。模型必须把集合操作(filter、intersect、union)组合起来,才能得到正确答案。这比单纯“看图识物”难了一个量级,也是模型注意力机制最容易失效的地方——注意力若没有精准绑定参照物,很容易漂移到无关物体上。

方位题看似简单,却是检验机器是否真正“看懂空间”的试金石。能在积木考场里稳定做对关系链的模型,才有资格谈真实世界的空间理解。

left_of(b)={ a∈S:xa<xb ∧ ∣ya−yb∣<δ }\text{left\_of}(b) = \{\, a \in S : x_a < x_b \ \land\ |y_a - y_b| < \delta \,\}
“左边”不是直觉而是坐标运算:参照物 b 左侧、且与 b 高度差不大的物体,才属于“在左边”的集合。
  1. 锁定参照物 $b$先明确“以谁为参照”,通常由唯一化操作确定唯一目标
    b=unique(filter(S,color=blue,shape=sphere))b = \text{unique}\big(\text{filter}(S, \text{color}=\text{blue}, \text{shape}=\text{sphere})\big)
  2. 坐标判定条件对场景中每个物体 $a$,检查它的 $x$ 坐标是否小于 $x_b$,同时 $y$ 坐标足够接近,排除“斜对角”的误判
    xa<xb,∣ya−yb∣<δx_a < x_b,\qquad |y_a - y_b| < \delta
  3. 输出物体集合满足条件的物体构成答案集合,可继续被计数、查询等模块消费
    left_of(b)⊆S\text{left\_of}(b) \subseteq S

模型诊断报告:读出体检单上的“偏科清单”

考试结束,最重要的不是总分,而是那份“偏科清单”。CLEVR 的官方评测会按问题类型、甚至按问题模板输出准确率表,像体检报告一样把每一项标红或标绿。研究者拿到手的不是一句“你 70 分”,而是“属性查询 92%,计数 85%,比较 70%,空间关系 40%”。

诊断报告的第一层看分层准确率(per-type accuracy),第二层做失败模式分析(error analysis):错误集中在哪些模板?是视觉识别错(看错颜色)还是推理错(关系链断裂)?CLEVR 论文还提供人类表现作为参考上限,让模型分数有了“对标系”。一个值得警惕的信号是:如果模型换一种问法准确率就骤降,说明它依赖语言先验而不是真正的场景推理——这属于典型的表面拟合。

有了分层报告,模型的改进方向就清晰了。空间关系差就补充关系类样本、调整注意力机制;比较推理差就强化数量感知模块。评测不再是“好坏”的定性判词,而是“哪里弱、补哪里”的施工图。这也是 CLEVR 作为多模态模型评测工具最被看重的价值:它让能力诊断变得可操作、可追踪。

体检报告的意义从来不是“你得了几分”,而是“哪项指标亮了红灯”。CLEVR 的分层报告正是这样一盏探照灯,照出模型在无数指标中真正需要补课的那一格。

gapc=Accmax⁡−Accc\text{gap}_c = \text{Acc}_{\max} - \text{Acc}_c
“短板”可以量化:用模型最强题型的准确率减去目标类别的准确率,差值越大,说明这类题越弱。
  1. 找最强项先取出该模型在所有题型上的最高准确率,代表它“最擅长”的能力水平
    Accmax⁡=max⁡c∈C{Accc}\text{Acc}_{\max} = \max_{c \in \mathcal{C}}\{\text{Acc}_c\}
  2. 与最强项做差用最高分减去第 $c$ 类的分数,得到能力落差
    gapc≥0\text{gap}_c \geq 0
  3. 短板宣言$\text{gap}_c$ 越大,说明该类题型与最强项差距越悬殊,改进优先级越高
    短板诊断:gapc>阈值\text{短板诊断}: \text{gap}_c > \text{阈值}

影响与局限:积木考场的边界

积木考场虽好,毕竟只是“玩具房”。学生在玩具房考满分,不代表他走进真实厨房也能正确完成“把锅放在灶台上”的空间推理——这就是合成数据逃不开的边界。命题老师很清楚:玩具房是体检仪器,不是真实生活。

CLEVR 的影响深远。它让“程序化标注 + 控制场景 + 分层报告”成为多模态评测的标准配方,催生了 GQA、CLEVR-Hyp、CLEVR-Ref+ 等一系列后续基准,也让合成数据从“训练资源”升级为“诊断工具”。在多模态模型评测体系中,CLEVR 成了视觉-语言推理能力的一把标准尺,几乎所有主流视觉语言模型都会在它上面“过一遍”。

但局限同样明显。其一,合成场景与真实图像存在域差距(domain gap),模型在 CLEVR 上高分,不代表在真实场景中同样可靠;其二,问题由模板生成,语言多样性不足,模型可能学到的是“模板与答案的对应关系”,而非真正的组合推理能力;其三,它评估的是受限世界内的推理,不覆盖开放世界的常识与知识。后续研究一直在尝试把合成的可控性与真实场景的丰富性折中起来,比如用真实图像搭配程序化问答。

玩具房里的体检依然是最靠谱的能力扫描仪,但别忘了那句忠告:考试满分不等于生活全能。CLEVR 的价值在于“照亮短板”,至于短板补完之后能否迁移到真实世界,还需要更多真实数据的检验。

Δoos=Epreal(x,q)[ℓ]−Epsynth(x,q)[ℓ]\Delta_{\text{oos}} = \mathbb{E}_{p_{\text{real}}(x,q)}\big[\ell\big] - \mathbb{E}_{p_{\text{synth}}(x,q)}\big[\ell\big]
这是“域差距”的数学表达:模型在真实分布上的平均损失减去在合成分布上的平均损失,差值越大,说明从积木考场迁移到真实世界的能力落差越大。
  1. 合成分布的期望在 CLEVR 合成测试集上计算模型平均损失,可近似为样本平均
    Epsynth[ℓ]≈1M∑j=1Mℓ(xj,qj)\mathbb{E}_{p_{\text{synth}}}[\ell] \approx \frac{1}{M}\sum_{j=1}^{M} \ell(x_j, q_j)
  2. 真实分布的期望把同一模型放到真实场景分布下计算平均损失
    Epreal[ℓ]≈1M∑j=1Mℓ(x~j,q~j)\mathbb{E}_{p_{\text{real}}}[\ell] \approx \frac{1}{M}\sum_{j=1}^{M} \ell(\tilde{x}_j, \tilde{q}_j)
  3. 做差解读$\Delta_{\text{oos}} > 0$ 说明真实场景表现更差,存在明显的域差距
    CLEVR 上高分  ⇏  真实场景高分\text{CLEVR 上高分} \;\not\Rightarrow\; \text{真实场景高分}

AI 应用场景

场景一:多模态大模型上线前的“偏科体检”

阶段:模型评测与回归测试

解决的问题:团队微调完一个视觉语言大模型,传统做法只看整体准确率——92%,看起来不错,但用户反馈总说“数不清物品”“分不清左右”。整体分数掩盖了空间推理短板。用 CLEVR 的分层报告,可以精确到“空间关系类准确率仅 35%,属性查询类 92%”,短板无所遁形。

具体案例:某多模态团队在发布新版模型前,用 CLEVR 测试集跑了 5000 道题,报告显示 relate 类问题正确率骤降到 31%,而 query 类高达 90%。进一步失败分析发现,模型对“参照物定位”不稳,往往把参照物右侧的物体也算进左侧。团队针对性补充了 20 万张带左右关系的合成场景训练数据,并将该题型加入每轮回归测试。

场景二:合成数据驱动的组合泛化训练

阶段:数据工程与预训练

解决的问题:自然图像无法穷尽所有属性与关系的组合,模型对没见过的组合方式容易“失灵”。CLEVR 开创的合成渲染思路,可以无限生成受控场景与程序化标注,专门用于强化组合泛化能力。

具体案例:某自动驾驶视觉团队自建了一套基于 Blender 的“积木渲染器”,批量生成 100 万张包含不同颜色、形状、相对位置的程序化场景图,先用这批数据做预训练,再在真实街景数据上微调。结果显示,模型对“信号灯在左转箭头右侧”这类组合问题的准确率提升了 12%。

场景三:评测流水线上的“自动体检机器人”

阶段:CI/CD 与模型发布管理

解决的问题:模型频繁迭代,人工评测成本高且口径不一。把 CLEVR 评测接入自动化流水线,每次代码提交后自动跑一遍“分层体检”,让能力波动在发布前就被发现。

具体案例:某公司的 MLOps 平台集成了 CLEVR 评测任务,每晚自动在测试集上运行 1000 道题,生成按题型分层的准确率趋势图。某次更新后,计数类问题准确率从 82% 掉到 74%,趋势图立刻标红,团队定位到是注意力模块改动影响了数量感知,随即回滚。

Python 演示

python68 行
# -*- coding: utf-8 -*-"""迷你CLEVR评测: 用功能程序答题, 输出分层诊断报告""" # 1. 积木场景: 每个物体带形状/颜色/大小/x坐标scene = [    {"shape": "cube", "color": "red", "size": "big", "x": 1.0},    {"shape": "sphere", "color": "blue", "size": "big", "x": 3.0},    {"shape": "cube", "color": "green", "size": "small", "x": 4.0},    {"shape": "cylinder", "color": "red", "size": "small", "x": 2.0},    {"shape": "sphere", "color": "green", "size": "big", "x": 5.0},    {"shape": "cube", "color": "blue", "size": "small", "x": 3.5},] # 2. 功能程序原语: 类似CLEVR的模块化函数def filter_attr(objs, attr, value):    return [o for o in objs if o[attr] == value] def count(objs):    return len(objs) def query(objs, attr):    return objs[0][attr] if objs else None def exist(objs):    return len(objs) > 0 def relate_left(objs, attr, value):    target = filter_attr(objs, attr, value)    if not target:        return []    t = target[0]    return [o for o in objs if o["x"] < t["x"]] # 3. 题目集: 每道题由题型名 + 功能程序组成questions = [    ("count", lambda s: count(filter_attr(s, "shape", "cube"))),    ("count", lambda s: count(filter_attr(s, "size", "big"))),    ("query", lambda s: query(filter_attr(s, "shape", "sphere"), "color")),    ("query", lambda s: query(filter_attr(s, "shape", "cylinder"), "color")),    ("exist", lambda s: exist(filter_attr(s, "color", "green"))),    ("exist", lambda s: exist(filter_attr(s, "color", "yellow"))),    ("relate", lambda s: relate_left(s, "color", "blue")),    ("relate", lambda s: relate_left(s, "shape", "cube")),] # 4. 待测模型: 空间关系类题目永远答错, 其余照抄参考答案def mock_model(qtype, gold):    if qtype == "relate":        return None    return gold # 5. 执行评测, 按题型分层统计report = {}for qtype, program in questions:    gold = program(scene)    pred = mock_model(qtype, gold)    hit = int(pred == gold)    item = report.setdefault(qtype, {"hit": 0, "total": 0})    item["hit"] += hit    item["total"] += 1 print("=== 分层诊断报告 ===")for qtype, item in sorted(report.items()):    acc = item["hit"] / item["total"]    print("%-6s 准确率: %d/%d = %.0f%%" % (qtype, item["hit"], item["total"], acc * 100)) weak = min(report, key=lambda k: report[k]["hit"] / report[k]["total"])print("短板定位: %s 类问题最弱, 需要重点提升" % weak)
目的:用 8 道迷你 CLEVR 问题演示“功能程序答题 + 分层诊断报告”,跑完会自动指出模型在哪类题型上偏科。
  1. scene = [...]用字典列表搭建“积木考场”,每个物体带属性与坐标,对应 CLEVR 的受控场景图
  2. def filter_attr(objs, attr, value)功能程序原语,类似 CLEVR 的 filter 模块,按属性过滤物体
  3. def relate_left(objs, attr, value)空间关系模块:用 x 坐标判断“在参照物左边”,对应 left_of 的坐标判定
  4. questions = [...("relate", lambda s: relate_left(s, "color", "blue"))...]把题型名与功能程序绑定,模拟 CLEVR 的问题模板机制
  5. def mock_model(qtype, gold)模拟一个“空间关系偏科”的模型,其余题型照抄标准答案
  6. item = report.setdefault(qtype, {"hit": 0, "total": 0})按题型分层累计答对次数,生成诊断报告的原始数据
  7. weak = min(report, key=lambda k: ...)自动找出准确率最低的题型,对应 CLEVR 的短板定位

常见误区

误区CLEVR 看起来就是一堆图片和问题,那我把它当训练集,让模型多学几遍,能力自然就上去了。

正解CLEVR 的原始定位是“诊断考卷”而不是“课本”。它的价值在于评测和定位短板:先在其他数据上训练模型,再在 CLEVR 上做分层体检。虽然确实有研究用 CLEVR 训练样本来预训练,但这属于二次利用,不是它的设计初衷。把考卷当课本反复刷,刷出来的分数含金量也要打个问号。

为何常见:大众习惯把“数据集”一律理解为“喂给模型学习用的原料”,很少注意到还有一类专门用于评测和诊断的基准数据集。

误区模型在 CLEVR 测试集上拿到 95% 的准确率,那它一定具备了通用视觉推理能力,可以放心部署到真实场景。

正解CLEVR 是合成积木世界,场景受控、问题模板化,模型可能只是学会了“这个模板对应那个答案”的表面映射。一旦遇到真实照片——光照变化、物体遮挡、背景杂乱——分数往往大幅下降,这就是合成域与真实域的差距。CLEVR 高分是“应试能力强”的证据,但不是“通用推理强”的充分条件。

为何常见:看到漂亮的数字就联想到“智能”,这是外行最容易踩的坑;评测基准的分数只有在同一分布内才有可比性。

误区把每张图里的物体都识别出来,颜色、形状都标对,CLEVR 的题自然全对。

正解识别只是第一步。大量 CLEVR 问题需要多跳组合推理:先过滤出蓝色球,再找到它左边的物体,接着数一数有几个,最后查颜色。每一步都依赖前一步的输出,相当于在场景图上执行一条函数流水线。只做单步识别,面对“蓝球左侧的绿色圆柱右边的方块是什么颜色”这种题会直接卡壳。

为何常见:初学者容易把“视觉问答”简化为“看图识物”,忽略了问题文本里嵌套的关系与逻辑结构。

误区模型在 CLEVR 上得分低,那就继续加大训练数据,数据越多,分数肯定越高。

正解CLEVR 的问题由程序模板生成,测试分布和训练分布高度重叠,盲目堆数据很容易让模型学到模板表面的语言先验,而不是真正的组合推理。更有效的做法是看诊断报告:哪个题型弱就补哪个题型的数据,并针对性地调整模型结构(如注意力绑定参照物)。没有分层报告指导的“大力出奇迹”,往往只是把分数刷在已经擅长的题型上。

为何常见:“数据越多越强”在大模型时代深入人心,但诊断型基准的用途恰恰是告诉你:问题的关键往往不在数据总量,而在能力分布。

面试题

Q1. CLEVR 最主要的作用是什么?

单选题 · easy

  • A.一个用于图像分类的合成图片数据集
  • B.一个诊断视觉推理能力的评测基准← 正确答案
  • C.一个用于语音识别的音频语料库
  • D.一个用于目标检测的实拍照片集

答案:B。CLEVR 全称 Compositional Language and Elementary Visual Reasoning,核心定位是诊断型评测基准,就像一座“积木体检考场”,专门用来评估模型的组合式视觉推理能力,而不是用来做图像分类或目标检测。

Q2. CLEVR 的图像是如何生成的?

单选题 · easy

  • A.从网络爬取大量真实生活照片
  • B.利用 GAN 生成模糊的合成图像
  • C.用 3D 渲染引擎合成的积木场景← 正确答案
  • D.对真实照片做裁剪与数据增强

答案:C。CLEVR 用 Blender 三维渲染引擎程序化地合成积木场景,这样每个物体的形状、颜色、大小、材质和位置都完全可控。GAN 生成的图像不够精确,无法满足“程序化标注”的严苛要求。

Q3. CLEVR 场景中的三种物体形状是?

单选题 · easy

  • A.正方体、圆锥体与三棱柱体
  • B.长方体、圆球体与六棱柱体
  • C.正方体、球体与圆柱体← 正确答案
  • D.三角锥、球体与八面体

答案:C。CLEVR 只使用正方体、球体、圆柱体三种简单几何体,这是“控制变量”思想的体现——形状种类越少,推理能力的归因越干净,模型不容易因形状多样性而分心。

Q4. CLEVR 中物体属性组合共有多少种?

单选题 · mid

  • A.属性组合数共计 96 种类型← 正确答案
  • B.属性组合数共计 48 种类型
  • C.属性组合数共计 24 种类型
  • D.属性组合数共计 192 种类型

答案:A。按乘法原理,物体类型数 = 3 种形状 × 2 种大小 × 2 种材质 × 8 种颜色 = 96。48 是漏乘了材质或大小,24 少乘了颜色,192 则是误把材质数算成 4 倍,只有 96 正确。

Q5. 下列哪类问题不属于 CLEVR 的标准题型?

单选题 · mid

  • A.属性查询类的问题
  • B.计数与存在类问题
  • C.比较与推理类问题
  • D.情感与观点类问题← 正确答案

答案:D。CLEVR 问题围绕视觉推理设计,包括属性查询、计数/存在、比较推理、空间关系。情感与观点属于主观判断,既不依赖场景中的客观属性,也无法用功能程序给出标准答案。

Q6. 功能程序(Functional Program)在 CLEVR 中起什么作用?

单选题 · mid

  • A.为模型提供训练时的对抗扰动
  • B.把问题拆成可执行的模块化步骤← 正确答案
  • C.对合成图像进行超分辨率重建
  • D.将真实照片转化为积木风格

答案:B。功能程序把问题拆成 filter、count、relate 等模块化函数,执行后得到标准答案,相当于每道题附带的“标准解题步骤”。它不是数据增强或图像处理工具,而是答案生成与可解释推理路径的核心机制。

Q7. CLEVR 相比传统 VQA 基准的优势有哪些?

多选题 · mid

  • A.合成场景可控,变量能精确调配← 正确答案
  • B.问题分层分类,便于短板诊断← 正确答案
  • C.标注直接取自真实照片自动采集
  • D.每道题配有程序化的标准答案← 正确答案

答案:ABD。CLEVR 的优势在于合成场景可控、问题按类型分层、程序化标注可解释。C 描述的是真实照片自动采集,与 CLEVR 的合成数据路线相反,传统 VQA 往往使用人工标注的真实图片,但这恰是 CLEVR 想规避的。

Q8. 某模型在属性查询类正确率 90%,空间关系类只有 40%,最可能的解释是?

单选题 · hard

  • A.模型过拟合了训练时常见问法
  • B.测试样本中空间关系题偏少
  • C.模型不擅长多跳组合的推理← 正确答案
  • D.模型只能识别单一的物体属性

答案:C。CLEVR 保证各题型数量均衡,B 不成立;过拟合问法(A)会影响所有题型,不会单独指向空间关系。空间关系题要求“定位参照物→关系判定→继续查询”的多跳组合,与单步属性查询相比推理链更长,模型恰恰容易在这类组合推理上失分。

Q9. CLEVR 合成数据的高可控性体现在哪些方面?

多选题 · hard

  • A.可控制图像中物体的数量与分布← 正确答案
  • B.可生成多样且均衡的问题模板← 正确答案
  • C.场景来自真实拍摄,无渲染误差
  • D.每个物体的属性与坐标均已知← 正确答案

答案:ABD。合成渲染让物体数量、布局、属性、坐标全部精确可控,问题模板也能由程序批量生成并保持均衡。C 与事实相反——CLEVR 恰恰是合成渲染而非真实拍摄,正因如此才能做到“每个物体属性坐标均已知”的完美标注。

Q10. 关于 CLEVR 问题与功能程序的对应关系,以下说法正确的是?

多选题 · extreme

  • A.先定义程序再反写为问句← 正确答案
  • B.程序由函数原语组合而成← 正确答案
  • C.程序执行结果即标准答案← 正确答案
  • D.问题全部靠人工逐句手写

答案:ABC。CLEVR 的生成流程是“先有程序、再造句子”:从函数原语组合出程序,再把程序反写为自然语言问题,程序执行结果就是标准答案。这样做既保证了语言与推理步骤严格对齐,又支持自动化批量生成,无需人工逐句手写,因此 D 错误。