三大主流深度学习框架之MXNet/Gluon
人工智能的浪潮正席卷全球,诸多词汇时刻萦绕在我们的耳边,如人工智能,机器学习,深度学习等。“人工智能”的概念早在1956年就被提出,顾名思义用计算机来构造复杂的,拥有与人类智慧同样本质特性的机器。经过几十年的发展,在2012年后,得益于数据量的上涨,运算力的提升和机器学习算法(深度学习)的出现,人工智能开始大爆发。但目前的科研工作都集中在弱人工智能部分,即让机器具备观察和感知能力,可以一定程度的理解和推理,预期在该领域能够取得一些重大突破。电影里的人工智能多半都是在描绘强人工智能,即让机器获得自适应能力,解决一些之前还没遇到过的问题,而这部分在目前的现实世界里难以真正实现。
若人工智能有希望取得突破,是如何实现的,“智能”又从何而来呢?这主要归功于一种实现人工智能的方法——机器学习。
一、机器学习概念
机器学习一种实现人工智能的方法。
机器学习最基本的做法是,使用算法来解析数据从中学习,然后对真实世界中的事件做出决策和预测。与传统的为解决特定任务、硬编码的软件程序不同,机器学习是用大量的数据来“训练”,通过各种算法从数据中学习如何完成任务。机器学习源于早期的人工智能领域,传统的算法包括决策树、聚类、贝叶斯分类、支持向量机、EM、Adaboost等等。从学习方法上来分,机器学习算法可以分为监督学习(如分类问题)、无监督学习(如聚类问题)、半监督学习、集成学习、深度学习和强化学习。
传统的机器学习算法在指纹识别、基于Haar的人脸检测、基于HoG特征的物体检测等领域的应用基本达到了商业化的要求或者特定场景的商业化水平,但每前进一步都异常艰难,直到深度学习算法的出现。
二、深度学习概念
深度学习是一种实现机器学习的技术。
其本身并不是一种独立的学习方法,也会用到有监督和无监督的学习方法来训练深度神经网络。但由于近几年该领域发展迅猛,一些特有的学习手段相继被提出(如残差网络),因此越来越多的人将其单独看作一种学习的方法。
最初的深度学习是利用深度神经网络来解决特征表达的一种学习过程。深度神经网络本身并不是一个全新的概念,可大致理解为包含多个隐含层的神经网络结构。为了提高深层神经网络的训练效果,人们对神经元的连接方法和激活函数等方面做出相应的调整。其实有不少想法早年间也曾有过,但由于当时训练数据量不足、计算能力落后,因此最终的效果不尽如人意。深度学习,作为目前最热的机器学习方法,但并不意味着是机器学习的终点。起码目前存在以下问题:
1、深度学习模型需要大量的训练数据,才能展现出神奇的效果,但现实生活中往往会遇到小样本问题,此时深度学习方法无法入手,传统的机器学习方法就可以处理;
2、有些领域,采用传统的简单的机器学习方法,可以很好地解决了,没必要非得用复杂的深度学习方法;
3、深度学习的思想,来源于人脑的启发,但绝不是人脑的模拟。
因此,机器学习框架和深度学习框架之间也是有区别的。本质上,机器学习框架涵盖用于分类,回归,聚类,异常检测和数据准备的各种学习方法,也可以包括神经网络方法。深度学习或深度神经网络(DNN)框架涵盖具有许多隐藏层的各种神经网络拓扑,包括模式识别的多步骤过程。网络中的层越多,可以提取用于聚类和分类的特征越复杂。常见的Caffe,CNTK,DeepLearning4j,Keras,MXNet和TensorFlow是深度学习框架。 而Scikit-learning和Spark MLlib是机器学习框架。 Theano则跨越了这两个类别。
三、主流的三大深度学习框架
TensorFlow:Google支持,其简化版是Keras;
PyTorch:Facebook支持,其工业版是Caffe2;
MXNet:中立,Apache孵化器项目,也被AWS选为官方DL平台。
MXNet的高层接口是Gluon,Gluon同时支持灵活的动态图和高效的静态图,既保留动态图的易用性,也具有静态图的高性能,这也是官网介绍的flexible和efficient的出处。同时,MXNet还具备大量学术界的前沿算法,方便移植至工业界。
四、Gluon 简介:AWS 和 Microsoft 合作推出的新机器学习库
2017年10月17日, AWS 和 Microsoft 联合发布了 Gluon – 一种新的开源深度学习接口,可帮助开发人员更轻松、更快速地构建机器学习模型,而不牺牲任何性能。 Gluon 徽标Gluon 采用一系列预先构建并经过优化的神经网络组件,为定义机器学习模型提供清晰、简洁的 API。刚刚接触机器学习的开发人员会发现此接口更像传统代码,因为他们可以像使用任何其他数据结构那样定义和操作机器学习模型。经验丰富的数据科学家和科研人员也会发现它的宝贵价值:快速构建原型和利用动态神经网络图实现全新模型架构,而又不减缓训练进度。Gluon 现已在 Apache MXNet 中可用,日后将“进驻”Microsoft Cognitive Toolkit 及其他架构。
神经网络与开发人员
使用神经网络的机器学习 (包括“深度学习”) 包含三个主要部分:训练数据、神经网络模型和训练神经网络的算法。您可以将神经网络看成是一种有向图:它有一系列输入 (数据),通过一系列连接的层和权重连接到一系列输出 (预测)。在训练期间,算法根据网络输出中的错误调整网络中的权重。这就是网络学习的过程 – 一种可能需要持续数天时间的内存和计算密集型过程。Caffe2、Cognitive Toolkit、TensorFlow 以及 Apache MXNet 等深度学习框架能够部分解决“如何加快这一过程?”的难题。与数据库中的查询优化器一样,训练引擎越了解网络和算法,越能更好地优化训练过程 (例如,它可以根据其他部分的改变,推断需要重新计算图中的哪些部分并跳过不受影响的权重,从而加快训练进度)。此外,这些框架还提供并行功能,可通过分发计算过程来减少总体训练时间。但是,要实现上述优化,大多数框架要求开发人员完成一些额外工作:首先,提供网络图形式定义,然后“定图”并调整权重。网络定义可能极其庞大而复杂 (包含数百万个连接),通常必须手动构建。深度学习网络十分“笨重”,难以调试,因而很难在项目间复用代码。
这种复杂性可能会令初学者“无从下手”,对经验丰富的科研人员来说也是一项耗时的任务。AWS 在 MXNet 中尝试了一些更灵活易用的新方法定义和训练神经网络。Microsoft 也是开源项目 MXNet 的开发者,对部分新想法感兴趣。于是我们进行了沟通,结果发现双方抱持几乎相同的愿景:借助此类技术降低机器学习的复杂性,让更多的开发人员能够轻松发挥其强大威力。
Gluon 特点:动态图,快速迭代,可扩展训练
Gluon 包含四大创新。
友好的 API:可以使用简单、清晰、简洁的代码定义 Gluon 网络 – 相比某些更晦涩、更形式化的网络及相关加权评分函数定义方法,这更易于开发人员学习,理解难度大幅降低。
动态网络:Gluon 中的网络定义是动态的:它可以像任何其他数据结构一样“收缩和扩展”。这有别于更常见的形式化网络符号定义 (既深度学习框架要求必须保持网络定义不变,才能在训练期间有效地优化计算)。相比之下,动态网络更容易管理。借助 Gluon,开发人员可以在定义网络和算法时轻松混用快速的符号表示和更友好、动态的“命令式”定义。
可以使用算法定义网络:这大大加强了模型与训练算法的联系。在这种情况下,算法可以在定义和训练期间动态调整网络,而不仅仅是独立的定义。也就是说,开发人员能够使用标准的编程循环、条件语句创建此类网络,科研人员也能定义以前无法实现的更复杂的算法和模型。不管是创建、更改还是调试,难度都大幅下降。
由高性能运营商进行训练:这样可在不牺牲训练速度的情况下提供友好、简洁的 API 和动态图,可谓是机器学习领域的一大进步。某些框架为深度学习提供了友好的 API 或动态图,但以前的此类方法都会减缓训练速度。与其他领域的软件一样,抽象需要在运行时进行协商和解释,因而会减慢计算速度。但 Gluon 将简明的 API 与形式化定义进行了深层融合,无需开发人员了解具体细节或手动调整编译器优化。
能通过 Gluon 向开发人员提供此类改进,AWS 团队和 Microsoft 的协作者倍感兴奋。目前,已有开发人员和科研人员提供十分积极的反馈。
开始使用 Gluon
Gluon 现已在 Apache MXNet 中可用,将在未来版本中支持 Microsoft Cognitive Toolkit。我们还将发布前端接口和底层 API 规范,以便在适当的时候“进驻”其他框架。
您可以立即试用 Gluon – 只需点击 AWS 深度学习 AMI,就能试验 50 个完全能够正常工作的笔记本示例。如果您是机器学习框架开发者,请访问 GitHub 查阅接口规范。
– Matt Wood 博士