随着机器学习(ML)成为每个行业的重要组成部分,对机器学习工程师(MLE)的需求急剧增长。MLE需要将机器学习技能与软件工程专业知识相结合,为特定应用程序找到高性能的模型,并应对出现的实施挑战——从构建训练基础架构到准备部署模型。在新的机器学习团队中,遇到最常见的障碍之一是工程师习惯传统软件工程的开发过程,而开发新ML模型的过程从一开始就是非常不确定的,需要不断的尝试才能找到一个比较合适的模型。
许多类型的专业人员都面临着类似的情况:软件和商业开发人员,寻求产品市场契合的初创公司等,这些职业中的每一个都采用了一个共同的框架,以帮助团队高效地工作:软件开发中的agile/scrum,初创公司和美国空军的OODA环。MLE同样可以遵循类似的框架来应对不确定性并快速开发出优质的产品。
在本文中,我们将描述ML的“OODA环”的概念:ML工程循环,其中ML工程师迭代地
快速有效地发现最佳模型并适应未知的环境。此外,我们将为每个阶段,以及优化过程给出具体的提示。
要引导下面描述的循环,您应该从一个涉及非常少的不确定性的最小实现开始。通常我们希望尽快建立足够的系统,以便我们可以评估其性能并开始迭代开发。这通常意味着:
设置训练、开发和测试数据集,以及构建好一个简单的模型。
例如,如果要构建一个树木探测器来测量一个地区的树木种群,可能会使用类似的Kaggle 竞赛中的现成训练集,以及来自目标区域的手工收集的一组照片用于开发和测试集。然后可以对原始像素进行逻辑回归,或者在训练图像上运行预训练网络(如ResNet)。此时的目标不是一次性地完成项目,而是开始迭代周期。以下是一些有所帮助的提示:
关于测试集:
一旦获得初始原型后,应检查其在训练、开发和测试集上的性能,评估测试性能与产品所需性能之间的差距。开始迭代开发模型了!
分析阶段就像医疗诊断一样:配备了一套可以执行的诊断程序,目标是针对限制模型性能的因素提出最可能的诊断。在实践中,可能会有许多不同的重叠问题导致当前的结果。不要试图全面了解每一个缺点,而是要了解最重要的因素,因为许多小问题会随着模型改进而改变甚至消失。
下面,我们列出了一组常用的诊断流程。
每次分析的一个良好起点是查看训练、开发和测试性能。建议在每次实验结束时使用代码执行此操作,以使自己习惯于每次查看这些数字。一般而言,训练集错误<=开发集错误<=测试集错误(如果每组中的数据遵循相同的分布)。根据上一次实验的训练、开发和测试错误率,可以快速查看这些因素中的哪些是当前的约束约束。
如果训练集错误是当前的限制因素,则可能会出现以下问题:
如果开发集错误是当前限制因素,这可能是由以下问题引起的:
如果测试集错误是当前限制因素,这通常是由于开发集太小或者实验过程中过度拟合开发集导致。
对于上述任何一种情况,可以通过手动检查模型出错的一组随机示例来了解模型的失败。
请注意,上述许多诊断都有直接而明显的应对方法。例如,如果训练数据太少,那么只需获取更多训练数据即可!我们仍然发现在心理上将分析阶段和选择阶段分开是有用的,因为很多人容易陷入尝试随机方法而不真正深入挖掘潜在的问题。此外,以开放的心态努力回归错误分析通常会发现更有用的见解,可以改善做出的决定。
在进行分析之后,需要很好地了解模型所出现的错误类型以及影响性能的因素。对于给定的诊断,可能存在几种可能的解决方案,下一步是枚举并优化它们。
上面的一些诊断有着潜在的解决方案。例如,如果训练数据集太小,收集更多训练数据可能是一个相当快速和简单的解决方案。
建议ML工程师列举尽可能多的想法,然后偏向简单、快速的解决方案。如果现有解决方案可能有效,请尝试在此基础之上使用迁移学习。
根据诊断,以下是一些常见的解决方案。
如果需要调整优化器以更好地适应数据:
如果模型无法很好地拟合训练数据:
如果模型没有在开发集表现不好:
只构建需要构建的内容,并快速完成
这个阶段的目标是快速实现基础模型,以便可以测量出结果,并从中学习,之后快速回到开发循环周期中。因此,建议专注于构建当前实验所需的内容。
大多数人高估了收集和标记数据所带来的成本,并低估了在数据匮乏的环境中解决问题的困难。
当收集和标记数据时:
当构造新的模型时,请从类似的现有实现开始。许多相似的研究论文都开源代码,这将节省大量的开发时间。对于任何问题,建议连续执行以下步骤:
编写测试程序以检查梯度、张量值、输入数据和标签是否格式正确。在最初设置模型时执行此操作,这样一旦捕获错误并解决后,之后再也不会遇到了。
打印出需要的测试结果和任何其他指标。
如果实验结果的表现有所改善,这可能说明你正走上正轨。在这种情况下,可能是弄清楚运行良好组件的好时机,并确保团队中的其他人可以复现该实验。
另一方面,如果性能变差或没有足够的改善,你需要决定是再次尝试(回到分析阶段)还是放弃当前的想法。这点取决于二者的成本,尝试成本和沉没成本。
尽管任务固有的不确定性,上面的ML工程环将帮助开发者朝着更好的模型方向前进。遗憾的是,它无法保证立刻开发出正确的模型,还需要我们需要培养自己在每个阶段做出正确选择的能力,比如确定性能瓶颈、决定尝试哪些解决方案、如何正确实现,以及如何衡量应用程序的性能。此外,还应该花时间考虑提高迭代的质量和速度,以便在每个周期中取得最大进展,并且可以快速完成多次迭代。
与其他决策一样,只有在解决当前的痛点时才能处理这些项目。有些团队花费太多时间构建“完美”框架,却发现真正令人头疼的事情在其他地方。
机器学习项目具有内在的不确定性,上面推荐的方法旨在为开发者提供一些指导。虽然每次实验的结果无法预测,很难让自己对达到特定的准确度目标负责,但至少可以让自己负责完成错误分析、制定想法列表、编写代码并查看其工作原理。
Emmanuel,数据科学家
本文由阿里云云栖社区组织翻译。
文章原标题《how to deliver on machine learning projects》,译者:海棠,审校:Uncle_LLD。
文章为简译,更为详细的内容,请查看原文。