首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解 RNN-神经图灵机(代码)

深入理解 RNN-神经图灵机(代码)

作者头像
用户1908973
发布2018-07-24 17:52:51
9130
发布2018-07-24 17:52:51
举报
文章被收录于专栏:CreateAMindCreateAMind

在写《深度学习与神经科学相遇》的过程中开始谈到了RNNs(Recurrent Neural Networks),我想很有必要暂停下来先对RNNs进行一些更深入的理解。当然,深度学习中有很多种网络结构,像多层网络结构(multi layered)可能大家比较熟悉,相信很多人接触神经网络是从下图这样的结构开始的,这也是deep learning中“deep”的来源。好友YJango也在专栏中写了一系列很好的介绍深层神经网络的文章,也以新颖的观点分析了深层学习为什么要deep。为了深入理解RNNs(也可能包含其他类型的网络),结合自身的学习经历和目前对深度学习的理解,我想分享一些我所认同的神经网络(甚至深度学习)的玩法(当前的一些fancy的研究),也借此机会梳理思路,同时希望能给读者有哪怕一点点的灵感,这也是写这个系列的初衷(同时也欢迎改进意见和讨论)。这个系列大概会分为三个部分:增强型的RNNs(augmented)、无监督的RNNs学习以及RNNs的训练与优化。

有趣的是,《生活大爆炸》第十季中,神经科学家Amy已经在用皮肤细胞诱导培养出神经元细胞群,如果这个idea可以实现,那这很可能是生物计算的一大突破。计算机科学家在捣鼓人工神经网络进行认知计算的同时,神经科学家们可能在训练真正的生物“神经网络”来进行语音、图像识别等任务了吧。

本文主要的reference是Google Brain的Chris Olah和Shan Carter所写的关于注意力机制和RNNs的Blog, 原文里有非常漂亮的动态图,想看英文的读者推荐直接阅读原文。另外Olah的blog超级赞,可以说是必看。

Citation: Chris Olah & Shan Carter, “Attention and Augmented Recurrent Neural Networks”, Distill, 2016. 可参看当天第二篇文章 http://distill.pub/2016/augmented-rnns/

引言

在某种意义上,有一张纸的人比没有的人更聪明,会使用数学符号的人可以解决不会使用数学符号的人所不能解决的问题。人类对计算机的使用让我们能够实现令人难以置信的成就,这些成就是不会使用工具的物种远远无法达到的。

一般来说,似乎很多有趣的智能形式是人类的创造力、具有启发性的直觉和一些更简洁和细致的媒介(media)之间的交互,如语言或方程(实际上都是语言,而所有的语言则都是特定的知识表示)。有时,媒介是物理存在的东西,并为我们存储信息,防止我们犯错误,或简化计算。在其他情况下,媒介可以是我们大脑中操纵的模型。无论如何,它似乎都是智能的根基。

我个人理解的这里所说的媒介,是知识表示(knowledge representation),无论是物体、光电信号还是数学符号等等,都是一样的。大脑可以把知识的表示凝聚到外界物体和信号之中,在视觉、听觉等感官系统的辅助下进行感知和推理,这样的能力是真正的人工智能必须具备的。也就意味着目前很多人所谓的“人工智能”都是狭义的。

机器学习最近的研究成果开始有些这种味道,将神经网络所带来的直觉(intuition)与别的东西相结合。其中一种方法可以称为“启发式搜索”。例如,AlphaGo(Silver, et al., 2016)有一个模型学习围棋怎么工作,并通过另一神经网络的直觉和探索来指导它采取措施。类似地,DeepMath(Alemi, et al., 2016)使用神经网络作为操纵数学表达式的直觉。我们在本文中讨论的“增强的RNN”是另一种方法,其中我们将RNN连接到被精心加工过的媒介,也就是通过我们说的记忆模块,以便扩展它们的一般能力。

其实无论怎么结合,首先逃离不了“表征学习”,其次,任何形式的结合无非是给网络增加了相互作用的成本函数(或者目标函数),他们的本质都是“多目标函数的动态交互”,这与《深度学习与神经科学相遇》中“大脑优化复杂的成本函数”观点一致,这也是我在读那篇paper之前最开始的intuition,我的思考都将follow这个观点。

RNNs无疑是深度学习的主要内容之一,它允许神经网络处理序列数据,如文本、音频和视频。 它们可以用于将序列编码至不同层级的理解(抽象层次不同的知识表示)、标注序列,甚至从头开始生成新序列。

一个RNN cell在处理序列数据时一直被重复使用,share weights。虽然我认为读者都应该知道这一点,但是考虑到可能有刚开始学的同学看,所以提一下。

然而,简单的RNNs(vanilla version)是存在很多缺陷的,直到出现LSTM,增加了gates使得gradient vanishing不在成为问题。前几天还看到关于LSTM之父 Sepp Hochreiter and Jürgen Schmidhuber(尤其后者)如今并没有很大名气的讨论,大家有兴趣也可以了解一下。如今所有state-of-the-art的RNNs几乎都在使用LSTM。关于理解LSTM,推荐Olah's Blog

在这基础之上出现了很多更加powerful的增强型RNNs,这些研究都是非常激动人心的。而这其中我们主要讨论以下4种:

本质上,它们都是RNNs的扩展,并且它们甚至可以组合在一起使用,这是由于注意力机制的使用将它们联系在了一起。Attention将是RNNs发展史上一个非常重要的里程碑。这四种模型都是非常酷的,但由于时间和篇幅关系,我们先从Neural Turing Machine开始,剩下的在后续文章中讨论。也算是为了弥补我之前没有那么成功的NTM分享经验。

神经图灵机 - Neural Turing Machines

NTM(Graves, et al., 2014)在一个很高的层面上构建神经计算模型,作为图灵机的实现。核心思想是在RNNs的基础上augment记忆模块。张量是神经网络的语言,因此记忆模块就是一组张量,具体地,原文使用一组向量来表示。实际上,只要可以保持一致性,使用一个高斯分布表示一个记忆单元也是可以的。

这里A被称作controller(图中是在处理序列数据,有个错误,最后应该是x3,y3), 可以是FNNs(feedforward neural networks),也可以是RNNs,但RNNs能实现更多操作,因为它是Turing Complete的。

那么,里面的读、写操作如何工作呢? 面临的挑战是,我们要使它们可微(differentiable)。 特别地,我们希望使它们相对于我们读取或写入的位置是可微的,以便我们可以学习读取和写入的位置。 这是棘手的,因为内存地址似乎是根本上离散的。 NTM采取一个非常聪明的解决方案:每一步,他们读写无处不在,只是程度不同。

这里的idea是非常general的,那就是把离散操作转化为可微分的操作,核心是使用稀疏的连续性(sparse continuity)去表示离散(discreteness),这个概念并不新颖,但在神经网络中它将会变得很重要,也很常见。

例如,在读取记忆的过程中, 与其指定单个位置,RNN给出“注意力分布”,其描述了我们关心不同存储器位置的程度的量。 这样,读取操作的结果是每个位置记忆内容的加权和。

同理,写入记忆的过程也是使用一个“写入注意力分布”,每个位置都写,只是写的程度不同,那么这里就涉及到如何在一定程度结合新的记忆内容和老的记忆内容,作者使用的是新老内容的convex combination,满足凸性的线性组合就行,一个非常简单的函数是:(单个记忆位置)

,

就可以看做“遗忘率”,等于1的时候久的记忆将被抹去。

但是NTM如何决定在记忆中的哪些位置需要他们的注意力? 他们实际上使用两种不同方法的组合:基于内容的注意和基于位置的注意。 基于内容的关注允许NTMs通过他们的内存搜索,并专注于匹配他们寻找的地方,而基于位置的注意允许内存中的相对移动,使NTM可以循环整个记忆。这个过程Olah他们的博客中一图解释得很清楚。

整个NTM工作的过程一目了然,里面有个卷积操作比较有意思,稍微有点tricky,大家可以去原文里看,叫circular convolution

之所以我说NTM是具有里程碑式意义的,是因为这种读写能力允许NTM执行许多简单的算法,这是超越传统神经网络的。 例如,他们可以学习在存储器中存储长序列,然后在其上循环、重复它。 当他们这样做,我们可以看到其在哪些位置进行读写以更好地了解NTM在做什么。一定意义上,作为图灵机的实现,它具有实现目前计算机能使用的所以算法,并且它是可学习的。不过要实现这个目标还有很多工作要做。

自从原始的NTM论文,目前已经有一些令人兴奋的文章探索类似的方向。 神经GPU(Kaiser&Sutskever,2015)克服了NTM无法添加和乘数的问题。(Zaremba&Sutskever,2016)训练NTMs使用强化学习,而不是原始使用的可微分的读/写。 神经随机存取机器(Kurach et al.,2015)基于指针工作。(这就是模仿我们现在使用的计算机内存) 一些论文已经探索了可微分的数据结构,如堆栈和队列(Grefenstette等人2015; Joulin&Mikolov,2015)。 和记忆网络(Weston et al.,2014; Kumar et al.,2015)是解决类似问题的另一种方法。

在某些客观意义上,这些模型可以执行的许多任务 - 例如学习数的加法 - 客观上并不是很困难。 传统的搞程序合成的小伙伴会像吃午饭一样简单地解决这种问题。 不过,神经网络能够做许多其他的事情,像神经图灵机模型已经跨越了一个非常深刻的神经网络能力限制。我们可以明显地看出,神经网络可以不用“deep”,但却可以完成更加复杂的任务,这是从感知能力到推理能力的跨越。DeepMind最新的基于NTM的架构是DNC - Differentiable Neural Computer,改善了NTM的记忆读写机制,可以看作神经版的NTM,里面有不少有趣的东西,后面有空可以结合代码解读写一期。很快地我们将会看到不同网络的各种结合,通过引入多目标函数来整合感知能力和推理能力。

开源代码

计算机科学,无疑动手实践很重要,参考之后这些实现之后应该自己实现一遍

Neural Turing Machine include Taehoon Kim’s(TensorFlow), Shawn Tan’s (Theano), Fumin’s(Go), Kai Sheng Tai’s (Torch), Snip’s (Lasagne);

Differentiable Neural Computer: Mostafa-Samir(TensorFlow)

Code for the Neural GPU: TensorFlow Models repository;

Memory Networks include Facebook’s (Torch/Matlab), YerevaNN’s (Theano), and Taehoon Kim’s (TensorFlow).

作者:https://www.zhihu.com/people/jeven-zhang/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CreateAMind 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 神经图灵机 - Neural Turing Machines
  • 开源代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档