当前位置: 首页 > 科技观察

每个机器学习者都必须知道的5个深度学习框架

时间:2023-03-23 11:58:37 科技观察

深度学习需要大量的计算。它通常由一个有很多节点的神经网络组成,每个节点都有很多连接,在学习过程中必须不断更新。换句话说,神经网络的每一层都有数百或数千个相同的人工神经元执行相同的计算。因此,神经网络的结构适用于GPU(图形处理单元)可以高效执行的计算类型(GPU专门设计用于并行计算相同的指令)。随着这几年深度学习和人工智能的飞速发展,我们也看到了很多深度学习框架的引入。创建深度学习框架的目的是在GPU上高效运行深度学习系统。这些深度学习框架都依赖于计算图的概念,计算图定义了需要执行计算的顺序。在这些框架中,您使用的是一种可以构建计算图的语言,并且该语言的执行机制与宿主语言本身的机制不同。然后可以优化计算图并在目标GPU上并行运行。在本文中,我想向您介绍推动深度学习发展的5个主要框架。这些框架使数据科学家和工程师更容易为复杂问题构建深度学习解决方案并执行更复杂的任务。这只是众多开源框架中的一小部分,由不同的科技巨头提供支持,并且相互推动彼此加快创新速度。1.TensorFlow(谷歌)TensorFlow最初是由谷歌大脑团队的研究人员和工程师开发的。其目的是面向深度神经网络和机器智能研究。自2015年底以来,TensorFlow的库已在GitHub上正式开源。TensorFlow对于快速执行基于图形的计算非常有用。灵活的TensorFlowAPI可以通过其GPU驱动的架构跨多个设备部署模型。简而言之,TensorFlow生态系统包含三个主要组件:TensorFlowAPI,用C++编写,包含用于定义模型和使用数据训练模型的API。它还具有用户友好的Python界面。TensorBoard是一个可视化工具包,可帮助分析、可视化和调试TensorFlow计算图。TensorFlowServing是一个灵活的高性能服务系统,用于在生产环境中部署预训练的机器学习模型。服务也是用C++编写的,并通过Python接口访问,允许从旧模式即时切换到新模式。TensorFlow已广泛应用于学术研究和工业应用。当前一些值得注意的用途包括DeepSpeech、RankBrain、SmartReply和On-DeviceComputerVision。你可以在TensorFlowGitHub项目上查看一些最好的官方用途、研究模型、示例和教程。让我们看一个工作示例。在这里,我使用随机数据在TensorFlow上训练一个具有L2损失的2层ReLU网络。此代码有两个主要组成部分:定义计算图和多次运行该图。在定义计算图时,我为输入x、权重w1和w2以及目标y创建了占位符。然后在forwardpass中,我计算了目标y的预测连同损失值(损失值是y的真实值和预测值之间的L2距离)。最后,我让Tensorflow计算关于w1和w2的梯度损失。完成计算图构建后,我创建一个会话框来运行计算图。这里我创建了numpy数组,会填充建图时创建的占位符(placeholders),并为x,y,w1,w2提供它们的值。为了训练网络,我迭代地运行计算图,使用梯度更新权重并获得numpy损失数组grad_w1和grad_w2。Keras:一个高级包装深度学习框架,在两个抽象级别上运行:低级-数学运算的实现和神经网络的基本实体(TensorFlow、Theano、PyTorch等)和高级-使用低级-级别基本实体以实现神经网络抽象,如模型和层(Keras)。Keras是其后端库的包装器,可以是TensorFlow或Theano——这意味着如果您使用Keras和TensorFlow作为后端库,您实际上是在运行TensorFlow代码。Keras会为您处理许多基本细节,因为它面向神经网络技术用户,是数据科学实践者的理想选择。它支持简单快速的原型制作,支持多种神经网络架构,并在CPU/GPU上无缝运行。在这个例子中,训练一个类似于前面例子的神经网络,我首先将模型对象定义为一系列层,然后定义优化器对象。接下来,我构建模型,指定损失函数,并使用单个“拟合”曲线训练模型。2.Theano(蒙特利尔大学)Theano是另一个可以在CPU或GPU上运行的用于快速数值计算的Python库。它是由蒙特利尔大学的蒙特利尔学习算法小组开发的一个开源项目。它的一些最突出的功能包括GPU的透明使用、与NumPy的紧密集成、高效的符号微分、速度/稳定性优化以及广泛的单元测试。遗憾的是,YoushuaBengio(MILA实验室负责人)于2017年11月宣布他们将不再积极维护或开发Theano。原因是Theano多年来引入的大部分创新现在已被其他框架采用和完善。如果您有兴趣,您仍然可以为其开源库做出贡献。Theano在很多方面与TensorFlow相似。那么让我们看另一个代码示例来训练具有相同批量大小和输入/输出维度的神经网络:我首先定义Theano符号变量(类似于TensorFlow占位符)。对于前向传播,我计算预测和损失;对于反向传播,我计算梯度。然后我编译一个函数,根据数据和权重计算损失、分数和梯度。最后,我多次运行这个函数来训练网络。3.PyTorch(Facebook)Pytorch在学术研究人员中很受欢迎,是一个相对较新的深度学习框架。Facebook的人工智能研究小组开发了pyTorch来解决其前身数据库Torch中遇到的一些问题。由于编程语言Lua的普及度不高,Torch永远感受不到谷歌TensorFlow的飞速发展。因此,PyTorch采用了许多研究人员、开发人员和数据科学家已经熟悉的原始Python命令式编程风格。它还支持动态计算图,这一特性使其对处理时间序列和自然语言处理数据的研究人员和工程师具有吸引力。到目前为止,Uber使用PyTorch的效果最好,它构建了Pyro,一种使用PyTorch作为后端的通用概率编程语言。PyTorch动态区分执行和构建梯度的能力对于概率模型中的随机操作非常有价值。PyTorch有3个抽象级别:张量:命令式ndarray,但在GPU上运行变量:计算图中的节点;存储数据和梯度模块:神经网络层;可以存储状态或可学习的权重这里我将重点放在张量抽象层面。PyTorch张量类似于numpy数组,但它们可以在GPU上运行。没有计算图或梯度或深度学习的内置概念。在这里,我们使用PyTorch张量拟合一个2层网络:如您所见,我首先为数据和权重创建随机张量。然后我计算前向传播过程中的预测和损失,并在反向传播过程中手动计算梯度。我还为每个权重设置了梯度下降步长。最后,我通过多次运行函数来训练网络。4.Torch(NYU/Facebook)接下来说说Torch。它是Facebook基于Lua编程语言的开源机器学习库、科学计算框架和脚本语言。它提供了广泛的深度学习算法,并已被Facebook、IBM、Yandex和其他公司用于解决数据流的硬件问题。作为PyTorch的直接祖先,Torch与PyTorchg共享许多C后端。与具有3个抽象级别的PyTorch不同,Torch只有2个:张量和模块。让我们尝试使用Torch张量训练两层神经网络的代码教程:最初,我构建了一个多层神经网络模型和一个损失函数。接下来,我定义了一个回溯函数,它接受权重并在其上产生损失/梯度。在函数内部,我在前向传递中计算预测和损失,在反向传递中计算梯度。最后,我反复将这个回溯函数传递给优化器进行优化。5.Caffe(加州大学伯克利分校)Caffe是一个具有表现力、速度和思维模块化的深度学习框架。由伯克利人工智能研究小组和伯克利视觉与学习中心开发。虽然它的核心是用C++写的,但是Caffe有Python和Matlab相关的接口。这对于训练或微调前馈分类模型很有用。虽然它在研究中使用不多,但它在部署模型中仍然很受欢迎,社区贡献者证明了这一点。为了使用Caffe训练和微调神经网络,您需要经过4个步骤:转换数据:我们读取数据文件,然后清理并以Caffe可以使用的格式存储它们。我们将编写一个Python脚本来进行数据预处理和存储。定义模型:模型定义了神经网络的结构。我们选择CNN架构并在扩展名为.prototxt的配置文件中定义其参数。定义求解器:求解器负责模型优化,定义有关如何进行梯度下降的所有信息。我们在扩展名为.prototxt的配置文件中定义求解器参数。训练模型:准备好模型和求解器后,我们通过从终端调用caffe二进制文件来训练模型。模型训练完成后,我们会得到训练好的模型,文件后缀为.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是“define-run”,在图结构中定义条件和迭代,然后运行它。另一方面,PyTorch是“由运行定义的”,其中图形结构是在前向计算期间实时定义的。也就是说,TensorFlow使用的是静态计算图,而PyTorch使用的是动态计算图。基于动态图的方法为动态神经网络等复杂架构提供了更多可操作的调试能力和更强的处理能力。基于静态图的方法可以更轻松地部署到移动设备、更轻松地部署到更多样化的体系结构以及提前编译的能力。因此,PyTorch更适合业余爱好者和小型项目的快速原型制作,而TensorFlow更适合大规模部署,尤其是在考虑跨平台和嵌入式部署时。TensorFlow经受住了时间的考验,仍然被广泛使用。对于大型项目,它具有更多功能和更好的可扩展性。PyTorch变得越来越容易学习,但它没有与TensorFlow一样的多合一集成。这对于需要快速完成的小型项目非常有用,但对于产品部署来说并不是最佳选择。图片来源:最后的JamieStreetonUnsplash上面的列表只是众多框架中比较突出的框架,大部分都支持Python语言。过去几年发布了几个新的深度学习框架,例如DeepLearning4j(Java)、Apache的MXNet(R、Python、Julia)、MicrosoftCNTK(C++、Python)和Intel的Neon(Python)。每个框架都是不同的,因为它们是由不同的人出于不同的目的开发的。总体概述将帮助您解决下一个深度学习难题。易用性(在架构和处理速度方面)、GPU支持、教程和培训材料的可用性、神经网络建模功能以及支持的语言都是为您选择最佳选项时的重要考虑因素。