如果你阅读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。笔记本很适合初始原型,但不适用于可复制的工作流程。
要使代码模块化,您需要一个管道框架来处理数据工程和建模工作流。一些不错的选择是Luigi和Apache Airflow,它们允许您将工作流构建为图中的一系列节点,并为您提供依赖项管理和工作流执行。您可能希望为代码库编写单元测试,以确保所有行为都符合预期,这在深度学习中非常重要,因为您正在处理黑盒算法。最后,您应该考虑向repo中添加持续集成,它可以用于在每次提交或合并后运行单元测试或管道,确保代码库的更改不会破坏它。
为了保持代码的良好文档化,您可能希望将代码组织在标准结构中,以便您的同事容易理解代码库。我最喜欢Cookiecutter上的模板。然后,您应该选择一种编码风格约定(如PEP8),并使用预提交检查程序(如yapf)强制执行它。如果您不想自己编写文档,可以使用Sphinx为项目创建文档。
现在大多数公司都能够系统地存储代码的版本,通常是通过像Git这样的版本控制系统。对于每个深度学习实验,您的组织应该有一个系统的方法来存储以下内容:
所谓系统化,我指的是一种方法,在这种方法中,你实际上能够将一个模型用于生产,并查看用于提出该模型的代码版本。每一个实验都应该这样做,无论它们是否在生产中。
云基础设施包括AWS、GCP、Microsoft Azure等传统提供商;以及ML的专业提供商,如Paperspace和FloydHub。本地基础设施包括预构建的深度学习服务器,如Nvidia工作站和Lambda Labs;以及从零开始的深度学习工作站(查看诸如此类的资源)。
当您刚刚开始时,云提供商(特别是特定于ML的提供商)是有意义的。只需要很少的前期投资,无论是金钱还是时间,你就可以获得关于GPU的第一个模型训练。然而,随着团队的壮大和模型数量的增加,使用本地的部署节省的成本几乎可以达到大型公共云的10倍。此外,您还可以提高构建内容的灵活性和更好的数据安全性,显然,本地解决方案是大规模进行深度学习的正确选择。
深度学习突然流行的主要原因之一与强大的计算能力有关。深度学习需要在海量数据上使用大量的参数来训练神经网络。因此,分布式计算是充分利用现代硬件的完美工具。如果你不熟悉分布式计算,我告诉你,这是一种通过网络连接多个不同组件来编写软件的方法。
神经网络的分布式训练有两种方法:(1)数据并行性和(2)模型并行性。
实际上,数据并行在大型组织中更受欢迎,并经常用于执行生产级深度学习算法。下面是几个很好的框架,可以让你实现大规模的数据并行:
深度学习项目不应该在真空中进行;因此,将模型实际集成到公司的运营中是至关重要的。回到第一部分,深度学习项目的目标毕竟是提供商业价值。这意味着模型将需要投入生产,而不会陷入原型或沙箱阶段。
机器学习开发中一个被低估的最大挑战是在生产中以可扩展的方式部署训练过的模型。Docker是解决这个问题的最好工具之一,它是一个容器化平台,可以将应用程序及其所有依赖打包到一个容器中。当你有许多服务以独立的方式工作,并作为web应用程序的数据提供商时,就会使用Docker。根据负载的不同,可以根据设置的规则按需分离实例。
Kubernetes Engine是另一个可以大规模运行工作负载的好地方。在能够使用Kubernetes之前,您需要对应用程序进行容器化。您可以在Docker容器中运行大多数应用程序,没有太多麻烦。然而,在生产中有效地运行这些容器并简化构建过程则是另一回事。以下是根据谷歌Cloud提供的可靠实践,可以帮助您有效地构建容器:
在广义上,容器非常适合用来确保分析和模型在不同环境中是可复制的。虽然容器对于在单个机器上保持依赖关系的整洁很有用,但它的主要好处是,数据科学家可以编写模型端点,而不必担心容器将如何承载。这种关注点分离使得与工程团队合作将模型部署到生产中更加容易。此外,使用Docker和/或Kubernetes,数据科学家还可以将模型部署到生产中。
如果你忘记了这10个实践中的任何一个,你就有可能让涉众对正在进行的深度学习项目产生消极的看法而感到沮丧。此外,您还可能会冒险评估从一开始就注定失败的不完整努力的结果,从而浪费大量的时间和金钱。遵循这些实践将允许您的组织将深入的概念验证快速地转移到生产中,并节省更多的时间和金钱。
转自:https://nanonets.com/blog/10-best-practices-deep-learning