指针网络(Pointer Networks)
Oriol Vinyals、Yoshua Bengio、Ilya Sutskever · arXiv 2015 · 让输出「指向输入」——答案不是造词,而是挑位置
Ilya 为什么选它
这篇论文的作者名单里就有 Ilya 本人。它解决的是一个被「固定词表」卡住的问题:普通序列模型的输出只能从一张预先定好的词表里挑词,可有一大类问题的答案天生不在任何词表里——它们是输入里的某个位置。
凸包、三角剖分、旅行商这类组合问题,答案都是从输入里「挑东西」:挑出哪几个点、哪几条边、哪条路线。指针网络把输出从「造词」改成「指位置」,并且输入点数可变,规模变大了机制也不用改。这是注意力思想早期的一次漂亮迁移:同样是打分,它不取信息,只取位置。
从生活说起
做阅读理解题有两种答法。一种是改写:用自己的话把答案编出来;另一种是举手指出:「答案在第 3 行第 5 个词。」出题人最认第二种——原文就是标准答案,你只要指得准。改写有走样的风险:编着编着就偏了;指认却永远不会走样,答案就是原文本身,指对了就是对了。
传统序列模型就像只会改写的考生:它的输出被锁死在一张固定词表上,词表里没有的它说不出来。可凸包问题的答案偏偏是「你输入的那几个点」:输入变,答案跟着变,词表根本没法提前准备。指针网络学会的是第二种答法:不改写、不造新词,每次输出就是一次举手——指向输入里的某个位置。输入给 10 个点,它就从这 10 个点里指;换成 100 个点,照样从这 100 个点里指,举手这个动作本身不用变。
核心思想拆解
先把问题摆清楚。凸包问题(Convex Hull):平面上撒一把点,要输出「围住所有点的边界点」——答案永远是输入点本身,绝不产生新点。三角剖分(Triangulation):把一片点连成整齐的三角形网,用的也全是原有的点。旅行商问题(TSP,Traveling Salesman Problem):找一条最短的路线走遍所有城市,输出是「输入城市的一个排列」。这类任务统称组合问题(Combinatorial Problems),共同点是:答案都藏在输入里。固定词表的传统输出方式干不了这个活——词表是死的,输入是活的。
指针网络的解法干脆利落:用注意力打分,但不拿分数去混合信息,而是拿分数直接「指向」输入位置。每一步输出前,模型对输入的每个位置打一个分,分最高的位置就是答案——像在输入上方装了一排指针,每次竖起其中一根。
最妙的是输入点数可变。因为打分是对「当前输入的每个位置」进行的:10 个点就打 10 个分,100 个点就打 100 个分,分最高的照样被指中,机制一模一样。换句话说,指针网络把「输出的菜单」从死词表换成了活输入——菜单每天换,点菜的动作不变。这一步也预演了后来「对所有位置打分」的通用套路,那个套路在 i16 里被推到了整句语言上。
动手算一算
设输入 5 个点,模型在某一步对它们分别打分,换算成占比:点 1 占 10%、点 2 占 20%、点 3 占 35%、点 4 占 5%、点 5 占 30%(合计 100%)。最大占比是点 3 的 35%,于是这一步的输出就是「指向点 3」。
注意两件事。第一,输出不是任何新造的东西,就是输入里现成的点 3——「指认式输出」永不走样。第二,把输入换成 50 个点,只是打分从 5 份变成 50 份,各份占比合计仍是 100%,挑最大占比的动作完全不变。这就是「可变输入长度」的全部含义:变的是打分的份数,不变的是打分与指认的方法。整套算术只有比大小和算百分比。