入门大爆炸式发展的深度学习,你先要了解这4个最流行框架
导读:对深度学习做出巨大贡献的Yoshua Bengio,他与Yann Lecun和Geofrey Hinton等人在今年3月获得了图灵奖。近几年,深度学习技术的大爆炸式发展,除了理论方面的突破外,还有基础架构的突破,这些都奠定了深度学习繁荣发展的基础。
可以预见,深度学习不管是现在,还是在之后的一段时间内都会是最流行、最有效的机器学习方法之一。
作者:卢誉声
来源:大数据DT(ID:bigdatadt)
00 深度学习的贡献
深度学习是一种思想、一种学习模式,深度神经网络是一类模型,两者在本质上是不一样的。但目前大家普遍将深度神经网络认为就是深度学习。
深度神经网络应用之前,传统的计算机视觉、语音识别方法是把特征提取和分类器设计分开来做,然后在应用时再合在一起。比如,如果输入的是一个摩托车图像的话,首先要有一个特征表达或者特征提取的过程,然后把表达出来的特征放到学习算法中进行分类学习。
因为手工设计特征需要大量的实践经验,需要对该领域和数据具有深入见解,并且在特征设计出来之后还需要大量的调试工作和一点运气。另一个难点在于,你不只需要手工设计特征,还要在此基础上有一个比较合适的分类器算法。如果想使特征设计与分类器设计两者合并且达到最优的效果,几乎是不可能完成的任务。
2012年后,深度神经网络给计算机视觉、语音识别、自然语言处理等领域带来了突破性的进展,特别是在人脸识别、机器翻译等领域应用的准确率接近甚至超过了人类的水平。深度神经网络如图1-1所示。
▲图1-1 深度神经网络示意图
深度神经网络最重要的是表示学习的能力,你把数据从一端扔进去,模型从另外一端就出来了,中间所有的特征完全可以通过学习自己来解决,而不再需要手工去设计特征了。
本文对现今和可预见的未来流行的深度学习框架进行介绍,如果你对这些框架有所了解,甚至实践过,那就再好不过了。如果你不了解这些框架或没有使用过,也不必过于担心,一起build from scratch。
01 TensorFlow
TensorFlow是一款基于Apache License 2.0协议开放源代码的软件库,用于进行高性能数值计算。借助其灵活的架构,用户可以轻松地将计算工作部署到多种平台(CPU、GPU、TPU)和设备(桌面设备、服务器集群、移动设备、边缘设备等)。
TensorFlow最初是由Google Brain团队中的研究人员和工程师开发的,可为机器学习和深度学习提供强力支持,并且其灵活的数值计算核心广泛应用于许多其他科学领域。
TensorFlow属于第2代人工智能系统,也是一个通用的机器学习框架,具有良好的灵活性和可移植性等优点。TensorFlow有非常好的伸缩性,同时支持模型并行与数据并行,可以在大规模集群上进行分布式训练。
与以Caffe为代表的第1代深度学习引擎不同,TensorFlow提供了自动微分功能,当添加新的层的时候我们无须自己计算并手写微分代码,极大地方便了网络的扩展。
此外,TensorFlow提供了非常多的语言接口,从C/C++、Python、Java甚至到现在的JavaScript,支持的语言非常广泛,因此也非常受欢迎。
接下来我们详细介绍一下TensorFlow的计算模型。
TensorFlow将完整的计算任务都抽象成一张图(graph),每个小的计算步骤是一个操作(operation),因此所有的计算任务就是一张由一个个小操作组成的图。
这样讲可能比较抽象,我们使用一个实际的TensorFlow Graph来说明这些概念,如图1-3所示。
图1-3代表了一系列的计算过程。我们先用constant操作定义一个常量,然后分成两条路,一条路先用add操作计算constant加1的结果,然后计算从外部读取一个数据ds1,和add的结果进行乘法,最后用avg操作求add和mul操作的平均值。
另一条路则是先使用mul操作将constant乘以2,然后从外部读取数据ds2,并和mul的结果做加法,然后将结果赋值给一个临时变量int_result。最后使用add操作将avg的结果和int_result相加,得到最后的结果。
▲图1-3 TensorFlow计算图示例
可以看到这个图1-3中有很多元素,比如我们将constant、add、mul称之为操作(operation)。操作是该图中的主要节点。除了操作以外还会有一些数据输入,比如ds1和ds2。我们还可以通过定义变量(variable)保存中间状态,比如int_result。
图中每一个节点负责处理一个张量(tensor)。张量是一个多维数组,表示数学里的多维向量。如果我们要处理一些平面上的散点,那么就可以将需要处理的数据看成一个二维向量(表示点的x和y),我们可以将整个数据处理过程看成Tensor在不同操作节点之间的流动(Flow),这也就是为什么该框架的名字叫作TensorFlow了。
使用TensorFlow的第一步就是将计算任务构造成一张图。但不能只描述计算过程,我们需要编写可执行的任务,因此需要创建一个会话(session)。会话的作用是建立一个执行上下文(context),所有的图都需要在会话中执行,会话会初始化并保存图中需要的变量、图的执行状态、管理执行图的设备(CPU和GPU)等。
所以我们可以看到,TensorFlow的结构很简单,只需要构建一张表示计算的图,并创建会话来执行图即可,TensorFlow帮我们隐藏了其他所有细节,因此我们可以不去关心计算的那些细枝末节。
02 TensorFlow Lite
TensorFlow是目前最完善和强大的深度学习框架,在工业界服务端深度学习领域已经是无可争辩的事实标准,但在移动平台和嵌入式领域中,TensorFlow就显得过于庞大而臃肿,而且计算速度并不能满足移动平台的要求。为了解决这个问题,Google开发了TensorFlow Lite,实现了TensorFlow到移动平台生态体系的延续。
TensorFlow Lite是一种用于设备端推断的开源深度学习框架,其目前是作为TensorFlow的一个模块发布,但我们需要知道TensorFlow Lite和TensorFlow几乎是两个独立的项目,两者之间基本没有共享代码。因此可以说TensorFlow Lite是一个完整而且独立的前向计算引擎框架。
使用TensorFlow Lite需要单独训练一些适用于移动平台的轻量级模型,减少参数数量,提升计算速度。与此同时,TensorFlow Lite还提供了模型转换工具,用于将TensorFlow的模型直接转换为TensorFlow Lite的模型,而且可以实现模型的压缩存储,还能实现模型参数的量化。这样就可以实现在服务器的TensorFlow上训练,在移动平台应用的场景。
此外,TesnorFlow Lite需要我们将其转换后的tflite文件打包到App或者目标存储设备中。TensorFlow Lite启动时会将其加载到移动设备或嵌入式设备中。
最后,TesnorFlow Lite对移动平台的前向计算进行了优化,可以加速浮点数运算,进行半精度浮点数运算,以及8位整数的量化计算,甚至可以通过代理方式在GPU上或者Android的NNAPI上调用。
03 MXNet
Apache MXNet是一个深度学习框架,主要目标是确保深度学习框架的灵活性与执行效率。它允许你混合符号和命令式编程,以最大限度地提高效率和生产力。
MXNet的核心是一个动态依赖调度程序,可以动态地自动并行化符号和命令操作。最重要的图形优化层使符号执行更快,内存效率更高。MXNet便携且轻巧,可有效扩展到多个GPU和多台机器。
MXNet支持命令式和符号式两种编程模式,简单、易于上手,同时支持在多端运行,包括多CPU、多GPU、集群、服务器、工作站,甚至移动智能手机。和其他框架一样,MXNet也支持多语言接口,包括C++、Python、R、Scala、Julia、Matlab和JavaScript。
最后MXNet可以非常方便地部署到云端,包括Amazon S3、HDFS和Azure。不过这里值得一提的是,MXNet很好地支持了AWS SageMaker,能够借助一系列工具有针对性地(计算平台、体系结构、网络等)进行模型优化,并非常直接地在Core ML移动平台引擎上使用。
04 PyTorch
PyTorch是这里最年轻的深度学习框架,也是最近发展最为迅猛的研究用深度学习框架,因为其上手简单、灵活强大,如今Caffe2也正式并入PyTorch。使用PyTorch可以非常快速地验证研究思路而为广大研究人员喜爱。
PyTorch是一个以C/C++为核心实现,以Python为胶水语言,编写调用接口的框架。与TensorFlow一样,PyTorch利用Autograd模块自动计算导数,避免了复杂的手动求导。因此PyTorch非常适合深度学习。
关于作者:卢誉声,Autodesk数据平台和计算平台资深工程师,负责平台架构研发工作。工作内容涵盖大规模分布式系统的服务器后端、前端以及SDK的设计与研发,在数据处理、实时计算、分布式系统设计与实现、性能调优、高可用性和自动化等方面积累了丰富的经验。擅长C/C++、JavaScript开发,此外对Scala、Java以及移动平台等也有一定研究。
本文摘编自《移动平台深度神经网络实战》,经出版方授权发布。
延伸阅读《移动平台深度神经网络实战》