2020年需要牢记的10个深度学习Best Practices

引言

如果你阅读21世纪以来关于人工智能的文献和出版物,你就不能忽视深度学习。它是机器学习的一个子集,涉及学习特征的层次结构,以从复杂的输入空间获得有意义的见解。

虽然人们通常对使用深度学习感到兴奋,但很快就会因为实施深度网络的难度而感到气馁。特别是在工业界,将深度学习集成到现有计算基础设施中的开发流程仍然是一个挑战。许多组织渐渐意识到,在真实系统中,深度学习代码的比例远远小于支持它所需的基础设施。

随着项目从小规模研究转向大规模部署,需要大量资源来支持推理、分布式训练、数据工作流(Data Pipeline)、模型监控……小公司要努力和拥有大量资源投资于深度学习工作流开发的大公司竞争。幸运的是,对于任意规模的公司,都有一些通用的最佳实践来实现深度学习模型的试用。
在这里插入图片描述

定义业务问题

运行一个成功的深度学习项目的第一步也是最重要的一步是定义一个业务问题。没有这一点,项目就不存在。为了深入研究一个业务用例,您必须从一个关键的业务问题列表开始,并从整个公司的团队中征求反馈和想法。
让我们以这个发票数字化为例。你应该能够回答如下这些问题:
当前的流程是什么?
检查发票的流程随着时间的推移已经发展了很多,从手工检查到发票扫描。发票数字化涉及到许多人工审核步骤,所以我们肯定可以使用技术优化这个过程。
使用深度学习技术是否会特别帮助解决这个业务问题,如果是,如何帮助?
深度学习方法已经在文本阅读和从图像中提取结构化和非结构化信息这些特定问题上取得了进步。通过将现有的深度学习方法与光学字符识别(OCR)技术相结合,公司和个人已经能够将数字化文件的过程自动化,并使手动数据输入程序更简单,记录和存储更高效,错误率更低,响应时间更短。
我们有足够的数据吗?
在选择深度学习用例时,您将希望选择一个数据已经可用的用例。在开始项目之前需要收集数据并不是一件好事,因为它将延长项目周期。在我们的用例中,有用于OCR任务的数据集,如车牌识别或手写识别,但这些数据集很难满足保险索赔处理或供应商还款分配等业务所需的准确性。
我们是否愿意与外部合作伙伴一起解决这个问题?
因为你将和其他人一起完成这个项目,所以你选择的问题应该是你愿意让第三方参与的问题。注意,如果选择构建内部解决方案,那么构建该解决方案的成本必须通过增加注册客户数量、增加发票处理速度和减少所需的手工评审人员数量来补偿。
这个项目能帮我赚钱还是省钱?
如果答案是“可能”或“不”,那么就把它从清单上划掉。该项目应关注具有真实和可衡量结果的机会。对于发票数字化,有几个好处:流程自动化,提高效率,降低成本和存储,提高客户满意度,减少生态足迹。

计算投资回报比

在计算深度学习项目的投资回报比时存在许多挑战。一个是,通常很难将它单独用于改进,特别是对于更大的业务产出。此外,计算往往是复杂的,因为价值不是一个数字,而是跨多个部门和团队。因此,这项工作的最大部分通常是确定深度学习项目带来成功的所有可能方式。
每个企业的因素不同,但深度学些普遍的贡献是:
节省时间:这很容易量化。通过深度学习项目节省下来的时间可以重新投资到您的组织中,用于其他方案。
节省金钱:这个价值完全依赖于单个项目。深度学习可以提高各行业的准确性和效率。对于预测性维护用例,深度学习可以节省客户流失率和维护人力的成本。对于推荐引擎用例来说,深度学习可以提高客户参与度和品牌忠诚度。对于客户服务聊天机器人用例来说,深度学习可以降低支持运营成本,改善客户体验。
可扩展性:如果数据难以访问或太大而无法处理,深度学习工程师打包数据和维护模型的内部IT工作可能代价高昂。这是深度学习平台的一个关键好处,因为您的工程师可以访问数据管道,并在需要时进行更改。这最终将允许您的组织更快地扩展,而不必担心基础设施负担。
改善客户体验:当项目展示了您的组织对客户的承诺时,他们更有可能选择您而不是其他竞争对手,从而使您具有优势。此外,当客户的体验是根据他们的个人需求量身定制时,他们就不太可能流失。深度学习可以在不大幅增加人力成本的情况下实现这种客户体验。
为了增加您的项目的投资回报率,你的目标是制定明确的随着时间的推移也可以跟踪到位的KPI,例如:(1)每月项目交付的数量(2)从原型到生产的耗时(3)部署到生产/项目中客户机的请求比例。

关注数据数量和质量

在将数据输入深度学习模型之前,对数据进行预处理非常重要。真实的数据通常是不完整的(缺少属性值、缺少某些感兴趣的属性,或者只包含聚合数据)、嘈杂的(包含错误或异常值)和不一致的(包含代码或名称上的差异)。一些好的预处理实践包括清理(填充缺失值、平滑噪声数据、识别或去除异常值,以及解决不一致性)、集成(使用多个数据库、数据立方体或文件)、转换(标准化和聚合)、减少(减少体积但产生相同或类似的分析结果)和离散(用名词属性代替数值属性)。
在数量方面,在实际应用程序中部署深度学习模型时,应该不断向模型提供更多数据,以持续改进其性能。但是收集标注良好的数据并不容易,因为这个过程既耗时又昂贵。雇佣员工来手工收集原始数据并给它们贴上标签并不高效。
一个可省时又省钱的建议是,你可以在大规模的开源数据集上训练你的深度学习模型,然后在你自己的数据上微调它。例如,谷歌的开放图像数据集有来自600个类别的边界框标记的近1600万图像。根据这些数据训练的模型在检测方面可能已经足够,您只需要对检测框中的对象进行分类。
如果用例与大型开源项目所满足的任务类型相似,那么上述方法就可以工作。在许多真实世界的情况下,它要求几乎100%的准确性(例如,欺诈检测,自动驾驶汽车),这是仅靠开源数据集是不可能做到的。为了解决这个问题,您可以通过利用数据增广来获得更多的数据,对现有数据进行微小的修改以生成综合修改数据。通过执行数据增广,你实际上可以阻止你的神经网络学习无关的模式,并提高它的整体性能。一些流行的图像数据增广技术包括水平和垂直翻转图像,一定程度上旋转图像,按一定比例向外或向内缩放图像,裁剪原始图像,沿着某些方向平移图像,向图像添加高斯噪声。这篇NanoNets文章提供了一些关于这些方法的详细评论,以及更先进的方法,如生成模型。

解决图像标注

正如你所见的数据增广的重要性,在构建强大的数据栈时,经常被忽略的一个组件是数据标注过程,而这个数据标注过程需要很鲁棒。标注是在图像上添加上下文信息或标签的过程,作为算法学习如何自动识别各种特征的训练示例。根据您的数据集,注释可以在内部生成,也可以外包给第三方服务提供商。
你可以尝试提供图片标注服务的第三方平台。你所要做的就是向他们描述你需要什么样的数据和标注。一些知名的平台如aleion、Figure Eight和Scale。他们的解决方案帮助不同行业,如自动驾驶汽车、无人机、机器人、AR/VR、零售等,处理各种数据标签和数据标注任务。
上一节已经介绍了一些外部第三方图像标注服务,所以在这里我将介绍内部标注的最佳实践,也就是构建你的标注基础设施:

  • 正式和标准化的培训和教育上投资是很重要的,以帮助提高不同数据集和标注器之间的质量和一致性。跳过这个步骤可能会导致歧义,因此,很多数据需要在以后重新标注,特别是那些需要特定类型的专业知识或倾向于包含任何主观性的数据。
  • 构建质量控制过程也很重要,该过程确保标注输出由其他人验证,以产生质量更高的数据。这个过程是在初始注释过程之后,在初始注释过程中,数据被随机发送以进行质量控制。
  • 最后,以数据驱动的方式,结合分析管理标注过程是至关重要的,特别是考虑到标注的操作性质。这些数据可以用来管理流程,并衡量您的团队如何针对标注器执行过度或不佳的目标进行工作。

既然已经构建了标注基础设施,那么如何使标注器更有效地输出数据呢?

  • 在对模型进行注释的早期阶段,使用更传统的方法(经典的计算机视觉技术)作为标注的基础通常是有意义的。这些方法可以显著减少标注时间并提高整体性能。
  • 标注用户界面非常重要。一个经过深思熟虑的、简单的界面在推动用户提供一致和高质量的标注方面大有帮助。
  • 最后,生成合成数据还可以帮助最大化单个标注的输出,因为它将为每个相应生成的数据集形成标注。

总的来说,高效地大规模生成干净、带标注的数据集的能力绝对是您业务的核心价值驱动因素。

组建团队

如今深度学习团队由拥有不同技能的人组成。当你开始构建生产级的深度学习解决方案时,你需要许多不同的角色。实现机器学习需要跨多个团队进行非常复杂的协调,只有最好的产品经理才能完成。以下是将ML交到用户手中所需的各种个人/团队:
1、数据科学家。探索并试图理解收集数据的相关性,这个人很了解统计和深度学习是如何工作的,同时还保持着良好的编程节奏。
2、深度学习工程师。将数据科学家创建的深度学习模型用于生产。这个人擅长编写可维护的代码,并且对深度学习的工作原理有很好的理解。
3、数据工程师。负责收集数据并使其对团队的其他成员可用。这个人知道如何规划可维护的数据管道,并管理如何测试数据。
4、数据标注员。对训练数据进行标记和注释。
5、UI设计师。用户体验和交互的设计师。
6、质量保证工程师。负责测试算法并检查故障情况。这个人应该擅长测试驱动开发中的最佳实践。
7、运营经理。将深度学习融入业务流程。这个人了解什么是组织的内部/复杂过程,在那里廉价的预测是有价值的,因此可以从深度学习中受益。
8、分销经理(通常来自销售/市场部门)。负责与客户沟通深度学习的价值。这个人必须具备领域内专业知识。

编写生产就绪代码

由于许多负责构建深度学习模型的数据科学家并非来自软件工程背景,所以代码的质量可能会有很大的差异,从而导致后续的可再现性和可维护性问题。因此,在这方面的最佳实践是编写可用于生产的代码,这些代码可以由许多其他人读取和执行,而不仅仅是编写它的人。特别地,生产就绪代码必须:(1)可再现性,(2)模块化,(3)文档完备。这些都是软件工程世界已经解决的挑战,所以让我们深入了解一些方法,它们可以立即对您的深度学习项目的质量产生积极的影响。
为了使你的代码可复制,你应该使用“git”来版本控制你的代码库,并尝试频繁地推送代码提交。对模型接受训练的数据集进行版本化也是很重要的,这样就可以跟踪模型的性能,因为模型随训练数据的变化而变化。您还应该使用一个虚拟环境,如“virtualenv”或“conda”,它们接受一个配置文件,其中包含代码中使用的包的列表。您可以通过版本控制在团队中分发此文件,以确保您的同事在相同的环境中工作。最后,你应该在编程时使用合适的IDE,比如PyCharm或Visual Studio Code,而不是Jupyter notebook。笔记本很适合初始原型,但不适用于可复制的工作流程。
要使代码模块化,您需要一个管道框架来处理数据工程和建模工作流。一些不错的选择是LuigiApache Airflow,它们允许您将工作流构建为图中的一系列节点,并为您提供依赖项管理和工作流执行。您可能希望为代码库编写单元测试,以确保所有行为都符合预期,这在深度学习中非常重要,因为您正在处理黑盒算法。最后,您应该考虑向repo中添加持续集成,它可以用于在每次提交或合并后运行单元测试或管道,确保代码库的更改不会破坏它。
为了保持代码的良好文档化,您可能希望将代码组织在标准结构中,以便您的同事容易理解代码库。我最喜欢Cookiecutter上的模板。然后,您应该选择一种编码风格约定(如PEP8),并使用预提交检查程序(如yapf)强制执行它。如果您不想自己编写文档,可以使用Sphinx为项目创建文档。

模型跟踪实验

现在大多数公司都能够系统地存储代码的版本,通常是通过像Git这样的版本控制系统。对于每个深度学习实验,您的组织应该有一个系统的方法来存储以下内容:

  • 训练代码:您可以简单地使用常规的软件开发版本控件,比如Git来存储用于运行特定实验的代码的确切版本。
  • 模型参数:存储参数并能够在一段时间内查看特定模型的参数值将帮助您对参数空间如何影响您的模型有深入的了解和直觉。当你的团队成长时,这是非常关键的,因为新员工将能够看到一个特定的模型在过去是如何被训练的。
  • 数据集:数据集的版本控制和存储对于再现性和遵从性非常重要。当处理深度学习时,解释性变得越来越困难,开始理解模型的一个好方法是查看训练数据。良好的数据集版本控制将在你面临诸如GDPR之类的隐私法律或未来可能遇到的诸如模型偏差之类的法律问题时帮助你。
  • 硬件:如果您使用功能更强大的云硬件,那么很重要的一点是要方便地查看硬件使用统计数据。不需要手动运行检查和监控,就可以很容易地看到机器的GPU使用和内存使用情况。这将优化机器的使用并帮助调试瓶颈。
  • 环境:包管理很困难,但为了使代码易于运行,完全是强制性的。基于容器的工具,如Docker,允许您快速加快围绕项目的协作。
  • 成本:在评估和预算机器学习开发时,实验的成本很重要。
  • 模型:模型版本控制是存储代码输出的一种好方法。
  • 日志:培训执行时间日志对于调试用例是必不可少的,但它们也可以提供重要的信息,用于跟踪关键指标,如准确性或培训速度和估计完成时间。
  • 结果:查看您所运行的任何训练实验的性能和关键结果都应该是微不足道的。

所谓系统化,我指的是一种方法,在这种方法中,你实际上能够将一个模型用于生产,并查看用于提出该模型的代码版本。每一个实验都应该这样做,无论它们是否在生产中。

本地v/s云基础设施

基础设施包括AWS、GCP、Microsoft Azure等传统提供商;以及ML的专业提供商,如Paperspace和FloydHub。本地基础设施包括预构建的深度学习服务器,如Nvidia工作站和Lambda Labs;以及从零开始的深度学习工作站(查看诸如此类的资源)。

  • 选择云计算的主要好处包括较低的进入门槛、来自供应商的可用支持,以及与不同规模的计算集群一起扩展的能力。
  • 另一方面,投资于内部系统可以让您在不考虑成本的情况下,尽可能多地迭代和尝试不同的实验,尽可能多地使用硬件处理项目。
    最终,在这两个选项中进行选择实际上取决于手头的用例和所涉及的数据类型。最有可能的情况是,您的组织将需要在项目工作流的不同点从一个环境转移到另一个环境,从初始试验到大规模部署。

当您刚刚开始时,云提供商(特别是特定于ML的提供商)是有意义的。只需要很少的前期投资,无论是金钱还是时间,你就可以获得关于GPU的第一个模型训练。然而,随着团队的壮大和模型数量的增加,使用本地的部署节省的成本几乎可以达到大型公共云的10倍。此外,您还可以提高构建内容的灵活性和更好的数据安全性,显然,本地解决方案是大规模进行深度学习的正确选择。

使用分布式训练

深度学习突然流行的主要原因之一与强大的计算能力有关。深度学习需要在海量数据上使用大量的参数来训练神经网络。因此,分布式计算是充分利用现代硬件的完美工具。如果你不熟悉分布式计算,我告诉你,这是一种通过网络连接多个不同组件来编写软件的方法。
神经网络的分布式训练有两种方法:(1)数据并行性和(2)模型并行性。

  • 数据并行性,试图将数据集平均划分到系统的节点上,每个节点都有神经网络的副本及其局部权值。每个节点操作数据集的唯一子集,并更新其本地的权值集。这些局部权值在集群中共享,通过累加算法计算出一个新的全局权值集。然后将这些全局权值分配到所有节点,然后进行下一批数据的处理。
  • 模型并行性,试图通过将模型的体系结构分割到单独的节点来分散训练。它适用于模型架构太大,无法在单个机器上安装,且模型有一些部分可以并行化的情况。一般来说,大多数网络都可以安装在2个gpu上,这就限制了可以实现的可伸缩性。

实际上,数据并行在大型组织中更受欢迎,并经常用于执行生产级深度学习算法。下面是几个很好的框架,可以让你实现大规模的数据并行:

  • MXNet——一个轻量级的、可移植的、灵活的分布式深度学习工具,适用于Python、R、Julia、Go、Javascript等。
  • deeplearning4j——一个面向Java, Clojure, Scala的分布式深度学习平台。
  • 分布式机器学习工具包(DMTK) ——一个分布式机器学习框架(由微软创建),允许你做主题建模,词嵌入,梯度增强树。
  • elephant——Keras的扩展,允许您使用Spark大规模运行分布式深度学习模型。
  • Horovod——TensorFlow的分布式培训框架(由Uber创建)。

在实际部署模型

深度学习项目不应该在真空中进行;因此,将模型实际集成到公司的运营中是至关重要的。回到第一部分,深度学习项目的目标毕竟是提供商业价值。这意味着模型将需要投入生产,而不会陷入原型或沙箱阶段。
机器学习开发中一个被低估的最大挑战是在生产中以可扩展的方式部署训练过的模型。Docker是解决这个问题的最好工具之一,它是一个容器化平台,可以将应用程序及其所有依赖打包到一个容器中。当你有许多服务以独立的方式工作,并作为web应用程序的数据提供商时,就会使用Docker。根据负载的不同,可以根据设置的规则按需分离实例。
Kubernetes Engine是另一个可以大规模运行工作负载的好地方。在能够使用Kubernetes之前,您需要对应用程序进行容器化。您可以在Docker容器中运行大多数应用程序,没有太多麻烦。然而,在生产中有效地运行这些容器并简化构建过程则是另一回事。以下是根据谷歌Cloud提供的可靠实践,可以帮助您有效地构建容器:

  • 将单个应用程序打包到每个容器中:当一个容器中运行不止一个应用程序时,调试会比较困难。
  • 优化Docker构建缓存:Docker可以缓存你的镜像,以加速以后的构建。这是一个非常有用的特性,但它引入了一些在编写Dockerfiles时需要考虑的行为。例如,您应该尽可能晚地在Dockerfile中添加应用程序的源代码,以便缓存基本映像和应用程序的依赖项,而不是在每次构建时都重新构建。
  • 删除不必要的工具:这有助于减少主机系统的附加表面。
  • 尽可能构建最小的镜像:这将减少下载时间、冷启动时间和磁盘使用。您可以使用几种策略来实现这一点:从最小的基本镜像开始,利用镜像之间的公共层,并利用Docker的多阶段构建特性。
  • 考虑是否使用公共镜像:使用公共镜像可能是开始使用特定软件的一个很好的方法。然而,在生产中使用它们会带来一系列挑战,特别是在高约束环境中。例如,您可能需要控制其中的内容,或者您可能不想依赖于外部存储库。另一方面,为您使用的每个软件构建您自己的镜像并非易事,特别是因为您需要跟上上游软件的安全更新。对于您的特定用例,仔细权衡每种方法的优缺点,并做出明智的决定。

在广义上,容器非常适合用来确保分析和模型在不同环境中是可复制的。虽然容器对于在单个机器上保持依赖关系的整洁很有用,但它的主要好处是,数据科学家可以编写模型端点,而不必担心容器将如何承载。这种关注点分离使得与工程团队合作将模型部署到生产中更加容易。此外,使用Docker和/或Kubernetes,数据科学家还可以将模型部署到生产中。

结论

如果你忘记了这10个实践中的任何一个,你就有可能让涉众对正在进行的深度学习项目产生消极的看法而感到沮丧。此外,您还可能会冒险评估从一开始就注定失败的不完整努力的结果,从而浪费大量的时间和金钱。遵循这些实践将允许您的组织将深入的概念验证快速地转移到生产中,并节省更多的时间和金钱。

转自:https://nanonets.com/blog/10-best-practices-deep-learning

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值