NTM-Lasagne:基于Lasagne的神经图灵机函数库

过去几年,递归神经网络(RNN)已经成为序列建模中的主要玩家。由于其高效性与灵活性,人们很容易认为,它们将是序列学习的未来。然而,深度学习的研究十分的迅速,以至于没人能够知道未来会是怎样。

实际上,近期深度学习领域的创新中,给现存架构添加某种形式的外部存储器的想法已经带来了有前景的结果,特别是在自然语言处理(NLP)方面。很大程度上都出于复制神经科学家的理论化概念的需要,后者也是归纳推理和发明新概念的动力。

在这里,我们将主要将目光集中于记忆增强神经网络(memory-augmented neural networks)早期例子中的一个:神经网络图灵机。我们将会了解它的运行原理细节,以及如何能适于完成学习算法任务。

用以建造我们的神经网络图灵机库的Snips也是开源,上等的。它包括了代码、预训练模型以及在这篇博文中所包括的例子。

Memory增强神经网络

无论是递归还是前馈神经网络,所有的神经网络都有一个特征,它们会将数据映射为抽象表征。然而,从外部环境中添加知识——例如为NLP添加词典——很困难。

比起人工增加RNN隐藏状态大小,我们更愿意任意增加加入模型的知识量,同时对模型本身做出最小限度改变。基本上,我们能用独立存储器——作为一种神经网络能够按需读写的知识库——来增强模型。你可以把神经网络视为CPU,而且将这种新的外部存储器视为RAM。

对于保持读/写的快速运行来说,记忆结构的选择非常关键,无论存储器大小如何。深度学习社区多推荐多重设计。例如,神经图灵机( Neural Turing Machines),还有神经网络随机存取机(Neural Random Access Machines)(Kaiser et al., 2015)和神经网络GPU (Kaiser et al., 2015),使用了带有读写磁头的磁带。Grefenstette et al., 2015,作者使用诸如栈或(双端)队列结构的连续版本。

这些Memory增强神经网络的一个有趣副作用便是跟踪中间计算的能力。举个例子,在NLP的QA问题中,当模型边度故事边记住它到最后回答问题,会有很有价值。例如,Memory Networks(Sukhbaatar et al., 2015)与Dynamic Memory Networks(Kumar et al., 2015),利用了存储器而在QA任务上表现良好。

为RNN添加额外存储器并不是什么新主意。实际上,长短期记忆神经网络(LSTMs)已经有了一个基础存储器细胞,每时间步(time-step)储存信息于此。为了介绍LSTM,我推荐一步步阅读它们运作的细节,包括存储细胞的作用。长话短说,这种细胞的主要功能就是简化RNN的学习,那么,较之LSTMs,给如此低水平的处理机制添加存储器的意义何在?答案就是结构。

LSTM通常有一个存储器中信息的分布式表征。这本身不是问题,经验已经表明他们肯定能记住数据结构。

与LSTM不同,Memory-增强神经网络鼓励(但并不是必要的)存储器的本地变化。这正好不仅有助于找到训练数据的结构,还可以泛化超出LSTM泛化能力的序列,例如算法任务中更长的序列(我们会在下面看多许多例子)。

你可以发现Memory-增强神经网络超过LSTM的价值所在:想象下你在一个party中,试着在所有宾客都在说话的时候搞清楚主人叫什么。一些人也许知道他的名,一些也许知道他的姓,甚至宾客们也许只知道他的姓或名的一部分。最后,就像LSTM一样,你能够通过收集来自不同宾客信号回收信息。但是,你能够想象,如果一开始就有一个宾客知道他的整个姓名,这将会简单得多。

神经网络图灵机(下面简称为NTM)

在它们各自领域中,可计算理论和机器学习已经推动了计算机能力的发展。前者定义了计算机计算的能力,而后者则让计算机执行那些对于人类简单而对于计算机则看似不可能的任务,例如计算机视觉。

艾伦·图灵在1940年就开始研究计算和人工智能前景密不可分的联系。他建立了一个经典计算模型,通过一个或读或写信号的磁头在无限存储磁带上运行。尽管这个抽象的计算机有着非常低水平的界面,但它强大到足够到模拟任何算法。神经网络图灵机(NTM)就是从这两个领域受到启发,博众家之长。

1

值得注意的是,神经网络图灵机和RNN之间有着有趣的连接。后者以图灵完备(Turing-complete)而闻名(Siegelmann,1995)。这意味着就像用图灵机一样,任何算法都能靠一个RNN用细心挑选的参数进行编码(虽然这样的参数也许不能从数据中学习到)。

NTM可以被看作是图灵机的可微版本。与图灵机相似,它有主要两个成分:一个(有限)存储磁带,以及一个控制器,负责打造与外部世界之间的交互界面(例如,输入序列与输出表示)和通过读写头的存储器。据说,这个架构可微,在控制器与处理机制都是可微的意义上。模型的参数能够利用随机梯度下降(Stochastic Gradient Descent)学习。下面我们就详细描述这些组成部分。

控制器

控制器是一个神经网络,提供输入的内部表示,通过读写头与存储器相互作用。值得注意的是,这种内部表征与最终储存在存储器中的并不完全相等,后者是这种表征的一种函数。

对于神经网络机来说,控制器的类型就是最重要架构选择的代表。这种控制器可以是前馈或递归神经网络。前馈控制器比起一个递归控制器要快速得多,并提供更多的透明度。但这意味着付出低表现力的代价,因为它限制了NTM每时间步所能执行的计算类型。

2

读/写机制

读写头让神经网络图灵机更加有趣。它们是仅有能够直接与存储器互动的成分。从内部来说,每个读写头的行为都被它自身的权重向量所控制,在每一时间步得到刷新。每个向量上的权重与在记忆中的位置一致(权重向量总和为1)。为1的权重尽在相应存储位置聚焦NTM所有的注意力。为0的权重则与记忆位置无关。

3

不仅如此,我们还让这些权重符合两个要求:它们应该支持存储器上的本地变化(读或写),同时保持它们的更新可微,因为我们想要训练NTM端对端。为了这个目的,权重向量通过一系列中间平滑操作进行更新。

每一个更新都有四个操作:内容处理、插值、卷积位移( convolutional shift)和锐化。它们都取决于控制器所产生的参数。更精确地说,这些参数是控制器释放的隐藏状态的函数。

4

在内容处理的操作中,NTM将注意力集中于「靠近」关键的存储器位置,因此让模型能够回收存储中的特殊信息。粗略地说,有点像《C语言指导》。以内容为基本的权重继而以之前插值操作时间步中的权重向量为门控。如果门为0值,那么内容处理就跳过。反之,门为1,那么之前的权重就被忽略。

卷积位移继而平滑地将权重左移或右移,与经典图灵机的读写头位移非常相似。最终,移动向量被锐化,尽可能针对性地获取一个权重向量。要记住,没有一个操作能够在存储中真正本地改变,尽管重点在于生成稀疏权重。其结果就是你得到「模糊」权重向量,无力查询整个存储。

一旦读写头刷新了自己的权重向量,那么,它就准备在存储器上运行。如果它是一个读取头,那么会输出记忆位置的权重结合:读取向量。后者接着在下一个时间步反馈回控制器。如果它是一个写头,那么记忆内容就会稍微修改(取决于 权重),抹去或添加向量,两者都由控制器生成。

NTM-Lasagne基准与样例

由谷歌DeepMind的论文所启发,我们检测了在算法任务上NTM库。在每个实验中,我们的目标都是仅通过观察一系列输入和输出样例来学习算法。更具体地说,我们仅仅为神经网络图灵机提供随机输入,以及从我们想要学习的算法中所要得到的预期输出。就算法任务的本质而言,并没有提供给NTM预先的知识。从某种意义上说,由于训练数据可以通过已知算法无限生成,所以学习任务的数据可以很便利(convenient)的获得,理论上无限准确的训练数据要比实际应用场景中有噪音且有限的训练数据具有更大优势。

训练NTM过程的例子。给模型随机输入序列,每一步都更新其参数。输入图像代表了模型在这个训练阶段的输出,以及与期望输出相对应的差值。模型读取输入和写出输出时存储器的状态相应地展示在右侧。该灵感来源于A. Graves在NIPS的动画。

我们在这里主要关注NTM理解算法概念的能力,意味着NTM应该能够归纳各种长度的序列,包括超出训练中所看到的更长的序列。这就是我们所谓的泛化(拟合)性能(generalization performance)。

下面所有实验的代码可以使用该数据库,以及预训练模型,因此你可以自己进行测试。所有的超参数(hyper-parameters)与架构细节也都可以获得,并且我们将会在这里简单介绍。如果你不希望读这些技术上的细节,你可以跳过下面的环节。

在所有这些样例中,我们利用一个有100单元前馈控制器的单层神经网络图灵机。如最初的论文中所写的那样,1对读写磁头控制着存储器的128个位置。我们发现一个非常有用的关键事情是校正激活(线性校正单元ReLU)。后者展示了比典型的双曲正切激活(typical tanh activation)具有更好的泛化(拟合)性能,并且帮助获得序列的分散表示。

复制

Copy任务是一个最基本的算法任务,我们用它测试了NTM从储存和从存储器获取信息的能力。目标是将输入序列再生为输出。当然,这个任务仅仅测试了处理机制提供的小部分操作。

指出这一点很重要:我们并不是在试着学会变成自动编程员,旨在立刻重新构建整个输出。反之,NTM一次只读取输入序列中的一项,一次也只写出一项输出。将它看做在读一本书(逐字地),然后必须从记忆当中复述出来。这就有挑战性得多。

更加有挑战性的是我们并不仅仅对NTM复制与受训所用相似序列的能力,

而是有效的学习复制算法并泛化更长的序列。为了与读书的比喻相对应,让我们把它比喻成我们去试着复述一本口袋小书,但是最终口袋小书,但是最终变成了复述一整本《奥德赛》。

在这个例子中,我们用小于等于5个随机序列训练神经网络图灵机,而它却展示了对于多达120项测试序列完美的泛化能力。实际上,这并不令人惊讶,因为NTM真正触碰到了记忆的基线,因此无法再泛化更长的序列。

6

重复性复制

为了测试更复杂的算法,检查NTM是否能够学习简单算法原函数是一件有趣的事,就像循环一样。在重复性复制任务中,NTM收到了一个输入序列,以及所需复本的表征。目标是在输入特定次数的序列时重现所需数据。

与谷歌DeepMind相反,我们利用了复制次数的一元表示(例如重复二进制标志)而不是单纯的[0,1],这样的表示虽然适合于训练,但是却非常依赖于标准化,并没有为泛化带来帮助。实际上,他们的论文里也给出了相似的效果。

7

注意到NTM读取原始输入序列而并没有得到任何关于数据和复制次数位置的暗示。模型在训练时需要自己找出相关的信息。

相关联想

相关联想任务是一个更加前沿的例子,学习基本的请求/回答系统。利用内容处理的优势,这个任务可以让我们测试NTM是否能够学习与C语言相似的指针。在这个简单的例子中,NTM被赋予由多个二进制向量组成的项,以分隔符以及在输入序列尾部的请求项分开。而目标是为了获取紧随输入序列请求项的答案。

再一次,NTM无法获得数据性质的暗示。特殊的是,它必须去理解这些项由特殊的二进制标志分开,并从实际数据与请求分隔符区分出来。

8

Dyck语句

除了上面所提到的所有回归的例子,我们还对测试神经网络图灵机在分类任务中的能力很感兴趣。从正式语言中得到启发,我们可以仅通过几个例子测试某些语言的识别能力。在复杂性上最好的折衷方法是去测试NTM在由括号字符串组成的语言(也叫做Dyck语句)表现如何。

9

Dyck语句已经被大范围研究过,并且与组合学的很多目标非常相关。在递归神经网络的环境中,它们非常有趣:典型完整的括号字符串涉及到长期依赖性,也被称为RNN的阿基琉斯之踵。

一个非常简单的算法可以用来检查是否一个括号组成的语句是Dyck语句,这个算法包括了一个栈,并像下述描述。

QQ图片20160304190137

经验证明NTM实际上能够编写这样一个程序的代码。然而,与之前的例子相反,NTM利用读写头并不是完全在内存中存储信息,而是作为跟踪栈状态的方式。这展示了NTM并不仅仅能够利用内存作为线性存储,还能够执行具有长期依赖性的复杂计算,无论它的内容如何。

11

结论

正如我们在文中解释的,与LSTM泛化能力相比,神经网络图灵机展示了其不可测量的前景。其在外部存储中存储信息和本地修改的方式让它成为了处理需要推理的问题很好的解决方法。

我们希望随着这篇文章一起公开的库能够帮助深度学习社区在探索这个有趣领域上有更多的进步。到现在为止,这是自谷歌DeepMind最初的论文发表以来,首个这种质量级别的能够重现复制、重复性复制和相关联想任务的开源库。

在深度学习的推广上已经有了很多的进步,尤其是卷积神经网络。NTM打开了更进一步的新可能性,去理解概念是如何创造的。毕竟,算法就是计算机的概念。这是一个人工智能新的时刻:试着去教计算机他们能做的事情,就像我们学习它们一样。让我们拭目以待吧!

入门深度学习
暂无评论
暂无评论~