以下部分转载自 知乎呜哈哈 专栏
NTM github
图灵完备性:
在可计算性理论里,如果一系列操作数据的规则(如指令集、编程语言、细胞自动机)按照一定的顺序可以计算出结果,被称为图灵完备(turing complete)。
一个有图灵完备指令集的设备被定义为通用计算机。如果是图灵完备的,它(计算机设备)有能力执行条件跳转(if、while、goto语句)以及改变内存数据。 如果某个东西展现出了图灵完备,它就有能力表现出可以模拟原始计算机,而即使最简单的计算机也能模拟出最复杂的计算机。所有的通用编程语言和现代计算机的指令集都是图灵完备的(C++ template就是图灵完备的),都能解决内存有限的问题。图灵完备的机器都被定义有无限内存,但是机器指令集却通常定义为只工作在特定的、有限数量的RAM上。
图灵完备的语言,有循环执行语句,判断分支语句等。理论上能解决任何算法。但有可能进入死循环而程序崩溃。
图灵不完备也不是没有意义,有些场景我们需要限制语言本身。如限制循环和递归, 可以保证该语言能写的程序一定是终止的。
比特币的脚本系统是图灵不完备的,以太坊的智能合约系统是图灵完备的。各有优缺点,图灵不完备会更安全些,图灵完备会更智能些。
NTM论文
结构图如下所示:
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得到的向量进行一定的旋转位移。具体的插值是为了将前一时刻的权重引入进来,对新的权重进行一定修正,然后卷积是为了将每个位置的权重值向两边分散,也就是所谓的旋转位移,最后的锐化操作是将权重在进行突出化,大的值更大,小的值更小:
有了该权重向量之后,具体的读写操作就很简单了,读就是一个加权求和的操作,而写被分为忘记和添加两部分,分别使用两个向量参数来指定要抹去和添加信息的量。
和Memorynetwork的不同
(摘自MemNN论文)
NTM的位置较少 只有128个 Mem有14M的location去定位
在实验侧重上 NTM更关注于问题的sort,copy和recall Mem关注于语言和推理任务
但两者的出发点都是相似的 都是通过大型的、可定位的存储 去提升预测的能力