搭建容易维护难!谷歌机器学习系统血泪教训

搭建容易维护难!谷歌机器学习系统血泪教训

2014,谷歌关于机器学习背后隐藏的高科技债务的论文非常受欢迎。今天,这篇文章再次成为知名技术社区黑客新闻(HackerNews)的头条。似乎即使在4年之后,人工智能也进入了一个新的春天,但是困扰机器学习研究者的问题仍然是相似的。

本文作者希望本文能为在生产环境中采用机器学习系统的开发人员和维护人员提供一些实用的建议。作者警告说,尽管从头开始构建机器学习系统相对容易,但后续的改进可能会遇到意想不到的困难。当阅读这篇文章时,读者会清楚地感觉到这种经历来自作者在谷歌任职期间来之不易的积累。

人工智能前线带你回到这篇经典文章。它的一些经验强调“它与机器学习有关,并不意味着好的软件工程实践可以被完全抛弃”。它的一些内容也属于机器学习特有的常见陷阱。考虑到所有希望建立“人工智能”业务的初创企业都面临这样的潜在挑战,本文提出的建议非常值得认真考虑。

搭建容易维护难!谷歌机器学习系统血泪教训

本文提到的机器学习系统带来的主要技术债务类别包括:信息隐藏和变更关闭带来的挑战;胶水代码和配置;以及在分析模型的结论中不断变化的外部世界和对这个世界的误解。

本文中最重要的观点之一是技术债务应该是工程师和研究人员需要关注的问题。以大规模增加系统复杂性为代价来研究解决方案显然是不明智的。即使只添加了一两个看似无害的数据依赖,进一步的开发也可能会变慢。尽管减少技术债务不如证明新定理那么令人兴奋,但它仍然是保持强大创新能力的重要驱动力。事实上,为复杂的机器学习系统开发全面而优雅的解决方案具有重要的现实意义。

信息隐藏与变化封装

.机器学习模型是一种产生复杂纠缠态的机器,不可能有效地隔离和分配其改进工作。作为证明,假设特征x1,……Xn用于一组模型中,如果我们改变x1中的值输入分布,那么它的重要性、权重或剩余特征都可能改变——,而不管模型是在批处理模式下完全重新训练还是在在线模式下逐渐调整。但是,添加新功能xn 1或删除任何功能xj也可能导致类似的变化。没有输入是真正独立的。牧羊人:这被称为CACE原则:任何改变都会改变一切。

如果我们理解优先的重要性,我们就不需要用机器学习来反复证明它!因此,该模型有点像一个巨大的混合机,我们在其中放入大量信息并获得结果,但是对输入内容的各种变化的敏感性很难预测,并且几乎不可能隔离影响。面对如此困难的问题,我们该怎么办?尽管没有什么尝试的计划,作者给出了三个可能有用的策略。

另一种发现偶然耦合的方法是建立一个隐藏的反馈回路,这在未声明的消费者中尤为明显。通过未声明的消费者,系统只消耗建模输出的输出,我们很难意识到这些过程的存在。如果根据影响模型的输入参数信息采取一些措施,这种隐藏的反馈回路很容易导致以下问题:

想象一下,在我们的新闻标题命中率预测系统中,系统中的一个组件负责以“智能的方式”确定标题的字体大小。如果字体大小模块开始使用点击率作为输入信号,并且字体大小确实影响用户的点击趋势,则字体大小将包括一个新的隐藏反馈环,该反馈环由点击率添加。可以想象,这样一个系统将逐渐和无休止地增加所有标题的字体大小。

数据依赖性问题

.虽然通过静态分析和链接图可以相对容易地识别代码依赖关系,但是带有数据依赖处理的分析工具很少。因此,我们很难构建能够解决大规模数据依赖链的解决方案。

例如,一些输入信号会随着时间改变行为。遵循CACE原则,即使这些变化被视为改进的方向,也很难预测其后果。另一个数据依赖性是模型中的特征集,其中一些特征集可以提供非常有限的精度增量。我们可以以多种方式利用最初未充分利用的依赖关系——,包括一些废弃的早期遗留功能、一次添加的多个功能的组合(而不是仅仅挑出那些真正有用的功能),或者为了追求准确性而添加的功能,但无法证明它们对复杂性的影响。定期删除功能非常重要。

例如,假设团队合并后,为了简化,有一轮从旧产品号到新产品号的转换,那么两种方案都将在系统中有特色。新产品只能得到一个新号码,但旧产品可能同时有两个号码。当然,机器学习算法也将把旧的数字合并到依赖关系中。一年后,一些经理清理了用旧号码填充的数据库代码。回归测试不会检测到这种变化,因为旧号码在清洗后不会直接使用。这对机器学习系统的维护者来说显然不是好消息.

能够理解数据相关性的工具将帮助我们顺利完成功能清理工作。一个谷歌团队已经建立了一个自动化的功能管理工具:“自采用以来,该程序已经帮助谷歌团队每季度安全删除数千行与功能相关的代码,同时自动验证版本和其他问题。该系统还能有效防止意外使用新型号中不推荐或损坏的功能。

最后一种数据依赖管理方法是建立一种“纠正”机制来重用现有模型。这样,你可以很快得到初步结果。但另一方面,你未来对模型的分析和改进将面临更高的成本。

其它 95%(胶水代码与配置)

世界还将带来怎样的变化?

这里要解决的问题是,许多机器学习库被打包成独立的工件,这无疑会引入大量胶水代码(例如从Java到R或matlab)。如果在更广泛的系统架构中找不到合适的资源选项,那么重新实现算法(代码的5%)并有效减少粘合代码的数量可能更有意义。

一个相关的问题是管道丛林——是一个过于复杂的数据准备管道。

管道丛林问题只能通过全面检查数据收集和特征提取来避免。清理管道丛林和从头开始设计清理方法的确是工程设计层面的一项重大投资,但也可以显著降低持续成本,加快进一步的创新活动。

一旦系统由于胶水代码和管道丛林的问题变得僵化,许多朋友就忍不住调整生产代码中的实验代码路径来执行额外的实验。这当然更方便,但是如果频率太高,只会导致更大的混乱。

作为一个典型的例子,谷歌最近在一个重要的机器学习系统中发现了数万行未使用的实验代码。在用更严格的应用编程接口重写之后,“遗留”的这一部分可以大大减少工作量、生产风险并控制系统的复杂性,从而为新算法的实验铺平道路。

在这一节的结尾,“配置通常是现实世界混乱的载体,会干扰漂亮的算法:“

请考虑下面的例子。功能甲在9月14日至9月17日之间出现录制错误。功能乙直到10月7日才正式推出。由于记录格式的变化,用于计算特征C的代码必须在11月1日之前和之后改变数据。特征D不用于生产,因此,在现场协调中,模型查询必须使用备选的D’和D”。如果使用特征Z,那么所有与训练相关的任务必须获得额外的内存配额,否则它们的训练效率将显著降低。最后,由于延迟限制,特征Q排除了特征R。所有这些混乱的情况使得正确地修改配置和推理变得困难。此外,配置错误也可能导致高成本——,包括严重浪费时间、计算资源损失或生产问题。

配置更改应该像代码更改一样小心处理,并提交给对等方进行审查。

经验表明,外部世界很少保持稳定。事实上,现实世界性质的变化是机器学习中技术债务的重要来源。

请不要手动设置决策阈值(例如显示或不显示广告),而是考虑评估现有验证数据以找到阈值。此外,因果不明的相关特征也可能引发问题:

这似乎不是主要问题:如果这两个特征总是相关的,但其中只有一个是真正的因果关系,看来功劳仍然可以归于两者,通过观察它们的共同现象可以得出结论。然而,如果外部世界中两个特征之间的共生关系突然消失,预测行为可能会发生显著变化。区分相关影响的综合机器学习策略也将超出我们的讨论范围。[·波顿2013]给出了一些很好的建议和参考。结合本文的重点,我们注意到非因果关系是隐性债务的另一个来源。

最后,实时监控系统至关重要。本文建议每个人都测量预测偏差,并在系统采取的行动数量超过某个阈值时发出警报。

在按预期工作的系统中,预测标签的分布通常应该等同于观察标签的释放。这不需要全面的测试,因为它可以通过单个空模型满足——,即直接预测标签出现的平均值而不考虑输入元素。然而,这种简单的方法已经带来了令人惊讶的好结果,这种度量标准的变化通常反映了需要注意的关键问题.

极牛网精选文章《搭建容易维护难!谷歌机器学习系统血泪教训》文中所述为作者独立观点,不代表极牛网立场。如若转载请注明出处:https://geeknb.com/3284.html

(40)
打赏 微信公众号 微信公众号 微信小程序 微信小程序
主编的头像主编认证作者
上一篇 2019年10月23日 上午9:02
下一篇 2019年10月23日 上午10:00

相关推荐

发表回复

登录后才能评论
扫码关注
扫码关注
分享本页
返回顶部