这两点对于初学者和从业人员都非常重要,我在后面详细讲述。
首先要恭喜MXNet近日获得了亚马逊的背书,MXNet平台本身非常优秀,具有很多优良的性质:例如多节点模型训练,目前是我知道最全面的多语言支持。此外,也有评测说MXNet性能方面可以高出同行平台很多,我们将会在后面的讨论中提到。现在进入正题,我们该如何选择深度学习开源平台,参考标准应该是什么样的?
今天主要探讨的平台(或者软件)包括:Caffe,Torch,MXNet,CNTK,Theano,TensorFlow,Keras。
如何选择一个深度学习平台?我总结出了下面的这些考量标准。因人而异,因项目而异。可能你是做图像处理,也可能是自然语言处理,或是数量金融,根据你不同的需求,对平台做出的选择可能会不同。
无论是学术研究还是工程开发,在上马深度学习课题之前一般都已积累不少开发经验和资源。可能你最喜欢的编程语言已经确立,或者你的数据已经以一定的形式储存完毕,或者对模型的要求(如延迟等)也不一样。标准1考量的是深度学习平台与现有资源整合的难易程度。这里我们将回答下面的问题:
我们做深度学习研究最后总离不开各种数据处理、可视化、统计推断等软件包。这里我们要回答问题:
上面我们提到的不少平台是专门为深度学习研究和应用进行开发的,不少平台对分布式计算、GPU等构架都有强大的优化,能否用这些平台/软件做其他事情?
比如有些深度学习软件是可以用来求解二次型优化;有些深度学习平台很容易被扩展,被运用在强化学习的应用中。哪些平台具备这样的特点?
这个问题可以涉及到现今深度学习平台的一个方面,就是图像计算和自动化求导。
当然,深度学习在不同应用场景的数据量是不一样的,这也就导致我们可能需要考虑分布式计算、多GPU计算的问题。例如,对计算机图像处理研究的人员往往需要将图像文件和计算任务分部到多台计算机节点上进行执行。
当下每个深度学习平台都在快速发展,每个平台对分布式计算等场景的支持也在不断演进。今天提到的部分内容可能在几个月后就不再适用。
成熟程度的考量是一个比较主观的考量因素,我个人考量的因素包括:社区的活跃程度;是否容易和开发人员进行交流;当前应用的势头。
讲了5个参考标准后,接下来我们用上面的这些标准对各个深度学习平台进行评价:
标准1考量的是深度学习平台与现有资源整合的难易程度。这里我们将回答下面的问题:是否需要专门为此学习一种新语言?是否能与当前已有的编程语言结合?
这一个问题的干货在下面这个表格。这里我们按照每个深度学习平台的底层语言和用户语言进行总结,可以得到下表。
其中Keras通过Theano,TensorFlow作为底层进行建模。
我们可以看到这样的趋势:
从格局上来说,Python作为深度学习建模的基本语言是可以确定的。如果你最喜欢编程语言是Python,恭喜您,大多数平台都可以和你的技术无缝衔接。如果是Java也不用担心,不少平台也具有Java支持,Deeplearning4J还是一个原生的Java深度学习平台。
完成深度学习建模等任务之后,和生态的整合也尤为重要。
我们可以发现,上面和Python,R,整合较为紧密,这里Keras生态(TensorFlow,Theano),CNTK,MXNet,Caffe等占有大量优势。
同时Caffe具有大量图像处理包,对数据观察也具有非常大的优势。
下图是本次公开课的核心:
CPU+GPU控制,通信:这一个最低的层次是深度学习计算的基本层面。
○包含各种激发函数(activationfunction),例如sigmoid,ReLU等。
○同时也包含求导模块
1.第一类是以Caffe,Torch,MXNet,CNTK为主的深度学习功能性平台。这类平台提供了非常完备的基本模块,可以让开发人员快速创建深度神经网络模型并且开始训练,可以解决现今深度学习中的大多数问题。但是这些模块很少将底层运算功能直接暴露给用户。
2.第二类是以Keras为主的深度学习抽象化平台。Keras本身并不具有底层运算协调的能力,Keras依托于TensorFlow或者Theano进行底层运算,而Keras自身提供神经网络模块抽象化和训练中的流程优化。可以让用户享受快速建模的同时,具有很方便的二次开发能力,加入自身喜欢的模块。
3.第三类是TensorFlow。TensorFlow吸取了已有平台的长处,既能让用户触碰底层数据,又具有现成的神经网络模块,可以让用户非常快速的实现建模。TensorFlow是非常优秀的跨界平台。
4.第四类是Theano,Theano是深度学习界最早的平台软件,专注底层基本的运算。
这里我介绍下深度学习的一些副产品,其中一个比较重要的功能就是符号求导。
图计算和符号求导:深度学习对开源社区的巨大贡献
大家可能会有疑问:我能训练出来深度学习模型就蛮好的了,为什么需要接触底层呢?
这里我先介绍下深度学习的一些副产品,其中一个比较重要的功能就是符号求导。符号求导英文是SymbolicDifferentiation,现在有很多有关的文献和教程可以使用。
符号求导是什么意思?
以前我们做机器学习等研究,如果要求导往往需要手动把目标函数的导数求出来。最近一些深度学习工具,如Theano,推出了自动化符号求导功能,这大大减少了开发人员的工作量。
当然,商业软件如MatLab,Mathematica在多年前就已具有符号计算的功能,但鉴于其商业软件的限制,符号计算并没有在机器学习应用中被大量采用。
深度学习由于其网络的复杂性,必须采用符号求导的方法才能解决目标函数过于复杂的问题。另外一些非深度学习问题,例如:二次型优化等问题,也都可以用这些深度学习工具来求解了。
更为优秀的是,Theano符号求导结果可以直接通过C程序编译,成为底层语言,高效运行。
这里我们给一个Theano的例子:
8
上面我们通过符号求导的方法,很容易的求出y关于x的导数在4这个点的数值。
对于多GPU支持和多服务器支持,我们上面提到的所有平台都声称自己能够完成任务。同时也有大量文献说某个平台的效果更为优秀。我们这里把具体平台的选择留给在座各位,提供下面这些信息:
首先想想你想要干什么。现在深度学习应用中,需要运用到多服务器训练模型的场景往往只有图像处理一个,如果是自然语言处理,其工作往往可以在一台配置优秀的服务器上面完成。如果数据量大,往往可以通过hadoop等工具进行数据预处理,将其缩小到单机可以处理的范围内。
本人是比较传统的人,从小就开始自己折腾各种科学计算软件的编译。现在主流的文献看到的结果是,单机使用GPU能比CPU效率提高数十倍左右。
但是其实有些问题,在Linux环境下,编译Numpy的时候将线性函数包换为IntelMLK往往也可以得到类似的提高。
当然现在很多评测,往往在不同硬件环境、网络配置情况下,都会得到不一样的结果。
就算在亚马逊云平台上面进行测试,也可能因为网络环境、配置等原因,造成完全不同的结果。所以对于各种测评,基于我的经验,给的建议是:takeitwithagrainofsalt,自己要留个心眼。前面我们提到的主要工具平台,现在都对多GPU、多节点模型训练有不同程度的支持,而且现在也都在快速的发展中,我们建议听众自己按照需求进行鉴别。
对于成熟程度的评判往往会比较主观,结论大多具有争议。我在这里也只列出数据,具体如何选择,大家自己判断。
这里我们通过Github上面几个比较受欢迎的数量来判断平台的活跃程度。这些数据获取于今天下午(2016-11-25)。我们用黑体标出了每个因子排名前三的平台: