神经图灵机(Neural Turing Machines)
Alex Graves、Greg Wayne、Danihelka(DeepMind) · arXiv 2014 · 给神经网络外挂一块可读写的「内存条」
Ilya 为什么选它
普通网络的记忆全都压缩在权重里,相当于把要记的事全刻在脑子里——这本「记账本」太小,遇到需要精确记住一长串内容的任务就吃力。这篇 DeepMind 的论文给网络配上外部记忆:一块可以随时读写、独立于权重之外的「内存条」,容量问题第一次被摆上台面正面解决。
它在书单里的位置也很有意味:2014 年的工作,比书单里多数注意力论文还早,却第一次把「网络如何操作一块外部存储」做成了端到端可训练的整体。后来各种「给模型外挂记忆、外挂工具」的想法,都能在这篇里找到早期的完整示范——外挂不难,难的是让外挂本身也学会自己动手,这正是 NTM 的贡献。
从生活说起
想象教室前面摆着一排储物柜,老师要在里面查资料。笨办法是老师硬性指定「开 3 号柜」——可一旦指定的柜子里没放东西,查询就卡死了。NTM 的办法温柔得多:老师不做任何指定,而是给每个柜子发一盏亮度不同的灯。要找的内容和 3 号柜最相关,3 号柜的灯就最亮;2 号、5 号柜沾点边,灯就暗一些;不相关的柜子,灯干脆不亮。
读的时候,不是只看最亮的那一个柜,而是按亮度「混合着看」:最亮的看七成,次亮的看两成,剩下的看一成。写的时候同样温柔:新内容不猛砸进一个柜子,而是按亮度比例分摊着写进几个柜子。柜子还是那些柜子,但每一格都被柔光笼罩、按需取用——这就是「软寻址」的画面:不给死命令,只给一排亮度不同的聚光灯。
核心思想拆解
NTM(Neural Turing Machines,神经图灵机)由三部分组成:控制器(Controller),负责思考的大脑;外部存储矩阵(External Memory),一格格排好的内存;读写头(Read/Write Heads),在内存上取放内容的手。普通网络的记忆压在权重里,本质是「把账刻在脑子上」;NTM 把账本搬到脑子外面,网络通过读写头随时翻账、记账,脑子和账本各自长大、互不挤占。
真正的妙处在读写的方式——软寻址(Soft Addressing)。读写头不「咔哒」一声只挑一个格子,而是给所有格子发不同权重的聚光灯:每个格子分到一个权重,全部权重加起来等于 1。读出时,按权重把所有格子的内容混合起来;写入时,按权重把新内容分散写进多个格子。没有任何一步是「硬选中」,整条链路从头到尾平滑连续。
为什么要追求平滑?因为这让整个系统端到端可训练(End-to-End Trainable):从输入,到读内存、算一算、写内存,全是可微操作(Differentiable,粗略地说就是「每一步都能顺着来路知道该怎么改」),训练信号能一路传到底。于是读写策略不是人写死的规则,而是网络自己学出来的本事。经典任务是学会复制一串序列:看一遍输入,再原样吐出来——这要求网络真把内容放进内存、记好位置、再按原序取出来;软寻址的读写策略正是在这类任务上练出来的。
动手算一算
看一次「按权重混合读出」。内存有 4 个格子,内容分别是 10、20、30、40;读写头发出的聚光灯权重是 0.6、0.3、0.1、0.0,加起来正好是 1。读出的内容 = 10×0.6 + 20×0.3 + 30×0.1 + 40×0.0 = 6 + 6 + 3 + 0 = 15。注意:没有任何一个格子的内容被原样读出,读出的是一份按权重调配的混合版;权重一变,混合版立刻跟着变——这就是「软」的含义。
再感受写入:新内容要写进内存,写头这次给的权重是 0.5、0.5、0、0,于是这份新内容的分量被摊到 1 号和 2 号格子各一半。权重收拢,就存得精确;权重摊开,就写得分散——收拢还是摊开,由网络在训练里自己学。你看,整套读写只有乘法和加法:把每个格子的内容按权重相乘、再全部加起来(读),或者把新内容按权重拆成几份分给各格子(写),全是小学算术。