[译]Quora如何避免软件系统的复杂性

原文:Avoiding Complexity of Machine Learning Systems

译者:杰微刊兼职翻译张迪

现今,越来越多的产品和工程团队都依赖机器学习(在此篇博客中简称ML)。大量的开源工具和图书馆可以让缺少相关知识和经验的人很容易就能学习、提高,甚至是建造机器学习模型。机器学习是一个很强大的工具,可以解决许多问题,但它所消耗的成本也是个问题。它可以将系统复杂化,让系统的搭建超时,并逐渐变成巨大的技术债务。根据谷歌最新的出版物所示,系统层次应用机器学习时很容易就会产生大量的维护成本(见参考文献1)。

在Quora网站上,我们一直使用机器学习解决许多有趣的问题,如排序、搜索、推荐、和垃圾邮件检测(见参考文献2,3,4)。我们用机器学习不断地评估新的方法,建立新的产品特征。与此同时,我们对于其复杂性也很小心地应对。通过这些模型的介绍,开发原则和最佳实践来避免或减少这种复杂性。在这篇博客中,我们将分享我们有关机器学习系统复杂性的的想法,描述一些降低机器学习复杂性的方法。请注意,这篇博客中的存在的大多数问题及解决方法也可以应用于一般的软件系统,反之亦然。然而,我们选择把重点放在那些对机器学习来说特别重要的部分。


你真的需要机器学习吗?

在思考机器学习系统复杂性之前,问问你自己的产品特性,是否真的需要机器学习来解决。有些时候,例如,当你可以仅用一个简单的启发式算法,不需要工程特性、模型优化、持续培训或模型部署就能解决问题时,应用机器学习反而会让你的系统更加复杂。然而,当已经有了用于其他目的机器学习模型时,这个模型你也可以重复使用,但这就将增加启发式的复杂性。一个快速而又随性的启发式看起来像是一个短期的利益,但实际上它真的需要长期的努力。随着时间的推移,它会变得越来越难以理解,越来越难以依靠,越来越难以维护所有的ad-hoc启发式。该产品承受同一件事情有多种不同解决方式的情况时,就会产生不一致的使用者互动行为。

因此,重要的是要意识到这种权衡,并在大量投资于任何方法之前,咨询您的团队或您组织里的机器学习专家。

评估机器学习解决方案是否适合你的问题,关键要做到好的文档要在组织内部保存和共享。这样,就可以了解到是否有和你的产品特性和问题相似的产品特性和问题已经用机器学习解决了。在Quora 网站和互联网上有很多的资源,是关于可以使用机器学习来解决的典型问题。

让我们看一下Quora 网站上的一些例子。我们已经为了一些排名问题开发和产品化了一些机器学习模型,例如搜索结果排名、答案排名、流量排名和摘要排名。在排名运算法则中,机器学习模型会产生一个得分,这个得分会预测用户是否会参与排名结果。虽然不是一个典型的排序问题,但是摘要邮件调度程序可以建立类似的机器学习模型来预测用户打开摘要邮件的可能性。相反,检测趋势话题或事件,通常是采用利用时间序列分析的启发式算法来解决。


复杂性是什么?

没有人认为复杂性是一个积极的特征。然而,不是每个人都同意去限制一个系统复杂性或为简易性给定一个权衡。重要的是要在我们决定如何对待它们之前,了解复杂性的不同症状。所以,什么时候我们看一个机器学习系统可以说它太复杂?下面是一个可能的答案列表。

1.一个类似的事情有太多方法去处理

当一个类似的事情有太多方法去处理的时候,机器学习系统就是很复杂。这会至少在两个方面创建复杂性:一是工程师浪费时间去试图找出正确的方法来做他们需要做的事。二是事情都以不同的方式实现、维护,增加了开销。

2.没有提供足够的解释或见解

如果一个系统从外部很难解释,并且只能被理解为一个“黑盒子”,它通常会被认为是复杂的。

3.未公开的功能

很难理解,未公开的功能也会在系统中创造复杂性。实际执行中可能不那么复杂,但事实上,很难理解的是没有挖掘到的细节会增加复杂性。

4.不可重复使用的功能

在不同环境下,不可重复使用的功能会导致要用不同的方式去做相同的事情,因此增加了复杂性。

5. 做一件简单的事情要很多步骤

有时,工程师们会觉得现有的系统或工具需要的步骤太多,或是对于他们的用例来说过于复杂。在这种情况下,他们可能会想出一个全新的系统或工具,让其在使用过程中更适合自己独特的用例。虽然通过添加不同的系统或工具可能会使当前的实现更简单,但却增加了整体的复杂度。

6. 需要理解很多工具

类似上面提到的情景,对大量或复杂工具的需求的增强会提高复杂性。例如,如果一个忙于搜索结果排序的工程师需要了解Python,C++,Gradient Boosted Decision Trees(梯度迭代的决策树算法)和矩阵分解,并且没有一个简单的方法将关键点从要理解的所有东西中摘出来,系统就会被认为是复杂的。

7. 不必要的维护开销

一个系统要是增加了不必要的维护开销就会被认定为是复杂的。例如,它会产生呼叫器责任负担,增加监督和培训成本。


是什么促使工程师产生复杂的解决方案?

工程师们不可能为了玩闹去构建一个复杂的解决方案,但是项目本身具有的制约因素可能促使工程师们建立一些不必要的复杂东西。

1. 计划不周全

凭直觉,好像计划不周全应该会带来一个简单的解决方案,因为我们的目标就是尽快做到。然而,这是在很少的情况下才会发生的。如前面所解释的,最快的解决方案往往导致局部最优,而不能在重复使用或在将来可以重复使用。我们认为, 斗志旺盛通常对发展速度有好处,但承认它的副作用,并纠正这些副作用也很重要。

2. 缺乏远见

工程师们可能太专注于开发一些特定的问题,而不重视系统在未来是否易于维护,或能否支持未来的使用案例。

3. 缺乏理解

不了解当前的系统也可能导致复杂性。可能会有一种方式能更容易实现新的用例,但因为缺乏理解,它就会看起来很复杂,或导致解决方案比必要的更复杂。

4. 架构缺乏灵活性

当一个现有的架构对于新的用例来说不够灵活,工程师们需要做出一个决定,是改变现有的架构还是做一个“一次性”的架构。通常情况下,“一次性”的架构是首选,因为它们能更容易,更快的被实现。

5. 缺乏特性选择

工程师们往往对于在机器学习模型中添加新功能而感到兴奋,但对于旧功能的删除常常忽略。旧的功能可能在多次迭代之后就不再发挥作用,它们使模型更难理解,也更复杂。

6. 准确度优化

为了优化准确度,工程师们经常使用的方法是将从多个机器学习模型系统中得出的结果合并。同时,这通常是提高模型质量的好方法,但“矫枉过正”可能会显著增加复杂性,并且还没有办法通过小尺度的wins(网络名称服务)来调整。

7.性能优化

很多时候,性能的优化也会导致模型过于复杂,或使系统实现更难。例如,出于性能原因,从事搜索的工程师也许会通过C++实现排名的基础建设,而其余的栈的是用Python编写,这使得整个系统更加复杂。

8.依赖性

建造一个机器学习系统是很难的,因为现有的知名的设计样式很少。另外,机器学习系统通常在数据源和子系统之间有依赖性关系。建立一个高效而简单的系统需要有经验的机器学习工程师。

9. 试验与生产

大多数机器学习系统需要有双重用途:(1)为离线试验提供一个接口(2)生产工作。满足这两个要求就会增加复杂性。


我们如何避免机器学习的复杂性?

在Quora网站上,我们已经发表了一系列建议,帮助大家避免或减少我们机器学习系统的复杂性。我们要求我们的机器学习工程师去了解这些原则,并在创建新的机器学习模型的时候,在用机器学习解决方案开发新产品特点的时候遵守这些原则。

1. 如果你建立一些东西很零碎,尽快清理干净

出于测试目的而建立一个不连贯的机器学习解决方案是可以的。然而,一旦系统被证明是成功,100%完成了,你需要把它清理干净。清理干净,意味着要采取一切必要措施使系统更简单。特别是,你应该尽可能花时间去将系统整合到现有的解决方案中,或删除不必要的代码和功能。

2. 让人审查你的设计

当你是正在设计一个机器学习解决方案时,与他人分享你的提案是很重要的。因为有时你可能没有意识到,现有的解决方案已经可以解决你大部分的要求。即使事实并非如此,和别人最初的讨论所提供的有价值的反馈,也能让你的系统更简单。

3. 文件系统

如果你的系统是很难记录和解释,它就会太复杂并具有过时。当然,代码是文件,但在详细层次可能不容易消化。作为一个经验法则,你应该能够在30分钟内或用2页纸去解释清楚整个系统的关键点。

4. 如果你想在现有系统的基础上建立,修复系统就会很复杂

如果你想在现有的系统上添加一些东西,但是发现这将比你自己建造一个自己的系统花费的时间都多。你应该做什么?如果你知道你的解决方案是长存的,你绝对应该将它创建到现有的系统里。如果系统对于你想做的事情不够灵活,评估一下制作一个更灵活的系统要花费的成本,然后去做。你添加的灵活性,不仅对你有利,而且对你以后的项目也有好处。你可以把这作为一个“发展速度”投资。

如果在你的日程表中,你一直都在试验,如果将你的新特性添加到现有系统中的花费要高于从头建立一个新的系统,你应该立马行动。那就是说当你完成实验,请阅读原则1#。

5. 实现机器学习的重复使用性功能

最理想的是应该有一个特征工程框架,能够创建可重用的机器学习功能。如果没有这样一个框架,重要的是去尝试,并要实现可重用、功能转换、可解释的和可靠的功能。

6. 不要使用不必要的功能

我们建议工程师们做特征选择和模型优化迭代。你可以去掉一些的会增加复杂性和保持模型质量时增加计算开销的机器学习功能。就是说,理解相互关系的功能和模式是很重要的。一些功能可能不会做出改变,因为学习的模型太简单。

7. 尽量选择最简单的模型

当决定选择不同的机器学习模型时,人们往往选择“最简单”的一个。“简单”的定义可能取决于具体情况,请参阅本博客的第一部分,了解导致复杂性的不同因素。以下是我们根据普通复杂性对机器学习模型采取的手段:

1)Linear regression线性回归

2)Logistic regression(逻辑回归)

3)Collaborative filtering(协同过滤)

4)Random forests(随机森林)

5)Gradient boosted decision trees(GBDT,梯度迭代的决策树算法)

6)Elastic nets(弹性网络)

7)LambdaMart and other learning-to-rank approaches(LambdaMart和其他learning-to-rank方法)

8)Neural networks(神经网络系统)

就是说,问题出在细节上,你可以有一个简单的gradient boosted decision trees执行方式,这种方式要比复杂的logistic regression执行方式来的简单。

另外,很重要的一点是要记得,模型的复杂性和数量(类型)特性之间的直接相互作用。因此,一个复杂的模型可能不会显现任何优质的WINS,仅仅是因为它没有值得学习的正确特性。

8. 尽量使用开源资源实现

虽然我们可能会有很好的理由去实现一个机器学习模型的内部,但事实上,大多数模型都已有相当不错的实现方式。实施一些模型的内部充分要考虑到更大的灵活性,但也意味着你需要为了系统的维护和发展进行投资。另外,除非是成熟的的内部机器学习框架,要不然一个内部实现方式通常会使从一个模型到另一个模型的切换变得很难做到。

9. 做相似的事情只需要一种方式

如果你发现自己想知道,为什么做类似事情会有好几种方式,那么就是时候把它们合并成一个。以下是一些我们应该避免的实例:

1)相同的ML模型的不同实现方式

2)相似的ML特征的不同实现方式

3)不同团队为同样的功能使用不同的工具

4)……

10. 抽象概念复杂性

有关机器学习的实验和关于机器学习的产品一样多。因此,你要为你的实验提供灵活性。提供灵活性的同时避免复杂性的方式是使用正确的abstraction级别。例如,模型和数据之间的联系与生产引擎这两方面如果都能通过一个明确的接口实现,那么你就可以轻松地改变自己的机器学习模型了。

总结

在这篇博客中,我们已经分享了关于机器学习系统自带复杂性的想法,分析了常见的特点和其存在的理由。我们相信,工程师们和组织机构依赖于机器学习去改进他们的产品需要,注意它所引入的复杂性,明智的权衡复杂性、质量和性能。我们推荐的几个原则,以避免或减少这种复杂性,这种方式Quora网站已经采用了,希望你可以发现它们的用处。

鸣谢

特别感谢Xavier Amatriain,我们的工程部副总裁,他曾在Quora网站主动推动机器学习复杂性,并撰写了本博客中绝大多数主要意见和原则描述。

参考文献

1.Machine Learning: The High Interest Credit Card of Technical Debt. D. Sculley et al. NIPS 2015

2.Quora engineering blog post: Machine Learning at Quora.

3.Quora engineering blog post: A Machine Learning Approach to Ranking Answers on Quora

4.Quora engineering blog post: Ask To Answer as a Machine Learning Problem

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容