30u30 中文导读 / 30 天目录 / 第 19 天

第 19 天 · 关系推理,就是把物体两两配对再求和

第 4 单元A simple neural network module for relational reasoningAdam Santoro, David Raposo, David G. T. Barrett et al.NeurIPS 2017 · 2017
这是导读,不是翻译。先用 10 分钟拿到这篇论文的思想地图,再去读 原论文 →,去原仓库的 19_relational_reasoning/ 目录 → 动手写代码。
给孩子讲:这一天有 10 岁孩子能听懂的讲义,带猜字游戏和动手活动,可打印。打开儿童讲义 → · PDF 简体 · PDF 繁體

一句话

论文提出关系网络(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) )

物体从哪里来。论文不要求预先标注物体。CNN 输出一张 d×d 的特征图。作者把每个格子的特征向量当成一个"物体",并在向量后面拼上这个格子的 (x, y) 坐标。问题文本先经过 LSTM 编码成向量 q,再拼进每一个物体对:g_θ(o_i, o_j, q)。这样 g_θ 会按问题去比较物体。例如 8×8 的特征图有 64 个物体,要算 4096 个物体对。

关键结果。

代价。物体对的数量是 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 条后续工作:

它和清单里其他论文也直接相关。第 16 天 Order Matters 讨论集合输入的顺序问题,RN 用求和给出最简单的答案。第 13、14 天的自注意力同样计算所有 token 对,只是把均匀求和换成按权重求和。读这篇可以帮你理解:Transformer 的核心操作本质上也是关系推理。

学前准备

在原仓库怎么学

  1. 运行 setup.py:检查环境,并验证置换不变性,以及 sum 和 mean 两种聚合对物体数量的敏感度差异。
  2. 阅读 implementation.py:对照论文公式找到 g_θ、求和、f_φ 三部分。
  3. 按顺序做 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 做计数任务。
  4. 卡住时再对照 exercises/solutions/。
  5. 运行 train_minimal.py:用 --mode furthest 或 --mode count 选任务,用 --aggregator 比较 sum、mean、max,用 --train-n 和 --test-n 测试物体数量泛化,用 --use-coords 测试坐标的作用。
  6. 运行 visualization.py:例如加 --compare-aggregators 画出聚合方式对比图。
  7. 最后打开 notebook.ipynb 串起全流程。paper_notes.md 和 CHEATSHEET.md 可以当速查材料。

今天再看

"逐对比较"这个思想完全活着,只是换了形式。Transformer 的自注意力先给每一对 token 打分,再加权求和。这就是带权重的 RN。大语言模型回答"A 比 B 高,B 比 C 高,谁最矮"这类问题,靠的正是层层叠加的逐对比较。

被取代的部分有 2 处。第一,"特征图每个格子就是一个物体"太粗糙。后来的 DETR 和 Slot Attention 学习真正以物体为单位的表示。第二,CLEVR 已经被解决,不再是有区分度的基准。

RN 暴露的平方复杂度问题今天仍然是核心难题。长上下文模型里的稀疏注意力、线性注意力和状态空间模型,都在尝试绕开"所有对都要算"的代价。理解 RN,就能理解这些工作在省什么。

容易卡住的地方

延伸阅读