机器学习规则:

机器学习工程最佳实践

Martin Zinkevich

本文档旨在帮助掌握机器学习基础知识的人员从 Google 的机器学习最佳实践中受益。它介绍了一种机器学习样式,类似于 Google C++ 样式指南和其他热门的实用编程指南。如果您参加过机器学习的一门课程,或者构建或处理过机器学习模型,则具备阅读本文档所需的背景。

Martin Zinkevich 介绍了他最喜欢的十条机器学习规则。请继续阅读,了解全部 43 条规则!

术语

在我们讨论有效的机器学习时,会反复提到以下术语:

  • 实例:要对其进行预测的事物。例如,该实例可能是您想要归类为“与猫相关”或“与猫无关”的网页。
  • 标签:预测任务的答案,它可以是由机器学习系统生成的答案,也可以是训练数据中提供的正确答案。例如,某个网页的标签可能是“与猫相关”。
  • 特征:预测任务中使用的实例的属性。例如,某个网页可能具有“包含字词‘猫’”这一特征。
  • 特征列:一组相关特征,例如用户可能居住的所有国家/地区的集合。样本的特征列中可能包含一个或多个特征。“特征列”是 Google 专用的术语。 特征列在 Yahoo/Microsoft 使用的 VW 系统中称为“命名空间”,也称为
  • 示例:一个实例(及其特征)和一个标签。
  • 模型:预测任务的统计表示法。您使用样本训练模型,然后使用模型进行预测。
  • 指标:您关心的一个数字。不一定会直接优化。
  • 目标:算法尝试优化的指标。
  • 流水线:机器学习算法的基础架构。这包括从前端收集数据、将数据放入训练数据文件、训练一个或多个模型,以及将模型导出到生产环境。
  • 点击率:点击广告中的链接的网页访问者所占的百分比。

概览

要打造优质的产品:

请把机器学习做成一名优秀的工程师,而不是像优秀的机器学习专家一样。

实际上,您将面临的大多数问题都是工程问题。即使使用出色的机器学习专家的所有资源,大部分收获也源于出色的特征,而不是出色的机器学习算法。因此,基本方法是:

  1. 确保管道从头到尾都稳固可靠。
  2. 从合理的目标入手。
  3. 以简单的方式添加常识特征。
  4. 确保管道始终稳固可靠。

此方法将在较长一段时间内有效。只有在没有更多简单的技巧来帮助您走得更远时,才不要偏离此方法。增加复杂性会减缓未来版本的发布。

学完这些简单的技巧后,先进的机器学习技术可能就是您将来的样子。请参阅第三阶段的“机器学习项目”部分。

本文档结构如下:

  1. 第一部分可帮助您了解构建机器学习系统的时机是否已经成熟。
  2. 第二部分介绍了如何部署第一个流水线。
  3. 第三部分介绍了在向流水线添加新特征时如何进行发布和迭代、如何评估模型,以及如何应对训练-应用偏差。
  4. 最后一部分介绍了当您达到稳定阶段时该怎么做。
  5. 之后是相关资源列表和附录,附录针对多次作为示例在本文档中用作示例的系统,提供了一些背景信息。

采用机器学习技术之前

第 1 条规则:不要害怕发布没有机器学习技术的产品。

机器学习很酷,但它需要数据。从理论上讲,您可以从其他问题获取数据,然后针对新产品调整模型,但这样做的效果很可能不如基本heuristics。如果您认为机器学习能为您带来 100% 的提升,那么启发式算法就可以为您实现 50% 的目标。

例如,如果您要对应用市场中的应用进行排名,可以将安装率或安装次数用作启发词语。如果您要检测垃圾内容,请过滤掉之前发送过垃圾内容的发布商。此外,也不要害怕人工修改。如果您需要对联系人进行排名,请对最近使用的联系人进行排名(或者按字母顺序排序)。如果您的产品并非一定要使用机器学习技术,则在获得数据之前,请勿使用机器学习技术。

第 2 条规则:首先,设计并实现指标。

在正式确定机器学习系统的功能之前,请在当前系统中尽可能多地进行跟踪。这样做的原因如下:

  1. 提前从系统用户处获取权限会更加容易。
  2. 如果您认为将来可能需要考虑某些事项,最好现在就获取历史数据。
  3. 如果您在设计系统时考虑到指标插桩,将来会让您受益匪浅。具体而言,您不希望自己在日志中苦苦查找字符串来检测指标!
  4. 您会注意到哪些内容发生了变化,哪些没有变化。例如,假设您想要直接优化单日活跃用户数。但是,在早期操纵系统的过程中,您可能会发现,用户体验的显著改变并不会使该指标发生明显变化。

Google+ 团队会衡量每次阅读的扩展次数、每次读取的转发次数、每次阅读的加号次数、每次阅读的评论数、每位用户的评论数、每位用户的转发次数等,计算帖子在投放时的效果。另请注意,实验框架非常重要,在该框架中,您可以将用户分组到各个存储分区中,并按实验汇总统计信息。请参阅第 12 条规则

通过以更加自由的方式收集指标,您可以更全面地了解自己的系统。发现了问题?添加指标进行跟踪!对上个版本的一些量化更改感到兴奋吗?添加指标进行跟踪!

第 3 条规则:选择机器学习,而不是复杂的启发式算法。

简单的启发式算法就可以让您的产品大放异彩。复杂的启发式算法不可维护。当您有了数据并对尝试实现的目标有一个基本概念后,便可以使用机器学习。与大多数软件工程任务一样,您需要不断更新方法(无论是启发式算法还是机器学习模型),而且您会发现机器学习模型更易于更新和维护(请参阅第 16 条规则)。

机器学习第一阶段:您的第一个流水线

重点关注第一个流水线的系统基础架构。虽然想象一下您将执行的所有富于想象力的机器学习会很有趣,但如果您不首先信任流水线,就很难确定会发生什么。

第 4 条规则:确保第一个模型简单易用,并正确设置基础架构。

第一个模型可以最大程度地提升产品,因此不需要花哨。但是,您遇到的基础架构问题会超出您的预期。在任何人都能使用您精心构思的新机器学习系统之前,您必须确定:

  • 如何为学习算法获取样本。
  • 首先,我们讨论“良好”和“糟糕”对您的系统有何意义。
  • 如何将模型集成到应用中。您可以实时应用模型,也可以对样本进行离线预计算,并将结果存储在表中。例如,您可能想要对网页进行预分类并将结果存储在表中,但可能希望对实时聊天消息进行分类。

选择简单的特征可以更轻松地确保:

  • 这些功能会正确应用于您的学习算法。
  • 模型学习合理的权重。
  • 特征可以正确应用于服务器中的模型。

一旦有一个能可靠地完成这三件事情的系统,您就完成了大部分工作。您的简单模型会为您提供基准指标和基准行为,供您测试更复杂的模型。一些团队力求实现“中立”的首次发布:在首次发布时明确降低机器学习收获的优先级,以免分散注意力。

第 5 条规则:独立于机器学习来测试基础架构。

确保基础架构可测试,并且对系统的学习部分进行了封装,以便测试其周围的一切。具体而言:

  1. 测试将数据导入到算法中。检查应填充的特征列是否已填充。在隐私权允许的情况下,手动检查输入到训练算法的数据。如果可能,请检查流水线中的统计信息,并与在其他地方处理的相同数据的统计信息进行比较。
  2. 测试从训练算法中获取模型的效果。确保训练环境中的模型与应用环境中的模型给出的分数相同(请参阅第 37 条规则)。

机器学习具有不可预测性,因此请确保您对用于在训练和服务中创建样本的代码有测试,并确保您可以在应用期间加载和使用固定模型。此外,了解您的数据至关重要:请参阅分析大型复杂数据集的实用建议

规则 6:复制流水线时请注意丢弃的数据。

通常,我们通过复制现有流水线来创建流水线(即货物崇拜编程),而旧流水线会丢弃新流水线所需的数据。 例如,Google+ 热门信息流水线会丢弃时间较早的帖子(因为它会尝试对最新的帖子进行排名)。此流水线已被复制用于 Google+ 信息流,在信息流中,较早的帖子仍然有意义,但旧流水线仍会丢弃它们。另一种常见模式是仅记录用户看到的数据。因此,如果我们想要对用户看不到特定帖子的原因进行建模,该数据毫无用处,因为所有负例都被丢弃。Play 中也发生了类似的问题。在处理 Play 应用首页时,创建了一个新的流水线,其中还包含来自 Play 游戏着陆页的示例,但没有任何功能可以区分每个示例的来源。

第 7 条规则:将启发法转变为特征或在外部处理它们。

通常,机器学习试图解决的问题并非全新问题。有一个现有的系统,可用于排名、分类或您尝试解决的任何问题。这意味着需要采用多种规则和启发式算法。使用机器学习进行调整后,这些启发式算法可以提升广告效果。应根据任何信息挖掘您的启发法,原因有两个。首先,向机器学习系统的过渡会更加顺畅。其次,这些规则通常包含很多您不想舍弃的系统的直觉。您可以通过以下四种方式使用现有启发法:

  • 使用启发法进行预处理。如果特征非常好,则可以选择此方法。例如,如果在垃圾邮件过滤器中,发件人已被列入黑名单,不要尝试重新了解“已列入黑名单”的含义。屏蔽邮件。这种方法最适合二元分类任务。
  • 创建地图项。直接通过启发法创建特征是一种很好的做法。例如,如果您使用启发法计算查询结果的相关性分数,则可以将此分数添加为特征的值。您稍后可能需要使用机器学习技术调整该值(例如,将该值转换为一组有限离散值中的一个,或将其与其他特征相结合),但首先使用启发法生成的原始值。
  • 挖掘启发法的原始输入。如果应用的启发法将安装次数、文本中的字符数以及星期几组合在一起,请考虑拆分这些内容,并将这些输入单独馈送到学习中。部分适用于集成学习的技巧也适用于此(请参阅第 40 条规则)。
  • 修改标签。当您认为启发式算法会捕获当前标签中未包含的信息时,可以选择进行此操作。例如,如果您尝试尽可能提高下载次数,但也希望获得优质内容,则解决方案可能是将标签乘以应用获得的平均星数。这方面还有很大的提升空间。 请参阅“您的第一个目标”

在机器学习系统中使用启发法时,请务必留意额外的复杂性。在新的机器学习算法中使用旧启发法有助于实现平稳过渡,但请考虑是否有更简单的方式来实现同样的效果。

Monitoring

一般来说,您应养成良好的提醒健全度的做法,例如让提醒具有实用价值以及设置信息中心页面。

第 8 条规则:了解系统的新鲜度要求。

如果您的模型只存在一天,那么性能会降低多少?一周?一个季度前?此信息可帮助您了解监控的优先顺序。如果模型一天不更新,会显著降低产品质量,那么最好让工程师持续观察。大多数广告投放系统每天都有新广告要处理,而且必须每天更新。例如,如果不更新 Google Play 搜索的机器学习模型,则不到一个月便会产生负面影响。Google+ 热门信息的某些模型没有帖子标识符,因此可以不经常导出这些模型。其他具有帖子标识符的模型的更新频率要高得多。另请注意,新鲜度可能会随时间而变化,尤其是在模型中添加或移除特征列时。

第 9 条规则:在导出模型之前检测问题。

许多机器学习系统都有一个阶段,在该阶段,您需要导出模型以应用模型。如果导出的模型存在问题,那就是用户会遇到的问题。

请在导出模型之前进行健全性检查。具体而言,请确保模型在处理预留数据方面表现合理。或者,如果您对数据仍有疑虑,请勿导出模型。许多持续部署模型的团队在导出之前会检查 ROC 曲线下面积(简称 AUC)。与尚未导出的模型有关的问题需要电子邮件提醒,但面向用户的模型出现问题可能需要一个页面。因此,最好先等待一段时间并确保万无一失,以免影响用户。

规则 10:留意静默失败。

相较于其他类型的系统,机器学习系统更容易出现此问题。假设正在联接的特定表不再更新。机器学习系统会做出调整,行为将继续保持在合理的水平,并逐步衰减。有时,您会发现一些表已有数月未更新,简单刷新一下,性能的提高幅度比该季度的任何其他发布都更胜一筹!特征的覆盖率可能会因实现变化而发生变化:例如,某个特征列可能在 90% 的样本中填充,然后突然下降至 60%。Play 曾经有一个过时 6 个月的表格,仅刷新这个表格就将安装率提升 2%。如果您跟踪数据的统计信息,并偶尔手动检查数据,则可以减少这些类型的失败。

第 11 条规则:为特征列提供所有者和文档。

如果系统很大,并且特征列有很多,则应知道每个特征列的创建者或维护者。如果您发现了解某个特征列的人即将离开,请确保有人知道相关信息。虽然许多特征列都具有描述性名称,但最好更详细地描述特征是什么、特征的来源以及预期的作用。

您的第一个目标

您有很多自己关注的系统指标或测量结果,但机器学习算法通常需要单个目标,即算法“尝试”优化的数字。在本文中,我区分目标和指标:指标是指系统报告的任意数字,可能重要,也可能不重要。另请参阅第 2 条规则

第 12 条规则:选择直接优化哪个目标时,不必过度思考。

您想赚钱,想让用户满意,并让世界变得更美好。您关注的指标有很多,您应该对所有这些指标进行测量(请参阅第 2 条规则)。但是,在机器学习过程的早期,您会注意到所有指标都会上升,即使是您没有直接优化的指标也是如此。例如,假设您关心点击次数和用户在网站上的停留时间。如果您针对点击次数进行优化,则访问者所花的时间可能会增加。

因此,当您仍然可以轻松增加所有指标时,请保持简单,不要过多考虑如何平衡不同的指标。但不要过度使用此规则:不要将您的目标与系统的最终运行状况相混淆(请参阅第 39 条规则)。此外,如果您发现自己增加了直接优化的指标,但决定不发布,则可能需要修改一些目标

第 13 条规则:为您的第一个目标选择一个可观测且可归因的简单指标。

您往往并不知道真正的目标是什么。您以为自己知道,但当您盯着数据,并对旧系统和新机器学习系统进行并排分析时,就会发现想要调整目标。此外,不同的团队成员通常无法就真正的目标达成一致。机器学习目标应是“真实”目标的替代指标,并且易于衡量。实际上,通常没有“真正的”目标(请参阅第 39 条规则)。因此,请针对简单的机器学习目标进行训练,并考虑在顶部添加一个“政策层”,以便您可以添加其他逻辑(希望是非常简单的逻辑)来执行最终排名。

要进行建模,最简单的方式是直接观察到且可归因于系统操作的用户行为:

  • 用户是否点击了此已排名链接?
  • 是否已下载此已排名对象?
  • 此已排名对象是否已转发/回复/通过电子邮件发送?
  • 此已排名对象是否已评分?
  • 这个显示的对象是否被标记为垃圾内容/色情内容/冒犯性内容?

首先避免对间接效应建模:

  • 用户第二天是否访问了网站?
  • 用户花了多长时间访问网站?
  • 日活跃用户数是多少?

间接影响可以成为出色的指标,可以在 A/B 测试和发布决策期间使用。

最后,不要试图让机器学习弄清楚:

  • 用户对产品的使用是否满意?
  • 用户是否对体验感到满意?
  • 该产品是否在改善用户的整体健康状况?
  • 这对公司的整体健康状况有何影响?

这些都很重要,但也极难衡量。而应使用代理:如果用户感到满意,他们就会在网站上停留更长时间。如果用户感到满意,明天就会再次访问。就幸福感和公司健康而言,需要进行人为判断,将任何机器学习目标与您销售的产品的性质和业务计划联系起来。

第 14 条规则:从可解释的模型开始可简化调试。

线性回归、逻辑回归和泊松回归均由概率模型直接推动。每个预测都可以解释为概率或预期值。与使用目标(零一损失、各种合页损失等)并试图直接优化分类准确率或排名性能的模型相比,这使得它们更易于调试。例如,如果训练中的概率偏离通过并排或通过检查生产系统预测的概率,则这种偏差可能揭示问题。

例如,在线性回归、逻辑回归或泊松回归中,有些数据子集的平均预测预期等于平均标签(1-时刻校准或仅校准后)。假设您没有正则化且算法已收敛,结果即是如此,这通常大致是正确的。如果每个样本的特征值均为 1 或 0,则对特征为 1 的 3 个样本集进行校准。此外,如果您的特征是每个样本都为 1,则会校准所有样本的集合。

利用简单的模型,您可以更轻松地处理反馈环(请参阅第 36 条规则)。通常,我们会使用这些概率预测来做出决策:例如,按期望值(即点击概率/下载概率等)对帖子进行排名。但是,请注意,在选择使用哪种模型时,您的决定比模型给出的数据可能性更重要(请参阅第 27 条规则)。

第 15 条规则:在政策层中区分垃圾内容过滤和质量排名。

质量排名是一门艺术,但垃圾内容过滤是一场战争。使用您系统的用户将清楚地看到您用来确定优质帖子的信号,他们会调整自己的帖子,使其具备这些属性。因此,您的质量排名应侧重于对诚信发布的内容进行排名。您不应因为质量排名学习器将垃圾内容排名很高而对其应用折扣。同样,“少儿不宜”的内容应与质量排名分开处理。垃圾信息过滤则另当别论。您必须明白,您需要生成的特征会不断变化。通常,您会在系统中设置明显的规则(如果一个帖子收到三次以上投票,就不要检索该帖子等等)。所有学习模型都必须每天更新,或者更新速度不快。内容创作者的声誉将发挥很大作用。

在某种程度上,必须集成这两个系统的输出。请注意,与过滤电子邮件中的垃圾邮件相比,过滤搜索结果中的垃圾邮件应该更严格。此外,从质量分类器的训练数据中移除垃圾内容是一种标准做法。

机器学习第二阶段:特征工程

在机器学习系统生命周期的第一阶段,重要问题是:将训练数据导入学习系统,对任何感兴趣的指标进行插桩,以及创建服务基础架构。在构建好可正常运行的端到端系统并且对单元测试和系统测试进行插桩后,第二阶段就开始了。

第二阶段有很多容易实现的目标。有很多显而易见的特征可以提取到系统中。因此,机器学习的第二阶段涉及提取尽可能多的特征,并以直观的方式将它们组合起来。在此阶段,所有指标应该会仍在上升。我们会进行大量的发布,而现在正是聘请大量工程师的好时机,这些工程师可以整合创建真正出色的学习系统所需的所有数据。

第 16 条规则:计划发布和迭代。

不要指望您现在正在开发的模型会是您将发布的最后一个模型,甚至不再是您会停止发布模型。因此,请考虑此次发布中增加的复杂性是否会降低未来发布的速度。多年来,许多团队每季度或更多团队都会发布一个模型。发布新模型有三个基本原因:

  • 您正在开发一些新功能。
  • 您将调整正则化,并以新方式组合旧特征。
  • 您正在调整目标。

无论如何,对模型多加爱意是件好事:查看馈送到样本中的数据有助于发现新信号以及旧的信号。因此,在构建模型时,请考虑添加或移除特征或重新组合特征的难易程度。考虑创建流水线的新副本并验证其正确性有多么容易。考虑是否可以并行运行两个或三个副本。最后,不必担心此流水线版本中的 16 个特征(共 35 个)是否会出现。您将在下个季度收到软件更新。

第 17 条规则:从直接观察到和报告的特征(而不是学习的特征)入手。

这可能是一个有争议的话题,但可以避免很多隐患。首先,我们来描述一下什么是学习特征。学习特征是由外部系统(如非监督式聚类系统)或学习器本身(例如通过因式模型或深度学习)生成的特征。这两种方式都很有用,但它们可能存在很多问题,因此不应该出现在第一个模型中。

如果您使用外部系统创建特征,请注意,外部系统有自己的目标。外部系统的目标可能与您当前的目标仅存在轻微的关联。如果您获取外部系统的快照,它可能会过时。如果您通过外部系统更新特征,则特征的含义可能会发生变化。如果您使用外部系统提供功能,请注意,此方法需要非常小心。

分解模型和深度模型的主要问题是它们是非凸的。因此,无法保证能够近似得出或找到最优解决方案,并且每次迭代时找到的局部最小值可能不同。这种变化导致难以判断系统更改所产生的影响是有意义的还是随机的。通过创建没有深度特征的模型,您可以获得出色的基准性能。达到此基准后,您可以尝试更深奥的方法。

第 18 条规则:探索可以跨情境泛化的内容的特征。

通常情况下,机器学习系统只是更大系统中的一小部分。例如,如果你想象某个帖子可能被用在“热门信息”中,那么很多人都会对该帖子进行 +1、转发或评论,然后才出现在“热门信息”中。如果您将这些统计信息提供给学习器,学习器可以宣传它在优化的上下文中无数据的新帖子。YouTube“接下来观看”可以使用来自 YouTube 搜索的观看次数或共同观看次数(观看一个视频后观看另一个视频的次数)。您还可以使用明确的用户评分。最后,如果您将某项用户操作用作标签,在不同上下文中看到对文档执行的操作可能是一个不错的特征。所有这些功能都能让您在相关上下文中引入新内容。 请注意,这与个性化无关:先弄清楚是否有人喜欢此情境中的内容,然后再弄清楚谁喜欢该内容的程度。

第 19 条规则:尽可能使用非常具体的特征。

对于海量数据,学习数百万个简单特征比学习几个复杂特征更简单。正在检索的文档的标识符和规范化查询的标识符不会提供很多泛化处理,但会使您的排名与头查询的标签保持一致。因此,请不要害怕成组的特征:每个特征适用于您一小部分数据,但总体覆盖率超过 90%。您可以使用正则化来消除适用于样本太少的特征。

第 20 条规则:组合并修改现有特征,以易于理解的方式创建新特征。

您可以通过多种方式组合和修改地图项。借助 TensorFlow 等机器学习系统,您可以通过转换对数据进行预处理。两种最标准的方法是“离散化”和“交叉”。

离散化包括获取一个连续特征并从中创建许多离散特征。以年龄等连续特征为例。您可以创建一个年龄在小于 18 周岁时值为 1 的特征,在年龄在 18-35 周岁之间时值为 1,等等。不要过度考虑这些直方图的边界:基本分位数将为您提供最大的影响。

“组合”用于组合两个或更多个特征列。在 TensorFlow 的术语中,特征列是一组同构特征(例如{男性、女性}、{美国、加拿大、墨西哥}等等)。组合是指包含特征的新特征列,例如 {male, female} × {US, Canada, Mexico}。这个新特征列将包含特征(男性、加拿大)。如果您使用的是 TensorFlow,并且让 TensorFlow 为您创建此组合,则此(男性,加拿大)特征将出现在代表加拿大男性的样本中。请注意,学习具有三个、四个或更多基本特征列组合的模型需要大量数据。

生成非常大的特征列的组合可能会过拟合。例如,假设您正在执行某种搜索,有一个包含查询中字词的特征列,还有一个包含文档中字词的特征列。您可以使用“组合”方法将这些特征组合起来,但最终会得到很多特征(请参阅第 21 条规则)。

处理文本时,有两种替代方案。最严苛的方法是点积。点积格式采用最简单的形式,即计算查询和文档共有的字数。然后,可以对此特征进行离散化。另一种方法是交集:因此,当且仅当文档和查询中均包含“pony”一词时,才会出现一个特征;当且仅当文档和查询中均有“the”一词时,才会出现另一个特征。

第 21 条规则:您可以在线性模型中学习的特征权重数量与您拥有的数据量大致成正比。

关于模型的适当复杂程度,统计学习理论已经取得了一些非常棒的成果,但这条规则基本上只需要了解什么。在我进行的一些对话中,人们抱有这样的疑虑:他们怀疑从一千个样本中学到什么东西,或者是否需要超过一百万个样本,因为他们陷入了某种学习方法中。关键在于根据数据规模调整学习方法:

  1. 如果您正在使用搜索排名系统,并且文档和查询中有数百万个不同的字词,并且您有 1000 个有标签样本,那么您应该在文档和查询特征(即 TF-IDF)以及其他六种高度人工工程的特征之间使用点积。1000 个样本,十几个特征。
  2. 如果您有一百万个样本,则使用正则化和特征选择(可能)使文档特征列和查询特征列相交。这样一来,您将获得数百万个特征,但如果使用正则化,则获得的特征会更少。千万个样本,也可能是十万个特征。
  3. 如果您有数十亿或数千亿个样本,则可以使用特征选择和正则化,通过文档和查询标记组合特征列。你将拥有十亿个样本和一千万个特征。统计学习理论很少设定严格的限制,但可以提供很好的起点指导。

最后,请根据第 28 条规则决定要使用哪些特征。

第 22 条规则:清理不再使用的功能。

未使用的特征会产生技术债务。如果您发现自己没有使用某个功能,并且无法将其与其他功能结合使用,请将其从基础架构中删除。您需要保持基础架构清洁,以便尽快试用最具前景的功能。如有必要,他人可以随时重新添加您的特征。

在考虑要添加或保留哪些特征时,要注意覆盖率。该功能涵盖多少个示例?例如,如果您有一些个性化功能,但只有 8% 的用户具有个性化功能,效果就不会很理想。

同时,有些特征可能会超出其权重。例如,如果您的某个特征仅覆盖 1% 的数据,但 90% 具有该特征的样本都是正例,那么这是一个可以添加的出色特征。

对系统的人工分析

在继续介绍机器学习的第三阶段之前,请务必关注任何机器学习课程都无法学到的知识:如何审视现有模型并加以改进。这更像是一门艺术而不是一门科学,但也有一些反模式需要避免。

第 23 条规则:您不是典型的最终用户。

这可能是让团队陷入困境的最简单方法。虽然 fishfood(在团队内部使用原型)和 dogfood(在公司内部使用原型)有诸多益处,但员工应该看看性能是否正确无误。虽然不应使用明显不良的更改,但任何看上去在生产环境附近看起来比较合理的更改都应进一步测试,方法是通过在众包平台上付费让外行人回答问题,或通过在真实用户身上开展实时实验的方式进行测试。

这有两个原因。首先,您与代码之间的距离太近。您关注的可能是帖子的某一特定方面,或者您只是在感情上太过投入(例如确认偏差)。其次,您的时间非常宝贵。考虑 9 名工程师参加一个小时会议的费用,以及有多少签约的人工标签在众包平台上进行购买。

如果您确实想获得用户反馈,请使用用户体验方法。在流程的早期阶段创建用户角色(请参阅 Bill Buxton 的 Sketching User Experiences 一书中的描述),然后进行易用性测试(请参阅史蒂夫·克鲁格的 Don’t Make Me Think 一书)。用户角色涉及创建假设的用户。例如,如果您的团队都是男性,则可能有助于设计一个 35 岁的女性用户角色(包含用户特征),然后看看它生成的结果(而不是针对 25-40 岁的男性用户生成 10 条结果)。在易用性测试中引入真实用户观察他们对您网站的反应(在本地或远程)也可以让您获得全新的视角。

第 24 条规则:衡量模型间的差异。

您可以在任何用户看到新模型之前,进行最简单、有时最有用的测量之一,就是计算新结果与生产环境的差异。例如,如果您遇到排名问题,请对整个系统中的查询样本运行两个模型,并查看结果的对称差分的大小(按排名位置加权)。如果差异很小,您无需运行实验即可知道变化很小。如果差异非常大,那么您需要确保这种更改是好的。查看对称差分较大的查询有助于您从性质上了解变化情况。不过,请确保系统是稳定的。确保模型与自身比较时具有较低的(理想情况下为零)对称差。

第 25 条规则:选择模型时,实用性能胜过预测能力。

您的模型可能会尝试预测点击率。但归根结底,关键问题是您使用该预测执行什么操作。如果您使用该模型对文档进行排名,则最终排名的质量比预测本身更重要。如果您预测文档是垃圾内容的概率,然后对内容被屏蔽,则允许通过内容的精确率更为重要。大多数情况下,这两项应该是一致的:当两者不一致时,可能会带来微小的收益。因此,如果某些更改可以改善对数损失,但会降低系统性能,则应寻找其他特征。当这种情况开始频繁发生时,就该重新审视模型的目标了。

规则 26:在衡量的错误中寻找规律,并创建新特征。

假设您看到模型“错误”的训练样本。在分类任务中,此错误可能是假正例或假负例。在排名任务中,错误可能是一对,其中正例的排名低于负例。最重要的一点是,这是一个示例,机器学习系统知道它弄错了,如果有机会,它会修复该示例。如果您向模型提供一个允许其修正错误的特征,模型将尝试使用它。

另一方面,如果您尝试基于系统不会视为错误的样本来创建特征,则该特征将被忽略。例如,假设用户在 Play 应用搜索中搜索“免费游戏”。假设排名靠前的搜索结果之一是相关性较低的搞笑应用。因此,您针对“搞笑应用”创建了一个功能。但是,如果您要尽可能提高安装量,并且用户在搜索免费游戏时安装了搞笑应用,“搞笑应用”功能将无法发挥您所期望的效果。

找到模型出错的样本后,寻找当前特征集之外的趋势。例如,如果系统似乎在将较长的帖子降位,则添加帖子长度。不必过于具体地说明您添加的特征。如果您要添加帖子长度,请不要试图猜测长度的含义,只需添加十几个特征,然后让模型自行处理(请参阅第 21 条规则)。这是获得您想要内容的最简单方法。

第 27 条规则:尝试量化观察到的不良行为。

您团队中的一些成员会开始对自己不喜欢的系统属性感到沮丧,因为现有的损失函数没有捕获到这些属性。这时,他们应该竭尽全力将抱怨内容变成实数。例如,如果他们认为 Play 搜索中显示的“搞笑应用”太多,可以让人工审核者识别搞笑应用。(在这种情况下,您可以使用人工标记的数据,因为一小部分查询带来的流量占很大比例。)如果您的问题是可衡量的,则可以开始将它们用作特征、目标或指标。一般规则是“先衡量,然后优化”。

第 28 条规则:请注意,相同的短期行为并不表示长期行为相同。

假设您有一个新系统,它会查看每个 doc_id 和 exact_query,然后计算每个查询的每个文档的点击概率。您会发现,在并排测试和 A/B 测试中,其行为与您当前的系统几乎完全相同,因此鉴于其简单性,您发布了它。不过,您发现系统未显示任何新应用。原因何在?您的系统仅根据自己的查询历史记录来显示文档,所以无法得知应该显示新文档。

要了解此类系统如何长期运行,唯一的方法是只使用模型运行时获取的数据进行训练。这一步非常困难。

训练-应用偏差

训练-应用偏差是指训练期间的性能与服务期间的性能之间的差异。出现这种偏差的原因可能是:

  • 训练流水线和应用流水线中数据的处理方式有差异。
  • 训练与应用期间的数据变化。
  • 模型与算法之间的反馈环。

我们观察到 Google 的生产机器学习系统存在训练-应用偏差,会对性能产生负面影响。最好的解决方案是对其进行明确监控,以防止系统和数据更改引入被忽视的偏差。

第 29 条规则:确保像提供服务一样进行训练的最佳方法是保存服务时使用的特征集,然后将这些特征传送至日志,以便在训练时使用。

即使您不能对每个样本都这样做,也请对一小部分样本这样做,以便验证应用和训练之间的一致性(请参阅第 37 条规则)。Google 采取了这项措施的团队有时会对结果感到惊讶。YouTube 首页已经改为在应用时记录特征,这可以显著提高质量并降低代码复杂性。目前,许多团队都在更换其基础架构。

第 30 条规则:对重要性加权抽样数据,不要随意丢弃它们!

当数据过多时,您就会倾向于接受第 1-12 个文件而忽略文件 13-99。这是错误的做法。虽然可以丢弃从未向用户显示的数据,但对于其余数据,按重要性加权是最佳选择。重要性加权意味着,如果您决定以 30% 的概率对样本 X 进行采样,则为其指定 10/3 的权重。使用重要性加权时,仍然适用规则 14 中讨论的所有校准属性。

第 31 条规则:如果您在训练和供应时联接表中的数据,则表中的数据可能会发生变化。

假设您将文档 ID 与一个包含这些文档特征(例如评论数或点击次数)的表格相联接。表中的特征可能会在训练时间和应用时间之间发生变化。这样一来,模型对同一文档的预测可能在训练和应用时有所不同。要避免此类问题,最简单的方法是在服务时记录特征(请参阅规则 32)。如果表只是缓慢变化,您也可以每小时或每天截取表的快照,以获得相对接近的数据。请注意,这仍无法完全解决问题。

第 32 条规则:尽可能在训练流水线与服务流水线之间重复使用代码。

批处理不同于在线处理。进行在线处理时,您必须在每个请求到达时对其进行处理(例如,必须针对每个查询进行单独的查找);而在批处理中,您可以组合任务(例如进行联接)。服务时,您进行的是在线处理,而训练是批处理任务。不过,您可以采取一些措施来重复使用代码。例如,您可以创建一个特定于您的系统的对象,其中任何查询或联接的结果都可以一种非常便于阅读的方式存储,并且可以轻松测试错误。然后,收集所有信息后,在传送或训练期间,您可以运行一种通用方法,在特定于您的系统的人类可读对象与机器学习系统期望的任何格式之间架起桥梁。这样可以消除训练-应用偏差的一个根源。因此,请尽量不要在训练和服务使用两种不同的编程语言。这样做会导致您几乎不可能共享代码。

规则 33:如果您根据 1 月 5 日之前的数据生成模型,请根据 1 月 6 日及之后的数据测试模型。

通常,应根据在训练模型之前收集的数据来衡量模型的性能,因为这可以更好地反映您的系统将在生产环境中的表现。如果您根据 1 月 5 日之前的数据生成模型,请根据 1 月 6 日的数据测试模型。您预计使用新数据时性能不会那么好,但应该不会太差。由于可能存在日常影响,您可能无法预测平均点击率或转化率,但曲线下方区域(表示正类别样本的得分高于负例样本的可能性)应该在合理程度上接近。

第 34 条规则:在用于过滤的二元分类(例如垃圾邮件检测或确定感兴趣的电子邮件)中,在短期内稍微牺牲性能,以获得非常纯净的数据。

在过滤任务中,标记为负例的样本不会向用户显示。假设您有一个过滤器,可在应用时屏蔽 75% 的负例。您可能想要从向用户显示的实例中提取额外的训练数据。例如,如果用户将电子邮件标记为垃圾邮件,而您的过滤器允许该电子邮件出现,您可能希望从中汲取经验。

但这种方法会引入采样偏差。如果您在提供服务期间将所有流量的 1% 标记为“留出”,并将所有留出的示例发送给用户,则可以收集更清晰的数据。现在,您的过滤器屏蔽了至少 74% 的负例。这些预留样本可以成为您的训练数据。

请注意,如果您的过滤器屏蔽了 95% 或更多的负例,则此方法的可行性会降低。即便如此,如果您希望衡量应用性能,则可以创建更小的样本(例如 0.1% 或 0.001%)。一万个样本足以非常准确地评估效果。

第 35 条规则:注意排名问题中的固有偏差。

当您彻底改变排名算法,导致显示不同的结果时,实际上改变了算法将来看到的数据。如果出现这种偏差,您应该围绕它来设计模型。具体方法有很多。这些方法都会让您的模型青睐已见过的数据。

  1. 对覆盖更多查询的特征(而不是仅覆盖一个查询的特征)进行更高的正则化。这样,模型将青睐专门针对一个或几个查询的特征,而不是泛化到所有查询的特征。这种方法有助于防止非常热门的结果泄露到不相关的查询中。请注意,这与以下更为传统的建议相反:对具有更多唯一值的特征列进行更高的正则化。
  2. 仅允许特征具有正权重。因此,任何好特征都比“未知”特征好。
  3. 不要使用仅含文档的功能。这是第 1 项的极端版本。例如,即使某个应用是热门下载应用(无论查询内容是什么),您也不想在所有地方都显示它。如果不选择只处理文档数据的特征,这一点很容易实现。您之所以不想在每个位置展示某个特定的热门应用,是因为让用户可以找到所有所需应用至关重要。例如,如果用户搜索“观鸟应用”,他们可能会下载“愤怒的小鸟”,但这显然并不是他们的意图。展示此类应用可能会提高下载率,但最终却未能满足用户的需求。

第 36 条规则:使用位置特征避免出现反馈环。

内容的位置会显著影响用户与其互动的可能性。如果您将应用放在首位,则应用获得的点击次数会更高,并且您会确信该应用获得点击的可能性更高。解决此问题的一种方法是添加位置特征,即与内容在页面中位置相关的特征。您使用位置特征训练模型,并学习对特征“1stposition”等进行大量加权。因此,对于“1stposition=true”的样本,您的模型会为其他因素分配较小的权重。 然后,在应用时,您无需为任何实例提供位置特征,或者为它们提供所有相同的默认特征,因为您在决定候选对象的显示顺序之前对其进行评分。

请注意,由于训练和测试之间的这种不对称性,请务必使任何位置特征与模型的其余部分稍微分开。理想的做法是将模型设置为位置特征函数和其他特征函数的总和。例如,不要将位置特征与任何文档特征进行交叉。

第 37 条规则:测量训练/应用偏差。

一般来说,有多种情况可能会导致偏差。此外,您还可以将其分为以下几个部分:

  • 训练数据和留出数据的效果之间的差异。一般来说,这种情况会一直存在,而且并非总是坏事。
  • 保留数据和“次日”数据的效果之间的差异。同样,这种规则始终存在。您应该调整正则化,以最大限度提升次日的效果。但是,如果留出数据与次日数据之间的效果显著下降,则可能表示某些特征具有时效性,并且可能会降低模型的性能。
  • “次日”数据和实时数据的效果之间的差异。如果您将模型应用于训练数据中的某个样本,并在应用时使用同一样本,这应该会得到完全相同的结果(请参阅规则 5)。因此,此处的差异可能表示存在工程错误。

机器学习第三阶段:缓慢增长、优化优化和复杂模型

有些迹象表明第二阶段即将结束。首先,每个月的收益会开始减少。您将开始在指标之间做出权衡:在某些实验中,您会看到一些指标上升,而另一些指标下降。这点很有趣。由于实现收益更难,因此机器学习必须变得更加复杂。注意:相较于前面的部分,本部分中的蓝天规则更多。我们看到许多团队在机器学习的第一阶段和第二阶段都度过了愉快的时光。到了第三阶段,团队必须找到自己的道路。

第 38 条规则:如果目标不一致成为问题,不要在新特征上浪费时间。

随着测量数据趋于平稳,您的团队将开始关注当前机器学习系统的目标范围之外的问题。如前所述,如果现有算法目标未涵盖产品目标,您就需要更改目标或产品目标。例如,您可以优化点击次数、+1 次数或下载量,但做出发布方面的决策在一定程度上取决于人工审核者。

第 39 条规则:发布决策代表长期产品目标。

Alice 有一个关于减少预测安装量的逻辑损失的想法。她添加了一项功能。逻辑损失变小了。在进行实时实验时,她发现安装率增加了。但是,在发布审核会议上,有人指出,日活跃用户数减少了 5%。该团队决定不发布该模型。Alice 很失望,但现在她意识到发布决策取决于多个条件,只有部分条件可以直接使用机器学习进行优化。

事实上,现实世界不是龙与地下城,也没有“生命值”来确定产品的运行状况。该团队必须使用其收集的统计信息来尝试有效地预测系统未来的表现。他们需要关注互动度、1 天活跃用户数 (DAU)、30 日 DAU、收入和广告主的投资回报率。这些指标本身可在 A/B 测试中衡量,但只能代表更长期的目标:满足用户的需求、增加用户、令合作伙伴满意以及提高利润。即便如此,您也可以考虑通过代理指标来开发实用、优质的产品,并在 5 年后推动公司蓬勃发展。

唯一能轻松做出发布决策的情况是,所有指标都变得更好(或者至少没有变差)。如果团队可以在复杂的机器学习算法和简单的启发法之间选择,而简单的启发法在所有这些指标上表现得更好,那么它应该选择启发法。此外,并未对所有可能的指标值进行明确排名。具体来说,请考虑以下两种场景:

实验 日活跃用户数 每日收入
100 万 400 万美元
B 200 万 200 万美元

如果当前系统是 A,则该团队不太可能切换到 B。如果当前系统是 B,该团队不太可能切换到 A。这似乎与理性行为相冲突;但是,对指标变化的预测不一定成功,因此这两种变化都存在很大的风险。每个指标都涵盖了团队所关注的一些风险。

此外,没有任何指标可以涵盖团队最关心的问题,即“五年后我的产品将如何发展”?

另一方面,个人更倾向于选择可以直接优化的目标。大多数机器学习工具都偏向于这样的环境。在此类环境中,工程师会稳定地发布新功能。有一种机器学习方法,即多目标学习,着手解决这个问题。例如,您可以提出约束满足问题,为每个指标设置下限,并优化指标的某些线性组合。然而,即便如此,并非所有指标都可以轻松实现机器学习目标:如果用户点击了文档或安装了应用,那是因为相应内容被展示了。但要弄清楚用户为何访问您的网站要困难得多。如何预测整个网站未来的成功状况属于 AI 完备问题:与计算机视觉或自然语言处理一样难。

第 40 条规则:确保集成学习简单。

接受原始特征并对内容进行直接排名的统一模型是最容易调试和理解的模型。但是,集成学习模型(将其他模型得分结合到一起的“模型”)的效果可能更好。为简单起见,每个模型应该要么是仅接受其他模型的输入的集成学习,要么是接受许多特征的基本模型,但不能同时接受两者。如果您在其他模型的基础上单独训练了模型,则将它们组合起来可能会导致不良行为。

使用简单的模型进行集成学习,该模型仅将“基本”模型的输出作为输入。您还需要对这些集成模型模型强制应用属性。例如,基本模型生成的分数增加不应导致集成学习的分数降低。此外,最好让传入模型在语义上可解释(例如经过校准),以确保底层模型的更改不会混淆集成模型。此外,强制要求:如果底层分类器的预测概率增大,不会使集成学习的预测概率降低

第 41 条规则:效果趋于平稳时,寻找添加性质的新信息来源,而不是优化现有信号。

您添加了一些有关用户的受众特征信息。您添加了一些有关文档中字词的信息。您已经探索了模板,并调整了正则化。但您的应用在发布后的几个季度中,关键指标没有超过 1% 的提升。接下来该怎么做呢?

是时候开始为完全不同的特征(例如,用户在过去一天、一周或一年内访问的文档的历史记录,或来自其他属性的数据)构建基础架构了。您可以使用wikidata实体或公司内部信息(例如 Google 的知识图谱)。利用深度学习。开始调整您对投资回报率的预期,并相应地扩大工作量。与在任何工程项目中一样,您必须权衡添加新特征的好处和增加复杂性的代价。

第 42 条规则:不要期望多样性、个性化或相关性与受欢迎程度的相关程度,如你想象的那样。

一组内容中的多样性可以有多种含义,其中内容来源的多样性是最常见的一种。个性化意味着每个用户可获得各自的结果。相关性意味着特定查询的结果更适合该查询。因此,这三个属性都被定义为不同于普通属性。

但常态往往很难被超越。

请注意,如果您的系统衡量的是点击次数、观看时长、观看次数、+1 次数、转发次数等,那么您在衡量内容的热门程度。团队有时会尝试学习具有多样性的个人模型。为了实现个性化,它们会添加一些可以让系统进行个性化(代表用户兴趣的功能)或多样化的功能(指示此文档是否与返回的其他文档有任何共同特征的功能,例如作者或内容),并发现这些特征的权重低于预期(或有时具有不同的符号)。

这并不意味着多样性、个性化或相关性不重要。 如上一条规则中所述,您可以进行后期处理以增加多样性或相关性。如果您看到长期目标有所提高,则可以声明除了热门程度之外,多样性/相关性也很有价值。然后,您可以继续使用后期处理,或根据多样性或相关性直接修改目标。

第 43 条规则:在不同的产品中,您的好友金额往往是一样的。但您的兴趣可能不尽相同。

Google 的团队使用一个模型来预测一个产品中某种联系的密切程度,然后将该模型用于另一个产品,取得了很大的进展。朋友身份不变。另一方面,我看到有几个团队在解决跨产品差异的个性化功能方面举步维艰。是的,它似乎应该可以运行。目前似乎并非如此。有时有效的方法是使用一个属性的原始数据来预测另一个属性的行为。另外请注意,即使知道用户具有另一个媒体资源的历史记录,也会有所帮助。例如,两个产品上出现了用户活动本身可能表示相关情况。

Google 内部以及外部有许多关于机器学习的文档。

致谢

感谢 David Westbrook、Peter Brandt、Samuel Ieong、Chenyu Zhao、Li Wei、 Michalis Potamias、Evan Rosen、Barry Rosenberg、Christine Robson、James Pine、Tal Shaked、Tushar Chandra、Mustafa Ispir、Jeremiah Harmantisen、Konsters、 Konsters此外,还要感谢 Kristen Lefevre、Suddha Basu 和 Chris Berg 对早期版本提供的帮助。任何错误、遗漏或(喘气!)不受欢迎的意见都由我自己发表。

附录

本文档中多次提及 Google 产品。为了提供更多背景信息,我在下面对最常见的示例进行了简短说明。

YouTube 概述

YouTube 是一项流式视频服务。YouTube“接下来观看”团队和 YouTube 首页团队都使用机器学习模型对视频推荐进行排名。“接下来观看”功能会推荐在当前视频播放完毕后再观看的视频,而首页会向浏览首页的用户推荐视频。

Google Play 概览

Google Play 有许多解决各种问题的模型。Play 搜索、Play 首页个性化推荐和“用户还安装了以下应用”应用都使用机器学习技术。

Google+ 概览

Google+ 在多种情况下使用机器学习技术:对用户正在浏览的帖子“信息流”中的帖子进行排名、对“热门”帖子(目前非常热门的帖子)进行排名、对认识的人进行排名等等。Google+ 已于 2019 年关停了所有个人帐号,并于 2020 年 7 月 6 日用 Google Currents 企业帐号取代了 Google Currents。