基于Sonnet,DeepMind开源可微神经计算机实现包
选自Github
机器之心编译
参与:蒋思源
去年 DeepMind 在自然期刊上曾介绍过一种记忆增强式的神经网络形式-可微神经计算机。而近日,DeepMind 开源了可微神经计算机的实现,该实现是基于 TensorFlow 和可在 TensorFlow 中快速构建神经网络的 Sonnet。
项目地址:https://github.com/deepmind/dnc
机器之心报道的可微神经计算机:
业界 | DeepMind 深度解读 Nature 论文:可微神经计算机
资源 | DeepMind 提出的可微神经计算机架构的 TensorFlow 实现
该开源包提供可微神经计算机(论文发表在自然期刊)的实现。
任何使用源代码展现该研究成果的出版物必须引用「Hybrid computing using a neural network with dynamic external memory」, Nature 538, 471–476 (October 2016) doi:10.1038/nature20101。
简介
当研究者设计 DNC 时,他们想要机器能够学习自己构建和引导复杂的数据结构。DNC 的核心是一个被称为控制器(controller)的神经网络,其类似于计算机中的处理器。控制器的作用是获取输入、读取和写入记忆、以及生成可以被解读为答案的输出。而其记忆(memory)则是一个位置(location)的集合,其中每个位置都存储了一个信息向量。
控制器可以在记忆上执行多种操作。在每一个时钟,它都会选择是否写入记忆。如果它选择写入记忆,它可以选择将信息存储在一个新的、未经使用过的位置或已经包含了该控制器正在搜索的信息的位置。这让控制器可以更新一个位置所存储的内容。如果记忆中所有的位置都用尽了,该存储器可以决定释放一些位置,这就像计算机可以重新分配不再需要的存储空间一样。当该控制器执行写入时,它会发送一个信息向量到记忆中被选中的位置。每一次写入信息时,这些位置都会被关联链接(links of association)连接起来,这代表了信息被存储的顺序。
除了写入,控制器也可以从记忆中的多个位置读取信息。它可以基于每个位置的内容对记忆进行搜索,即可以通过关联时间链接(associative temporal links)向前和向后回调以顺序或反序写入的信息。其读取出的信息可被用于生成问题的答案或在某个环境中要采取的行动。总的来说,这些操作让 DNC 可以选择如何重新分配记忆、在记忆中存储信息、以及轻松地找到存储在记忆中的信息。
架构的图示。其神经网络控制器可接收外部输入,并基于这些输入通过读取和写入操作(这些操作被称为 head)与记忆进行交互。为了帮助控制器引导记忆,DNC 会存储「时间链接(temporal links)」以追踪内容被写入的顺序,DNC 还会记录每个记忆位置的当前「使用(usage)」水平。
可微神经计算机是一种循环神经网络。在每一个时间步中,它的状态由当前记忆内容和诸如记忆使用的辅助信息组成,并将在时间 t 的输入映射到时间 t 的输出。该架构能作为 RNNCore 模块的集合而实现,RNNCore 允许将不同的模块嵌入到一起以试验架构上的变体。
访问模块(access module)是主 DNC 逻辑发生的地方,因为其是记忆写入和读取的位置。在每一时间步,访问模块的输入是从 controller 传递的向量,而输出是从记忆读取的内容。该模块使用两个更深的RNNCores :TemporalLinkage 追踪记忆写入的顺序,Freeness 追踪哪些记忆位置已经被写入,并没有随后「被释放」。这些都在 addressing.py 定义了。
控制器模块(The controller module)「控制」记忆的访问。通常情况下,其为一个前馈或 LSTM 网络(可能是深层网络),该模块的输入是整个循环神经网络的即时输入,其与前一时间步访问模块的读取记忆输出相级联。
DNC 将简单地封装访问模块和控制模块,并形成整个架构的基本 RNNCore 单元。这一部分在 dnc.py。
训练
DNC 要求安装 TensorFlow 和 Sonnet。下面提供了一个示例训练脚本,该示例可以使用 python 解释器运行:
$ ipython train.py
通过 flags 你能够指定训练选项,包括模型参数和优化器:
$ python train.py --memory_size=64 --num_bits=8 --max_length=3
# Or with ipython:
$ ipython train.py -- --memory_size=64 --num_bits=8 --max_length=3
定期保存或「检查点」在模型默认情况下是禁用的。如需要启用它,请使用 checkpoint_interval flag。例如--checkpoint_interval=10000 将确保每 10000 步将创建一个检查点。该模型默认将检查点放入/tmp/tf/dnc,从这里可以恢复训练。要指定替代检查点目录,需使用 checkpoint_dir flag。请注意,在不同模型参数恢复训练之前需要确保 /tmp/tf/dnc/ 已经删除,以避免参数分布不一致错误。
更一般的,在 dnc.py 找到的 DNC 类可以用作标准 TensorFlow RNN 内核,并可以使用 TensorFlow rnn ops 展开,例如在任何序列任务的 tf.nn.dynamic_rnn。
免责声明:该开源包不是谷歌官方产品。