机器学习者必知的5种深度学习框架
深度学习需要大量的计算。它通常包含具有许多节点的神经网络,并且每个节点都有许多需要在学习过程中必须不断更新的连接。换句话说,神经网络的每一层都有成百上千个相同的人工神经元在执行相同的计算。因此,神经网络的结构适用于GPU(图形处理单元)可以高效执行的计算类型(GPU是专门为并行计算相同指令而设计的)。
随着深度学习和人工智能在过去几年的迅速发展,我们也看到了许多深度学习框架的引入。深度学习框架的创建目标是在GPU上高效运行深度学习系统。这些深度学习框架都依赖于计算图的概念,计算图定义了需要执行的计算顺序。在这些框架中你使用的是一种可以建立计算图的语言,并且语言的执行机制与其宿主语言本身的机制有所不同。然后,计算图可以并行地在目标GPU中优化和运行。
在这篇文章中,我想向大家介绍推动深度学习发展的5个主力框架。这些框架使数据科学家和工程师更容易为复杂问题构建深度学习解决方案,并执行更复杂的任务。这只是众多开源框架中的一小部分,由不同的科技巨头支持,并相互推动更快创新。
1. TensorFlow (Google)
TensorFlow最初是由Google Brain Team的研究人员和工程师开发的。其目的是面向深度神经网络和机器智能研究。自2015年底以来,TensorFlow的库已正式在GitHub上开源。TensorFlow对于快速执行基于图形的计算非常有用。灵活的TensorFlow API可以通过其GPU支持的架构在多个设备之间部署模型。
简而言之,TensorFlow生态系统有三个主要组成部分:
- 用C ++编写的TensorFlow API包含用于定义模型和使用数据训练模型的API。 它也有一个用户友好的Python接口。
- TensorBoard是一个可视化工具包,可帮助分析,可视化和调试TensorFlow计算图。
- TensorFlow Serving是一种灵活的高性能服务系统,用于在生产环境中部署预先训练好的机器学习模型。Serving也是由C ++编写并可通过Python接口访问,可以即时从旧模式切换到新模式。
TensorFlow已被广泛应用于学术研究和工业应用。一些值得注意的当前用途包括Deep Speech,RankBrain,SmartReply和On-Device Computer Vision。大家可以在TensorFlow的GitHub项目中查看一些最佳官方用途,研究模型、示例和教程。
我们来看一个运行的示例。 在这里,我在TensorFlow上用随机数据训练一个基于L2损失的2层ReLU网络。
这个代码有两个主要组件:定义计算图并多次运行这个图。在定义计算图时,我为输入x,权重w1和w2以及目标y创建placeholders进行占位。然后在前向传播中,我计算目标y的预测以及损失值(损失值为y的真实值与预测值之间的L2距离)。最后,我让Tensorflow计算关于w1和w2的梯度损失。
完成计算图构建之后,我创建一个会话框来运行计算图。在这里我创建了numpy数组,它将填充建图时创建的placeholders(占位符),将它们数值提供给x,y,w1,w2。为了训练网络,我反复运行计算图,使用梯度来更新权重然后获得loss,grad_w1和grad_w2的numpy数组。
Keras: 高级包装
深度学习框架在两个抽象级别上运行:低级别--数学运算和神经网络基本实体的实现(TensorFlow, Theano, PyTorch etc.)和高级别--使用低级基本实体来实现神经网络抽象,如模型和图层(Keras) 。
Keras是其后端库的包装,该后端库可以是TensorFlow或Theano - 这意味着如果你们在使用以TensorFlow为后端库的Keras,你实际上是在运行TensorFlow代码。Keras为您考虑到了许多基本细节,因为它针对神经网络技术用户,而且非常适合那些练习数据科学的人。它支持简单快速的原型设计,支持多种神经网络架构,并可在CPU / GPU上无缝运行。
在这个例子中,对一个与之前例子中相似的神经网络进行训练,我首先将模型对象定义为一系列图层,然后定义优化器对象。接下来,我建立模型,指定损失函数,并用单个“fit”曲线来训练模型。
2. Theano (蒙特利尔大学)
Theano是另一个用于快速数值计算的Python库,可以在CPU或GPU上运行。它是蒙特利尔大学蒙特利尔学习算法小组开发的一个开源项目。它的一些最突出的特性包括GPU的透明使用,与NumPy紧密结合,高效的符号区分,速度/稳定性优化以及大量的单元测试。
遗憾的是,Youshua Bengio(MILA实验室负责人)在2017年11月宣布他们将不再积极维护或开发Theano。原因在于Theano多年来推出的大部分创新技术现在已被其他框架所采用和完善。如果有兴趣,大家仍然可以为它的开源库做贡献。
Theano在许多方面与TensorFlow相似。那么让我们来看看另一个代码示例,使用相同批量和输入/输出尺寸来训练神经网络:
我首先定义了Theano符号变量(类似于TensorFlow占位符)。对于正向传播,我计算预测和损失; 对于反向传播,我计算梯度。然后我编译一个函数,根据数据和权重计算损失,得分和梯度。最后,我多次运行这个函数来训练网络。
3. PyTorch (Facebook)
Pytorch在学术研究者中很受欢迎,也是相对比较新的深度学习框架。Facebook人工智能研究组开发了pyTorch来应对一些在它前任数据库Torch使用中遇到的问题。由于编程语言Lua的普及程度不高,Torch永远无法经历Google TensorFlow那样的迅猛发展。因此,PyTorch采用了被已经为许多研究人员,开发人员和数据科学家所熟悉的原始Python命令式编程风格。同时它还支持动态计算图,这一特性使得它对做时间序列以及自然语言处理数据相关工作的研究人员和工程师很有吸引力。
到目前为止,Uber将PyTorch使用得最好,它已经构建了Pyro,一种使用PyTorch作为其后端的通用概率编程语言。 PyTorch的动态差异化执行能力和构建梯度的能力对于概率模型中的随机操作非常有价值。
PyTorch有3个抽象层次:
- 张量:命令性的ndarray,但在GPU上运行
- 变量:计算图中的节点;存储数据和梯度
- 模块:神经网络层;可以存储状态或可学习的权重
在这里我将着重谈一谈张量抽象层次。 PyTorch张量就像numpy数组,但是它们可以在GPU上运行。没有内置的计算图或梯度或深度学习的概念。在这里,我们使用PyTorch Tensors(张量)拟合一个2层网络:
正如你所看到的,我首先为数据和权重创建随机张量。然后我计算正向传播过程中的预测和损失,并在反向传播过程中手动计算梯度。我也为每个权重设置梯度下降步长。最后,我通过多次运行该功能来训练网络。
4. Torch (NYU / Facebook)
接下来我们来谈谈Torch。它是Facebook的开源机器学习库、科学计算框架和基于Lua编程语言的脚本语言。它提供了广泛的深度学习算法,并已被Facebook,IBM,Yandex和其他公司用于解决数据流的硬件问题。
作为PyTorch的直系祖先,Torch与PyTorchg共享了很多C后端。与具有3个抽象级别的PyTorch不同,Torch只有2个:张量和模块。让我们试一试一个使用Torch张量来训练两层神经网络的代码教程:
最初,我建立了一个多层的神经网络模型,以及一个损失函数。接下来,我定义一个回溯函数,输入权重并在权重上产生损失/梯度。在函数内部,我计算前向传播中的预测和损失,以及反向传播中的梯度。最后,我反复将该回溯函数传递给优化器进行优化。
5. Caffe (UC Berkeley)
Caffe是一个兼具表达性、速度和思维模块化的深度学习框架。由伯克利人工智能研究小组和伯克利视觉和学习中心开发。虽然其内核是用C ++编写的,但Caffe有Python和Matlab相关接口。这对训练或微调前馈分类模型非常有用。虽然它在研究中使用得并不多,但它仍然很受部署模型的欢迎,正如社区贡献者所证明的那样。
为了使用Caffe训练和微调神经网络,您需要经过4个步骤:
- 转换数据:我们读取数据文件,然后清洗并以Caffe可以使用的格式存储它们。我们将编写一个进行数据预处理和存储的Python脚本。
- 定义模型:模型定义了神经网络的结构。我们选择CNN体系结构并在扩展名为.prototxt的配置文件中定义其参数。
- 定义求解器:求解器负责模型优化,定义所有关于如何进行梯度下降的信息。我们在扩展名为.prototxt的配置文件中定义求解器参数。
- 训练模型:一旦我们准备好模型和求解器,我们就通过从终端调用caffe binary(咖啡因)来训练模型。训练好模型后,我们将在一个扩展名为.caffemodel的文件中获得训练好的模型。
我不会为Caffe做代码展示,但是您可以在Caffe的主页上查看一个教程。总的来说,Caffe对于前馈网络和微调现有网络非常有用。您可以轻松地训练模型而无需编写任何代码。它的Python接口非常有用,因为您可以在不使用Python代码的情况下部署模型。不利的一面是,您需要为每个新的GPU图层编写C++内核代码(在Caffe下)。因此,大网络(AlexNet,VGG,GoogLeNet,ResNet等)的构建将会非常麻烦。
您应该使用哪种深度学习框架?
由于Theano不再继续被开发,Torch是以不为许多人熟悉的Lua语言编写的,Caffe还处于它的早熟阶段,TensorFlow和PyTorch成为大多数深度学习实践者的首选框架。虽然这两个框架都使用Python,但它们之间存在一些差异:
- PyTorch有更加干净清爽的接口,更易于使用,特别适合初学者。大部分代码编写较为直观,而不是与库进行战斗。相反,TensorFlow拥有更繁杂的小型、含混的库。
- 然而,TensorFlow拥有更多的支持和一个非常庞大,充满活力和乐于助人的社区。这意味着TensorFlow的在线课程,代码教程,文档和博客帖子多于PyTorch。
- 也就是说,PyTorch作为一个新平台,有许多有趣的功能尚未被完善。但是令人惊奇的是PyTorch在短短一年多的时间里取得了巨大的成就。
- TensorFlow更具可扩展性,并且与分布式执行非常兼容。它支持从仅GPU到涉及基于实时试验和错误的繁重分布式强化学习的庞大系统的所有的系统。
最重要的是,TensorFlow是“定义 - 运行”,在图形结构中定义条件和迭代,然后运行它。另一方面,PyTorch是“按运行定义”,其中图结构是在正向计算过程中实时定义的。换句话说,TensorFlow使用静态计算图,而PyTorch使用动态计算图。基于动态图的方法为复杂体系结构(如动态神经网络)提供了更易于操作的调试功能和更强的处理能力。基于静态图的方法可以更方便地部署到移动设备,更容易部署到更具不同的体系结构,以及具有提前编译的能力。
因此,PyTorch更适合于爱好者和小型项目的快速原型开发,而TensorFlow更适合大规模部署,尤其是在考虑跨平台和嵌入式部署时。 TensorFlow经受了时间的考验,并且仍然被广泛使用。它对大型项目具有更多功能和更好的可扩展性。 PyTorch越来越容易学习,但它并没有与TensorFlow相同的一体化整合功能。这对于需要快速完成的小型项目非常有用,但对于产品部署并不是最佳选择。
图片来源: Jamie StreetonUnsplash