机器学习规则:

机器学习工程方面的最佳做法

Martin Zinkevich

本文档旨在帮助对机器学习有基本的了解的人从 Google 的机器学习最佳做法中受益。它介绍了一种机器学习样式,类似于 Google C++ 样式指南和其他实用的实践编程指南。如果您参加了机器学习课程,或者构建了机器学习模型,那么您已经具备阅读本文档所需的背景知识。

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

术语

关于高效机器学习的讨论中,会反复提到以下术语:

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

概览

要打造出色的产品,请执行以下操作:

事实上,您所面临的大部分问题都是工程问题。即使拥有一位出色的机器学习专家的所有资源,也大部分优势都来自于出色的功能,而不是出色的机器学习算法。因此,基本方法是:

  1. 确保流水线以端到端的方式稳定可靠。
  2. 从合理的目标入手。
  3. 轻松添加常识。
  4. 确保流水线始终可靠。

这种方法非常适合长时间使用。只有在没有其他简单的技巧,才能使效果更远时,再采用这种方法。增加复杂性会减缓未来版本的发布。

尝试完所有简单的技巧后,尖端的机器学习可能确实会在未来。请参阅第三阶段的机器学习项目部分。

本文档的安排如下:

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

机器学习之前

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

机器学习很酷,但它需要数据。理论上,您可以从其他问题中获取数据,然后针对新产品调整模型,但这样做可能无法发挥基本的启发法。如果您认为机器学习可以提升 100%,那么使用启发法,可以有 50% 的机会实现这一目标。

例如,如果您要对应用市场中的应用进行排名,则可以使用安装率或安装次数作为启发法。如果您要检测垃圾内容,请滤除之前发送过垃圾内容的发布商。也不要害怕使用人工编辑。如果您需要对联系人进行排名,可以按时间由高到低(或者甚至按字母顺序)对联系人进行排序。如果您的产品并非绝对需要机器学习,请在获得数据之前不要使用机器学习。

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

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

  1. 更容易获得系统用户的许可。
  2. 如果您认为将来可能发生问题,现在最好获取历史数据。
  3. 如果您在设计系统时考虑到指标插桩,那么将来情况会更好。具体而言,您不希望自己在日志中苦苦寻找字符串来检测指标!
  4. 您会注意到哪些方面发生了变化以及哪些方面保持不变。例如,假设您希望直接优化一天的活跃用户数。不过,在早期操纵系统的过程中,您可能会发现用户体验的显著改变并没有使该指标发生明显变化。

Google+ 团队衡量每次帖子的展开次数、每次读取的转发次数、每次读取的加一、评论数/读取次数、每位用户的评论数、每位用户的转发次数等,这些数值可用于计算帖子在发布时的表现。另请注意,实验框架非常重要,在实验框架中,您可以将用户分组到存储分区中,并按实验汇总统计信息。请参阅第 12 条规则

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

第 3 条规则:选择机器学习而非复杂的启发法。

简单的启发法便可让产品触手可及。复杂的启发式算法不可维护。在获得数据以及对尝试达成的基本概念之后,我们开始学习机器学习。与大多数软件工程任务一样,您需要不断更新方法(无论是启发式算法还是机器学习模型),而且您会发现机器学习模型更易于更新和维护(请参阅第 16 条规则)。

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

专注于第一个流水线的系统基础架构。虽然想到要运用的所有富于想象力的机器学习技术会很有趣,但是如果您不先信任自己的流水线,就很难弄清楚会发生什么情况。

第 4 条规则:确保第一个模型保持简单,并正确构建基础架构。

第一种模型可为您的商品提供最大的提升空间,因此不需要花哨。但是,您会遇到很多意料之外的基础架构问题。您必须先确定以下事项,然后才能使用您打造的新式机器学习系统:

  • 如何获取学习算法示例。
  • 第一个问题是关于“良好”和“不佳”对系统的意义。
  • 如何将模型集成到您的应用中。您可以实时应用模型,也可以在离线示例上预计算模型并将结果存储在表中。例如,您可能需要对网页进行预分类并将结果存储在表中,但可能需要实时对聊天消息进行分类。

选择简单的功能可以更轻松地确保:

  • 这些特征会正确应用到您的学习算法。
  • 模型学习合理的权重。
  • 这些特征会正确到达服务器中的模型。

在让系统可靠地完成这三项操作后,您就完成了大部分工作。简单的模型为您提供了基准指标和基准行为,您可以用它们来测试更复杂的模型。有些团队的目标是“中立”首次发布:首次发布时,会明确降低机器学习收益的优先级,以避免分散注意力。

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

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

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

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

第 6 条规则:复制流水线时应谨慎处理丢失的数据。

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

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

通常,机器学习尝试解决的问题并不是全新的。有一个现有的系统用于排名、分类,或任何你想要解决的问题。这意味着存在许多规则和启发法。使用机器学习调整这些启发法后,您可以得到提升。应该挖掘启发法来获取其任何信息,原因有两个。首先,向机器学习系统过渡更加顺畅。其次,通常情况下,这些规则包含关于您不想舍弃的系统的许多直观信息。您可以通过以下四种方式使用现有启发法:

  • 使用启发法进行预处理。如果该功能非常出色,那么这是一个选择。例如,如果垃圾邮件过滤器已将其列入黑名单,请勿尝试重新学习“已列入黑名单”的含义。屏蔽相应消息。这种方法在二元分类任务中最合理。
  • 创建设施。根据启发法直接创建特征是一种很好的做法。例如,如果您使用启发法计算查询结果的相关性分数,则可以将此分数添加为特征的值。之后,您可能需要使用机器学习技术来按摩该值(例如,将该值转换为一组有限的离散值之一,或将其与其他特征结合使用),但首先要使用启发法生成的原始值。
  • 挖掘启发法的原始输入。如果应用启发法结合了安装次数、文本中的字符数和星期几,请考虑将这些部分进行拆分,并将这些输入单独提供给学习过程。部分适用于集成学习的技巧也适用于此(请参阅第 40 条规则)。
  • 修改标签。当您感觉启发法会捕获当前标签中未包含的信息时,可以使用此选项。例如,如果您希望尽可能增加下载量,但同时也希望获得优质内容,或许可以通过将标签乘以应用获得的平均星数来进行判断。此阶段的改进方面有很多。 请参阅“您的第一个目标”

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

监控

一般来说,要采取良好的提醒卫生措施,例如使提醒可操作且具有信息中心页面。

第 8 条规则:了解系统及时更新的要求。

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

第 9 条规则:先检测问题,然后再导出模型。

许多机器学习系统都有一个阶段,供您导出模型以提供服务。如果导出的模型存在问题,则是面向用户的问题。

请在导出模型之前进行健全性检查。具体而言,请确保模型在处理数据方面的性能合理。或者,如果您有数据方面的疑虑,请勿导出模型。许多持续部署模型的团队在导出之前会检查 ROC 曲线下面积(或曲线下面积)。尚未导出的模型存在的问题需要电子邮件提醒,但面向用户的模型可能需要显示页面。因此,最好等一下,在影响用户之前,请务必确定。

第 10 条规则:注意静默失败。

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

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

如果系统很大,并且有很多特征列,请确定每个特征列的创建者或维护者。如果您发现了解某个特征列的用户要离开,请确保有人知道相关信息。虽然许多特征列都有描述性名称,但最好更详细地说明什么是特征、特征的来源以及提供帮助的方式。

您的第一个目标

您会关注很多关于系统的指标或测量结果,但机器学习算法通常需要一个目标,即您的算法“尝试”优化的数值。我在这里将目标和指标区分开来:指标是指您的系统报告的任何数字,可能重要,也可能不重要。另请参阅第 2 条规则

第 12 条规则:不要过分考虑您选择直接优化的目标。

您想赚钱,让用户满意,让世界变得更美好。您关注的指标有很多,因此您应该对所有这些指标进行衡量(请参阅第 2 条规则)。不过,在机器学习的早期阶段,您会注意到它们都会上升,甚至是您未直接优化的那些。例如,假设您关注点击次数和在网站上停留的时间。如果您针对点击次数进行优化,您可能会发现所花费的时间有所增加。

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

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

您通常并不知道真正的目标是什么。您认为自己这样做了,但在查看旧系统和新机器学习系统的数据并对其进行对比时,您发现自己想要调整目标。此外,不同的团队成员通常无法就真正的目标达成共识。机器学习目标应是容易衡量的指标,并且是“真实”目标的代理。 实际上,通常没有“true”目标(请参阅第 39 条规则)。 因此,请对简单的机器学习目标进行训练,并考虑在顶部添加一个“政策层”,以便您添加其他逻辑(最好是非常简单的逻辑)来进行最终排名。

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

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

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

  • 用户第二天访问网站了吗?
  • 用户访问网站的时长是多久?
  • 日活跃用户数是多少?

间接效应是很好的指标,可以在 A/B 测试期间和发布决策期间使用。

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

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

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

第 14 条规则:从可解释的模型着手可更轻松地进行调试。

线性回归、逻辑回归和泊松回归均由概率模型直接驱动。每个预测都可以解读为概率或预期值。因此,与使用直接优化分类准确率或排名性能的目标(零零损失、各种合页损失等)的模型相比,这种模型更易于调试。例如,如果训练中的概率与并排或预测生产系统预测的概率不同,则这种偏差可能会发现问题。

例如,在线性回归、逻辑回归或泊松回归中,数据子集中平均预测的预期等于平均标签(校准时刻,或刚刚校准的时刻)。假设没有正则化且算法已收敛,这通常成立。如果您的特征为每个样本 1 或 0,则系统会校准该特征为 1 的 3 个样本集。此外,如果每个样本的特征均为 1,则系统会校准所有样本集。

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

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

质量排名是一门艺术,但垃圾内容过滤就像一场战争。那些用来决定高质量帖子的信号会让使用您系统的人显而易见,并且他们会调整自己的帖子以具备这些属性。因此,您的质量得分应以诚信发布内容为主。您不应该因为质量排名学习器对垃圾内容进行高排名而给予折扣。同样,“少儿不宜”的内容也应独立于质量排名进行处理。垃圾内容过滤则截然不同。您需要生成的特征会不断变化。通常情况下,您会在系统中添加一些明显的规则(如果一个帖子有超过 3 个垃圾内容投票,请勿检索该帖子等等)。所有学到的模型都必须每天更新,如果不能更快。内容创作者的声誉会发挥很大作用。

在某种程度上,这两个系统的输出必须集成。请注意,与过滤电子邮件中的垃圾邮件相比,过滤搜索结果中的垃圾邮件可能应该更加严格。假设您没有正则化且算法已收敛,就会出现这种情况。通常大致是这样。此外,从质量分类器的训练数据中移除垃圾内容是一种标准做法。

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

在机器学习系统生命周期的第一阶段,重要的问题包括将训练数据传入学习系统、对任何感兴趣的指标进行插桩,以及创建应用基础架构。在设置了可正常工作的端到端系统(包含单元测试和系统测试)后,第二阶段就开始了。

在第二阶段,有许多容易实现的目标。有许多明显的特征可以拉取到系统中。因此,机器学习的第二阶段涉及提取尽可能多的特征,并以直观的方式将它们组合起来。在此阶段,所有指标都应持续上升。这期间将有大量项目推出,这是一个绝佳的时机,可以吸引众多工程师汇聚,共同打造真正出色的学习系统所需的所有数据。

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

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

  • 即将推出新功能。
  • 您要调整正则化并以新方式组合旧特征。
  • 您正在调整目标。

无论如何,给模型一点爱可是有益的:查看馈送到示例中的数据有助于找到新信号和旧信号。因此,在构建模型时,请考虑添加、移除或重组特征的难易程度。设想创建流水线的新副本并验证其正确性有多么容易。请考虑是否可以同时运行两个或三个副本。最后,不必担心 35 个特性中的 16 个特性是否进入此版本的流水线。下一季度将会推出。

第 17 条规则:从直接观察和报告的特征开始,而不是从学到的特征开始。

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

如果您使用外部系统创建功能,请注意,外部系统有自己的目标。外部系统的目标只能与您的当前目标建立微弱的关联。如果您获取外部系统快照,则该快照可能会过时。如果您从外部系统更新这些特征,则含义可能会发生变化。如果您使用外部系统提供功能,请注意此方法需要格外小心。

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

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

通常情况下,机器学习系统从宏观角度来说只占很小一部分。举例来说,假设您有一篇热门信息可能已经用在了“热门信息”中,那么许多人会首先对信息进行 +1、转发或评论,然后才会出现在“热门”信息中。如果您向学员提供这些统计信息,模型可以在优化的上下文中推广它没有数据的新帖子。YouTube 的“接下来观看”可以使用 YouTube 搜索中的观看次数或连看次数(在观看一个视频后观看另一个视频的次数)。您还可以使用显式用户评分。最后,如果您将某个用户操作用作标签,则在其他上下文中查看文档上的操作可能会是一个很棒的功能。所有这些功能都能让您将新内容带入到情境中。请注意,这与个性化无关:先确定是否有人喜欢此上下文中的内容,然后再弄清楚喜欢或不喜欢这些内容的用户。

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

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

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

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

离散化包括接受连续特征并从其创建许多离散特征。考虑使用连续特征,例如年龄。您可以创建一个年龄小于 18 时为 1 的特征,如果年龄介于 18 到 35 岁之间时创建另一个值为 1 的特征,等等。不要过多考虑这些直方图的边界:基本分位数会为您提供最多的影响。

组合会将两个或更多特征列组合在一起。用 TensorFlow 的术语表示的特征列是一组同类特征(例如,{male, female}、{US, Canada, Mexico} 等)。交叉是指包含特征的新特征列,例如 {male, female} × {US,Canada, Mexico}。这个新的特征列将包含特征(男性、加拿大)。如果您使用 TensorFlow 并且告知 TensorFlow 为您创建此组合,此(男性、加拿大)功能将会出现在表示男性的加拿大人的示例中。请注意,使用三、四个或更多基本特征列的组合来学习模型需要大量数据。

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

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

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

关于模型的适当复杂程度,有一些很棒的统计理论结果,但基本上您只需要知道此规则。我的对话中有些人不确定,能否从 1000 个示例中学习任何东西,或者您是否需要超过 100 万个示例,因为它们陷入了某种学习方法。关键在于根据数据大小调整学习规模:

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

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

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

未使用的功能会导致技术债务。如果您发现自己并未使用某项功能,并且将其与其他功能结合使用不起作用,请将其从您的基础架构中移除。您需要保持基础架构干净,以便能够尽快试用最具潜力的功能。如有必要,他人可以随时添加您的功能。

在考虑添加或保留哪些功能时,请注意覆盖范围。该功能涵盖多少个示例?例如,如果您有一些个性化功能,但只有 8% 的用户拥有个性化功能,那么这样做就不会十分有效。

同时,有些特征可能会超出其权重。例如,如果您的某个特征仅覆盖 1% 的数据,但包含该特征的样本中有 90% 都是正例,那么这个特征就会非常实用。

对系统的人工分析

在进入机器学习的第三阶段之前,请务必重点学习在任何机器学习课程中都学不到的内容:如何查看现有模型并进行改进。这更像是一门艺术,而不是一门科学,但有许多反模式有助于避免。

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

这或许是让团队陷入困境的最简单方法。虽然 Fishfood(在团队内部使用原型)和 Dogfood(在公司内部使用原型)有诸多好处,但员工应考虑性能是否正确。虽然不应使用明显很糟糕的更改,但应进一步测试看起来接近生产环境的任何内容,具体方法是通过在外包平台上回答非专业人员的问题或对真实用户进行实时实验。

原因有两个。第一个原因是您离代码太近了。您可能想要寻找帖子的某个特定方面,或者仅涉及情感上(例如确认偏差)。其次,您的时间非常宝贵。考虑一下九名工程师坐在一个小时的会议上的费用,想一想在众包平台上购买的合同工标签有多少个。

如果您确实想获得用户反馈,请使用用户体验方法。尽早创建用户角色(请参阅 Bill Buxton 的 Sketching User Experiences 一文)并执行易用性测试(相关说明见 Steve Krug 的 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 年后,您也可以考虑使用此指标来打造实用的优质产品和蓬勃发展的公司。

唯一的简单发布决策是所有指标都得到改善(或至少不会变差)。如果团队能够在复杂的机器学习算法和简单的启发式算法之间进行选择,那么如果简单的启发法在这些指标上表现得更好,则应选择启发法。此外,没有明确列出所有可能的指标值。具体而言,请考虑以下两种情形:

实验 日活跃用户数 收入/天
A 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 Iliskandn Harmsin、Hhirninn、Hhirninn、Hhirninn、Hirsinn 另外,还要感谢 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 企业帐号。