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

第 16 天 · 数据怎么排列,会改变模型学得好不好

第 3 单元Order Matters: Sequence to sequence for setsOriol Vinyals, Samy Bengio, Manjunath KudlurICLR 2016(arXiv 2015) · 2015
这是导读,不是翻译。先用 10 分钟拿到这篇论文的思想地图,再去读 原论文 →,去原仓库的 16_order_matters/ 目录 → 动手写代码。
给孩子讲:这一天有 10 岁孩子能听懂的讲义,带猜字游戏和动手活动,可打印。打开儿童讲义 → · PDF 简体 · PDF 繁體

一句话

论文用实验说明,seq2seq 对输入和输出的排列顺序很敏感。对无序的输入,作者提出读-处理-写结构,用多步注意力得到与顺序无关的集合表示。对无序的输出,作者提出在训练中搜索最佳顺序的损失。

论文讲了什么

问题。seq2seq 把输入和输出都当作序列。但很多数据本来是集合:一组待排序的数、平面上的一堆点、分子里的原子。把集合排成序列时,必须选一种顺序。n 个元素有 n! 种排法。作者提出 2 个问题:顺序会不会影响学习?如果会,该怎么办?

顺序确实重要。论文先列证据。翻译中,把源句倒序输入,LSTM 的效果明显变好,这是 Sutskever 等人 2014 年的发现。句法分析中,把句法树按深度优先或广度优先线性化,结果也不同。理论上,链式法则对任何顺序都成立:p(x1, x2) = p(x1) p(x2|x1) = p(x2) p(x1|x2)。但模型容量有限,优化也不完美,所以有的顺序明显更好学。

输入是集合:读-处理-写。

作者用排序任务验证这个结构。输入是 [0, 1] 区间的随机实数,输出是从小到大排列的下标。实验比较了 5、10、15 个数的情况。对照模型用 LSTM 按给定顺序读入。增加处理步数可以提高排序准确率,数越多任务越难。

输出是集合:搜索顺序。如果目标没有天然顺序,作者让训练过程自己挑顺序。对每个样本,在候选顺序中选出当前模型概率最高的一个,用它计算损失。只取最大值容易过早锁定一个差的顺序,所以训练前期要采样多种顺序做探索。作者在一个人造任务上验证了这个方法:估计未知图模型中多个变量的联合分布。

直觉例子。让模型输出一句话里出现的所有人名。答案"张三、李四"和"李四、张三"一样对。如果训练标签随机给其中一种,模型会在两个答案之间摇摆。固定一种规则(例如按出现顺序),或让模型自己挑,学习都会更稳。

关键概念

排列不变性(Permutation Invariance)
打乱输入元素的顺序,输出保持不变。求和、求平均和注意力加权和都满足这一点,LSTM 顺序读入则不满足。
读-处理-写(Read-Process-Write)
本文为集合输入设计的三段式结构:逐元素编码、多步注意力处理、指针网络输出。处理块后来常被称为 Set2Set。
内容注意力(Content-Based Attention)
用查询向量与每个记忆向量的相似度决定权重,不使用位置信息。因此读出结果不受元素排列影响。
处理步数(Process Steps)
处理块中 LSTM 运行的步数 T。每一步重新读一次全部记忆,步数越多,集合表示被反复修正的次数越多。
链式法则分解(Chain Rule Factorization)
把联合概率拆成逐个元素的条件概率连乘。拆法有 n! 种,数学上等价,但对神经网络来说难度不同。
输出顺序搜索(Order Search)
训练时不固定标签顺序,而是在候选顺序里挑模型当前最认可的一个计算损失,让模型和顺序一起被优化。

历史位置:为什么值得读

这篇论文和第 18 天的指针网络出自同一位第一作者 Vinyals,发表时间晚几个月。指针网络解决了"输出是输入元素"的问题,但输入仍按序列读入。本文进一步追问:输入本来没有顺序时怎么办?

它的影响主要有 3 条:

清单把这篇放在注意力和记忆的系列里,因为处理块本质上是"多次读取一块记忆"。这和第 17 天神经图灵机的读头思路一致。

学前准备

在原仓库怎么学

  1. 读 README.md,看读、处理、写 3 个模块分别对应代码里的哪一部分。
  2. 对照 PAPER_NOTES.md 读原论文第 4 节,重点看处理块的公式。
  3. 读 implementation.py,依次看 SetEncoder、PointerNetwork 和组合起来的 ReadProcessWrite。
  4. 做 exercises/ 里的 5 个练习:exercise_1.py 写指针注意力,exercise_2.py 写排列不变的集合编码器并验证打乱输入后输出不变,exercise_3.py 训练排序,exercise_4.py 求凸包,exercise_5.py 近似求解旅行商问题。凸包和旅行商问题是第 18 天论文的任务,这里用来练习写模块。答案在 exercises/solutions/。
  5. 运行 train.py,它支持 sorting、convex_hull 和 tsp 3 种任务。数据生成方式见 data/README.md。
  6. 用 visualization.py 画指针的注意力热力图和几何结果。
  7. 用 notebook.ipynb 串一遍,用 CHEATSHEET.md 复习。

今天再看

本文的两个问题,今天都还在:

本文最值得带走的一句判断:对神经网络来说,数学上等价的分解,学习难度可以完全不同。

容易卡住的地方

延伸阅读