深度学习与深度合成
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 深度学习框架

正如在第一章所述,深度学习是对人脑的模拟,本质上是对大量的矩阵进行操作。在深度学习刚刚起步阶段,深度学习的基本算法及网络模型需要每一个研究人员独自编写。为了提高工作效率,这些基本的通用代码被写成了框架并共享到网络中。随着时间的推移,部分框架不断完善并被大量的人使用从而流行至今。从此可以看出,深度学习框架即为软件开发中常提及的“库”,因此选用了一种框架开展深度学习研究,可以让大量不同应用领域的研究人员不需再进行重复的底层算法开发,能够利用框架提供的各种性能已得到验证的基本模块快速构建网络模型,让研究人员更关注于其各自的研究领域,大大提高了工作效率。目前已有的知名框架包括Theano、Caffe、MXNet、TensorFlow、Keras、PyTorch等。

2.1.1 Theano

Theano是最早的深度学习框架之一,2008年诞生于蒙特利尔理工学院,是一个基于Python语言、定位底层运算的计算库,同时支持GPU和CPU运算。Theano派生出了大量深度学习Python软件包,最著名的包括Blocks和Keras。Theano的核心是一个数学表达式的编译器,采用符号式语言定义程序员所需的结果,并使之成为一个使用numpy和高效本地库的代码。作为早期专门处理大型神经网络算法计算而设计的类库之一,Theano被认为是深度学习研究和开发的行业标准,深受学术界科研人员的喜爱。而且Theano支持机器学习中的逻辑回归、多层感知机、卷积神经网络、自动编码器、限制玻尔兹曼机、深度置信网络等学习方法,很多机器学习早期的相关教学课程都采用该框架。但由于Theano开发效率较低,模型编译时间较长,同时核心开发人员转投TensorFlow等原因,Theano目前已经停止维护,退出了深度学习的历史舞台。但作为Python的第一个深度学习框架,它为深度学习研究人员的早期开拓提供了极大的帮助,同时也为之后的深度学习框架的开发指明了基本的设计方向:即采用计算图为框架的核心,并利用GPU加速网络计算。

2.1.2 Caffe

Caffe是由伯克利大学视觉和学习中心的华人博士贾扬清在2013年开发的深度学习框架,Caffe的主要开发语言是C++,也提供Python、Matlab语言等接口,支持GPU和CPU。由于开发时间较早,在业界的知名度较高。2017年Facebook推出了Caffe的升级版本Cafffe2,Caffe2目前已经融入PyTorch框架中。Caffe代码组织性非常好,可读性强。另外Caffe提供了一整套工具集,可以用于训练数据预处理、网络模型的训练和测试,并且提供了一系列的参考网络结构、模型和教程。除此之外,Caffe完全开源,并且在国内外有很多比较好的社区,因此,许多提供源码的深度学习的论文都是使用Caffe来实现其模型的。在计算机视觉领域采用Caffe的应用尤其多,可以用来做图片分类、人脸识别、位置检测和目标追踪等。最初Caffe主要是面向学术研究,但它的代码质量比较高,程序运行非常稳定,所以也很适合企业应用环境。而且由于Caffe的底层是基于C++的,可以方便在各种硬件环境编译并移植,不仅支持Windows、Linux和Mac系统,也可以编译部署到Android和iOS移动设备系统上。因此,Caffe深度学习框架深受学术界和工业界的厚爱,被称为第一个工业级的深度学习框架。

2.1.3 Torch

Torch也是一个历史比较悠久的科学计算框架,2000年公布了第一版本,在Facebook开源了其深度学习的组件之后得到发扬光大,此后包括Google、Twitter、纽约大学等组织都大量使用Torch。Torch是采用Lua语言编写的科学计算框架,支持多种机器学习算法,其中包含了大量计算机视觉、信号处理、并行运算、图像视频及音频等多媒体信息处理的库。Torch配置有大量预先训练好的深度学习模型,能够方便设计新的网络层,有利于设计更加复杂的神经网络拓扑图结构,支持CPU和GPU上的并行运算。Torch采用了Lua语言编写,Lua的性能是非常优秀的(该语言经常被用来开发游戏),语法相对于C/C++更加简洁,易于掌握,而且Lua可以使用接口简便地调用大量基于C的库,因此也可以方便地移植到各种环境。Lua不仅支持Linux、Mac桌面操作系统,还支持iOS、Android、FPGA等各种嵌入式系统,但由于运行时必须安装LuaJIT的环境,妨碍了其在工业生产环境的使用,而且使用Lua语言需要学习成本,其应用状况远不如Caffe和TensorFlow框架。

2.1.4 MXNet

MXNet名字源于“Mix and Maximize”,由华人博士陈天奇和李沐等人开发,是一个轻量级的深度学习框架,具有高效率、灵活性强、节省内存和可移植性强的特点。由于其开发者来自cxxnet、minerva和purine2等深度学习项目,博采众家之长,吸收了不同框架的优点,支持多机多节点、多GPU计算。它是率先支持多GPU和分布式的深度学习框架,能够自动将计算任务并行化到多个GPU或分布式集群。为了方便开发者使用,MXNet支持C++、Python、R、Scala、Julia、Go、MATLAB和JavaScript等多种语言接口,同时在底层兼容Caffe和Torch计算模块等。为了节省内存,MXNet设计了一种独特的内存优化方法,可以在小显存GPU上训练其他框架因显存不够而无法训练的深度学习模型,也可以在Android、iOS等移动设备上运行基于深度学习的图像识别等任务。目前MXNet框架已经是亚马逊公司的官方深度学习框架,文档和案例也较为丰富,其仍然处于不断发展和完善之中,发展的方向是小而精、高效灵活,并且将会有更多的语言支持、更多的应用领域(比如建模、语言和视频等)和更完善的支持文档。

2.1.5 TensorFlow

Tensorflow的前身为Google人工智能学习系统Distbelief。Google在2011年首次推出Distbelief,在此基础上可以将Google应用程序中的语音识别率提升了25%,并且在Google Photos中建立了图片搜索功能,但它基于Google内部基础设施开发,在代码分享方面存在很大的困难。针对这些问题,Google于2015年发布了TensorFlow深度学习框架,Tensorflow是一个异构分布式系统上的大规模机器学习框架,支持多种深度学习模型,具有较好的移植性能,适用于大规模的集群及小型移动设备等多种应用环境。得益于发布时间较早,以及Google在深度学习领域的影响力和号召力,TensorFlow很快成为近年来最流行的深度学习框架。随着Tensorflow的代码逐步开源,对新硬件设备的支持力度也不断提升,使用群体也越来越多。但是由于TensorFlow接口设计变动频繁,功能设计重复冗余,编程开发和调试较为困难,学习成本较高,TensorFlow1.x版本一度被业界诟病。2019年,Google推出TensorFlow2正式版本,采用了动态图优先模式运行,从而避免了TensorFlow 1.x版本的诸多缺陷,弥补了TensorFlow之前在上手难度方面的不足,使得用户可以既能轻松上手学习和使用TensorFlow框架,又能方便部署网络模型至工业系统,更进一步获得业界的广泛认可。

2.1.6 Keras

Keras是一个基于Theano和TensorFlow等框架提供的底层运算而实现的高层框架,使用Python实现,它提供了目前为止最方便的深度学习API,大大减少了用户的工作量,避免重复制作“轮子”。因为底层使用Theano或TensorFlow,用Keras训练模型相比于前两者基本没有什么性能损耗,而且简化了编程的复杂度,节约了设计新型网络结构的时间。Keras所有的模块都是简洁、易懂、方便配置,能够对网络层、损失函数、初始化方法、优化器、激活函数和正则化等模块进行自由组合。同时,也方便将新的模块进行添加,这让Keras非常适合最前沿的研究。可以说模型越复杂,使用Keras的收益就越大。此外,Keras中的模型采用Python语句定义,不需像Caffe、CNTK等添加额外的文件来定义模型,这样就可以通过编程的方式对模型结构和各种超参数进行灵活调试。在Keras中,只需要几行代码就能实现一个多层感知器,或者十几行代码实现一个AlexNet网络,这在其他深度学习框架中是不可能完成的任务。Keras最大的问题在于,Keras做了层层封装以屏蔽后端的差异性,导致用户在自定义操作或是获取底层的数据信息时过于困难。同时,过度封装也使得Keras的程序运行效率不高,不易发现隐藏于封装之中bug。另外就是学习Keras十分容易,用户主要是在调用接口实现深度学习,很难理解到深度学习的内涵。

2.1.7 PyTorch

PyTorch是Facebook基于原有的Torch框架推出的采用Python作为主要开发语言的深度学习框架。尽管PyTorch的发布时间在2017年,但是迅速在学术界获得了广泛好评。PyTorch基于Torch并由Facebook、NVIDIA等大企业及斯坦福大学、卡纳基梅隆大学等著名高校强力支持,具备十分详细条理清晰的官方文档和官方教程。PyTorch支持动态计算图,尽量少的进行封装,代码简洁易读,应用灵活。其接口沿用Torch,具有很强的易用性,同时可以很好地利用Python语言的各种优势。PyTorch一经推出就立刻引起了广泛关注,也得到了网络用户的大力支持,并群策群力推动了PyTorch的发展。当前开源的框架中,PyTorch在灵活性、易用性、速度这三个方面均相对于其他框架具有明显优势。在PyTorch 1.0版本后,PyTorch与Caffe2进行了整合,弥补了PyTorch在工业环境应用方面的不足。目前已经超越Caffe、MXNet和Theano等前辈,成为与TensorFlow并驾齐驱的主流深度学习框架。

2.1.8 框架选择

除了上述深度学习框架外,还包括微软开源的深度学习框架CNTK、百度深度实验室2013年推出的Paddle、由创业公司Skymind于2014年发布基于Java语言的Deeplearning4j等。目前来看,TensorFlow和PyTorch框架无疑是业界使用最为广泛的两个深度学习框架,TensorFlow在工业界拥有完备的解决方案和用户基础,PyTorch得益于其精简灵活的接口设计,可以快速设计调试网络模型,在学术界获得好评如潮。因此,初学者可以从TensorFlow或PyTorch入手学习,当然也包括对TensorFlow进行调用的Keras,本书的主要代码采用简便易用的Keras框架编写,方便读者入门。

需要指出的是,尽管深度学习框架的出现降低了入门的门槛,用户不再需要从复杂的神经网络开始编写代码,可以基于深度学习框架根据需要选择已有的模型,通过训练得到模型参数,或在已有模型的基础上增加自己的网络层,选择自己需要的分类器和优化算法,极大方便了深度学习用户的项目开发,大家不用重复编写基本的神经网络运算代码。然而,没有任何框架是完美的,就像一套积木玩具里可能没有你需要的那一种积木,而且不同的框架适用的领域不完全一致。因此,尽管深度学习框架为用户提供了一系列的深度学习的组件,但这些组件并不一定适应所有的应用场景,很多时候需要用户深入理解这些组件的功能和使用方法,然后编写程序、设计算法,最终调用深度学习框架的接口完成具体的应用开发。