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

深度学习应用实践指南:七大阶段助你创造最佳新应用

时间:2023-03-22 16:13:25 科技观察

深度学习应用程序实用指南:帮助您创建最佳新应用程序的七个阶段来自实验深度神经网络的人员关于学习算法应用程序的实用建议。为了使项目更易于管理,建议分为几个阶段,每个阶段都包含大量建议和见解以帮助新手。本报告面向应用领域的主题专家,但对深度学习不熟悉。它为那些希望在以前从未使用过深度学习算法的应用程序上试验深度神经网络的人提供实用建议。为了使您的项目更易于管理,我们建议将其分成几个阶段。对于每个阶段,本报告都包含丰富的建议和见解来帮助新人。简介尽管我的研究重点是深度学习(DL),但我发现越来越多的人要求我帮助没有深度学习经验但想在其新颖应用中尝试深度学习的团队。这份NRL报告的动机是我注意到所有这些团体的大部分建议和指导都是相似的。因此,本报告讨论了更普遍相关的深度学习应用的各个方面。虽然机器学习的最佳实践建议有几个有用的来源[1-5],但在本报告中涵盖的深度学习方面存在一些差异。但是,我建议读者阅读并熟悉这些参考资料,因为它们包含很多有价值的信息。此外,还有许多关于软件工程和敏捷方法(我假设读者已经熟悉)的最佳实践资源(例如[6,7])。本报告中最重要的内容可以在《深度学习》的第11章“实用方法论”中找到,但我也在本报告中讨论了本教科书未涵盖的几个因素和见解。正如您在下面看到的,深度学习应用程序项目分为几个阶段。然而,在实践中,您可能会发现回到更早的阶段更有帮助。例如,在第3阶段寻找类比时,您可能会发现在第1阶段没有考虑过的新指标。所有这些最佳实践都意味着迭代回到某个阶段并随着项目的进展不断改进。第1阶段:开始准备在本报告中,我假设您是(或有权访问)该应用程序的主题专家。您应该熟悉有关解决相关问题的文献和研究,并了解最先进的解决方案和性能水平。如果深度学习解决方案值得,我建议您从一开始就考虑这一点。您必须考虑现有技术的性能水平是否足够高以保证根据本报告中提出的建议进行渐进式改进。不要仅仅因为它看起来是有史以来最伟大的方法就进行深度学习。您还应该考虑您是否拥有计算机资源,因为训练深度网络的每个过程可能需要几天或几周的时间。我在研究中充分利用了DoD的HPC系统。此外,您应该考虑机器学习是否合适——请记住,训练深度网络需要大量标记数据,如第2阶段所述。第一步是定量定义成功场景。不管是人做的还是机器做的,如果成功了,你会看到什么?这有助于定义您的评估指标。想想哪些指标很重要?哪些不是?您需要指定对这个项目的成功起作用的所有量化值,并确定如何对每个值进行加权。您还需要为您的指标定义目标;你的目标是否超过人类的表现?您的目标将极大地影响项目进度。定量了解人类在这项任务中的表现将有助于指导您的目标;最先进的技术与人类表现相比如何?同样,了解人类如何解决此任务将为深入了解机器如何解决其任务提供有价值的信息。其中一些指标还可用于设计损失函数,这有助于指导网络训练。不要只使用softmax/crossentropy/log因为这些是最常见的损失函数,尽管你应该从它们开始。根据定义,您的评估指标是对您的应用程序很重要的数量。准备好将这些指标作为损失函数的加权组成部分进行测试,以指导训练(参见第6阶段)。虽然您可能会考虑深度学习的强大功能,但请考虑如何使网络的“工作”尽可能简单。这是违反直觉的,但由于它是深度网络的力量,它可能会激励您尝试它。然而,网络执行的工作越简单,训练就越容易,性能也越好。您(或最先进的)目前使用的启发式/物理学可以在这里工作吗?数据可以预处理吗?虽然网络可以学习复杂的关系,但请记住:“网络工作得越简单,执行起来就越容易,效果也越好。”因此值得花时间考虑您可以从以前的工作中借鉴什么以及网络需要为您做什么。假设您希望改进物理高度近似的复杂过程(即“球形牛”案例);您可以选择将数据馈送到(希望)输出所需结果的深层网络,或者您可以训练网络以找到正确的结果。后一种方法几乎肯定会优于前者。另一方面,不要依赖人类的努力来定义底层启发式——最稀缺的资源是人类时间,所以让网络在没有任何固定的人类预处理的情况下学习它的表示。此外,您可能想记下您对这个高级过程的任何假设或期望,因为它会证明自己。第2阶段:准备数据深度学习需要大量训练数据。您可能想知道“我需要多少训练数据”。网络中参数的数量与训练数据量有关。训练示例的数量将限制您在第6阶段对架构的选择。训练数据越多,网络就越大、越准确。因此,训练数据量取决于您在阶段1中定义的目标。除了训练数据之外,您还需要较少的标记验证或测试数据。此测试数据应与训练数据相似但不完全相同。该网络不是在测试数据上训练的,而是用来测试网络的泛化能力。如果训练数据量非常有限,可以考虑迁移学习[9]和域适应[10,11]。如果合适,请下载最接近您数据的数据集以进行预训练。另外,考虑创建合成数据。合成数据的优势在于可以创建和变化大量样本。项目目标还指导训练数据样本的选择。确保训练数据与任务直接相关,并且足够多样化以覆盖问题空间。研究每个类别的统计数据。例如,班级是否平衡?平衡类的一个例子是猫与狗,而不平衡类的例子是猫与所有其他哺乳动物(如果你的问题本质上是不平衡的,请咨询深度学习专家)。什么预处理是可能的?您可以将数据归零并归一化吗?这使得网络的工作更容易,因为它消除了学习均值的工作。归一化还通过在训练样本之间创建更大的相似性来使网络的工作更容易。如上所述,调查是否有一种方法可以使用先验知识或已知启发式方法来降低数据的维度。你不需要花时间手动确定启发式,因为目标是节省人类时间,你可以让网络学习它自己的表示。只要知道网络必须筛选的不相关数据越多,需要的训练数据就越多,训练网络所需的时间也就越长。因此,请充分利用现有资源。第3阶段:找到您的应用程序与最接近的深度学习应用程序之间的相似之处专家知道,每个项目都不能从头开始。这就是为什么他们被称为专家。然后他们使用以前的解决方案并搜索其他研究人员的深度学习文献来解决问题。即使没有人做过你想做的事情,你仍然需要借助专家的力量。深度学习已应用于各种应用。为了创建您的基线模型(您的起点),您需要找到与您的相似的应用程序。你应该搜索深度学习文献,将各种应用程序解决的“问题”与你的应用程序中需要解决的“问题”进行比较。找出这些问题之间的相似点和类比。此外,请注意您的新应用程序与深度学习应用程序之间的差异,因为这些差异可能需要在第6阶段进行架构更改。当您找到最接近的应用程序时,查找代码并下载它。许多研究人员已在开源环境中公开提供他们的代码,从而使代码可重复用于研究。您的首要目标是在最接近的应用程序的论文中复制结果。然后在“学习”阶段修改每个代码块以查看其对结果的影响。如果幸运的话,将有多个代码可用,您应该复制所有代码的结果。此比较将为您提供足够的信息,以便您可以在第4阶段创建基线。有几个“经典”深度学习应用程序和众所周知的解决方案。其中包括图像分类/对象识别(卷积网络)、处理顺序数据(如语言处理(RNN/LSTM/GRU))和复杂决策(深度强化学习)。还有一些常见的其他应用,例如图像分割和超分辨率(全卷积网络)和相似性匹配(孪生网络)。附录A列出了许多最近的深度学习应用程序和它们使用的架构,以及描述这些应用程序的论文的链接。这些可以提供一些想法,但不应用作寻找深度学习应用程序的来源。你应该仔细搜索谷歌学术(https://scholar.google.com)和arXiv(https://arxiv.org)深度学习的应用。第4阶段:创建一个简单的基线模型从保持简单、小巧和容易开始。使用比您预期需要的更小的体系结构。从一个共同的目标函数开始,对超参数使用共同的设置,并且只使用一部分训练数据。这是练习敏捷软件方法的一部分的好地方,例如简单设计、单元测试和短期发布。现在只需要得到基本的功能,然后在第六阶段完善它。也就是小步计划,不断更新,不断迭代。只选择一种通用框架,例如Caffe、TensorFlow或MXnet。该计划是只使用一种框架和一种计算机语言,以最大限度地减少不必要的复杂性带来的错误。框架和语言的选择可能由第3阶段执行的复制工作驱动。如果Web将成为更大框架的一部分,那么这是检查框架API是否正常工作的好地方。第5阶段:创建可视化和调试工具了解模型中发生的事情将影响项目的成功。木匠有句谚语“测量两次,切割一次”。您应该“编码一次,测量两次”。除了评估输出之外,您还应该可视化您的架构并衡量内部实体,以了解您为什么会得到这样的结果。如果没有模型诊断,将很难解决问题或提高性能。您应该对与高偏差(收敛到错误结果)和高方差(收敛差)相关的问题有一个大致的了解,因为每种类型的问题都有不同的解决方案;例如,你可能使用更大的网络修复了高偏差问题,但你可以通过增加训练数据集的大小来处理高方差问题。可视化您的模型,以便您可以尽可能多地监控架构的演变。在可能的情况下,为每个代码修改设置单元测试。您应该将训练误差与测试误差进行比较,并将两者与人类表现进行比较。您可能会发现您的网络行为异常,您需要确定架构演化过程中发生了什么以及原因。首先开始调试最严重的问题。找出问题是出在训练数据、架构还是损失函数上。请记住,方差分析试图解释当前绩效与最新绩效之间的差异。烧蚀分析试图解释某些基线性能与当前性能之间的差异。使用一种或另一种或两种测定法可能会有用。使用TensorFlow作为框架的一个动机是它有一个称为TensorBoard的可视化系统,它是框架的一部分。您可以从TensorFlow中导出必要的文件,TensorBoard可用于可视化您的架构、监控权重和特征图,以及探索网络创建的嵌入空间。因此,框架中提供了调试和可视化工具。如果使用其他框架,您将需要找到这些工具(通常可以在线获得)或创建您自己的工具。第6阶段:微调您的模型此阶段可能会花费大部分时间。您应该进行广泛的试验。并且不要只使用您认为会改善结果的因素,而是尝试改变每一个因素以了解当它发生变化时会发生什么。更改架构设计、深度、宽度、路径、权重初始化、损失函数等。更改每个超参数以查看增加或减少值的效果。我建议使用学习率范围测试[12]来了解您的网络在不同学习率下的行为。可以执行类似的程序来研究其他超参数的影响。尝试各种正则化方法,例如增强、丢弃和权重衰减。泛化是深度网络的关键优势之一,因此一定要测试正则化方法,以最大限度地泛化到未知情况的能力。你应该测试损失函数。您在基线中使用了一个简单的损失函数,但也创建了您关心并实现(定义)成功的多个评估指标。评估指标和损失函数之间的唯一区别是用于测试数据的测量指标和用于训练网络的训练数据的损失函数。更复杂的损失函数能否产生更成功的结果?您可以向损失函数添加加权项以反映每个指标对结果的重要性。但是要非常小心,不要用不重要的标准使损失函数复杂化,因为它是模型的核心。在早期,您发现您的应用程序与现有深度学习应用程序之间存在类比,并选择最接近的应用程序作为您的基线。现在比较第二或第三接近的应用程序。如果您遵循另一个类比并使用该架构,会发生什么情况?您能想象结合两者进行测试吗?首先,您应该从简单的事情开始并取得成功。随着您的深入,提高性能变得更加困难。您在第1阶段定义的目标将决定您??想要的绩效改进程度。或者您可能想要修改以前定义的目标。阶段7:端到端训练、集成和其他复杂性如果你有时间和预算,你可以探索更复杂的方法,实际上有很多复杂的方法可供选择。关于深度学习的文献非常丰富,每天都有更多的论文出现。这些论文中的大多数都以一种或另一种方式宣布了新的最先进的结果,有些可能会帮助您提高性能。本节可以单独作为一份长篇报告,因为有太多的体系结构和其他选项需要考虑,但如果你正处于这个阶段,请考虑与具有大量深度学习专业知识的人交谈,因为这个阶段的建议可能是对你有用该应用程序是独一无二的。但是,您可能会考虑两种常见的方法:端到端训练和集成。作为一般规则,连接系统的端到端训练将胜过具有多个部分的系统,因为具有端到端训练的组合系统允许每个部分独立适应任务。因此,如果与您的应用相关,考虑这些组合部件是很有用的。各种学习器的集成(即bagging、boosting、stacking)也可以提高单个模型的性能。但是,这将需要您训练和维护集成中的所有学习者。如果您的性能目标值得,那么就值得测试集合的方法。总结本报告为您提供了一些在试验以前未使用过深度学习的应用程序时需要考虑的因素。并非每个项目都与这些因素相关,但我希望本文涵盖您在项目期间应考虑的大部分因素。祝你成功!【本文为专栏机器心原创翻译,微信公众号“机器心(id:almosthuman2014)”】点此查看作者更多好文