1.3 深度学习框架介绍#

深度学习框架是为了简化和加速深度学习模型的开发、训练和部署而设计的软件工具。它们提供了高效的计算资源管理、自动微分和优化算法等功能,使研究人员和工程师能够更轻松地实现复杂的神经网络结构,并在大规模数据集上进行训练。深度学习框架的存在使得人工智能应用的开发过程更加高效和可靠,加速了技术的进步和应用的推广。

1.3.1 深度学习框架的出现#

在深度学习框架出现之前,开发深度学习模型的过程更为繁琐和复杂。在这样的情况下,每一位开发人员都需要手动实现神经网络的结构和算法,包括网络层(如CNN、RNN)、激活函数、损失函数以及反向传播算法等。同时,在没有现成的深度学习框架的情况下,开发人员需要从零开始编写大量的底层代码来实现神经网络模型,包括矩阵计算、梯度计算、优化算法等。最后,在进行模型训练时开发人员还需要手动管理计算资源,包括CPU、GPU和内存等以确保模型能够顺利地进行训练。总体而言,在没有深度学习框架的情况下,开发深度学习模型需要更多的时间和精力,并且容易出现错误。

基于这样的原因,深度学习框架应运而生。深度学习框架的出现极大地简化了深度学习模型的开发过程,能够在开发过程中为我们提供多种便利:

(1)简化开发过程:深度学习框架提供了高级抽象和易用的接口,使开发人员能够更快速地构建和实现复杂的神经网络模型,而无需从头开始编写底层代码;

(2)提供计算资源管理:深度学习框架能够有效地管理CPU和GPU等计算资源,以加速模型的训练和推理过程;

(3)自动微分:深度学习框架通常具备自动微分功能,能够自动计算出神经网络中各个参数对损失函数的梯度,从而简化了反向传播算法的实现。

(4)优化算法支持:深度学习框架提供了各种优化算法的实现,包括随机梯度下降、Adam、RMSProp等,使得模型的训练过程更加高效和稳定;

(5)跨平台支持: 深度学习框架通常支持多种硬件平台和操作系统,能够在不同的设备上进行部署和运行,提高了模型的可移植性和灵活性。

综上所述,深度学习框架为开发人员提供了一个强大的工具,使开发人员能够更快速、高效地构建、训练和部署深度学习模型,也加速了人工智能技术的发展和应用。

1.3.2 深度学习框架的历史#

从深度学习框架的理念被提出以后,不同公司或个人都曾推出了不同的深度学习框架。对于每个框架来说在提出之处都有其独特的特点和优势,它们也都提供了丰富的功能和工具,例如灵活的API、高效的计算引擎、分布式训练支持等,为研究人员和开发者提供了广泛的选择和灵活性,助力他们在各种任务和应用中取得成功。下面,我们就一些经典和流行的深度学习框架进行简单介绍。

1. Torch /tɔrtʃ/

Torch是一个开源的科学计算框架,专注于机器学习和深度学习任务,最初由罗南·科洛伯特(Ronan Collobert)和萨米·班吉欧(Samy Bengio) 等人于2002年10月发布并维护,并于2017年加入到PyTorch框架中 [1]。

图 1-55 Torch框架标识

Torch采用了动态计算图的设计,这使得用户可以动态定义、修改和执行计算图,极大地增强了灵活性。这种设计特性使得Torch在探索性研究和快速原型设计方面非常强大。Torch的主要接口是基于轻量且高效的Lua编程语言,且同样采用了模块化的设计理念使得用户可以方便地构建、组合和重用各种深度学习模型。同时,Torch也支持在GPU上进行张量运算,借助CUDA和cuDNN等加速库,可以显著提高深度学习模型的训练和推理速度。Torch提供了丰富的功能库,涵盖了从基本的张量操作到高级的神经网络构建、优化算法和可视化工具等方面。这些功能库使得用户可以高效地开展各种机器学习和深度学习任务。

2. Theano /ˈθiːənəʊ/

Theano项目开始于2007年,最初是由约书亚·本吉奥教授和他的学生们在蒙特利尔大学进行研究时所开发 [2] [3]。Theano项目目标是构建一个能够高效利用GPU进行数值计算的数学表达式编译器。2010年Theano发布了第一个稳定版本,开始引起学术界和工业界的关注,其符号计算的特性和GPU加速的能力使得 Theano在科学计算和深度学习领域得到了广泛的应用。

图 1-56 Theano框架标识

Theano 使用符号计算(Symbolic Computation)的方法,将数学表达式表示为符号变量和操作符的组合,然后通过计算图的形式来优化和求解这些表达式。这种方法使得Theano能够在计算图上进行各种优化,使得Theano在处理大规模数据和复杂模型时表现优异。Theano还提供了Python接口,使得用户可以使用Python的简洁和灵活性来定义和管理数学表达式。这种设计让Theano易于学习和使用,并且与Python的其他科学计算库(如NumPy、SciPy等)无缝集成。同时,Theano 能够自动计算数学表达式的导数,这对于训练深度学习模型和实现反向传播算法异常重要。尽管 Theano 不是专门针对深度学习而设计的框架,但其强大的符号计算能力和 GPU 加速功能使得它成为了早期深度学习研究和实践中的重要工具之一。然而,随着其他深度学习框架(如TensorFlow、PyTorch等)的发展,Theano的使用和发展逐渐受到了限制,2017年Theano维护团队宣布将不再继续开发Theano并停止了维护。

3. MXNet /ˈemˌeksˈnet/

MXNet 是一个开源的深度学习框架,同样也用于训练和部署深度神经网络,由陈天琦和李沐等人于2015年在NeurIPS会议上所提出。MXNet 由 CXXNet、Minerva 和 Purine2 三个项目(同样也是深度学习框架)的作者合作而成,分别融合了CXXNet 的静态优化、 Minerva 的动态执行和Purine2 的符号计算等思想以达到灵活性、速度和内存效率的目标。2015年 MXNet 发布了开源版本,并逐渐开始在学术界和工业界引起关注,其分布式计算的特性以及多语言(包括C++、Python、Java、Julia、Matlab、JavaScript、Go、R、Scala、Perl和Wolfram语言)支持为其赢得了一定的用户群体 [4] [5]。

图 1-57 MXNet框架标识

除了上述语言外,经过 MXNet 训练的模型还可用于 MATLAB 和 JavaScript 的推理过程,并且无论使用哪种模型构建语言,MXNet 都会调用优化的 C++ 作为后端引擎。此外,它具有可扩展性,可在从移动设备到分布式图形处理单元 (GPU) 集群的各种系统上运行,还可以自动扩展到多个主机的多块GPU上。2017年,MXNet 加入了Apache软件基金会,并成为了亚马逊AWS的首选深度学习框架之一,被集成到AWS的深度学习服务中。同时,MXNet 还采用了符号式(Symbolic)和命令式(Imperative)两种编程风格,用户可以根据需要选择合适的方式进行开发,前者可以提高性能和并行度,而后者则更适合快速原型设计和实验。不过遗憾的是,在 MXNet 的发展过程中因诸多因素逐渐被大众所遗忘,目前该项目已经停止了更新。

4. Caffe /ˈkæfeɪ/

CAFFE(Convolutional Architecture for Fast Feature Embedding)是贾扬清在加州大学伯克利分校攻读博士学位时所创建的项目并于 2014年开源 [6] [7]。2016年2月,贾扬清从谷歌离职进入Facebook,在时任Facebook人工智能实验室负责人杨立昆手下担任研究科学家。2017年4月,Facebook发布Caffe2,加入了循环神经网络等新功能。2018年3月底,Caffe2并入PyTorch框架。

图 1-58 Caffe框架标识

CAFFE是一个以C++编写的开源框架,具有灵活性和高效性并且提供了Python接口,设计之初旨在实现快速的卷积神经网络训练和推理。CAFFE的设计采用了模块化的理念,允许用户轻松定义、修改和组合不同的神经网络层。这种设计使得实验迭代更加便捷,也方便了定制化网络结构。同时,CAFFE也支持在CPU和GPU上进行训练和推理,并提供了与各种深度学习加速库(如cuDNN)的集成,以提高计算性能。CAFFE开源以后在计算机视觉领域得到了广泛应用,特别是在图像分类、目标检测和语义分割等任务上取得了显著的成果。此外,它还支持多种数据类型和任务,包括图像、文本和语音等。

5. Keras /ˈkerəs/

Keras 最早由谷歌的一名研究员 弗朗索瓦·肖莱 (François Chollet)在他个人工作的项目中所开发,并于2015年3月27日以开源软件的形式发布(并不是由谷歌公司所发布)[8] [9]。与其它深度学习框架不同的是,Keras 被定义为是一个更高级的API接口而非独立的机器学习框架。它提供了更高级别、更直观的抽象集,无论使用何种计算后端(例如 TensorFlow、PyTorch或是Theano),用户都可以轻松地开发深度学习模型。

图 1-59 Keras框架标识

Keras 是一个用 Python 编写的开源人工神经网络库,旨在快速实现深度神经网络,专注于用户友好、模块化和可扩展性。直到2.3版本以前,Keras 支持多个后端,包括 TensorFlow、Theano等。从版本 2.4 开始,Keras 仅支持 TensorFlow作为计算后端。然而,从版本 3.0 开始,Keras 将再次成为多后端,支持 TensorFlow、JAX和PyTorch等计算框架。Keras 的设计目标之一是使深度学习模型的构建和实验变得尽可能简单。Keras 采用了模块化的设计理念,模型可以通过堆叠不同的层来构建。这种设计使得用户可以轻松地构建、组合和调整神经网络模型,而无需深入理解底层的实现细节。由于其简单易用的特性,Keras 被广泛应用于学术界和工业界的深度学习项目中,包括于图像分类、目标检测、自然语言处理等各种任务。在2017年,Keras 更成为了 TensorFlow 的官方高级API,进一步巩固了其在深度学习领域的地位。

6. Chainer /ˈtʃeɪnər/

Chainer是一个开源深度学习框架,由日本风险投资公司首选网络(Preferred Networks)牵头,与IBM、英特尔、微软和英伟达4家公司合作开发。在2015 年6月发布了第一个版本 [10] [11]。Chainer是一个使用纯 Python 开发的深度学习框架,因其设计伊始便采用了动态计算图这为 Chainer赢得了一定的关注和用户群体。随后,Chainer迅速得到了深度学习社区的认可和应用,并在学术界和工业界得到了广泛的使用。其灵活的动态计算图和易于使用的 Python API 使得 Chainer成为了一种流行的深度学习框架。

图 1-60 Chainer框架标识

与静态计算图的框架相比,Chainer采用动态计算图允许用户在运行时动态构建、修改和执行计算图。这种设计使得Chainer非常灵活,适用于探索性研究和快速原型设计以及教育和学术研究领域,以帮助用户更快地入门深度学习。同时,Chainer的 API 设计以 Python 为主,使得用户可以使用Python的简洁性和灵活性来进行深度学习模型的开发和调试。这种设计也使得 Chainer可以与 Python 的其他科学计算库无缝集成,为用户提供了丰富的工具和库。这些优点也被后来的后起之秀所借鉴。然而,随着其他深度学习框架(如PyTorch、TensorFlow等)的兴起和发展,Chainer的发展势头逐渐放缓,部分用户和开发者转向了其他框架。2020年,Preferred Networks 宣布 Chainer将进入维护模式,不再开发新功能,而是专注于提供漏洞修复和支持。

7. TensorFlow /’tensə fləʊ/

TensorFlow 最初由谷歌大脑团队开发,用于谷歌的研究和生产,于2015年11月9日在Apache 2.0开源许可证下发布,支持Python和C++等多种语言 [12] [13]。从2010年开始,谷歌大脑着手建立了支持数万个CPU来训练大规模神经网络的第一代分布式机器学习系统DistBelief,并有超过50多个团队在谷歌和其他字母表(Alphabet)公司的商业产品上部署了基于DistBelief的神经网络,包括谷歌搜索、谷歌语音搜索、广告、谷歌 相册等。后来,谷歌指派杰弗里·辛顿和杰夫·迪恩等人简化和重构DistBelief的代码库,使其变成一个更快、更健壮的应用级别代码库,这便形成了TensorFlow框架。

图 1-61 TensorFlow框架标识

TensorFlow 提供了灵活的计算模型,支持各种深度学习任务并提供了两种计算图的模式:静态计算图(1.0版本)和动态计算图(2.0 版本以后)。静态计算图在定义后即被固定,适合于高性能的生产环境;而动态计算图允许在运行时灵活地构建、修改和执行计算图,有助于探索性研究和快速原型设计。为了方便快速实现各种网络模型,TensorFlow 还提供了高级API接口(如Keras)和低级API接口,使得用户可以根据需求选择合适的抽象层级。Keras 提供了简洁而直观的接口,便于快速搭建和训练模型;而低级API则提供了更大的灵活性和控制权。同时,TensorFlow 还支持在各种硬件和平台上的并行和分布式计算,包括CPU、GPU、TPU(Tensor Processing Unit)等设备。它还提供了针对不同平台的优化和部署工具,以实现高效的模型。最后,TensorFlow 还拥有庞大的生态系统,包括了大量的预训练模型、工具库和扩展,涵盖了图像处理、自然语言处理、推荐系统等多个领域。

8. PaddlePaddle /ˈpædəlˈpædəl/

飞桨(PaddlePaddle)是由百度公司于2016年8月29日开源的深度学习框架,旨在为科学家、工程师和开发者提供一个易用、高效的深度学习框架 [14] [15]。PaddlePaddle 底层使用 C++ 进行开发,并同时提供了Python、Java等接口。PaddlePaddle 还提供了丰富的自动化工具,例如AutoDL模块,这些工具使得模型的设计、调参和优化过程更加自动化和高效化。

图 1-62 PaddlePaddle框架标识

PaddlePaddle内置了高效的分布式训练框架,支持在多个GPU或多个机器上进行并行训练,从而加速模型的训练和优化过程。这使得PaddlePaddle特别适合于处理大规模数据和复杂模型。在 PaddlePaddle 2.0 版本以后,其采用了动态图和静态图统一的设计,即既可动态计算又支持静态计算,用户可以根据需求选择合适的计算方式,同时它也提供了更灵活和高效的深度学习模型设计和训练方式。进一步,PaddlePaddle还针对不同的任务场景提供了对应的开发套件,如语义理解套件ERNIE、图像分类套件PaddleClas、图像分类套件PaddleClas和文字识别开发套件PaddleOCR等。

9. PyTorch /ˈpaɪˌtɔːrch/

PyTorch 是一个由 Meta 公司开发并维护的开源深度学习框架,于2016年10月首次发布 [16] [17]。PyTorch 最初由 Meta Platforms的人工智能研究团队开发,现在属于Linux基金会的一部分。PyTorch 是基于Torch库而来,底层由C++实现同时也支持Python接口。PyTorch 结合了动态计算图和自动微分的功能,与静态计算图的框架相比它允许用户根据需要动态地构建、修改和执行计算图。这种设计使得PyTorch 非常适合于探索性研究和快速原型设计。这也使得PyTorch成为了高校及研究人员最喜欢的深度学习框架。

图 1-63 PyTorch框架标识

PyTorch 的 API 设计以Python为主,这使得用户可以使用 Python 的简洁性和灵活性来进行深度学习模型的开发和调试,这也使得 PyTorch 可以与Python的其他科学计算库无缝集成,为用户提供了丰富的工具和库。同时,PyTorch 的模块化设计使得用户可以方便地构建、组合和重用各种深度学习模型。它提供了丰富的预定义模块,也允许用户自定义模块,从而更好地适应不同的任务和场景。PyTorch支持在GPU上进行张量计算,使用CUDA和cuDNN等GPU加速库来显著提高深度学习模型的训练和推理速度。PyTorch 还提供了丰富的功能库,涵盖了从基本的张量操作到高级的神经网络构建、优化算法等,使得用户可以高效地进行各种深度学习任务的开发和实验。

引用#

[1] https://en.wikipedia.org/wiki/Torch_(machine_learning)

[2] https://en.wikipedia.org/wiki/Theano_(software)

[3] https://github.com/Theano/Theano

[4] https://mxnet.apache.org/

[5] https://en.wikipedia.org/wiki/Apache_MXNet

https://insights.sei.cmu.edu/blog/mxnet-a-growing-deep-learning-framework/

https://github.com/apache/mxnet

[6] https://caffe.berkeleyvision.org/

[7] https://zh.wikipedia.org/wiki/Caffe

[8] https://en.wikipedia.org/wiki/Keras

[9] https://keras.io/

[10] https://chainer.org/

[11] https://en.wikipedia.org/wiki/Chainer

[12] https://zh.wikipedia.org/zh-cn/TensorFlow

[13] https://www.tensorflow.org/

[14] https://www.paddlepaddle.org.cn/

[15] https://github.com/PaddlePaddle/Paddle

[16] https://zh.wikipedia.org/zh-cn/PyTorch

[17] https://pytorch.org/