有记忆会推理的可微分神经计算机,DeepMind现在开源了代码
王新民 编译自 GitHub 量子位 报道 | 公众号 QbitAI
去年10月,Google旗下DeepMind在《Nature》上发布第三篇论文,宣布搞出了可微分神经计算机(Differentiable Neural Computer,DNC)。
通过把神经网络和可读写的外部存储器进行结合,可微分神经计算机这种混合学习型神经网络,既能像神经网络那样进行学习,又能像计算机那样处理复杂数据。
可微分神经计算机类似一个可微分的函数,能够成功理解复杂的图形结构,比如家谱图或者是交通网络。
在实验中,DNC可以在没有现成知识的情况下,规划出最佳的伦敦地铁线路,或根据符号语言所描述的目标来解决方块拼图问题。
也正是如此,可微分神经计算机时常被描述为拥有“短期记忆”,具备“推理能力”,在某种程度上更接近人类大脑的能力。
现在,DeepMind把相关代码公布在GitHub上。
原理介绍
目前深度学习的能力更多体现在模式识别,未来人工智能的发展,一定会要求神经网络模型具备推理的能力。
而推理有一个关键的前提:记忆。此前DNC项目负责人Alex Graves表示,“神经网络的记忆受到计算本身的约束,我们决定通过分离存储器的方式让它变得更强大”。
可微分神经计算机(Differentiable Neural Computer,DNC)是一种特殊的循环神经网络。在每个迭代周期里,其状态包含的信息由当前存储器内容和存储器用量等辅助信息共同构成,并且可以在时间t
将当前输入通过线性变换映射到输出上。这种神经网络通过集合RNNCore
模块,改变原有神经网络的结构,将不同模块首尾相接,来测试新网络结构的性能。
▪ access
模块是可微分神经计算机做出逻辑判断的主要位置,因为这是存储器写入和读取的地方。在每个迭代周期里,access
模块的输入是一个由控制器模块controller
传递来的向量,其输出是从存储器中读取的相关内容。它还进一步加入了两个新的RNNCore
模块:模块TemporalLinkage
用来跟踪信息在存储器中写入的顺序,Freeness
用来跟踪哪些信息在存储器中被写入以后没有及时释放,记录存储器对应位置。以上这些功能都定义在addresses.py
中。
▪ controller
模块控制着存储器访问路径。通常情况下,这个模块只是一个前馈LSTM网络或是深层LSTM网络,其输入是在那个时刻整个循环神经网络的输入,与在前一个迭代周期里access
模块中读取存储器的输出相连。
▪ dnc
模块只是简单地对access
模块和controller
模块进行包装,并形成整体结构里的基本RNNCore
单元。这些功能被定义在dnc.py
中。
△ DNC的结构
训练过程
实现可微分神经计算机需要安装TensorFlow库和Sonnet库。DeepMind提供了一个网络训练的脚本示例,此算法可以用于循环复制一个给定的输入字符串。这可以从python中用命令行进行执行:
$ ipython train.py
当然您可以直接选定训练过程的参数,包括模型参数和优化器参数:
$ python train.py --memory_size=64 --num_bits=8 --max_length=3
# 在ipython下执行
$ ipython train.py -- --memory_size=64 --num_bits=8 --max_length=3
定期保存或创建“检查点”的功能在默认情况下会被禁用,可以通过checkpoint_interval
标记来启用。当checkpoint_interval
的值设置为10000
时,程序将保证每10,000个训练步骤后创建一个检查点。在默认情况下,该模型将会被保存到/tmp/tf/dnc/
。我们可以加载该文件来恢复训练,也可以使用checkpoint_dir
标志来更改自动保存的位置。需要注意的是,在使用不同的模型参数恢复训练之前,要确保已经删除/tmp/tf/dnc/
路径下的文件,以避免由于网络参数不一致导致的错误。
通常来说,在dnc.py
中定义的DNC
类可以用作TensorFlow rnn的标准内核,并在任何时序训练任务上用TensorFlow rnn ops来展开,如tf.nn.dynamic_rnn
函数。
声明:这不是一个Google官方产品。
官方案例
之前在《Nature》发布的论文中,DeepMind还展示了一下可微分神经计算机的能力。
比如可以理解人类编写的故事。故事中包括这样的句子,“约翰在游乐场”,“约翰拾起了足球”等。当你问”足球在哪里”时,模型能够给出正确答案。
可微分神经计算机还能从家谱中理清人物关系。在家族树中,DeepMind展示了DNC可回答需要复杂指令的问题。比方说,即便只描述该网络的父母、子女和兄弟姐们关系,也能够回答“谁是某人妈妈的叔祖父?”这样的问题。
另外一个例子就是寻找地铁线路。在描述了伦敦地铁的站点和线路之后,就可以让DNC回答类似“从Bond街出发,顺着Central线沿某方向走一站路,然后沿Circle线按某方向走4站,再沿Jubilee线按某方向走2站,最后你会到达哪一站?”
或者针对“如何从Moorgate去到Piccadilly Circus?”这样的问题,可微分神经计算机可以规划出路线。
相关评论
对于可微分神经计算机展现出的能力,不来梅大学计算机科学家Herbert Jaegar说:“我认为这可以说是理性的推理。这些任务涉及到将信息规划和组织成块,并重新组合它们”。
Herbert Jaegar认为可微分计算机表明,AI技术正在快速推进。未来计算机将不再局限于逻辑性的任务,人脑能够完成的事情,物理系统同样可以完成。他说:“计算机的能力已经接近人类,甚至在某些方面超过了人类。这只是个时间和投资的问题”。
不过Facebook人工智能研究员田渊栋在知乎和他的博客上表示,这个模型复杂、手工设计太多、实验相对简单,以及没有在大规模数据集上测试性能。
“技术上来说,我觉得它是隐含地学到了搜索的启发式函数(heuristic function),并且成功地应用于一些需要小规模搜索的任务当中。至于通用化,可能还需要再走很长的路”,田渊栋表示Facebook也有类似的研究,例如MemNet。
相关地址
GitHub地址:
https://github.com/deepmind/dnc
《Nature》原文:
- 请求跨域的解决方案
- 运用Kubernetes进行分布式负载测试
- Spring Cloud(五)断路器监控(Hystrix Dashboard)
- 微信技术团队的又一力作,WCDB 简单易用的数据库框架
- Redis特性和应用场景
- Spring Cloud(四)服务提供者 Eureka + 服务消费者 Feign
- 智能下拉刷新框架-SmartRefreshLayout
- Spring Cloud(三)服务提供者 Eureka + 服务消费者(rest + Ribbon)
- Spring Cloud(二)Consul 服务治理实现
- Spring Cloud(一)服务的注册与发现(Eureka)
- Shard 分片集群
- 面试官最爱的volatile关键字
- 玩转 WebView ,突破系统限制,让缓存更简单,更灵活
- Mycat 读写分离 数据库分库分表 中间件 安装部署,及简单使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [译] 在 Vue 组件中分离 UI 和业务逻辑
- Android Notes|BottomNavigationView 爱上 Lottie
- Android Notes|玩转 ShapeableImageView
- 前端技术 Webpack(学习 Webpack 的原因,Webpack 快速入门)
- 每日一问第1期 | 截取字符串
- 动态规划此一篇就够了 万字总结
- 每日一问第2期 | final, finally, finalize 的区别?
- 当return遇到try、catch、finally时会发生什么?
- 五分钟C语言数据结构 之 二叉树层次遍历
- 为何IntelliJ IDEA比Eclipse好在哪里?
- 五分钟C语言数据结构 之 二叉树中序遍历
- Django 安全之跨站点请求伪造(CSRF)保护
- 五分钟C语言数据结构 之 二叉树先序遍历
- Java 语言基础(常用设计原则和设计模式,常用 Java 8~11 新特性)
- 五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)