随着人工智能的发展,现代科技公司的终极目标是构建无需人类介入、能够自我思考的 AI 软件。
亚马逊首席技术官 Werner Vogels 在周二的一篇博客文章中表示,亚马逊网络服务公司(AWS)刚刚选择 MXNet 作为其最主要的深度学习框架。
《财富》今年 9 月的一篇深度长文回溯了深度学习推动的人工智能在整个计算生态系统引发的革命,如文章所述,深度学习是 AI 的一个子集,包含神经网络的使用。神经网络在算法(而非人类程序员)的帮助下通过处理大量数据来学习并解决问题。
Vogels 表示,AWS 将为 MXNet 及支持其生态系统的其他公司提供软件代码、文档和开发资金。虽然他同时表明,该公司也支持其他深度学习框架,包括 Caffe、CNTK、TensorFlow 和 Torch,但显然在 MXNet 加入后,其他这些框架会被放到次要位置。
TensorFlow 和 CNTK 框架分别是谷歌和微软开发的,Caffe 则来自加州大学伯克利分校的伯克利人工智能研究实验室。
MXNet 的消息恰在亚马逊云服务的年度 AWS RE:Invent 大会前一周发布,亚马逊的高管将在大会上讨论人工智能带来的机会,以及他们将亚马逊的个人助理 Alexa 的工具开放给 AWS 开发者的计划。
为了实现 AI 的终极目标,亚马逊及其竞争对手也在追求尽可能大的数据集。
所以,如果你想知道亚马逊、微软、苹果以及谷歌公司分别从 Alexa、Cortana、Siri 和 Google Home 中得到了什么,记住这一点:所有使用这些智能设备和应用的人都在向这些公司提供非常有价值的数据,应用于这些面向未来的项目。
MXNet 设计和实现简介
神经网络本质上是一种语言,我们通过它来表达对应用问题的理解。例如我们用卷积层来表达空间相关性,RNN来表达时间连续性。根据问题的复杂性和信息如何从输入到输出一步步提取,我们将不同大小的层按一定原则连接起来。近年来随着数据的激增和计算能力的大幅提升,神经网络也变得越来越深和大。例如最近几次imagnet竞赛的冠军都使用有数十至百层的网络。对于这一类神经网络我们通常称之为深度学习。从应用的角度而言,对深度学习最重要的是如何方便地表述神经网络,以及如何快速训练得到模型。
对于一个优秀的深度学习系统,或者更广来说优秀的科学计算系统,最重要的是编程接口的设计。他们都采用将一个领域特定语言(domain specific language)嵌入到一个主语言中。例如numpy将矩阵运算嵌入到python中。这类嵌入一般分为两种,其中一种嵌入的较浅,其中每个语句都按原来的意思执行,且通常采用命令式编程(imperative programming),其中numpy和Torch就是属于这种。而另一种则用一种深的嵌入方式,提供一整套针对具体应用的迷你语言。这一种通常使用声明式语言(declarative programming),既用户只需要声明要做什么,而具体执行则由系统完成。这类系统包括Caffe,theano和刚公布的TensorFlow。
这两种方式各有利弊,总结如下:
命令式编程:
如何执行 a=b+1: 需要b已经被赋值。立即执行加法,将结果保存在a中。
优点: 语义上容易理解,灵活,可以精确控制行为。通常可以无缝地和主语言交互,方便地利用主语言的各类算法,工具包,debug和性能调试器。
缺点: 实现统一的辅助函数和提供整体优化都很困难。
声明式编程:
如何执行 a=b+1: 返回对应的计算图(computation graph),我们可以之后对b进行赋值,然后再执行加法运算
优点:在真正开始计算的时候已经拿到了整个计算图,所以我们可以做一系列优化来提升性能。实现辅助函数也容易,例如对任何计算图都提供forward和backward函数,对计算图进行可视化,将图保存到硬盘和从硬盘读取。
缺点:很多主语言的特性都用不上。某些在主语言中实现简单,但在这里却经常麻烦,例如if-else语句 。debug也不容易,例如监视一个复杂的计算图中的某个节点的中间结果并不简单。
几种主要深度学习框架的比较
目前现有的系统大部分都采用上两种编程模式的一种。与它们不同的是,MXNet 尝试将两种模式无缝的结合起来。在命令式编程上 MXNet 提供张量运算,而声明式编程中 MXNet 支持符号表达式。用户可以自由的混合它们来快速实现自己的想法。例如我们可以用声明式编程来描述神经网络,并利用系统提供的自动求导来训练模型。另一方便,模型的迭代训练和更新模型法则中可能涉及大量的控制逻辑,因此我们可以用命令式编程来实现。同时我们用它来进行方便地调式和与主语言交互数据。
五个主要 Python 深度学习库的比较
Theano 是一个专用于高效计算的低级库。如果你需要细粒度的定制和灵活性,可以直接使用这个库。
TensorFlow是另一个低级库,比 Theano 还要不成熟。但它是 Google 支持的库,并提供了开箱即用的分布式计算。
Lasagne是 Theano 中的一个轻量级库。如果你想要 Theano 的灵活性,但不想总是从头开始编写神经网络的层,可以选择 Lasagne。
Keras 是基于 Theano 或 TensorFlow 高层神经网络库。它具有极简化、模块化的优点,而且在实验中非常快速。这是深度学习的最受欢迎的库,也是初学者的最佳入门库。
MXNet是另一个类似 Keras 的高级库。它提供了多种语言的绑定,并且支持分布式计算。
导师(Mentor):Theano
我们授予 Theano “导师”称号,因为它让引导我们认识并喜欢上其他的深度学习库。
例如,Lasagne 和 Keras 都是基于 Theano 的。就其核心来说,Theano 是为使用多维数组进行数学计算的库,它的速度非常快,并且使用 GPU 进行优化(比 CPU 快 140倍)。换句话说,它是神经网络的“构建块”。
根据我们的经验,很少有人会直接写 Theano 代码。通常需要使用更高级的包装器(wrapper),除非你需要的是低级的定制。
例如,下面是一个用 Theano 写的逻辑激活函数
后起之秀:TensorFlow
TensorFlow 是“后起之秀”,而且它很受欢迎。
TensorFlow 是 Google 自己的 AI 团队开发的,而且最近开源了。TensorFlow 允许使用数据流图进行高效的数值计算。它从 Theano 的经验中学习了很多,因此被称作是全新的 Theano 2.0 版本。Google 的强力支持也使得它格外有前景。
即便如此,Theano 在很多方面仍然比 TensorFlow 快,而且支持更多样的操作。
但是,TensorFlow 最大的优势是它支持开箱即用的分布式计算,这使得在多 GPU 上训练深度神经网络更简单。
轻量:Lasagne
Lasagne 是 Theano 的一个轻量级包装器。Lasagne 允许使用 Theano 的优化计算来构建并训练神经网络。而轻量级是指,在 Lasagne 中,你仍然需要获取相当的低级,并且声明网络的每个层。在 Theano 之外,它只提供模块化的构建块。
结果是你的代码会变得十分冗长,但你可以用 NN 结构而非多维数组进行编程。
Lasagne 可以视为 Theano 的灵活性 和 Keras 的简单性之间的折衷选择。
半机械人(Cyborg):Keras
在所有 Python 深度学习库中,Keras 是最受欢迎的。原因有三:
首先,Keras 是一个允许在后端使用 Theano 或 TensorFlow 的包装器。这意味着开发者可以根据自己的应用程序轻松在两个库之间切换,。
第二,它有很漂亮的指导原则:模块性、极简主义、易扩展性,以及与 Python 协作。这使得 Keras 的实际使用非常简单愉快。
最后,Keras 拥有常见的网络结构的开箱即用的实现。它能快速、轻易地运行卷积神经网络。
下面是一个超快的序列模型的例子:
看起来很容易,是吧?如果想快速实现,Keras 是十分理想的库。但它最大的缺点是不支持并行训练的多 GPU 环境。
多语通(Polyglot):MXNet
MXNet 同 Keras 一样是高级库,但它的优势在另外的方面。
一方面,使用 MXNet 构建网络比用 Keras 需要花更多功夫。由于教程少,学习的难度更大。
但是,MXNet 支持超过 7 种不同的语言的优势弥补了这一点,这些语言包括 C++、Python、R、Javascrip,甚至 Matlab。
MXNet 是真正的多语通,对使用不同的语言共享模型的团队工作来说,它是不二之选。
MXNet 的另一个明显的优势是支持分布式计算。这意味着如果你需要在多个 CPU 或 GPU 上训练模型以提高速度,MXNet 是很好的选择。.
本文转自d1net(转载)