驾驭机器学习的13种框架
想大胆尝试机器学习?这些工具可以为你处理繁重的任务。
驾驭机器学习的13种框架
在去年,机器学习以前所未有的势头进入主流。对这股潮流起到推波助澜的不单单是成本低廉的云环境和功能更强大的GPU硬件,还有如今面向机器学习的数量激增的框架。它们都是开源框架,而更重要的是,它们旨在化解机器学习最难的部分,将其技术或方法提供给广泛的开发人员。
本文介绍了13种机器学习框架,有的在去年刚出炉,有的刚修订。它们引起了我们的注意,因为都是在IT界具有重要影响力的产品,有的试图带来一种简化的解决办法,有的旨在攻克与机器学习有关的某个难题。
Apache Spark MLlib
Apache Spark最广为人知的角色就是它是Hadoop家族的一员,但这种内存数据处理框架脱胎于Hadoop之外,而且在Hadoop生态系统外面扬名立万。Spark已成为一款可靠的机器学习工具,这归功于其日益庞大的算法库,其算法可以高速运用于内存中数据。
Spark没有坐以待毙,因为Spark拥有的算法一直在不断增加和修订。去年的1.5版本增添了许多新的算法,改进了现有的算法,并进一步增强了Python中对MLlib的支持,而Python是面向数学运算和统计用户的一大平台。除了其他功能外,刚发布的Spark 1.6还让用户可以通过持久化流水线(persistent pipeline),暂停和恢复Spark ML任务。
Apache Singa
“深度学习”框架支持处理繁重任务的机器学习功能,比如自然语言处理和图像识别。Singa最近得到接受、进入Apache孵化器(Apache Incubator),这种开源框架旨在让用户很容易训练针对大量数据的深度学习模型。
Singa提供了一种简单的编程模型,用于训练跨机器集群的深度学习网络,它还支持许多常见类型的训练任务:卷积神经网络、受限玻尔兹曼机和递归神经网络。模型可以同步训练(逐个训练),也可以异步训练(并行训练),这取决于哪种方法最适用于某个问题。Singa还利用Apache Zookeeper简化了集群构建和设置。
Caffe
深度学习框架Caffe“在开发当初牢记表达、速度和模块化”。Caffe在2013年为机器视觉项目而开发,此后扩大到了其他应用领域,比如语音和多媒体。
速度是一大优先事项,于是Caffe完全用C++编写,并支持CUDA加速,不过它可以根据需要在CPU处理和GPU处理之间进行切换。发行版包括一套面向常见分类任务的免费开源参考模型,其他模型则由Caffe用户社区开发和捐献。
微软Azure ML Studio
考虑到执行机器学习需要大量的数据和强大的计算能力,云是机器学习应用的理想环境。微软为Azure配备了自己的按需付费的机器学习服务:Azure ML Studio,分为按月付费、按小时付费和免费套餐这三种版本。(该公司的HowOldRobot项目就是用这个系统构建的。)
Azure ML Studio让用户可以创建和训练模型,然后将它们变成可以被其他服务使用的API。用户可以为模型数据获得每个帐户最多10GB的存储空间,不过你也可以将自己的Azure存储空间连接到该服务,以处理更庞大的模型。一系列广泛的算法可供使用,这要感谢微软和第三方。你甚至不需要帐户就可以试用该服务;匿名登录后,就可以使用Azure ML Studio长达8个小时。
亚马逊机器学习
亚马逊对云服务采用的一般方法遵循这种模式:提供基本服务,培育关注它的核心受众,让他们在上面构建,然后找到他们真正需要的东西,并提供这种东西。
亚马逊首次尝试提供机器学习即服务:亚马逊机器学习(Amazon Machine Learning)也是如此。它连接到存储在亚马逊S、Redshift或RDS中的数据,可以对相关数据执行二元分类、多类分类或递归等操作。然而,这项服务完全以亚马逊为中心。除了依赖存储在亚马逊上的数据外,因而生成的模型无法导入或导出,训练模型的数据集不得大于100GB。不过,它仅仅是个开始,表明了它更注重机器学习的实用性,而不是便利性。
微软分布式机器学习工具包
用来处理任何机器学习问题的计算机部署得越多,效果越好,但是将机器结合起来、开发可以跨所有机器顺畅运行的机器学习应用程序可能很棘手。微软的DMTK(分布式机器学习工具包)框架就专门处理这个问题:跨系统集群分配各种各样的机器学习任务。
DMTK号称是一种框架,而不是一种完备的即开即用的解决方案,所以它自带的实际算法数量很少。不过DMTK的设计便于将来扩展,而且便于用户最充分地利用资源有限的集群。比如说,集群中的每个节点都有本地缓存,减少了与中央服务器节点之间的通信量,而中央服务器节点为相应任务规定了范围。
谷歌TensorFlow
谷歌TensorFlow酷似微软的DMTK,这种机器学习框架旨在跨多个节点灵活扩展。与谷歌的Kubernetes一样,它当初也是旨在解决谷歌内部的问题,谷歌最终决定将它作为一款开源产品来发布。
TensorFlow实施了所谓的数据流图(data flow graph),其中成批数据(“tensor”)可以由数据流图描述的一系列算法来加以处理。数据在系统中的移动被称为“流”(flow)??TensorFlow由此得名。数据流图可以用C++或Python来装配,可以在CPU或GPU上进行处理。谷歌的长期计划是,让第三方贡献者来完善TensorFlow。
微软计算网络工具包
微软发布DMTK不久,紧随其后发布了另一款机器学习工具包:计算网络工具包(Computational Network Toolkit,简称CNTK)。
CNTK类似谷歌TensorFlow,因为它让用户可以通过有向图来构建神经网络。微软还认为它与Caffe、Theano和Torch等项目相媲美。它声称相比那些框架的优点主要在于速度快,具体来说是能够同时充分利用多个CPU和多个GPU。微软声称,使用CNTK,并结合Azure上的GPU集群,将Cortana的语音识别训练的速度提升了一个数量级。
CNTK最初作为微软的语音识别研究项目的一部分而开发,早在2015年4月起初作为一个开源项目来提供,不过后来重新发布到GitHub上,采用了一种极其宽松的、类似MIT许可证的许可证。
Veles(三星)
Veles是一种面向深度学习应用的分布式平台;与TensorFlow和DMTK一样,它也用C++编写,不过使用Python来执行自动化和节点之间的协调。数据集加以分析、自动规范后被馈送到集群,REST API让受过训练的模型可以立即用在生产环境中(假设你的硬件足够好)。
Veles使用Python并不局限于仅仅将它用作粘合代码(glue code)。IPython(现在的Jupyter)这种数据可视化和分析工具,可以直观显示和发布来自Veles集群的结果。三星希望,发布开源Veles项目有望促进进一步的发展,比如移植到Windows和Mac OS X。
Brainstorm
Brainstorm由瑞士卢加诺的Dalle Molle人工智能研究所(IDSIA)的两名博士生Klaus Greff和Rupesh Srivastava开发而成,该项目的目的是“让深度神经网络快速、灵活而有趣”。已经包括了支持众多递归神经网络模型(比如LSTM)的功能。
Brainstorm使用Python提供两个“hander”,即数据管理API :一个用于Numpy的CPU运算,另一个通过CUDA利用GPU。大部分工作通过Python脚本来完成,所以别指望有一个丰富的前端GUI,只有你给自己提供的那个GUI。但长远计划是开发这种构架:可以运用“从早期开源项目汲取的经验”,并使用“与多种平台和计算后端兼容的新的设计元素”。
mlpack 2
我们之前汇总的机器学习资源提到了mlpack,这种基于C ++的机器学习库最早于2011年推出,设计当初着眼于“可扩展性、速度和易用性”,据库的开发者声称。实施mlpack有两种方法:通过处理简易的“黑盒子”操作的命令行执行文件缓存,或者借助处理较复杂工作的C ++ API。
2.0版本有很多重构和新功能,包括许多新类型的算法,并对现有算法做了改变,以便提速或简化。比如说,它丢弃了Boost库面向C++ 11的原生随机函数的随机数发生器。
一个长期存在的缺点是,缺少针对除C++之外的任何语言的绑定,这意味着使用从R到Python各种语言的用户无法使用mlpack,除非有人为上述语言推出了自己的包装器。已开展了工作,添加支持MATLAB的功能,但是像这样的项目在处理机器学习工作的主要环境下径直发挥作用,才往往会受到更大的追捧。
Marvin
Marvin神经网络框架是另一种比较新的框架,它是普林斯顿视觉小组(Princeton Vision Group)的杰作。它“生来就是为了被改动的”,开发者在项目的说明文档中这么解释,它只依赖用C++和CUDA GPU框架编写的几个文件。尽管代码本身有意很小,但项目确实随带许多预先训练的模型:只要适当引用,可以重复使用这些模型,使用合并请求(pull request)贡献给社区,就像该项目的自家代码那样。
Neon
Nervana这家公司开发了自己的深度学习硬件和软件平台,它提供了一种名为Neon的深度学习框架,将其作为一个开源项目。它使用可插入式模块,以便在CPU、GPU和Nervana自己的定制硬件上处理繁重任务。
Neon主要是用Python编写的,有几个组件用C++编写,以求速度。这样一来,用Python处理数据科学工作的其他人可以立即用它,拥有Python绑定的其他任何框架也可以立即用它。
欢迎加入本站公开兴趣群
软件开发技术群
兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
QQ群:26931708
Hadoop源代码研究群
兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
QQ群:288410967