大家好,我是TallaCorporation的资深数据科学家DanielShank,今天我要讲一个新的令人兴奋的机器学习架构,它被称为神经图灵机(NeutralTuringMachine/NTM)。首先我给这个架构一个大概的概述,这个架构是什么?然后我会开始讨论为什么这个架构很重要,它和机器学习的未来有什么关系,然后我会讲为什么我们不能马上在所有地方使用这些东西。例如,如果它非常有用,我们为什么不立即在生产中使用它。***我将讨论最近关于神经图灵机(NeutralMachine)及其后续架构的Nature论文,并且我将展示对该模型的一些有趣的扩展。我们为什么要关心神经图灵机?要解释为什么神经图灵机如此重要,我们实际上必须解释什么是普通图灵机。图灵机是一种简单的计算机模型。就像现代计算机一样,它有一个外部存储器和某种处理器。本质上,图灵机由一个写有指令的磁带和一个能够沿着磁带读取的设备组成。根据从磁带上读取的指令,计算机可以决定在磁带上向不同的方向移动,写入或擦除新的符号等等。那么什么是神经图灵机?简而言之,NeuralTuringMachine是一种神经网络,但它从TuringMachines中获得灵感,尝试实现一些计算机可以很好解决的机器学习模型。没有很好解决的任务。从本质上讲,它由神经网络控制器、读取磁带设备的仿真器或处理器以及外部存储或内存(如果您愿意)组成。它对它读取的所有输入都是持久的。与长短期记忆(LSTM)网络或其他相关模型一样,它是一种循环神经网络。这意味着,就像我们大多数人所熟悉的那样,它像读取变量一样读取输入,但是神经图灵机和图灵机之间也有区别:除了具有内存/内存之外,神经图灵机还可以接受一个连续的输入和输出链。这里的关键思想是神经图灵机基本上是可微的图灵机,这很重要,因为我们每天在计算机上做的算法和事情对计算机来说是非常困难的,原因是计算机的计算是绝对的。0或1。计算机以“非此即彼”逻辑或整数运算。然而,大多数神经网络和机器学习其实并不是这样的。他们使用实数。他们使用更平滑的曲线,这使得他们更容易训练,这意味着当你看到他们的输出时,你可以轻松地通过输出回溯并调整参数以获得所需的输出。当计算机CPU充满了异或门(XOR)和与门(AND)等转换功能时,这是很难实现的。神经图灵机使用基本图灵机中的所有功能来找到平滑的模拟功能。因此,例如,在磁带上,神经图灵机可以决定稍微向左或向右移动,而不是仅仅向左或向右移动,这让你可以做一些令人惊奇的事情。在神经图灵机可以做的事情中,我们有一些令人兴奋的例子,当然也有一些不那么令人兴奋的例子……但缺点是它只能学习简单的算法。例如接受输入并复制它。这看起来是极其普通的事情,但是对于现在的神经网络来说,这其实是一件非常困难的事情,因为神经网络需要学习一种算法才能把这个工作做得足够好。神经图灵机接受输入和输出,并学习从输入映射到输出的算法。这真的很令人兴奋,因为它本质上是在试图取代程序员。我们还没有实现它,但它真的很酷。这意味着一旦学习了一种算法,他们就可以接受输入并根据该算法推断出任何可变输出。您会立即明白为什么这很酷。因为他们也很擅长语言建模。如果你不知道什么是语言建模,你可以考虑自动完成。语言建模就是猜测单词在句子或文档的上下文中的含义。神经图灵机在Facebook的bAbI数据集上也显示出前景,该数据集旨在鼓励研究人员提高神经网络的一般认知推理能力。复制/重复任务的概括这是一个神经图灵机执行复制/重复任务的例子。它已经学会接受相对较短的序列并重复它们几次。正如您在上图中所看到的,它一开始会出错。不过最后看起来还不错,图片上半部分是目标,下半部分是输出。神经图灵机优于长短期记忆网络相反,您将此示例与长短期记忆网络(LSTM)进行比较,后者实际上是一种非常强大的神经网络模型。它们往往会很快崩溃。这样做的原因是LSTM确实在学习一些东西,但他们不是在学习算法。LSTM试图一次解决整个问题,所以他们没有意识到他们前两次所做的是他们之后应该做的。平衡括号神经图灵机可以做的一个有趣的例子是它们可以识别平衡括号。这个特别有趣,因为它涉及一种使用堆栈的算法,因此基本上您可以跟踪进入的左括号,并尝试匹配相应的右括号。神经网络可以做到这一点,但它会以更统计的方式来完成,而神经图灵机实际上可以像人类程序员一样完成这项任务。好吧,现在让我们谈谈bAbI数据集以及我们为何如此关心它。bAbI数据集本质上是一系列故事,后面跟着问题,所有这些都需要某种形式的推理来回答。我这里有一个简单的例子——使用位置进行推理。这里的关键点是,如果你问某人在哪里,你实际上是在问他们到底去了哪里。这可能看起来很明显,但当涉及到角色捡东西或走路时,它实际上会变得有点复杂。故事还涉及关于物体相对大小的实际推理。基本上,这件事背后的基本思想总是一个在所有这些任务中表现良好的系统接近一个更一般的知识推理系统。bAbI数据集上的结果这里只是一些基于bAbI数据集的结果。请注意,bAbI数据集实际上是训练集。正如我之前向您展示的那样,根据这些故事中的每一个,您将看到训练集实际上提供了一个提示,说明实际故事中的哪些内容对于回答问题很重要。事实证明,使这个问题如此困难的原因不仅在于你必须进行逻辑推理,而且你还必须了解相关的内容。你会看到两者之间存在竞争。bAbI数据集的许多子任务或子部分的准确率超过95%,可作为系统通过给定域的基准。挑战和建议神经图灵机可以做所有这些很酷的事情:它们可以学习算法,它们可以理解一个小故事的含义,但为什么我们不能一直使用这些东西呢?嗯,他们的结构是如此有趣,但也伴随着一些问题。问题:架构相关;大量参数;不受益于GPU加速;难以训练首先,一旦你指定了一个通用架构,在实施它时仍然需要做出很多决定。例如,对于每个给定的输入或输出单元,您可以在给定时间步读取或写入多少个向量?这些都很重要,不仅仅是提高你的识别准确率的问题。如果你没有正确地做到这一点,它很可能永远不会得到合理的结果。参数的数量非常多,这会给你的内存带来很大的压力。这是机器学习的重要组成部分,它们不会从GPU加速中受益,尽管正如我们所见,GPU加速是机器学习的重要组成部分。原因是这是顺序的并且很难并行化,因为它们现在所做的一切都是基于以前的输入。很难将这些部分分解为易于并行化的计算。很难训练,这与我刚才提到的所有问题都不一样。难以训练:数值不稳定;难以使用内存;需要很好的优化;难以在实践中使用它们往往具有很强的数值不稳定性。这部分是由于它们实际设计的任务。因为他们在学习算法,他们往往不会犯小错误,他们往往会犯大错误。如果您的算法出错,所有输出都将不正确。这意味着当你训练他们时,他们总是很难找到他们需要的算法。如果输入大量数据并给予足够的时间,大多数神经网络都会得到一些结果。神经图灵机经常卡住。我们都知道,他们经常盲目地一遍又一遍地产生那些经常重复的值。这是因为使用内存很困难。他们不仅要学会记住以后解决问题需要什么,而且还要记住不要不小心忘记它,这是这一层所需要的额外一层复杂性。因此,为了解决这个问题,您最终会使用一些循环神经网络常用的巧妙优化方法。但是为了使这些方法起作用,您需要考虑所有事情。所有这些问题使得神经图灵机难以在日常应用中使用。有很多方法可以处理数学不稳定性。一种非常常见的方法是梯度裁剪,尤其是在使用LSTM时。梯度裁剪的本质是无论我们怎么认为一个不好的结果是由初始参数引起的,我们都必须限制改变的程度。这有助于我们避免在得到不好的结果时擦除所有参数。当机器犯错时,我们不能完全丢弃我们学到的东西。损失裁剪本质上是梯度裁剪的扩展。同样的基本思想是,神经图灵机会离他们的目标很远。就像损失函数的总值一样,为我们可以改变的参数总和设置了一个上限。我们经常将这两种方法结合起来。基本上,我们需要将许多有效的更改绑定到一个具有不同含义的参数。好吧,实际上另一个有趣的方向是Graves的RMSprop。RMSprop实际上是您可能熟悉的常见反向传播算法的扩展。反向传播是当今训练所有神经网络的关键。RMSprop是一个用于平滑梯度的系统。因此,在有序数据点中,基本上您所做的是对任何给定参数的影响取平均值。Graves的RMSprop实际上是这种方法的变体。它本质上是在对方差进行运行估计,而不仅仅是取平均值。它归一化并确保损失的极值在实践中不会衰减太多,或者将参数减少太多。这是一种非常聪明的方法,也非常有趣,因为必须通读AlexGraves的一些论文才能解决这个问题。如果您只是实现简单的RMSprop,它往往无法正常工作。幸运的是,还有其他优化方法。老实说,虽然你经常要尝试多种算法才能找出哪种方法对你有帮助,但Adam优化器确实是一种常见的优化方法,它也支持当今大多数机器学习框架。与Graves的RMSprop方法一样,它也基本上平滑了梯度。这个方法有些复杂,这里不讨论它是如何工作的。但总的来说,它确实是一个不错的选择。另一件值得注意的事情是值的初始化,尤其是内存。有些确实利用了快速训练神经图灵机引入的记忆偏差。但总的来说,这实际上是他们架构的一个有问题的特性。因为初始记忆会极大地影响以后的计算,所以如果您从一组错误的参数开始,它可能会完全破坏整个模型。与许多其他此类技术一样,它们有助于提高通用神经网络的性能。但是这种情况下,如果做的不对,很可能不会收敛,得不到合理的结果,所以要想合理优化,就得频繁尝试不同的参数值作为初始点.另一种方法,也是比较有趣的,是curriculumlearning,就是一开始就feed一些简单的数据。你从一个序列开始,让它学习将某些东西复制到一定长度,比如5。当它可以做到这一点时,你将长度增加到10,然后在某个时候,你达到一个新的长度,比如20,并且然后在某个时候你非常有信心你可以概括模型,所以正如我们之前看到的,将复制序列的长度增加到100或更多。现在我要继续进行最近的扩展。非常令人兴奋,如果我没记错的话,它几周前出现在《自然》杂志上。它以一些有趣的方式扩展了神经图灵机,并有助于解决一些问题。可微分神经计算机(参见机器之心文章《DeepMind 深度解读 Nature 论文:可微神经计算机》)或一些最近的模型本质上是经过一些修改的神经图灵机。在某种程度上,他们放弃了基于索引移动的寻址。我一直在谈论沿着记忆或磁带的运动。他们不再那样做了;他们试图根据他们看到的内容直接在内存中搜索给定的向量。它们还具有分配内存和释放内存的能力,如果您曾经使用过低级编程语言,就会明白这一点。以同样的方式,很难跟踪内存区域中的内容,这样您就不会在编程中出错,很容易将某些内存区域标记为不可访问,这样您以后就不会不小心删除它们,这有助于优化.他们还具有将序列输入到本地内存序列的能力。当神经图灵机学习复制时,它们会学习将所有输入按顺序写入内存,然后回到内存的开头读取它们。在这种情况下,他们在某种程度上具有某种形式的时间记忆,他们可以回忆起他们做的最后一件事,最后一件事的最后时间。事情等等,这意味着他们可以遍历他们需要做的事情的链表。这是可微神经计算机体系结构的总结。您在左侧看到的图表表示输入和输出变量的长度,然后读写头允许计算机访问内存。在这里您可以看到它一次读取整个向量并写入区域6。就像我之前描述的那样,内存区域在右侧有一个额外的时间链接。如果您追踪这些箭头,您会发现这些箭头实际上是模型能够回忆和重复其最近的输入和输出的方式。在这里,我们看到一张图片,展示了一台同样执行复制任务的可微分计算机。你看到的绿色方块是它写入内存的内容,紫色方块是它从内存中读取的内容。通常,当你给它一些序列时,如果你沿着左边看,你看到的是计算机正在释放某些内存区域,因为它需要写一些东西,所以这是在分配内存中,底部的方块显示了这个活动.然后,写入完成后,输出。然后,它会说,“好的,我们可以重新分配这块内存”。你会得到这种交替的模式,“我需要这段记忆。好吧,我完成了。我需要这段记忆......”但是DNC确实学会了这样做,那就是让事情变得更容易,让这些事情变得更简单更有趣。动态神经计算机在推理任务上的表现我见过的唯一让计算机看起来有点不同的例子是它们能够进行这种逻辑推理,尽管结合了某种模糊推理。您在这里看到的是您用来训练模型的家谱,本质上是“MaryisJodie'sdaughter”,或“SimonisSteve'sson”。所以,你问计算机:“Freya和Fergus是什么关系?”或者“Freya和Fergus之间的关系是什么?”答案是大叔,所以他们确实可以回答这个问题。如果你去看论文,你会发现一些有趣的例子,比如学习寻找最短路径,跨越伦敦地铁系统的图形结构等等,这些都很有趣。我这里没有相关的幻灯片,但是如果你有兴趣的话,我强烈推荐你去看看Nature上的这篇文章,链接如下:http://www.nature.com/nature/journal/v538/n7626/abs/nature20101.html动态神经计算机在bAbI数据集上也表现良好。bAbI数据集在过去一年左右的时间里有了很大的改进。你实际上会看到,除了少数几个,大多数最先进的模型都通过了bAbI数据集并且做得相当好。你看,DynamicNeuralComputing(DNC)只在两个领域失败了,它通过了所有其他领域,它可以与Facebook的模型相媲美,它设计得非常好,因为这些数据集是他们自己的数据集。这非常令人兴奋,你可以说只剩下少数几个领域需要解决了,这是我们以前无法解决的神经网络学习任务向前迈出的一大步。.谢谢你们。这里有一些参考资料;我推荐Theano、Lasagne和Go实现。我要推荐的列表中的最后一篇文章是一种使用更少内存使这些东西工作的方法,越来越接近在实际产品中实现神经图灵机所需的方法。本文由TallaCorporation的高级数据科学家DanielShank撰写。他最近在旧金山的机器学习会议上提交了一份关于神经图灵机的报告。原文:http://blog.talla.com/neural-turing-machines-perils-and-promise【本文为机器之心专栏原文翻译,微信公众号“机器之心(id:almosthuman2014)”】点此阅读该作者更多好文
