【干货】如何快速高效调试机器学习系统?

【新智元导读】机器学习的“难”通常不在于数学,因为机器学习本身不需要很高强度的数学计算,而在于 debugging 难的问题。机器学习 debug 要比普通计算机程序难得多:出现问题的情形多,而且调试周期长。本文深入讨论了这个难题,提出了在 debug 时需要注意的要点。

在过去的几年里,机器学习便捷化方面的技术已经取得了显著的发展:出现了很多相关的网络在线课程、精编书籍和架构理论。这些精编课程对前沿科技研究分析,分解成通俗易懂的语言。而架构理论方面则将普通问题抽象化,与构建机器学习系统相结合形成理论系统。这些发展某种程度上能够使人们打破已有的认知图示,加强对算法工作原理和计算代码的理解。

机器学习之难在于debug

尽管如此,机器学习仍是一个相对“难”的问题。毫无疑问,提高机器学习算法是一项艰难的科研课题,需要不断的创新、反复的试验、不懈的韧性。而将现有算法和模式与机器学习贯通运用则更难,这也解释了为什么机器学习方面的专业工程师的工资相比普通软件工程师要高出很多的原因。

这里的难通常不在于数学计算,机器学习应用本身不需要高强度的数学计算,而在于前面提到的构建系统,包括如何为工具建立图式以解决实际应用中的问题,这就要对现有算法和模式,两者权衡以及使用限制充分熟悉。机器学习技术是通过对不同类型的模式(比如课程、课本和论文等)进行应用的过程中,对这些模式进行检测。当然,这种知识构建形式存在于计算机科学的所有领域,而不仅仅是机器学习领域。一般的软件工程项目都需要对其他的框架、工具、技术以及设计决策几方面进行权衡。

机器学习的难点在于根本性的调试(debug)难题。机器学习的调试一般发生在以下两种情况:1)算法无法运行,或者2)算法运行不太完美。机器学习“难”的独特性在于,当运行效果不如预期时,想要检测出哪里出了问题极其困难。如果这两种困难同时发生,那么应用修复、升级以及结果显示方面的调试周期将会延长。很少会发生计算运行从一开始直到最后,占用大部分时间去做构建算法的情况。

机器学习相比传统软件,调试困难增加了两个维度

标准的软件工程中,遇到问题解决方案效果不如预期的情况时,一般有两种可能:算法问题和实施问题。举一个简单的递归算法的例子。

通过这种方法,列举出运行效果不好的故障分析图,如下:

横轴列出的是算法设计上可能会出现的问题,纵轴是在算法应用上可能会出现的问题。两个维度上都有可能出现问题(如多重应用bug),只有保证算法和应用两方面都精确无误,才能制定出正确的调试解决方案。

调试过程中,需要凭借直觉,结合不同的bug(如编译错误提示,程序输出结果等)信息,去准确判断问题所在。这些信息和启发式方法能帮助缩短锁定范围,快速处理问题。

机器学习有两个方面的常见bug:实际模式和数据。最简单的例子,就如用随机梯度下降算法训练逻辑回归。这里,算法准确包含梯度下降更新方程式,应用准确包括对特性和参数更新的精确计算。数据方面的bug包括嘈杂标签(noisylabels)、预处理过程中由于缺乏监控信号或数据不足导致的错误。模式bug包括建模能力的实际限制。比如,下图展示了在非线性决策边界中使用线性分类器。

调试过程从2D网格到4D超立方体(这里只显示了三个维度),第四个数据维度,我们可以想象成是这些立方体的序列(注意这里只有一个小立方体是正确的解决方案)。

机器学习极其“难”的原因在于,如果在一个维度上有 n 种错误的可能,2D维度中的错误就有 n*n 种可能,4D维度中的错误就有 n*n*n*n 种可能。这种情况下,依据现有信息,建立直觉去发现bug就显得尤为重要。

幸运的是,机器学习算法中,有更多的信号可以用于判断哪里出了bug,比较重要的有:训练集和测试集的功能缺失图(plots)、开发数据集中算法的实际输出结果,以及算法的中间计算汇总统计。

如何解决延迟的调试周期

另一个导致机器学习调试非常困难的因素是调试周期长。通常,从运行潜在修复功能到得出结果是否可行,需要花上几个小时甚至几天的时间。网页开发中,具备自动更新功能的开发模式可以极大地提高开发效率,因为这意味着可以最大限度地减少开发流程中出现的bug事件。而在机器学习中这很难实现,因为在数据集中训练算法需要花上几个小时甚至几天的时间。而深度学习模式更有可能导致调试周期延长,这就必须要进行“并行”试验范式。对于机器学习开发人员来说,同时运行多个试验,是因为算法训练是开发中的主要难点,通过多程序同时运行以开发指令流水(对于程序开发者而不是应用者)。强制性地多程序同时运行的主要缺点在于顺序调试和试验过程中,不能运用累积经验。

机器学习通常被归结为一种直觉开发的艺术,有了这种直觉,在很多维度都可能出现bug(或可以提高)时,可以判断出了bug(或需要提高)的地方在哪。这是构建机器学习项目的一个重要技巧,即当调试范围内呈现出的信号,你会开始利用这个信号尝试判断问题出在哪。我工作过程中经常会出现类似的情况。

举例来说,我最早遇到这样的问题是在训练神经网络时,总是出现周期性的训练功能损失。这些功能损失在经过某些数据时会发生延迟,但很快便返回到一个很高的数值。经过很多的试验和错误之后,我意识到这通常是因为训练集没有被正确地随机化(这看似是一个数据问题,但实际上是一个应用问题),还有一个问题就是,在使用随机梯度算法时,只处理小部分的数据。

总的来说,快速高效的调试是一个非常需要的技巧,可以应用到现在的机器学习流水线中。

原文链接:http://ai.stanford.edu/~zayd/why-is-machine-learning-hard.html?

原文发布于微信公众号 - 新智元(AI_era)

原文发表时间:2016-11-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨熹的专栏

强化学习第4课:这些都可以抽象为一个决策过程

这个过程有两步,首先你的代理会观察环境的一些特质,有时是传感器感知到的,有些是输入的用户特征。 然后代理会选择一个行为,将这个行为反馈给环境。 之后代理不仅...

9310
来自专栏ATYUN订阅号

光子量子处理器Xanadu团队:探索量子神经网络

28040
来自专栏机器之心

学界 | 谷歌提出协同机器学习:通过分散的手机更新同一个云端模型

选自Google Blog 作者:Brendan McMahan、Daniel Ramage 机器之心编译 参与:微胖、韩天哲 标准的机器学习方法要求在一个机器...

314100
来自专栏数值分析与有限元编程

高斯消去法解方程组及Python实现

Python 是一种高级计算机程序设计语言。对于初学者和完成普通任务, Python 语言是非常简单易用的。 对于方程组Ax=b,增广矩阵为[A b]。第一次消...

69270
来自专栏新智元

【重磅】百度通用 AI 大突破,智能体通过交互式学习实现举一反三

【新智元导读】百度IDL研究员徐伟、余昊男、张海超提出了一个新的框架,通过多任务强化学习和零数据学习,让智能体在没有先验知识的情况下,自己学会了结合语言和视觉两...

45990
来自专栏ATYUN订阅号

【行业】用于AI开发的最佳5个开源框架

AiTechYun 编辑:nanan AI和机器学习是目前流行的两个术语,有时甚至可以互换使用。然而,两项都不一样。虽然AI所涉及的机器可以执行具有人类智能特征...

33380
来自专栏企鹅号快讯

机器学习必知的15大框架

机器学习工程师是开发产品和构建算法团队中的一部分,并确保其可靠、快速和成规模地工作。他们和数据科学家密切合作来了解理论知识和行业应用。数据专家和机器学习工程师的...

22680
来自专栏新智元

深入Facebook机器学习部门:服务、模型、框架和硬件(贾扬清等HPCA论文)

来源:research.fb.com 作者:Kim Hazelwood et al. 编译:刘小芹 【新智元导读】近日 Facebook 研究团队公开一篇 HP...

41750
来自专栏AI科技大本营的专栏

最新机器学习开源项目Top10

【导读】过去一个月里,我们对近 1400 个机器学习项目进行了排名,并挑选出热度前 10 的项目。这份清单涵盖了包括 OpenAI 最新开发的 RND 算法、U...

7510
来自专栏达观数据

达观数据推荐系统实践—实时演算用户动态数据 提升运营效率

本文曾在infoq大数据微信群和数据猿直播平台上进行过分享,是对分享内容最直观的表达,同时对推荐系统架构和算法解释的也很详尽。 随着移动互联网技术的迅猛发展、互...

62670

扫码关注云+社区

领取腾讯云代金券