第 19 天 · 关系推理,就是把物体两两配对再求和
一句话
论文提出关系网络(Relation Network):用同一个小网络处理所有物体对,再把结果求和。这个即插即用的模块让 CNN 在 CLEVR 视觉问答上达到 95.5% 准确率,第一次超过人类。
论文讲了什么
结论先行:普通 CNN 和 MLP 擅长认出"是什么",但不擅长回答"谁和谁是什么关系"。作者给网络加了一个结构上的偏好:强制它逐对比较物体。只加这一个模块,CLEVR 准确率就从论文对比的 68.5% 提高到 95.5%。
问题。看一个问题:"离蓝色圆柱最远的物体是什么颜色?"回答它必须比较场景里的每一对物体。CNN 的卷积核只看局部,MLP 的输入没有"物体"这个单位。两者都可以在理论上学会比较,但需要的数据量非常大。
方法。关系网络(RN)只有一行公式:
RN(O) = f_φ( Σ_{i,j} g_θ(o_i, o_j) )
O = {o_1, ..., o_n}是一组物体,每个物体是一个向量。g_θ是一个 MLP。它读入一对物体,输出这对物体的"关系向量"。所有 n² 个物体对共用同一个g_θ。- 求和把 n² 个关系向量合成一个向量。求和与顺序无关,所以打乱物体顺序不改变输出。
f_φ是另一个 MLP。它把合成的向量映射成答案。
物体从哪里来。论文不要求预先标注物体。CNN 输出一张 d×d 的特征图。作者把每个格子的特征向量当成一个"物体",并在向量后面拼上这个格子的 (x, y) 坐标。问题文本先经过 LSTM 编码成向量 q,再拼进每一个物体对:g_θ(o_i, o_j, q)。这样 g_θ 会按问题去比较物体。例如 8×8 的特征图有 64 个物体,要算 4096 个物体对。
关键结果。
- CLEVR(从像素输入):RN 达到 95.5%。人类为 92.6%。论文对比的此前最好模型(CNN+LSTM+空间注意力)为 68.5%。
- Sort-of-CLEVR:作者自建的 2D 小数据集,把关系问题和非关系问题分开。CNN+MLP 在关系问题上明显落后,加上 RN 后两类问题都超过 90%。
- bAbI 文本问答:把每句话当一个物体,联合训练时解决 20 个任务中的 18 个。
- 物理系统:给出若干小球的运动轨迹,RN 能推断哪些小球之间连着弹簧。
代价。物体对的数量是 n²。物体多了以后,计算量和显存按平方增长。这个问题后来在注意力模型里反复出现。
关键概念
- 关系网络(Relation Network, RN)
- 一个可插入任意网络的模块。它用共享的 g_θ 处理每一对物体,求和后交给 f_φ 输出。它专门负责比较,不负责识别。
- 关系归纳偏置(relational inductive bias)
- 网络结构里预先写入的假设:答案取决于物体之间的关系。RN 把这个假设写进结构,所以模型不必从数据里自己发现它,样本效率更高。
- 置换不变性(permutation invariance)
- 打乱输入物体的顺序,输出保持不变。RN 用求和实现这一点。一组物体本来就没有天然顺序,这个性质符合问题本身。
- 坐标标记(coordinate tagging)
- 在每个特征格子的向量后面拼上它的 (x, y) 位置。没有坐标,g_θ 只知道两个物体长什么样,不知道它们相距多远。
- 问题条件化(question conditioning)
- 把问题的 LSTM 编码 q 拼进每一个物体对的输入。同一张图配不同问题时,g_θ 会提取不同的关系。
- CLEVR 数据集
- Johnson 等人 2017 年发布的合成视觉问答数据集。场景由几何体组成,问题需要计数、比较和空间推理,专门用来测试关系推理。
历史位置:为什么值得读
它解决的是 DeepMind 一条研究线上的关键一步。2016 年的交互网络(Interaction Networks)已经用"两两作用再求和"模拟物理系统,但要求输入是明确的物体列表。RN 证明这个结构可以直接接在 CNN 特征图或句子编码后面,不需要人工定义物体。
它影响了 3 条后续工作:
- 第 20 天的关系 RNN 由同一作者完成。它把"物体两两比较"换成注意力,并放进循环记忆里。
- 第 21 天的消息传递网络把"全部配对"换成"只沿图的边传递"。从这个角度看,RN 是在完全图上做一次消息传递再求和读出。
- 2018 年的图网络(Graph Networks)框架把 RN、交互网络和 MPNN 统一到一起。
它和清单里其他论文也直接相关。第 16 天 Order Matters 讨论集合输入的顺序问题,RN 用求和给出最简单的答案。第 13、14 天的自注意力同样计算所有 token 对,只是把均匀求和换成按权重求和。读这篇可以帮你理解:Transformer 的核心操作本质上也是关系推理。
学前准备
- 会写 PyTorch 的 MLP 和 CNN,理解张量的 batch 维度
- 知道 LSTM 如何把一句话编码成一个向量(先看第 2 天)
- 理解广播和 repeat,能把 n 个向量变成 n² 个配对
- 建议先看第 16 天,了解集合输入为什么需要顺序无关
在原仓库怎么学
- 运行 setup.py:检查环境,并验证置换不变性,以及 sum 和 mean 两种聚合对物体数量的敏感度差异。
- 阅读 implementation.py:对照论文公式找到 g_θ、求和、f_φ 三部分。
- 按顺序做 exercises/ 里的 7 个练习:
exercise_01_pair_generator.py生成物体对,exercise_02_g_theta.py写关系函数,exercise_03_permutation.py测试置换不变性,exercise_04_sort_of_clevr.py构造 Sort-of-CLEVR 数据,exercise_05_coordinates.py加坐标,exercise_06_masking.py处理掩码,exercise_07_counting.py做计数任务。 - 卡住时再对照 exercises/solutions/。
- 运行 train_minimal.py:用
--mode furthest或--mode count选任务,用--aggregator比较 sum、mean、max,用--train-n和--test-n测试物体数量泛化,用--use-coords测试坐标的作用。 - 运行 visualization.py:例如加
--compare-aggregators画出聚合方式对比图。 - 最后打开 notebook.ipynb 串起全流程。paper_notes.md 和 CHEATSHEET.md 可以当速查材料。
今天再看
"逐对比较"这个思想完全活着,只是换了形式。Transformer 的自注意力先给每一对 token 打分,再加权求和。这就是带权重的 RN。大语言模型回答"A 比 B 高,B 比 C 高,谁最矮"这类问题,靠的正是层层叠加的逐对比较。
被取代的部分有 2 处。第一,"特征图每个格子就是一个物体"太粗糙。后来的 DETR 和 Slot Attention 学习真正以物体为单位的表示。第二,CLEVR 已经被解决,不再是有区分度的基准。
RN 暴露的平方复杂度问题今天仍然是核心难题。长上下文模型里的稀疏注意力、线性注意力和状态空间模型,都在尝试绕开"所有对都要算"的代价。理解 RN,就能理解这些工作在省什么。
容易卡住的地方
- 分不清 g_θ 和 f_φ 的职责:g_θ 看一对物体,输出关系向量;f_φ 只看求和后的总向量,输出答案。画出张量形状再写代码。
- 构造 n² 个配对时形状出错:先把物体张量扩成 (B, n, n, d) 的两份再拼接,最后展平成 (B, n², 2d)。每一步都打印形状。
- 用 mean 聚合后计数任务学不会:mean 把总数信息除掉了。计数类任务必须用 sum,这正是仓库里聚合对比实验要演示的现象。
- 空间问题准确率停在随机水平:检查是否拼接了 (x, y) 坐标。没有坐标,模型无法判断远近和左右。
延伸阅读
- 原论文:A simple neural network module for relational reasoning
- 原仓库第 19 天目录:19_relational_reasoning/ —— 代码、笔记本、练习与答案(英文)
- CLEVR: A Diagnostic Dataset for Compositional Language and Elementary Visual Reasoning —— RN 主要评测的数据集原论文
- Interaction Networks for Learning about Objects, Relations and Physics —— RN 的前身,两两作用再求和
- Relational inductive biases, deep learning, and graph networks —— 把 RN 与图网络统一的综述
- Deep Sets —— 从理论上讲集合函数为何用求和