Peter Goldsborough写的文章,我个人觉得很不错,就全文翻译过来,原文在此
摘要:深度学习是人工智能使用深度神经网络架构的一个分支,它已经在计算机视觉,语音识别,自然语言处理等领域取得显著成果。2015年11月,谷歌开源其内部使用多年的用来定义,训练和发布机器学习模型的软件库,Tensorflow。本文将会把Tensorflow放到现代深度学习理论和软件实现的框架下评估。我们将讨论Tensorflow的基本计算范式和分布式计算模型,它的编程接口还有可视化组件。然后我们再把它和其它深度学习库,比如Theano,Torch或Caffe做定性和定量对比分析,最后对Tensorflow的已知的学术界和工业界使用实例作评估。
一,简介
现代人工智能系统和机器学习算法在各个领域都取得了革命性的进步。我们注意到在计算机视觉,语音识别和自然语言处理等技术领域的长足进步。更进一步,这些技术进步已经惠及我们个人生活的方方面面。个人定制数字化助理,电商平台的推荐系统,金融诈骗检测,定制化网页搜索和社交网络订阅以及新颖的地理位置经济学发现都得益于当前机器学习算法。
近几年,一种称之为深度学习的机器学习的分支已经被证明特别有效。深度学习属于表现学习算法类,它使用复杂神经网络结构,其中包含巨大数量的隐藏层。每个隐藏层包含对输入数据进行简单但却是非线性转换。给定足够这样的转换模块可以构成非常复杂的功能模型去实现分类,回归,翻译和很多其他的事情【1】。
值得注意的是,深度学习的崛起也就是近几年的事情,这都得益于越来越多可用的大数据集可以作为训练样本;得益于有效使用GPU和大量并行硬件在大数据集上训练深度学习模型;也得益于一些新方法的发现,比如修正线性单元(ReLU)激活函数或者退化(Dropout)作为一种正规化技术【1】【2】【3】【4】。
在深度学习算法和单独算法模块比如表示转换,激活函数,或者正规化方法在开始还是数学公式的时候,接下来它们必须要转化为某种计算机程序实现才能用于应用。因此,市场上存在很多这样的开源和商业软件。在这些众多的软件中,Theano【5】,Torch【6】,scikit-learn【7】和许多其它的软件会在本文第二部分有更详细的评估。而Tensorflow是在2015年11月由谷歌发布的全新机器学习软件库【8】。根据开始公布的情况来看,Tensorflow旨在担当在“大规模”异构分布式系统上的“快速机器学习算法实现”【8】。
本文接下来将完整评估Tensorflow,并且将其放在当前机器学习的大背景下来讨论。本文详细架构如下,第二部分将介绍机器学习软件发展历史,不局限于Tensorflow相似项目。接下来,第三部分将深入讨论Tenorflow的计算范式。在第四部分,我们会解释各类编程语言的编程接口。第五部分会介绍Tensorflow的调错可视化工具。第六部分是Tensorflow和其它类似软件库的定性和定量分析。在最后第八部分总结,第七部分对于Tensorflow的学术界和工业界使用做了研究。
二,机器学习软件库历史
本章旨在提供一个机器学习软件库历史和关键里程碑的描述。开始,我们回顾20年前一系列广泛用于机器学习和数据分析的软件库。然后,我们聚焦到最近适合于深度学习的编程框架研究。图一展示的是这一研究在时间轴上的展开。本章不会比较比较Tensorflow和这些软件库,因为这一部分将会在第六部分具体讨论。
A. 通用机器学习
在接下来的文字,我们将会列举和回顾一组通用机器学习软件库。所谓“通用”,意味着这些软件库用于机器学习和数据分析,并不局限于深度学习。所以,它们可能用于统计分析,聚类,降维分析,结构化预测,异常检测,浅神经网络(相对于深度神经网络而言)和其它。
让我们从Tensorflow发布21年前的一个库开始说起,MLC++【9】。MLC++是用C++开发的算法库,包含了一系列数据挖掘,统计分析,模式识别技术的比较框架。它诞生于斯坦福大学,现在被Silicon Graphics Inc公司(SGI)维护。据我们所知,这是迄今为止岁数最大的机器学习库。
排在MLC++后面的,当属Bradski等人在2000年发布的OpenCV【10】。它主要解决计算机视觉和图像识别问题,包括一系列人脸识别,对象识别,3D模型提取等。它遵循BSD开源,拥有C++,Python和MATLAB等多种编程接口。
另一种机器学习库我们希望提及的是scikit-learn【7】。2008年由David Cournapeu作为谷歌编码之夏项目的一部分开发出来。它是使用Python编写的开源库,基于NumPy,SciPy和matplotlib框架。它能够用于广泛的监督学习和非监督学习问题。
Accord.NET和前述库不一样,它是2008年使用C#开发的,除了一些机器学习算法,它还包括了用于语音识别和图像识别的信号处理模块。【11】
Massive Online Analysis(MOA)是一个可以支持在线和离线大数据分析的开源库。MOA包括了一系列用于分类,回归,推荐系统和其它训练能力。它于2010年发布,使用JAVA编程语言,由新西兰的Waikato大学维护【12】。
Mahout是Apache软件基金会支持的一个Java开源库,基于Hadoop平台,支持可伸缩的机器学习应用。它可以凭借Hadoop分布式文件系统(HDFS)对于大数据集的很好支持进行分析。Mahout提供了分类,回归和过滤算法。
Pattern在我们认可的Python机器学习库列表之中,得益于它提供丰富的网页挖掘能力。它包含了不仅仅是机器学习算法(比如,聚类,分类或者最近邻近搜索),自然语言处理(n-gram搜索用于情感分析),还提供了网络爬虫,比如抓去Tweets或者Wiki百科的数据来帮助快速分析。它由Antwerp大学于2012年开发,开源并维护。
最后一个需要介绍的是Spark MLib,也是一款开源机器学习库,发布于2015年,看名字很容易知道,这是基于Spark开发而成分布式分析系统。它支持处理大规模分布式数据集,并且在集群硬件环境下进行机器训练。它包含了分类,回归,聚类和其它机器学习的算法【14】。
B. 深度学习
上述软件库能够用于非常广泛的机器学习,统计分析应用。接下来介绍的库在训练深度模型方面特别有效。
首先介绍的是发布于2002年的,最古老的Torch【6】。Torch包含了一个纯C++实现和编程接口。现在,他的核心是C/CUDA实现,对外暴露的语言是Lua脚本语言。Torch采用一个LuaJIT(实时)编译器把Lua的函数过程连接到C语言的具体实现。它包括了内部别名,数值优化过程,神经网络模型,同时能够产生通用的N维数组(张量)对象。
Theano发布于2008年【5】,是另外值得一提的库。我们注意到Theano在机器学习社区具有极高的人气,但是它实际上并不是机器学习库。它只是符号化数理编程框架,比如生成计算图,然后编译和优化在CPU或者GPU上运行,所以Theano更多时候只是“数理编译器”。
Caffe是由Berkley视觉与学习中心(BVLC)维护的开源深度学习库。它于2014年发布,并遵循BSD开源【15】。Caffe使用C++实现,神经网络层是它的计算单元(这和Theano那些需要用户自己定义详细的数学公式去构成神经网络层不同)。包含很多层的深度学习模型采用谷歌协议缓冲格式保存(GPBF)。模型能够使用协议缓冲“语言”定义,然后通过和Python或者MATLAB已有的绑定,自动生成神经网络。Caffe特别适合于训练卷积神经网络(CNNs,或者ConvNets)用于图像识别领域。
上面介绍的机器学习库都是使用Python,MTATLAB或者Lua定义深度学习模型,而Deeplearning4J(DL4J)则是使用Java去创建深度神经网络。DL4J能够创建有限波资曼机,卷积神经网络和递归神经网络。DL4J还能够使用Hadoop或者Spark这样的分布式计算平台进行工作。Adam Gibson2014年编写的DL4J遵循Apache 2.0开源协议。
最后我们要介绍的是NVIDIA的深度学习SDK。这个SDK能够充分利用GPU来加速计算。SDK首先提供了基于GPU的高性能深度算法(cuDNN),用于加速卷积,激活函数和张量转换。其次,它提供了一个线性代数库,cuBLAS。最后,cuSPARSE包含了基于GPU的高效空间矩阵运算。它可以单独使用,也可以和其它库联合使用,比如Torch。