NTM是一种使用Neural Network为基础来实现传统图灵机的理论计算模型。利用该模型。能够通过训练的方式让系统“学会”具有时序关联的任务流。


论文:http://arxiv.org/abs/1410.5401
中文翻译:http://www.dengfanxin.cn/?p=60
ppt:http://llcao.net/cu-deeplearning15/presentation/NeuralTuringMachines.pdf
基于Theano的python语言实现1:https://github.com/shawntan/neural-turing-machines
基于Theano的python语言实现2:https://github.com/snipsco/ntm-lasagne
基于Torch的实现:https://github.com/kaishengtai/torch-ntm
基于Tensor Flow的实现:https://github.com/carpedm20/NTM-tensorflow
基于C#的实现:https://github.com/JanTkacik/NTM
基于JS语言的实现:https://github.com/gcgibson/NTM
GO语言实现:https://github.com/fumin/ntm
相关博客1:https://blog.wtf.sg/category/neural-turing-machines/
相关博客2 :https://medium.com/snips-ai/ntm-lasagne-a-library-for-neural-turing-machines-in-lasagne-2cdce6837315#.twrvqnda9
百度贴吧:http://tieba.baidu.com/p/3404779569
知乎中关于强人工智能的一些介绍:http://www.zhihu.com/question/34393952

1.图灵机

首先,我们来复习一下大学的知识,什么是图灵机呢?图灵机并非一个实体的计算机,而是一个理论的计算模型,由计算机技术先驱Turing在1936年提出(百度知道)
它包括例如以下基本元素:
TAPE:磁带。即记忆体(Memory)
HEAD:读写头,read or write TAPE上的内容
TABLE:一套控制规则,也叫控制器(Controller),依据机器当前状态和HEAD当前所读取的内容来决定下一步的操作。在NTM中,TABLE事实上模拟了大脑的工作记忆
register:状态寄存器。存储机器当前的状态。
例如以下图:
Neural Turing Machines-NTM系列(一)简述

2. 神经图灵机(NTM)

所谓的NTM,事实上就是使用NN来实现图灵机计算模型中的读写操作。其模型中的组件与图灵机同样。那么,NTM中是怎么实现的呢?

2.1 Reading 操作

假设t时刻的内存数据为,当中N为内存地址的数目,M为每一个内存地址向量的长度。


定义读取向量为
显然,的凸组合。

2.2 Writing 操作

写操作分解为顺序运行的两步:
1.擦除(erase)
2.加入(add)

式中的空心圆圈表示向量按元素逐个相乘(point-wise),显然,这里的指出了每一个分量将被擦除的量。举个简单的样例:
假设

假设不考虑相当于每一个分量将要被改动的权重。
假设要全然擦除一个分量。仅仅须要相应的都为1。

为0时,将不进行不论什么改动。
Write Head还须要生成一个长度为操作运行完之后,它将被“加”到相应的内存地址中。


t时刻的内存值将为:

显然,操作都是可微的,它们的组合操作writing也同样是可微的。writing能够对随意地址的元素值进行随意精度的改动。

3.NTM的寻址策略

有两种寻址策略,

3.1 Content-base(基于内容的寻址):

产生一个待查询的值即为待查询的值。
首先,须要进行寻址操作的Head(Read or Write)生成一个长度为M的key vector:
当中,越大。函数的曲线变得越发陡峭,焦点的范围也就越小。
类似度函数这里取余弦类似度:

3.2 Location-base(基于位置的寻址):

直接使用内存地址进行寻址,跟传统的计算机系统类似,controller给出要訪问的内存地址,Head直接定位到该地址所相应的内存位置。

对于一些对内容不敏感的操作,比方乘法函数,显然该操作并不局限于x,y的详细值。x,y的值是易变的。重要的是能够从指定的地址中把它们读出来。这类问题更适合採用Location-base的寻址方式。


基于地址的寻址方式能够同一时候提升简单顺序訪问和随机地址訪问的效率。我们通过对移位权值进行旋转操作来实现优化。

比如。当前权值聚焦在一个位置,旋转操作1将把焦点移向下一个位置,而一个负的旋转操作将会把焦点移向上一个位置。


在旋转操作之前。将进行一个插入改动的操作(interpolation),每一个head将会输出一个改动因子
显然,时。将全然依照Content-base方式进行寻址。
在上述的interpolation操作结束后,每一个head将会产生一个长度为N的移位权值向量
写成矩阵的形式例如以下:
Neural Turing Machines-NTM系列(一)简述
原始可改写为:
由于卷积操作会使权值的分布趋于均匀化,这将导致本来集中于单个位置的焦点出现发散现象。为了解决问题,还须要对结果进行锐化操作。详细做法是Head产生一个因子
通过上述操作后,权值分布将变得“尖锐”。
我们通过一个简单的样例来说明:
假设N=5,当前焦点为1,三个位置-1,0,1相应的权值为0.1,0.8,0.1,
所以有:


能够看出来,经过锐化处理后不同元素直接的差异变得更明显了(即变得“尖锐”了)。内存操作焦点将更加突出。

整个寻址的步骤例如以下图:
Neural Turing Machines-NTM系列(一)简述

通过上图的内存寻址系统。我们能够实现三种方式的内存訪问:
1.直接通过内容寻址,即前边提到的Content-base方式;
2.通过对Content-base产生的权值进行选择和移位而产生新的寻址权值,在这样的模式下,运行内存操作焦点跳跃到基于Content-base的下一个位置,这将使操作Head能够读取位于一系列相邻的内存块中的数据;
3.仅仅通过上一时刻的权值来生成新的操作地址权值,而不依赖不论什么当前的Content-base值。这将同意Head进行顺序迭代读取(比方能够通过多个时刻的连续迭代,读取内存中一个连续的数组)

3.3 控制器网络(Controller Network)

NTM的结构中存在非常多的自由參数。比方内存的大小。读写头的数目,内存读取时的位移的范围。可是最重要的部分还是控制器的神经网络结构。比方,是选用递归网络还是前馈网络。假设选用LSTM,则其自有的隐层状态能够作为内存矩阵的补充。

假设把Controller与传统计算机的CPU进行类比,则就相当于传统计算机的内存(RAM),递归网络中的隐层状态就相当于寄存器(Registers),同意Controller混合跨越多个时间步的信息。还有一方面,前馈网络能够通过在不同的时刻读取内存中同样的位置来模拟递归网络的特性。此外。基于前馈网络的Controller网络操作更为透明。由于此时的读写操作相比RNN的内部状态更easy解释。当然前馈网络的局限性主要在于同一时候存在的读写头数目有限。

单一的Read Head每一个时间步仅仅能操作一个内存向量,而递归Controller则可通过内部存储器同一时候读取多个内存向量。

相关文章:

  • 2022-01-15
  • 2021-07-06
  • 2021-11-26
  • 2021-12-28
  • 2021-05-20
  • 2021-07-24
  • 2021-11-01
  • 2021-08-11
猜你喜欢
  • 2022-01-09
  • 2021-08-21
  • 2022-01-11
  • 2021-10-08
  • 2021-09-20
  • 2021-08-17
  • 2022-02-23
相关资源
相似解决方案