记忆网络之Neural Turing Machines

记忆网络之Neural Turing Machines

前面介绍了Memory Networks相关的几篇文献,接下来让我们从新回到Memory的起点,也就是DeepMind在14年发表的“Neural Turing Machines”这篇论文。这是第一篇提出使用外部memory模块来增强神经网络记忆能力的论文,我将结合Tristan Deleu的博客对该论文进行介绍。(因为论文很长,前面两章都是从历史根源或者神经学发展论述的,感兴趣的可以直接从论文第三章看,然后第四章就已经是实验验证了==)。

在开始介绍NTM之前,我们先来看一下其与LSTM的区别。首先LSTM通过输入门、忘记门、输出门来控制hidden state中保存的信息,门控方法改进了RNN的梯度弥散和梯度爆炸现象,从而实现长期记忆的功能。但是其在每一步更新过程中所有的隐层向量都会被更新,h的频繁更新,导致其无法记录更长久的信息。而且hidden_size也限制了模型记忆信息的容量。而memory-augmented的网络通常只对某些相关的memory进行修改(通过特定的寻址读写机制),而不会同时修改所有的memory的值,这就使memory networks可以记录更长的依赖关系,而且外部的记忆矩阵可以方便的扩大模型的记忆空间,从而存储更多的信息量。举个最简单的例子,下面第一个图是NTM的结果,第二个图是LSTM的结果,每个子图下面的是预测,上面的是真实值。对比可以发现LSTM在序列长度为30的时候就已经无法正常预测,而NTM在序列长度为50的时候还可以预测的很好。

NTM的架构很简单,就是有一个controller和一个memory矩阵,controller主要负责根据输入对memory进行读写操作,从而实现记忆的更新,可以使用简单的前向神经网络或者RNN来作为controller的模型,前向神经网络计算复杂度较低,而且更加透明,但是因为比较简单所以会限制NTM模型在每个time step里的计算类型。而选用RNN作为controller的话,其本身就存在一个内部记忆,如果将其比作计算机的话,LSTM就是CPU,其内部hidden state就是寄存器,负责对内存进行读写,而memory矩阵就是内存。使用RNN的好处是通过内部记忆扩展读写规模,不会受到每个时间步都被单次读写的限制。结构图如下所示:

controller主要负责将输入转变为中间表示,然后根据该向量选择出应该要读写的memory location即可,下面我们看一下addressing寻址机制。本文提出了两种addressing机制,content-based addressing和location-based addressing,后者主要是针对在某些情况下变量是任意的但仍然需要寻址和表示,所以引入location-based addressing以增强模型的适用范围和泛化效果。整个addressing的流程如下图所示,包含content addressing,Interpolation,Convolutional shift, Sharpening四个部分。

首先在content addressing中,计算kt与相应memory Mt之间的相似度(使用余弦相似度进行度量),然后根据权重bate计算归一化的重要性得分,如下图所示:

然后对前一时刻的权重wt-1按照门控值g进行差值(Interpolation),公式如下所示:

经过插值之后对新的权重向量进行循环卷积,这里实现的功能主要是对权重进行旋转位移,比如当前的权重值关注于某一个location的memory,经过此步就会扩展到其周围的location,使得模型对周围的memory也会做出少量的读和写操作。循环卷积(关于循环卷积的解释可以看一下这个博客,有比较直观的例子进行介绍)的公式如下所示:

但是循环卷积往往会造成权重的泄漏和分散,为了解决这个问题,需要在经过一层锐化(sharpening)操作,其公式如下所示;

这样就得到了新的权重向量,可以根据该向量进行相应的读写操作,对记忆进行修改。我们可以结合下图对上面四个操作的功能有一个直观的理解和认识,第一个操作是根据输入得到每个memory location的相关性计算,后面三个操作是为了实现location-based addressing的作用,也就是将content-based得到的向量进行一定的旋转位移。具体的插值是为了将前一时刻的权重引入进来,对新的权重进行一定修正,然后卷积是为了将每个位置的权重值向两边分散,也就是所谓的旋转位移,最后的锐化操作是将权重在进行突出化,大的值更大,小的值更小:

有了该权重向量之后,具体的读写操作就很简单了,读就是一个加权求和的操作,而写被分为忘记和添加两部分,分别使用两个向量参数来指定要抹去和添加信息的量。

这样我们就分析完了模型的主要部分,可见其余Memory Networks思路上还是一致的,都是使用外部的记忆来扩展模型能力,而且都包含对memory的读取和修改功能。本文的实现方案可以参考https://github.com/carpedm20/NTM-tensorflow,不过我感觉该方案有些地方写的比较多余,个人看法==就不具体介绍代码了,感兴趣的可以看一下,跑跑试试~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章