Skip to content

Latest commit

 

History

History
79 lines (40 loc) · 8.9 KB

software-engineering-vs-machine-learning-concepts.md

File metadata and controls

79 lines (40 loc) · 8.9 KB

软件工程与机器学习概念

原文:www.kdnuggets.com/2017/03/software-engineering-vs-machine-learning-concepts.html

c 评论

作者:保罗·米内罗,微软首席研究软件开发人员。

分而治之 - 软件工程中的一个关键技术是将问题分解为更简单的子问题,解决这些子问题,然后将它们组合成对原始问题的解决方案。可以说,这就是整个工作,递归地应用,直到解决方案可以用所使用的任何编程语言的一行代码表示。经典的教学示例是汉诺塔

不幸的是,在机器学习中我们从未真正解决一个问题。充其量,我们只是近似解决了一个问题。这就是技术需要改进的地方:在软件工程中,子问题的解决方案是精确的,但在机器学习中,错误会累积,最终结果可能是完全无用的。此外,可能会出现表面上矛盾的情况,即一个组件在孤立状态下被“改进”,但当这种“改进”被部署后,整体系统性能却退化(例如,由于错误模式现在被下游组件意外地处理,即使这些错误更少)。

这是否意味着我们注定要整体考虑(这对大型问题来说似乎不可扩展)?不是,但这意味着你必须对子问题分解持防御态度。最佳策略是(当可行时)端到端地训练系统,即优化所有组件(以及组合策略),而不是孤立地进行。通常这并不可行,因此另一种替代方案(受贝叶斯思想启发)是让每个组件在输出时报告某种置信度或方差,以促进下游处理和集成。

在实践中,当系统达到一定规模时,需要进行分解,以便将工作分配给多人。机器学习中这一点现在不能正常工作是一个问题,正如 Leon Bottou 在他的ICML 2015 特邀讲座中优雅地描述的那样。

说到 Leon 讨论的另一个概念……

正确性 - 在软件工程中,可以证明算法的正确性,即在给定对输入的特定假设时,算法终止时某些属性将为真。在(监督)机器学习中,我们唯一真正拥有的保证是,如果训练集是来自特定分布的独立同分布样本,那么在另一个相同分布的独立同分布样本上的表现将接近于训练集上的表现,并且不会离最优太远。

因此,任何以机器学习为职业的人都具有实验性思维。我经常被问到选项 A 还是选项 B 更好,大多数时候我的回答是“我不知道,我们试试两个选项看看会发生什么。”也许机器学习领域最重要的事情是知道如何评估一个模型,以预测其泛化能力。即便如此,这也是一种“感觉”:识别和防止训练和验证集之间的泄漏(例如,通过分层和时间采样)是通过犯错学会的;反事实循环也是如此。Kaggle 对于学习前者很棒,但后者似乎需要在闭环系统中犯错误才能真正理解。

实验性的“正确性”比其他软件的保证要弱得多,并且有许多方法可能导致问题。例如,在我的经验中,这种情况总是暂时的:模型会变得陈旧,这似乎总是发生。因此,你需要计划不断(因此自动)重新训练模型。

重用 - 这点很有趣。重用是传统软件工程中的关键:重用其他代码不仅更高效,而且你自己编写的每一行代码都是注入缺陷的机会。因此,重用不仅可以让你更快地移动,还可以减少错误:作为回报,你必须支付学习如何操作他人编写的软件的代价(如果做得好,这个代价通过良好的组织、文档和社区支持降低了)。

机器学习的某些方面展示了完全相同的权衡。例如,如果你在编写自己的深度学习工具包,请意识到你是在享受乐趣。享受乐趣本身没有问题,教育活动可能比整天玩电子游戏要好。然而,如果你想完成某项工作,你绝对应该尽可能多地重用技术,这意味着你应该使用标准工具包。一旦你学会如何操作标准工具包,你会移动得更快,犯的错误也会更少。

然而,机器学习工具包是“传统软件”,并设计为可重用。那模型重用呢?这也可以很好,但上述关于分解的警告仍然适用。所以也许你使用一个模型,该模型从用户配置文件中生成特征作为你模型的输入。很好,但你应该对你依赖的模型进行版本管理,而不是盲目地升级而不进行评估或重新训练。重用另一个模型的内部尤其危险,因为大多数机器学习模型是不可识别的,即具有各种内部对称性,这些对称性不是由训练过程决定的。例如,将嵌入与树结合,当下一个版本的嵌入是前一个版本的旋转时,你可以立即看到你的性能变差。

基本上,模型重用会在组件之间创建强耦合,如果其中一个组件发生更改,可能会出现问题。

测试 - 我发现软件测试在机器学习中的角色是最棘手的问题。毫无疑问,测试是必要的,但使用像基于属性的测试这样的东西的挑战在于,机器学习组件所捕捉的概念不容易用属性来表征(否则,你会使用非机器学习软件技术来实现它)。在机器学习组件应该表现出一些属性的程度上,你可以测试这些属性,但除非将这些属性融入到学习过程中(例如,通过参数绑定或数据增强),否则你可能会遇到一些并不一定表示缺陷的属性违反。

拥有一个质量最低可接受的“额外测试”数据集是个好主意:这可以是“任何合理模型”都应该正确处理的简单例子。还有自我一致性:在雅虎,他们曾用一组在模型组装时计算的输入-输出对来发货模型,如果加载的模型没有重现这些对,模型加载会被取消。(这绝不该发生,对吧?惊讶!也许你在使用不同版本的库进行特征化。)

监控部署模型的度量指标(代理指标和真实指标)也有助于检测问题。如果代理指标(即你实际训练模型和估计泛化性能的依据)变差,模型的输入发生了变化(例如,非平稳环境,特征提取管道的变化);但如果代理指标稳定而真实指标变差,问题可能在于模型输出的利用方式。

不幸的是,我发现许多具有机器学习组件的软件系统以一种会让传统软件工程师感到不安的方式进行测试:我们查看输出以确定其是否合理。太疯狂了!随着机器学习成为软件工程中越来越普遍的一部分,这种情况必须改变。

简介: 保罗·米内罗 是微软的首席研究软件开发人员。他喜欢领导中型团队,专注于原型设计、探索性开发和将研究转化为开发("高风险,高回报"的活动)。他喜欢迭代的测试驱动开发、数据驱动决策和积极心理学导向的管理。

原文。经许可转载。

相关:


我们的前三个课程推荐

1. 谷歌网络安全证书 - 快速通道进入网络安全职业。

2. 谷歌数据分析专业证书 - 提升你的数据分析技能

3. 谷歌 IT 支持专业证书 - 支持你的组织进行 IT 管理


更多相关话题