机器学习的四十三条经验法则全文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

机器学习的四十三条经验法则
——来自谷歌的ML工程最佳实践
本文主要围绕的是谷歌公司(Google)在机器学习方面的经验,旨在为那些具备一定机器学习基础的读者提供最佳的经验法则。

本文向读者展现机器学习经验法则的方式,与谷歌C++ 风格指南以及其它流行的编程实践指南相类似。

如果你曾上过机器学习的相关课程,或者曾构建或研究过机器学习的模型,那么你就已经具备了足够多的阅读本文的知识了。

术语
在接下来的关于有效机器学习的讨论中,下面一些术语将会反复出现:
示例(Instance):那些你要为其做出预测的事物称为示例。

例如,示例可能是一个网页,你要将其归为“关于猫的”网页或者“不是关于猫的”网页。

标记(Label):预测任务的答案或结果称为标记。

无论是机器学习系统的答案或结果,还是训练数据的答案或结果,都可以称为标记。

例如,将网页标记为“关于猫的”。

特征(Feature):预测任务中示例的属性即为“特征”。

例如,网页可以有“包含词汇‘猫’”的特征。

特征栏(Feature Column):特征栏是相关特征的集合,如用户所住地区存在的所有可能国籍的集合。

在同一个样例的同一个特征栏中可能有一个或多个特征。

特征栏相当于(雅虎或微软的)虚拟机系统的“命名空间(namespace)”或“域(field)”。

样例(Example):样例包含示例(具有各种特征)和标记。

模型(Model):模型是预测任务的数学表达形式。

先是通过样例训练模型,而后利用模型做出预测。

度量(Metric):度量是指一系列的数字,这些数字直接或间接的都被优化过。

目标(Objective):目标是指算法经过优化,努力要达到的度量标准。

工作流(Pipeline):工作流指的是围绕机器学习算法而存在的基础架构。

从前端搜集数据、将搜集到的数据放入训练数据文件夹、训练一个或多个模型以及将模型用于生产等过程,都属于工作流。

综述
要想创造出优秀的产品:
你需要以一位优秀工程师的身份去运用深度学习!记住!你不单单是一位机器学习的研究者!
事实上,你所面临的大多数问题都是技术性问题。

即便拥有足以媲美机器学习专家的理论知识,要想有所突破,大多数情况下都在依赖示例的良好特征,而非优秀的机器学习算法。

因此,基本方法如下:
1.确保你的工作流各连接端十分可靠
2.树立合理的目标
3.添加的常识性特征尽量简单
4.确保你的工作流始终可靠
这种方法能带来相当多的盈利,或者也能在较长的时间里令许多人都满意,甚至还可能实现双赢。

只有在简单技巧不能发挥任何作用的情况下,才能使用复杂一些的方法。

方法越复杂,产品最终的产出速度越慢。

当你用尽了所有的简单技巧,等待你的很可能就是最前沿的机器学习技术。

请看第三阶段机器学习项目中的章节。

本文共分为四部分:
1.关于第一部分,它会帮助读者理解,当下构建机器学习系统是否适合。

2.关于第二部分,它将向读者介绍,第一次该如何部署自己的工作流。

3.关于第三部分,它将向读者介绍,机器学习系统是一个不断迭代更新的过程,
工作流中会持续不断地添入新特征;同时,第三部分还会涉及如何评价模型、如何评价训练过程中的偏误。

4.在最后一部分,文章为大家提供了一些停滞不前时的做法。

5.再后面,是与机器学习相关的工作以及附录,附录里提到了本文中常用例子
的背景情况。

在机器学习之前
法则1:不用害怕发布一款没有用到机器学习的产品。

机器学习是很酷,但它需要数据。

从理论上讲,你可以从不同的问题中获取相关的数据,而后通过调整模型得到新的产品。

但是这样做,效果不如基本的启发式
方法。

机器学习能完成的任务,启发式方法能够完成一半。

举个例子,当为应用商店的某款应用排名时,利用安装率或安装数量来判断即可;当查找垃圾邮件时,找出之前曾经发过垃圾邮件的发行者即可,当然也可以使用人工编辑的方法;为联系人排名时,把最近联系人排在最前面(或按字母顺序)即可。

如果可以不使用机器学习,那就不用,或者等你有了足够的数据再用。

法则2:将度量标准的设计和执行置于首位。

在正式决定机器学习系统的功能之前,尽可能多地对当前系统做记录。

这么做的原因有以下几条:
1.更容易为早先的用户所接受。

2.如果你觉得某个问题以后会受到关注,最好是从现状开始就搜集数据。

3.如果按照预先设定好的标准设计系统,将来会大有益处。

准确地说,这是为
了让你以后不用在日志文件中翻来覆地去找的相关的字符串
4.你会注意到哪些东西变了,哪些保持不变。

举个例子,假设你想要直接优化
一天的活跃用户量。

然而在早期对系统的处理中可能会发现用户体验的变化并没有显著改变活跃用户量的度量。

Google Plus团队会衡量单次阅读的展开次数、分享数、点赞数、评论数、每位用户的评论以及每位用户的分享情况等等。

通过上述数据,他们会计算在服务时间内某条信息的好坏。

另外,实验框架也很重要,在实验框架中,你可以把用户分类,并通过实验来汇总数据(参照法则12)。

选择度量标准时越自由,对系统的了解情况就越全面。

一旦发现有问题,就可以立即添加一个度量标准进行追踪!若新版本发布后,某些量发生了变化,也可以添加一个度量来追踪!
法则3:在机器学习和启发式方法中优先选择机器学习。

简单的启发式方法可以轻松应用到产品上,而复杂的启发式方法却难以维护。

一旦你拥有了足够的数据,并且对要实现的目标有了基本的概念,那就投奔机器学习吧。

在大多数软件工程中,不管使用的是启发式方法还是机器学习模型,都需要经常更新算法。

但是你会发现,使用机器学习的模型更容易更新和维护(见法则16)。

机器学习阶段1:第一条工作流
认真对待第一条工作流的基础架构建设。

虽然发挥想象力构思模型很有意思,但首先得确保你的工作流是可靠的,这样出了问题才容易发现。

法则4:第一个模型要简单,基础架构要正确。

第一个模型对你的产品最重要,不需太过花哨,但是必须实用。

在后续过程中,你会发现,与基础架构相关的问题将大大超出你的预料。

对于你新设计出的这个新模型,在它被别人使用之前,你需要决定:
1.如何把样例加入学习算法中。

2.为你的系统初步定义“好”与“坏”。

3.如何将模型和应用程序相结合。

你可以直接将模型应用到在线应用程序中,
也可以在离线样例的基础上对模型进行预计算(pre-compute),然后把与计算的结果储存在表格中。

举个例子,对于网页分类,你可以先预分类然后把结果储存在表格中;对于聊天信息,则可以使用在线模型。

选择简单的特征,这样以下过程会更容易保障:
1.特征正确地应用到算法中。

2.模型学习到的是合理的权重值。

3.特征正确到达到服务器的模型里。

如果你的模型能够做到上面三件事,那工作基本上就做到位了。

简单的模型可以为测试更复杂的模型提供度量基准和行为基准。

有些团队特意选择“中性(neutral)”的初步模型,因为它不会首先优化机器学习的增益(gain),以避免错乱。

法则5: 单独测试基础架构。

你不仅需要确保基础架构的可测试性,还需要确保系统的学习部分(learning part)是封装好的(encapsulated),这样才能测试所有与之相关的部件。

明确地讲:1.把数据代入算法中测试。

检查特征栏该填充(populated)的地方是否填充到
位。

若隐私部分允许的话,人工检查训练算法的输入部分。

如果还有可能的话,检查工作流中的统计数据,并将其与其他的进行比较,比如相对谱滤波(RASTA)。

2.测试模型在训练算法之外的运行情况。

不管在训练环境还是实际运行环境中,
你都需要确保模型的得分是相同的。

机器学习的一个特点就是不可预测性。

因此,你必须确保在训练和实际运行中创造样例的代码能被测试,并且在实际运行中始终使用同一个固定的模型。

此外,对数据的理解也很重要:见分析大量复杂数据的实用建议(Practical Advice for Analysis of Large, Complex Data Sets.)。

法则6: 复制工作流时留意丢失的数据。

一般情况下,我们会通过复制现有的工作流来创建新的工作流(也就是货物崇拜编程,cargo cult programming),而在这个过程中,旧工作流会丢失一些新工作流需要的数据。

举个例子,由于要更新信息排名,Google Plus what’s hot(热点信息)的工作流会删除一些过时的信息。

这条工作流将通过复制的形式直接用于Google Plus Stream。

然而,旧工作流中的过时信息对Google Plus Stream来说仍然是有价值的,但是复制过程不会保留这些旧信息。

另一种常见的情形是,系统只记录用户查阅过的数据。

因此,如果我们要建模研究为何某些信息没有被用户查阅,这些数据就无能为力了。

Google Play也经常发生类似的问题。

Play App Home有一条工作流,包含另外两个登陆页(分别是Play Games Home和Play Home Home)的样例,但是没有任何特征可以区分这些样例分别来源于哪个页面。

法则7: 要么把启发式方法转化为特征,要么在外部处理它们。

通常情况下,机器学习要解决的并不是全新的问题。

不管是排序、分类或其它任
何你想要解决的问题,都会有对应的现成系统。

这意味着,当下存在着大量的规则和启发式方法。

若用这些启发式方法调整机器学习,可以为其带来很大提升。

你应当尽可能地去挖掘启发式方法中的信息,原因有两个:第一,系统更容易过渡为机器学习系统;第二,规则中通常包含很多关于系统的知识,你会发现它们很有价值。

启发式方法有四种应用方式:
1.用启发式方法进行预处理。

若特征相当完美,则可以采用这个方法。

举个例
子,在垃圾邮件过滤器中,如果发件人已经被加入黑名单了,则可以不用重新学习“黑名单”的概念。

直接阻止该信息就可以!这种方法在二元分类(binary classification)任务中很有用。

2.创建特征。

直接从启发式方法中创建特征会很便捷。

举个例子,若要用启发
式方法为某个查询结果计算相关度,你可以把分数纳入特征的值中。

接下来,用机器学习的方法来处理这些值(例如,把这些值转化为由一系列离散值组成的有限集,或者也可以与其它特征相结合),但是要从启发式方法生成的原始数据入手。

3.挖掘启发式方法的原始输入数据。

对于某款app,若存在一个启发式方法,
其包含安装量、文本字符数和当天日期等要素,应该考虑将这些要素分开,并分别给系统学习。

想要了解某些处理方法,可以点击这里(见法则40)。

4.改良标记。

当你发觉启发式方法捕捉了一些信息,而这些信息没有包含在标
记中,这时可以考虑该选项。

举个例子,如果你想让下载量达到最大,但同时对内容的质量有要求,那么可以用app的平均评级乘以标记来解决问题。

这里你有很多选择的余地。

见章节“你的第一个目标”。

在机器学习系统中,使用启发式方法会增加复杂度,这一点需要注意。

虽然在新机器学习算法上使用老启发式算法可以为系统平滑过渡提供帮助,但是还是尽量考虑使用更简单的方法来解决问题吧。

监控
一般来说,所有系统都要设置良好的警示程序,警报系统需要顺利执行,或者设置一个仪表板页面(dashboard page)。

法则8: 了解系统的更新需求。

如果你使用的是一天前的旧模型,运行状况会下降多少?如果是一周前的呢?或一个季度前的呢?知道何时该刷新系统能帮助你划分监控的优先级。

如果你的模型一天没有更新,受益便下降10%,因此有必要指派一名工程师时时关注它的动态。

大多数广告服务系统每天都会有新的广告需要处理和更新。

打比方,若Google Play Search的机器学习模型没有更新的话,一个月之内其收益就会受到冲击。

Google Plus 的What’s Hot中一些模型没有信息辨识器,因此这些模型可以不用那么频繁地去更新。

其它一些有信息辨识器的模型则需要经常更新。

此外,要留意更新需求是会变化的,特别是在添加或移除特征栏的时候,需要尤为注意。

法则9: 输出模型前发现问题。

许多机器学习系统都存在这样一个阶段:直接把模型输出运行。

,如果问题出现
在模型输出之后,那么这个问题就是用户所面临的问题。

而如果问题出现在模型输出之前,就是训练过程中的问题,用户不会发现。

输出模型之前请做好完整性检查(sanity check)。

具体来讲,确保模型在留存数据上运行合理。

或者,如果你还是对数据有担忧的话,干脆就不要输出模型。

很多团队会持续不断地部署模型,并在模型输出之前检验ROC或AUC曲线下的面积。

对于还未输出的模型,其存在的问题需要通过邮件进行提示;而对于面向用户的模型,其存在的问题则需要一整个页面进行提示。

因此最好慢慢来,在发布给用户之前尽量完善好自己的模型。

法则10:当心潜在的故障。

比起其它系统,机器学习系统更容易出现潜在的问题。

假设系统的某个特定的表格不再进行更新,整个系统通过调整仍会保持良好的运行水准,但是会慢慢衰减。

有时有些表格几个月都不会刷新一次,而只需简单的刷新就能大幅度提升系统的运行水准,效果甚至超过该季度最新发布的那些模型!例如,由于系统实现(implementation)发生变化,特征的覆盖范围也会发生相应的变化:比如,某个特征栏刚开始可能包含90%的样例,接下来却可能突然下降到60%。

Play曾经有一个表格,6个月没有更新,仅仅刷新这一个表格就能使安装率提升2%。

如果你能一边跟踪统计数据,一边时不时地人工检查这些数据,就能减少这类故障的发生。

法则11:为特征栏指定负责人并进行文件编制。

如果系统的规模比较大,并且特征栏比较多,那么必须清楚每个特征栏的创建者或者维护者。

如果某个了解该特征栏的人离开了,一定要确保另外还有人了解这部分信息。

虽然很多特征栏的名字非常直观,但最好还是使用更详尽的文档来描述这些特征的内容、来自哪里以及它们的作用。

你的第一个目标
你会关注许多系统评测指标,但机器学习算法的目标通常只有一个——这个目标是一个数字,算法需要不断地努力优化这个数字。

在这里,我对目标和度量作一下区分:度量是系统报告给出的数字,不一定很重要。

见法则2
法则12: 选择直接优化的目标时不要想太多。

如果你想赚钱,想取悦你的用户,或者想建设更美好的世界,那么有太多的你需要考虑的度量标准了。

而且,你还应该对这些度量标准作出权衡(见法则2)。

然而,在机器学习的初期过程,你会发现这些度量标准全部都在上升,即使是那些没有经过直接优化的度量也在上升。

举个例子,假设你关注点击量、网站的停留时间以及日活跃用户。

如果你优化点击量的话,网页的停留时间很可能也会上升。

因此,当你可以轻松提升所有度量时,简简单单就好,不需要绞尽脑汁求取平衡。

但是,也不要滥用这些规则;不要把这些目标和系统要达到的最终状态搞混了(see Rule #39)。

并且,如果你发现自己只是在提升直接优化度量,却无意
发布新模型,那就需要修正一下目标了。

法则13:选择一个简单、可观测并且可归类的评估指标作为你的第一个目标。

通常情况下,你并不知道真正的目标是什么。

有时候你觉得你选对了目标,然而通过对数据的认真观察以及新旧机器学习系统的对比之后,你会意识到需要对目标进行调整。

另外,关于这个真正的目标,团队中的成员之间也很难达成一致的意见。

机器学习的目标应当是很容易测量的,并且可以利用这个目标逐渐寻找“真实”目标1。

因此,先在简单的机器学习目标上做训练,然后考虑在顶端加一个“策略层”,以便添加额外的逻辑(希望是简单的逻辑)用于最终排名。

用户的行为表现可直接被观测到,这是模型中最容易的事情,并且也可以将其在系统中归类:
1.链接是否被点击过?
2.链接中的对象是否被下载过?
3.链接中的对象是否被转发/回复/用电邮发送过?
4.链接中的对象是否被评过级?
5.所展示的对象是否被标记为垃圾信息/色情图片/恶意信息?
开始的时候,避免模拟间接影响:
1.用户第二天访问了吗?
2.用户在网站上访问了多长时间?
1通常“真实”目标不存在。

见法则39
3.每天活跃在网页上的用户属于哪个群体?
间接影响可以成为极好的度量,在A/B测试阶段和最终的发布阶段,可以考虑这些因素。

最后,不要让机器学习考虑下面这些因素:
1.用户在使用产品时是否开心?
2.用户对体验是否满意?
3.产品是否能提升用户的整体幸福度?
4.这会如何影响公司的整体状况?
这些因素虽然都很重要,但是却又都很难测量。

相应地,我们可以使用其等效替代品:若用户用得开心,那么在网页上停留的时间会久一些;若用户对网站十分满意的话,他们以后还会继续访问。

至于说福利和公司状况,需要把机器学习目标和所出售的产品特点以及商业计划联系起来。

其中,必然会涉及人类的主观判断,因此在这里我们不再赘述。

法则14: 从容易解释的模型入手会让调试过程更加容易。

线性回归、逻辑回归和泊松回归都直接建立在概率模型之上。

每一次预测都可以用概率值或期望值来解释。

因此,与那些利用目标(0-1 loss、various hinge losses 等)以直接优化分类精确度和排名性能的模型相比,这类模型更容易调试纠错。

举个例子,若训练中的概率偏离了产出系统预测的概率,就有可能出现了问题。

例如,在线性、逻辑或泊松回归中,数据存在一些子集,这些子集的平均预测期望等于平均标记(一阶矩校准1-moment calibrated,或仅仅是校准)2。

如果你有一个样例,其特征用0或1来标记,那么用1来标记的样例的集合会被校准。

另外,如果样例的所有特征都是1,那么所有样例的集合都会被校准。

使用简单的模型更容易处理反馈环路(feedback loops)(见法则36)
通常我们会按照预测的概率来做决定:比如把帖子按降序排序(即点击概率或下载概率等)。

然而,选择模型时需要谨记,人为的决策结果比模型算出的概率更为重要。

法则15: 在策略层将垃圾信息过滤和质量排名分开。

质量排名是优雅的艺术,而垃圾信息过滤则是战争。

对使用该系统的人而言,那些高质量信息的信号很容易就能被辨别出来,他们会调整要发布的信息与这些信号想契合。

因此,质量排名应更多地关注诚心诚意的内容。

你不能把质量排名简化为垃圾信息的逆向排名。

相似地,“生动”的内容也应当从质量排名中拿出来单独处理。

垃圾信息过滤则完全不同。

特征需要不断地改变。

通常,会有一些明显的规则可以加入系统(如果一条信息被当作垃圾信息三次,就不用再取回了等等)。

所有经过学习的模型至少得每天更新,内容创建者的声誉会非常重要。

某些情况下,这两种系统的输出需要合并。

请记住,过滤搜索结果会比过滤垃圾2大多数情况下,假设没有任何规则,算法也能够收敛是可行的
邮件更激进。

另外,从质量分类器的训练数据中去掉垃圾信息也是标准做法。

机器学习阶段2:特征工程
在机器学习系统研发周期的第一阶段,重点是把训练数据导入学习系统,确定度量和兴趣的评价指标(仪表化),并创建基础架构。

当你有了一个端对端的系统,并且该系统的单元和测试都仪表化之后,第二阶段便开始了。

在第二阶段可以轻松实现许多成果。

很多明显的特征都能被纳入系统。

因此,该阶段需要纳入尽可能多的特征,并依据直观的感觉组合起来。

在这个阶段,所有的度量仍会上升,会有很多成果发布,这时候最适合招募大量工程师,他们可以整合你需要的数据,来创造一个真正了不起的学习系统。

法则16:做好反复发布新模型的打算。

你现在所做的模型很可能不是最后要发布的那个,甚至有可能,你需要一直不停地去更新自己的模型。

因此,需要考虑好现在添加的模型复杂度是否会拖慢以后新产品发布的进度。

很多团队每季度就发布一个新模型,并持续了好几年。

之所以不断发布新模型,有三个基本原因:
1.你会不断地想到新的特征。

2.你会不断地调整并以新的方式组合旧的特征。

3.你会改变目标。

不管怎样,还是应该多关注自己的模型:通过观察流入样例的数据可以帮助你找到新的信号以及出现故障的旧信号。

因此,当你搭建模型时,你可以想象到,添加、移除或重新组合某些特征会是多么的简单;创造一条全新的工作流副本并测试其正确性也将会非常的简单;同时,你可以考虑一下,有没有让两三条副本并联运行的可能。

最后,不要去担心是不是35个特征中的第16号的特征决定了工作流的版本,这完全没有必要。

总之,下一季度你就能得到答案了。

法则17: 从直接观测到的特征入手,使用reported特征,而不是learned特征。

这一点虽然很有争议,但可以避免很多陷阱。

先描述一下什么是learned 特征。

Learned 特征是由外部系统(比如无监督聚类系统)或学习者本身(比如因子模型、深度学习)生成的特征。

两种方式生成的特征都很有用,但也有很多问题,因此不应当用在初始模型中。

如果你用外部系统创造特征,那么请记住,系统是有自己的目标的。

外部系统的目标与你当前的目标可能联系不大,如果你仅仅粗略地研究外部系统,那么它有可能会过时;如果你从外部系统来更新特征,那这些特征的意义可能会变化。

所以,如果用外部系统来提供特征的话,需要多加注意。

因子模型和深度学习模型的主要问题是它们都是非凸的(non-convex)。

因此,无法保证能找到或近似最优解,并且每次迭代找到的局部最小值也可能不同。

这种变化会导致我们很难判断出对系统的影响是必然的还是随机的。

通过创建有简单特征的模型,你可以获得完美的基准性能。

接下来,就可以再尝试更多深奥的。

相关文档
最新文档