NTM/DNC | 神经图灵机/可微分神经计算机

Chapter 1. NTM原理初探

NTM是Neural Turing Machine的缩写,中文翻译为神经图灵机

RNN的使用特别普遍。

越来越多人尝试采用新属性来增强RNN,其中,有四个令人兴奋的方向:

  • 神经图灵机:提供了可读写的外部记忆
  • 注意力接口:让RNN仅关注部分输入
  • 自适应计算时间:允许每个step有不同的计算量##
  • 神经编程机:可以调用函数,运行时建立新的程序

单独来说,这些技术都是RNNs的有效扩展,但真正令人吃惊的是,它们可以组合在一起,而且似乎只是更广阔空间中的点。此外,它们都依赖于相同的基本技巧——注意力——才能奏效。我们猜测,在未来几年,这些“增强的RNNs”将在扩展深度学习能力方面发挥重要作用。

神经图灵机将RNN与外部存储库相结合。

在Memory中,信息以向量组的形式存储。

NTM_Image1.png

每一个时刻,网络执行一次读操作,同时接收来自外界的输入,然后执行写操作,最后网络和Memory都进入下一状态。

下面解释读写操作具体如何进行。关键问题在于,如何使这个过程“可微(differentiable)”——这样就可以用BP算法学习了。

目标:学习应该读哪里、写哪里——在读写位置方面要是可微的。但读写位置是离散的,因此这似乎很困难。
NTM对此采取了一个非常聪明的解决方案:每一步,它们在每一处读写,只是程度不同。

下面以具体例子来说明:

对于读过程而言。RNN不是指定单独某个位置,而是输出一个“注意力分布”,描述我们如何分配对不同记忆位置的注意。因此,读取操作的结果是加权和。

NTM_Image2.png

输入的不同位置是不同的向量,对不同输入位置分配不同的注意力,即权重,越关注某个向量,则该向量越重要,它的权重越大,在对输出的影响也越大。

同样,我们在所有位置进行不同程度的写入。注意力分布描述了我们在每个地方写入的程度。Memory中某个位置的新值为该位置的旧值与写入值的线性组合(Convex Combination),两者的占比由注意力权重决定。

NTM_Image3.png

下面介绍NTM如何决定聚焦注意力的位置。

事实上,HTM用了两种不同方法的组合:

  • content-based attention 基于内容的注意力
  • location-based attention 基于位置的注意力

基于内容的注意力:NTM搜索Memory,寻找内容匹配的位置并聚焦注意力。
基于位置的注意力:NTM进行Memroy中注意力的相对移动,这使得NTM能够执行循环操作。

NTM_Image4.png

step 1. “RNN控制器”给出一个“查询向量(query vector)”,内存中的每一个向量与查询向量对比得到相似度评分。相似度评分计算方式为向量点积。
step 2. 利用softmax算子对所有评分进行运算,得到分布值。
step 3. “RNN控制器”给出插量(interpolation amount)将上一时刻的注意力分布值插进当前分布值。插量指示了旧注意力分布值的占比。
step 4. “RNN控制器”给出了移位滤波器(shift filter)。分布值与移位滤波器进行卷积。这一步用于注意力的转移。
step 5. 锐化分布值,得到新注意力分布值。该注意力分布值将用于读写操作。

问题:
查询向量、插量、移位滤波器怎么得来?插量、移位滤波器为什么要存在?step 5中具体如何锐化分布值?

这种读写能力允许NTM执行许多简单的算法,这在以前超出了神经网络的能力范围。

目前NTM可以执行哪些简单的算法?

例如,NTM可以学习在内存中存储一个很长的序列,循环遍历并返回对应值。

NTM_Image5.png

NTM还可以学习模仿查询表,甚至学习对数字排序(尽管存在作弊嫌疑)!另一方面,NTM仍然不能做很多基本的事情,如加法或乘法。

自从最初的NTM论文发表以来,已经有许多令人兴奋的论文在探索类似的方向。神经GPU克服了NTM不能加和乘数字。Zaremba & Sutskever使用强化学习来训练NTMs,而不是原始的可微分读写。神经随机存取机[6]是基于指针的。一些论文探索了可微数据结构,如栈和队列。内存网络是解决类似问题的另一种方法。

从某种客观意义上说,这些模型可以完成的许多任务——比如学习如何添加数字——在客观意义上并没有那么难。传统的程序综合社区会把它们当作午餐。但是神经网络可以做很多其他的事情,像神经图灵机器这样的模型似乎已经打破了对它们能力的一个非常深刻的限制。

参考资料
[1] Olah, Chris, and Shan Carter. "Attention and augmented recurrent neural networks." Distill 1.9 (2016): e1. https://distill.pub/2016/augmented-rnns/

软件测试

在代码重构过程中,有一个核心的步骤就是测试。

简单调研了一下常用软件测试工具后,决定使用google test这个工具进行软件测试。下面对所搜索到的资源做一个简单记录,以便日后查阅。


google test和googel mock有什么区别?

googletest 是一个类似于 unittest等的单元测试框架。可以对,类,函数等的功能进行测试。很好用。googlemock 是googletest的一个辅助框架,用于当类(A)没有编写时,造一个假类(MockA)模拟A的操作,以免必须A完成后才能测试。当然MOckA和A的接口要协商好,以免二者不匹配。一般情况下只用googletest 就可以了。


玩转Google开源C++单元测试框架Google Test系列(gtest)

论文泛读 | 谷歌AI预测源代码

Google开发了一个算法,用于编程时的源代码预测。
程序员再也不怕需求改来改去!谷歌大脑新突破:AI预测源代码

具体来说(举一个例子):

AI预测代码-图片1.png

且看State 2,当代码状态处于State 2时,预测的修改表征Likely Edit 3有两种可能,一是t=3: INSERT ', 1',二是t=3: DELETE ', y',那么应该选择哪种修改方式呢?取决于历史状态。历史状态State 0如果是History A,则预测为前者;如果是History B,则预测为后者。

【MARK】这让我联想到了HTM的序列预测模型。不过不同的是,HTM的输入对象和预测对象是同一类对象,而这里预测对象(可能的编辑)和输入对象(代码状态)是不同的对象。是否可以改进HTM网络的模型,使之更普适,也能兼容如是情形,进行代码预测呢?

比较感兴趣的关键问题:

  1. 是否建立了数据集?如果有,下载下来,可作为实践的根据。
  2. 如何表示代码状态和编辑内容?若要利用HTM进行实现,需要首先明确这个问题。
  3. 评价标准是什么?准确率?怎么定义准确率?

[转载] 如何阅读paper

论文阅读一直是科研过程中至关重要的一环,如何收集论文,快速选取和课题匹配的论文,高效地把握论文核心思想是每个科研人员的必备素养,也是每个科研萌新(硕士研究生)苦恼的问题。
台湾国立清华大学的彭明辉教授曾出版过一份《研究生手册》,其中关于论文阅读的内容详实精彩,将其整理如下,希望对大家有所帮助。


- 阅读剩余部分 -

[转载] 蒲慕明给实验室的一封信

“大约10年前,著名华人生物学家蒲慕明先生曾经有一封邮件在网上广为流传,这封邮件是蒲先生语重心长写给自己实验室所有博士和博士后的,其中的观点我完全赞同。无论是在普林斯顿还是在清华大学,我都把这封邮件转发给实验室的所有学生,让他们体会。”
——施一公

“所有成功的科学家一定具有的共同点,就是他们必须付出大量的时间和心血。这是一条真理。实际上,无论社会上哪一种职业,要想成为本行业中的佼佼者,都必须付出比常人多的时间。”
——蒲慕明



- 阅读剩余部分 -