机器学习工程最佳实践
Martin Zinkevich
本文档旨在帮助已掌握机器学习基础知识的人员从 Google 的机器学习最佳做法中受益。它提供了一种机器学习样式,类似于 Google C++ 样式指南和其他热门实用编程指南。如果您参加了机器学习课程,或者构建或构建了机器学习模型,则具有阅读本文档所需的背景。
术语
关于有效机器学习的讨论中会反复提到以下术语:
- 实例:要对其进行预测的内容。例如,实例可能是您要归类为“关于猫”或“不是关于猫”的网页。
- 标签:预测任务的答案,它可以是由机器学习系统生成的答案,也可以是训练数据中提供的正确答案。例如,网页的标签可能是“关于猫”。
- 特征:预测任务中使用的实例的属性。例如,某个网页可能具有“包含字词‘猫’”这一特征。
- 特征列:一组相关特征,例如用户可能居住的所有国家/地区的集合。样本的特征列中可能包含一个或多个特征。“特征列”是 Google 专用的术语。特征列在 Yahoo/Microsoft 使用的 VW 系统中称为“命名空间”,也称为字段。
- 示例:一个实例(及其特征)和一个标签。
- 模型:预测任务的统计表示法。您使用样本训练模型,然后使用该模型进行预测。
- 指标:您关心的一个数值。不一定会直接优化。
- 目标:算法尝试优化的指标。
- 流水线:围绕机器学习算法的基础架构。包括从前端收集数据、将数据放入训练数据文件、训练一个或多个模型,以及将模型导出到生产环境。
- 点击率:点击广告中的链接的网页访问者所占的百分比。
概览
要打造优质产品,请执行以下操作:
就像您一样,是出色的工程师,而不是您不那么擅长的机器学习专家。
实际上,您将面临的大部分问题都是工程问题。即使拥有一位出色的机器学习专家的所有资源,大部分收益也还是来自于出色的特征,而不是出色的机器学习算法。因此,基本方法是:
- 确保管道从头到尾都稳固可靠。
- 从制定合理的目标开始。
- 轻松添加常识功能。
- 确保流水线始终稳健可靠。
这种方法非常适合长时间使用。只有没有什么简单的技巧可以超越时,才可偏离此方法。增加复杂性会减慢未来版本的发布速度。
一旦用完了简单的技巧,尖端的机器学习技术可能就在您的未来。请参阅第三阶段的“机器学习项目”部分。
本文档安排如下:
- 第一部分可帮助您了解构建机器学习系统的时机是否已经成熟。
- 第二部分介绍了如何部署第一个流水线。
- 第三部分介绍了在向流水线添加新特征时如何进行发布和迭代、如何评估模型,以及如何应对训练-应用偏差。
- 最后一部分介绍了当您达到稳定阶段时该怎么做。
- 之后是相关工作列表和附录,附录针对多次作为示例在本文档中提及的系统,提供了一些背景信息。
机器学习之前
第 1 条规则:不要害怕发布未采用机器学习技术的产品。
机器学习很酷,但需要数据。从理论上讲,您可以从其他问题中获取数据,然后针对新产品调整模型,但这可能会导致基本启发法的效果不理想。如果您认为机器学习技术能够帮助您提升 100%,那么通过启发法,您可以获得 50% 的提升。
例如,如果您要对应用市场中的应用进行排名,则可以将安装率或安装次数作为启发法。如果您要检测垃圾邮件,请滤除之前发送过垃圾邮件的发布商。也不要害怕使用人工编辑。如果您需要对联系人进行排名,可以按时间由近到远(甚至按字母顺序)排序。如果您的产品并非绝对需要使用机器学习技术,请在获得数据后再使用。
第 2 条规则:首先设计并实现指标。
在正式确定机器学习功能的用途之前,应尽可能多地在当前系统中进行跟踪。原因如下:
- 更容易从系统的用户那里获得权限。
- 如果您认为将来可能需要考虑某个方面,最好立即获取历史数据。
- 如果您在设计系统时考虑到指标插桩,将来会更加好。具体而言,您不希望自己也在寻找日志中的字符串来检测指标!
- 您会发现哪些地方发生了变化,哪些保持不变。例如,假设您想要直接优化一天的活跃用户数。不过,在早期操纵系统的过程中,您可能会发现用户体验的显著变化并没有明显改变这一指标。
Google+ 团队会衡量每次阅读的展开次数、每次朗读的转发次数、每次阅读的加一、评论数/阅读次数、每位用户的评论数、每位用户的转发次数等,用于计算帖子在推送期间的好感度。另外请注意,实验框架非常重要,在这种框架中,您可以将用户分组到实验中并按实验汇总统计信息。请参阅第 12 条规则。
通过更自由地收集指标,您可以更全面地了解您的系统。发现了问题?添加指标以对其进行跟踪!对上个版本中发生的一些变化感到兴奋吗?添加指标以对其进行跟踪!
第 3 条规则:选择机器学习而非复杂的启发法。
简单的启发式算法可让产品顺利上市。复杂的启发式算法无法维护。在获得数据并基本了解您要尝试实现的目标后,接下来我们开始进行机器学习。与大多数软件工程任务一样,您需要不断更新方法(无论是启发式算法还是机器学习模型),而且您会发现机器学习模型更易于更新和维护(请参阅第 16 条规则)。
机器学习第一阶段:您的第一个流水线
专注于第一个流水线的系统基础架构。虽然想想您即将实现的所有富于想象力的机器学习充满乐趣,但如果您不先相信流水线,就很难弄清楚会发生什么情况。
第 4 条规则:让第一个模型保持简单,并采用合适的基础架构。
第一个模型可为您的商品提供最大的提升空间,因此不需要花哨。但您将遇到很多超出预期的基础架构问题。您需要先确定以下信息,然后任何人都可以使用您新推出的全新机器学习系统:
- 如何获取学习算法的示例。
- 第一部分是“良好”和“糟糕”对你的系统有什么影响。
- 如何将模型集成到应用中。您可以实时应用模型,也可以在离线示例上预计算模型并将结果存储在表中。例如,您可能希望对网页进行预分类并将结果存储在表中,但可能需要对聊天消息进行实时分类。
选择简单的功能可以更轻松地确保:
- 这些特征会正确连接到您的学习算法。
- 模型学习了合理的权重。
- 这些特征在服务器中正确到达您的模型。
有了能够可靠地执行这三项工作的系统后,您就完成了大部分工作。简单的模型为您提供了基准指标和基准行为,可用于测试更复杂的模型。有些团队的目标是“中立”首次发布:首次发布会明确降低机器学习带来的收益,以避免分散注意力。
第 5 条规则:独立于机器学习测试基础架构。
请确保基础架构可测试,并且对系统的学习部分进行封装,以便测试其周围的所有内容。具体而言:
- 测试数据的获取算法。检查应填充的特征列是否已填充。在隐私权许可的情况下,手动检查训练算法的输入。如果可能,请查看流水线中的统计信息,并与在其他地方处理的相同数据的统计信息进行比较。
- 测试从训练算法中获取模型的效果。确保训练环境中的模型与应用环境中的模型给出的分数相同(请参阅第 37 条规则)。
机器学习具有不可预测的元素,因此请确保针对在训练和供应过程中创建示例的代码进行了测试,并确保您可以在投放期间加载和使用固定模型。此外,了解您的数据也很重要:请参阅分析大型复杂数据集的实用建议。
第 6 条规则:复制流水线时应谨慎处理丢弃的数据。
通常,我们会通过复制现有流水线(即货物崇拜编程)来创建流水线,而旧流水线会舍弃新流水线所需的数据。例如,Google+ 热门信息的流水线会丢弃时间较早的帖子(因为它正尝试对最新的帖子进行排名)。此流水线已复制用于 Google+ 信息流,在信息流中,时间较早的帖子仍然有意义,但旧管道仍会丢弃它们。另一种常见模式是仅记录用户看到的数据。因此,如果我们想要对用户看不到特定博文的原因进行建模,那么这些数据就毫无用处,因为所有反例都已被删除。Play 中也发生了类似的问题。使用 Play 应用首页时,创建了一个新流水线,其中还包含来自 Play 游戏着陆页的示例,而没有任何功能可明确说明各个示例的来源。
第 7 条规则:将启发法转变为特征或在外部处理它们。
通常情况下,机器学习尝试解决的问题并不是全新的问题。有一个现有的系统,它可以用来进行排名、分类,也可以解决你想要解决的任何问题。这意味着需要遵循许多规则和启发法。在利用机器学习技术进行调整时,这些启发法可为您提供一种提升效果。您应该挖掘自己的启发法以获取任何信息,这有两个原因。首先,向机器学习系统过渡更加顺畅。其次,通常情况下,这些规则反映出很多关于你不想舍弃的直觉。您可以通过以下四种方法使用现有启发法:
- 使用启发法进行预处理。如果该功能非常好,则可以选择执行此操作。例如,在垃圾邮件过滤器中,如果发件人已被列入黑名单,则不要试图重新学习“已列入黑名单”的含义。屏蔽该消息。这种方法在二元分类任务中最为合理。
- 创建设施。直接基于启发法创建特征是一种很好的做法。例如,如果您使用启发法计算查询结果的相关性分数,则可以将此分数添加为特征的值。之后,您可能需要使用机器学习技术来调整值(例如,将值转换为一个有限离散值集中的一个,或与其他特征相结合),但首先请使用启发法生成的原始值。
- 挖掘启发法的原始输入。如果某个应用启发法结合了安装次数、文本中的字符数和星期几,请考虑将这些内容拆分开来,并单独将其输入到学习中。部分适用于集成学习的技巧也适用于此(请参阅第 40 条规则)。
- 修改标签。当您感觉启发法会捕获当前标签中未包含的信息时,可以使用此选项。例如,如果您尝试最大限度增加下载次数,但同时又希望获得优质内容,则解决方案可能是将标签乘以应用获得的平均星数。这里有很多学习机会。请参阅您的第一个目标。
在机器学习系统中使用启发法时,务必要注意增加复杂性。在新的机器学习算法中使用旧启发法有助于实现顺畅的过渡,但思考下是否有更简单的方法来实现相同的效果。
监控
一般而言,请练习保持良好的提醒健全度,例如使提醒具有实用价值以及创建信息中心页面。
第 8 条规则:了解系统的最新要求。
如果您的模型是一天前创建的,性能会下降多少?一周时间?四分之一?此信息可帮助您了解监控的优先级。如果某一天的模型没有更新,导致产品质量下降,建议让工程师持续观看。大多数广告投放系统都有每天处理的新广告,并且必须每天更新。例如,如果不更新 Google Play 搜索的机器学习模型,则不到一个月便会产生负面影响。Google+ 热门信息的某些模型中没有帖子标识符,因此无需频繁导出这些模型。其他具有帖子标识符的模型的更新频率要高得多。另请注意,新鲜度可能会随时间而变化,尤其是在模型中添加或移除特征列时。
第 9 条规则:先检测问题,然后再导出模型。
许多机器学习系统都有一个阶段,可供您导出模型以提供服务。如果导出的模型存在问题,则是面向用户的问题。
请在导出模型之前进行健全性检查。具体而言,请确保模型在处理数据时的效果合理。或者,如果您对数据存在疑虑,请勿导出模型。许多持续部署模型的团队都会在导出前检查 ROC 曲线下面积。与尚未导出的模型有关的问题需要电子邮件提醒,但面向用户的模型问题可能需要显示页面。因此,最好先等待一段时间,再确定影响用户。
第 10 条规则:注意静默失败。
与其他类型的系统相比,机器学习系统更容易出现这种问题。假设正在联接的特定表不再更新。机器学习系统会进行调整,而行为将持续保持良好状态,逐渐衰减。有时,您会发现已过时几个月的表格,而简单的刷新比该季度的任何其他发布都有助于提高性能!特征的覆盖率可能会因实现变化而发生变化:例如,90% 的样本中可能会填充某个特征列,而突然下降到 60%。Google Play 曾有一个过时 6 个月的表,但只刷新该表就能将安装率提高 2%。如果您跟踪数据的统计信息,并偶尔手动检查数据,则可以减少此类失败情况。
第 11 条规则:提供特征列的所有者和文档。
如果系统很大,并且有很多特征列,请了解每个特征列的创建者或维护者。如果您发现了解某个特征列的人要离职,请确保有人知道相应信息。虽然许多特征列都有描述性名称,但最好详细说明一下特征是什么、它来自哪里,以及它的预期帮助是什么。
您的第一个目标
您会关注很多关于系统的指标或测量结果,但机器学习算法通常需要一个目标,即您的算法“尝试”优化的数值。我在此处区分了目标和指标:指标是系统报告的任意数字,可能重要,也可能不重要。另请参阅第 2 条规则。
第 12 条规则:选择直接优化哪个目标时,不必过度考虑。
您希望赚钱,让用户满意,让世界更加美好。您关注的指标有很多,而且您应该对所有这些指标进行衡量(请参阅第 2 条规则)。但是,在机器学习的早期阶段,您会注意到它们都会不断上升,甚至包括您未直接优化的那些。例如,假设您关注点击次数和在网站上停留的时间。如果您针对点击次数进行优化,则所花的时间可能会增加。
因此,如果您仍能轻松增加所有指标,请保持简单,不要过多考虑如何平衡不同的指标。不过,不要过度使用此规则:不要将您的目标与系统的最终运行状况相混淆(请参阅第 39 条规则)。此外,如果您发现自己增大了直接优化的指标,但决定不发布系统,则可能需要修改某些目标。
第 13 条规则:为您的第一个目标选择一个可观察且可归因的简单指标。
您通常并不知道真正的目标是什么。您以为是,但当您注视旧系统和新机器学习系统的数据和并排分析时,您意识到自己想要调整目标。此外,不同的团队成员通常无法就真正的目标达成一致意见。机器学习目标应是易于测量的内容,并且是“真正”目标的代理。实际上,通常没有“真正的”目标(请参阅第 39 条规则)。因此,请训练简单的机器学习目标,并考虑在顶部添加一个“政策层”,以便添加其他逻辑(最好是非常简单的逻辑)来执行最终排名。
最简单的建模是直接观察到可归因于系统操作的用户行为:
- 用户点击了这个排名链接吗?
- 是否下载了此排名对象?
- 此排名对象是否已转发/回复/通过电子邮件发送?
- 对这个已评分的对象进行了评分吗?
- 此显示的对象是否被标记为垃圾内容/色情内容/攻击性内容?
一开始避免建模间接效果:
- 用户次日访问网站了吗?
- 该用户访问该网站的时长是多少?
- 日活跃用户数是多少?
间接影响可作为出色的指标,可以在 A/B 测试和发布决策期间使用。
最后,不要试图让机器学习系统确定以下信息:
- 用户满意产品吗?
- 用户对体验是否满意?
- 产品能否改善用户的整体健康?
- 这对公司的整体健康状况会有什么影响?
这些都很重要,但也很难衡量。请改用代理:如果用户感到满意,他们会停留在网站上更长时间。如果用户感到满意,他们明天将再次访问。就幸福感和公司运行状况而言,需要进行人为判断,以便将任意机器学习目标与您销售的产品的性质和业务计划关联起来。
第 14 条规则:从可解释的模型着手可简化调试。
线性回归、逻辑回归和泊松回归均由概率模型直接驱动。每个预测都可以解读为概率或预期值。这使得它们比使用直接尝试优化分类准确率或排名性能的目标(零一损失、各种合页损失等)的模型更容易调试。例如,如果训练中的概率与并排预测或通过检查生产系统预测的概率不同,则这种偏差可以揭示问题。
例如,在线性回归、逻辑回归或泊松回归中,存在数据的子集,其中平均预测的预期值等于平均标签(1 - 时刻校准,或仅校准)。假设您没有正则化且您的算法已收敛,以及通常大致成立,那么就会出现这种情况。如果每个样本的特征为 1 或 0,则校准 3 个特征为 1 的样本集。此外,如果您的特征为每个样本 1,则所有样本的集合都是校准的。
借助简单的模型,您可以更轻松地处理反馈环(请参阅第 36 条规则)。通常,我们会使用这些概率预测来做出决策:例如,按预期值(即点击/下载概率等)降低排名排名。但是,请注意,当选择要使用的模型时,您的决定比模型给出数据的可能性更为重要(请参阅第 27 条规则)。
第 15 条规则:在政策层中区分垃圾内容过滤和质量排名。
质量排名是一门艺术,但垃圾内容过滤就像一场战争。您用来标识优质帖子的信号将对于使用您的系统的人员而言变得显而易见,并且他们会调整他们的帖子以获得这些属性。因此,您的质量排名应侧重于对诚实发布的内容进行排名。您不应该因为质量排名学习器对垃圾内容进行排名而给予折扣。同样,“少儿不宜”的内容应与质量排名分开处理。垃圾邮件过滤则另当别论。您需要预期自己需要生成的特征会不断变化。通常,您可以很明显地将规则添加到系统中(如果一个帖子有超过三个垃圾投票,请勿检索该帖子,等等)。所有学到的模型都必须每天更新(如果不能更快)。内容创作者的声誉会发挥很大作用。
在某种程度上,这两个系统的输出必须集成。请注意,与过滤电子邮件中的垃圾邮件相比,在搜索结果中过滤垃圾邮件应该更加严格。假设您没有正则化且算法已收敛,就会出现这种情况。一般来说是正确的。此外,从质量分类器的训练数据中移除垃圾内容是一种标准做法。
机器学习第二阶段:特征工程
在机器学习系统生命周期的第一个阶段,重要的问题是将训练数据传入学习系统、对任何感兴趣的指标进行插桩,以及创建服务基础架构。在您设置了可正常运行的端到端系统并对插桩和系统测试进行插桩后,第二阶段便会开始。
在第二阶段,有许多低难度的果实。系统中可能会包含各种明显的功能。因此,机器学习的第二阶段涉及提取尽可能多的特征,并以直观的方式将它们组合起来。在此阶段,所有指标应该仍然呈上升趋势。如此一来,会有很多启动,现在是时候吸引大量工程师,让他们加入您构建真正出色的学习系统所需的所有数据了。
第 16 条规则:计划发布和迭代。
不要指望您现在正在构建的模型会是您将启动的最后一个模型,甚至不要指望您会停止启动模型。因此,请考虑随着此次发布增加的复杂性是否会减缓未来发布的速度。许多团队多年来每个季度都会发布一个模型。发布新模型有三个基本原因:
- 您需要提供一些新功能。
- 您将调整正则化并以新方式组合旧特征。
- 您正在调整目标。
无论如何,给予模型一点爱是一件好事:查看馈送到示例中的数据有助于找到新信号和旧的信号。因此,在构建模型时,请考虑添加或移除、重组特征的难易程度。考虑创建流水线的新副本并验证其正确性有多容易。考虑一下是否可以并行运行两个或三个副本。最后,不要担心 35 个特性中的第 16 个特性是否进入此版本的流水线。我们会在下个季度发布。
第 17 条规则:从直接观察到的功能(而非用户学到的功能)开始。
这可能是一个有争议的点,但可以避免很多陷阱。首先,我们来介绍什么是学习特征。学习特征是由外部系统(例如非监督式聚类系统)或学习者本身(例如通过因子模型或深度学习)生成的特征。两者都很有用,但它们可能有很多问题,因此不应包含在第一个模型中。
如果您使用外部系统创建特征,请记住,外部系统有自己的目标。外部系统的目标可能只是与您当前的目标无关。如果您获取外部系统快照,则该快照可能会过时。如果您更新外部系统中的特征,含义可能会发生变化。如果您使用外部系统提供功能,请注意,您需要非常谨慎地使用此方法。
因子模型和深度模型的主要问题是,它们是非凸的。因此,无法保证可以得出或找到最优解决方案,并且每次迭代时发现的本地最小值可能不同。这种变化导致难以判断系统更改是有意义的还是随机的影响。通过创建没有深度特征的模型,您可以实现出色的基准效果。达到此基准后,您可以尝试更隐秘的方法。
第 18 条规则:探索可跨情境泛化的内容的特征。
机器学习系统往往只是一个大得多的细节。例如,如果您想象了一个帖子可能会在热门信息中发帖,那么许多人都会先在此帖子的“热门信息”中对其进行 +1、转发或评论。如果您向学习者提供这些统计信息,它就可以在所优化的上下文中推广自己没有数据的新帖子。YouTube 的“接下来观看”可以使用来自 YouTube 搜索的观看次数或连看次数(观看一个视频后观看另一个视频的次数)。您还可以使用显式用户评分。最后,如果您将某个用户操作用作标签,在不同情境下查看该文档的操作可能会是一个很好的功能。所有这些功能都能让您将新的内容带到情境中。请注意,这与个性化无关:先弄清楚是否有人喜欢此情境中的内容,然后再弄清楚喜欢程度。
第 19 条规则:尽可能使用非常具体的特征。
拥有大量数据后,学习数百万个简单特征会比几个复杂特征更简单。所检索文档的标识符和规范化查询不会提供太多泛化功能,但会将您的排名与头部查询中的标签保持一致。因此,不要害怕每个特征都应用到一小部分数据中的特征,但总体覆盖率超过 90%。您可以使用正则化来消除适用于太少样本的特征。
第 20 条规则:组合并修改现有特征,以易于理解的方式创建新特征。
您可以通过多种方式组合和修改地图项。借助 TensorFlow 等机器学习系统,您可以通过转换预处理数据。最标准的两种方法是“离散化”和“交叉”。
离散化包括采用连续特征,并从中创建许多离散特征。考虑年龄等连续特征。您可以创建一个在年龄小于 18 时为 1 的特征,或者在年龄介于 18 到 35 之间时创建另一个特征,以此类推。不要过多考虑这些直方图的边界:基本分位数将为您提供最大的影响力。
组合是指两个或更多特征列的组合。用 TensorFlow 的术语而言,特征列是一组同质特征(例如,{male, female}、{US, Canada, Mexico} 等)。叉型特征是一种新的特征列,例如,特征为 {male, female} × {US,Canada, Mexico}。这个新的特征列将包含特征(男性、加拿大)。如果您使用 TensorFlow 并指示 TensorFlow 为您创建此组合,此(男性、加拿大)功能将存在于代表男性男性的样本中。请注意,学习大量包含三个、四个或更多基本特征列的模型需要大量数据。
产生非常大的特征列的交叉可能会过拟合。例如,假设您正在执行某种搜索,您的某个特征列包含查询中的字词,而特征列包含文档中的字词。您可以用交叉方式将这些特征组合起来,但最终会得到很多特征(请参阅第 21 条规则)。
处理文本时,有两种选择。最严苛的标准是点积。点积形式的最简单形式就是对查询和文档之间的共同单词数进行计数。然后可以离散使用此功能。另一种方法是交集:因此,当且仅当文档和查询中都包含“pony”一词时,才会出现一个特征;当且仅当文档和查询中都包含“the”一词时,才会出现另一个特征。
第 21 条规则:您可以在线性模型中学习的特征权重数量与您拥有的数据量大致成比例。
关于模型的适当复杂程度,存在一些令人惊叹的统计学习理论结果,但基本上您只需要知道此规则。我的对话中,人们不确定能否从 1000 个示例中学到任何东西,或者是否需要超过 100 万个示例,因为它们被卡在某种学习方法中。关键在于将学习规模扩展到数据规模:
- 如果您开发的是搜索排名系统,并且文档和查询中有数百万个不同的字词,并且您有 1000 个已加标签的示例,则您应该在文档和查询特征、TF-IDF 以及半打其他高人文工程特征之间使用点积。1000 个示例,十几个特征。
- 如果您有一百万个样本,请使用正则化和特征选择(可能)使文档特征列和查询特征列相交。这将为您提供数百万个特征,但使用正则化后,特征数量将减少。千万个示例,也许有十万个。
- 如果您有数十亿或数千亿个样本,您可以使用特征选择和正则化,通过文档和查询标记组合特征列。您有十亿个样本,一千万个特征。统计学习理论很少设定严格的限制,但提供了很好的起点指导。
最后,请根据第 28 条规则决定要使用的功能。
第 22 条规则:清理您不再使用的功能。
未使用的特征会造成技术债务。如果您发现自己并未使用某项功能,并且将其与其他功能无法搭配使用,请将其从您的基础架构中移除。您需要让基础架构保持整洁,以便尽可能快地试用最具潜力的功能。如有必要,他人可以随时重新添加您的功能。
在考虑添加或保留哪些功能时,请注意覆盖率。该功能涵盖多少个示例?例如,如果您有一些个性化功能,但只有 8% 的用户拥有个性化功能,那么效果就不会太理想。
同时,有些地图项可能会超出其重量。例如,如果您的某个特征仅覆盖 1% 的数据,但 90% 的特征都是正面的,那么这将是一个很棒的特征。
对系统的人工分析
在进入机器学习的第三阶段之前,请务必关注任何机器学习类别中都未学到的内容:如何查看现有模型并对其进行改进。这更像是一门科学,而不是一门科学,但有助于避免一些反模式。
第 23 条规则:您不是典型的最终用户。
这或许是让团队陷入困境的最简单方法。虽然 fishfood(在团队内使用原型)和 dogfood(在公司内部使用原型)有诸多好处,但员工应该关注性能是否正确。虽然不应使用明显不好的更改,但应该在接近生产环境附近时进一步测试任何内容,方法是向外聘人员回答众包平台上的问题,或通过实时对真实用户进行实验。
这有两个原因。第一,您离代码太近了。您可能在寻找帖子的某个特定方面,或者您只是有太多情绪化(例如确认偏差)。其次,您的时间非常宝贵。考虑一下九位工程师坐在一个时长一小时的会议上的费用,想一想有多少人力标签员工在众包平台上进行购买。
如果您确实想获得用户反馈,请使用用户体验方法。在一个流程的早期阶段创建用户角色(请参阅 Bill Buxton 的 Sketching User Experiences 一书中的描述),然后进行可用性测试(请参阅 Steve Krug 的 Don’t Make Me Think 中的说明)。用户角色涉及创建虚构用户。例如,如果您的团队全是男性,则设计 35 岁的女性用户角色(包含用户特征)可能就比较实用了,最好看看他们生成的结果,而不是 25 到 40 岁的男性产生的结果。通过真实性测试吸引实际用户(包括本地或远程)观看他们对您网站的反应,您还可以获得全新的视角。
第 24 条规则:衡量模型之间的增量。
在用户查看新模型之前,您可以进行的一项最简单也有时最有用的测量,那就是计算新结果与生产环境之间的不同程度。例如,如果您遇到了排名问题,请对整个系统上的查询样本运行这两个模型,并查看结果的对称差分的大小(按排名位置加权)。如果差异很小,您无需运行实验即可得知变化不大。如果此差值较大,那么您需要确保更改是有效的。查看对称差异较大的查询有助于您了解变化的性质。不过,请确保系统稳定。确保模型与自身相比具有较低的对称差值(理想情况下为零)。
第 25 条规则:选择模型时,实用效果优先于预测能力。
您的模型可能会尝试预测点击率。但归根结底,关键在于您要如何进行预测。如果您使用它对文档进行排名,那么最终排名的质量比预测本身更重要。如果您预测某个文档是垃圾内容的概率,然后决定要屏蔽的内容,则允许的内容的准确性更为重要。大多数情况下,这两个方面应该达成一致:当它们不同意时,可能只有很小的收益。因此,如果某项更改可以改善对数损失,但会降低系统的性能,请寻找其他功能。当这种情况开始更频繁时,是时候重新审视模型的目标了。
第 26 条规则:在衡量的错误中寻找规律,并创建新的特征。
假设您看到一个模型“模型不正确”的训练示例。在分类任务中,此错误可能是假正例或假负例。在排名任务中,错误可能是正数的排名低于负值的对。最重要的一点是,机器学习系统会知道自己弄错了,并且希望在有机会的情况下进行修复。如果您为模型提供一个功能,让其能够修正错误,则模型将尝试使用以下功能。
另一方面,如果您尝试根据系统认为不是错误的示例创建特征,系统会忽略该特征。例如,假设用户在 Play 应用搜索中搜索“免费游戏”。假设热门结果之一是相关性较低的搞笑应用。因此,您需要为“搞笑应用”创建功能。但是,如果您在尽可能提高安装量的情况下,用户在搜索免费游戏时安装了搞笑应用,那么“搞笑应用”功能不会产生您想要的效果。
在确定模型出现错误的示例之后,请查看当前特征集之外的趋势。例如,如果系统似乎使较长的博文出现降级,请添加博文长度。不要添加过于具体的特征。如果您要添加帖子长度,请不要试图猜测长度的具体含义,只需添加十几个特征,然后让模型自行处理(请参阅第 21 条规则)。这是获得所需内容的最简单方法。
第 27 条规则:尝试量化观察到的不良行为。
您的团队中有些成员会开始对系统的某些属性感到失望,因为系统无法捕获其现有属性。此时,他们应该竭尽所能将抱怨转换为纯数字。例如,如果他们认为 Play 搜索中显示的“搞笑应用”过多,则可以让人工审核者识别搞笑应用。在这种情况下,您可以合理地使用人工标签数据,因为查询的相对较小比例占据了大部分流量。如果您的问题是可衡量的,则可以开始将其用作功能、目标或指标。一般规则是“先衡量,再优化”。
第 28 条规则:请注意,短期行为相同并不意味着长期行为相同。
假设您有一个新系统,它会查看每个 doc_id 和完全匹配_查询,然后计算每个查询的每个文档的点击概率。您发现,在并排测试和 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 的极端版本。例如,即使某个给定应用是热门下载内容(无论查询是什么),您也不想在所有地方都展示它。如果没有文档专用功能 就能轻松做到这一点您之所以不想在所有地方展示特定的热门应用,是因为让用户可以找到所有所需应用的重要性。例如,如果有人搜索“观鸟应用”,他们可能会下载“愤怒的小鸟”,但那绝对不是他/她想要的应用。展示此类应用可能会提高下载率,但最终却未能满足用户的需求。
第 36 条规则:利用位置特征避免反馈环。
内容的位置会显著影响用户与内容互动的可能性。如果您将应用放在第一位,该应用的点击频率会提高,并且系统会确信该应用更有可能获得点击。处理此问题的一种方式是添加位置特征,即有关内容在页面中位置的特征。您使用位置特征训练模型,它会学习进行权重训练,例如,特征“1stposition”。因此,对于包含“1stposition=true”的示例,您的模型会将权重降低到其他因素的权重。然后,在应用时,您不会为任何实例提供位置功能,或者您为所有实例都提供相同的默认功能,因为在确定显示它们的顺序之前,您都在候选候选项。
请注意,由于训练与测试之间的这种不对称性,请务必让所有位置特征与模型的其余部分保持一定的分离性。让模型获得位置特征函数和其他函数之和的理想情况。例如,不要将位置特征与任何文档特征结合使用。
第 37 条规则:测量训练/应用偏差。
一般来说,有多个因素会导致偏差。 此外,您还可以将其分为以下几个部分:
- 训练数据的性能与留出数据之间的差异。一般来说,这种情况始终存在,而且并非总是坏事。
- 留出数据的性能与“次日”数据之间的差异。同样,这种情况始终存在。您应该调整正则化,以最大限度地提高次日性能。但是,留出数据与次日数据之间的效果大幅下降可能表明某些特征具有时效性,而且可能会降低模型的性能。
- “次日”数据和实时数据的效果之间的差异。如果您将模型应用于训练数据中的某个样本,并在应用时使用同一样本,那么您得到的结果应该完全相同(请参阅第 5 条规则)。因此,出现差异可能表示存在工程错误。
机器学习第三阶段:增长缓慢、优化优化和复杂模型
有一些迹象表明第二阶段即将结束。 首先,您的每月收益会开始减少。您将开始在指标之间做出取舍:您将看到一些实验有所提高,而其他实验则会在一些实验中下降。这正是有趣之处。由于增益很难实现,因此机器学习必须变得更加复杂。注意事项:此部分的蓝天规则数量多于前面几个部分。我们已经看到许多团队在第一阶段和第二阶段机器学习中度过了愉快的时光。进入第三阶段后,团队必须找到自己的道路。
第 38 条规则:如果不一致的目标已成为问题,请勿将时间浪费在新功能上。
随着您的测量结果趋于稳定,您的团队将开始调查当前机器学习系统的目标范围之外的问题。如前所述,如果现有算法目标未涵盖产品目标,您需要更改目标或产品目标。例如,您可以优化点击、+1 或下载,但在一定程度上依据人工审核者制定发布决策。
第 39 条规则:发布决策是长期产品目标的指标。
Alice 有一个关于减少预测安装次数的逻辑损失的想法。她添加了一个特征。逻辑损失下降。在进行实时实验时,她发现安装率提高了。但是,当她参加发布审核会议时,有人指出,日活跃用户数减少了 5%。该团队决定不启动该模型。Alice 很失望,但现在意识到,发布决定取决于多个条件,而其中一些条件可以直接通过机器学习进行优化。
事实上,现实世界并不是地下城与龙:不存在可用于确定商品健康状况的“接触点”。该团队必须使用其收集的统计信息,来尝试有效地预测系统未来的表现。他们需要关注互动度、1 天活跃用户数 (DAU)、30 日活用户数、收入和广告客户的投资回报率。这些指标本身可在 A/B 测试中衡量,并且仅作为更长期目标的指标:满足用户需求、增加用户数量、使合作伙伴满意和提高利润。即便如此,您也可以考虑使用代理,获取有用的高质量产品和从现在起五年内实现蓬勃发展的公司。
唯一简单的发布决策是所有指标都得到改进(至少不会变差)。如果团队能够在复杂的机器学习算法和简单的启发式算法之间做出选择,如果简单的启发式算法能够更好地处理这些指标,则应选择启发式算法。此外,没有针对所有可能的指标值进行明确排名。具体而言,请考虑以下两种场景:
实验 | 日活跃用户数 | 收入/天 |
---|---|---|
答 | 100 万 | 400 万美元 |
B | 200 万 | 200 万美元 |
如果当前系统是 A,团队就不太可能切换到 B。如果当前系统是 B,团队就不太可能切换到 A。这似乎与理智行为冲突;但是,更改指标的预测不一定会成功,因此,做出任何一项更改都有很高的风险。每个指标涵盖该团队所担心的一些风险。
此外,没有一个指标涵盖该团队最终关注的问题:“我的产品在未来五年内会在哪里?”
另一方面,个人倾向于倾向于可以直接优化的目标。大多数机器学习工具都青睐这样的环境。在这样的环境下,工程师们不断淘汰新功能,获得源源不断的发布。有一种机器学习(即多目标学习)可以解决这个问题。例如,您可以制定约束满意度问题,针对每个指标设定下限,并优化指标的某种线性组合。但是,即使如此,也并非所有指标都很容易被理解为机器学习目标:如果用户点击了某个文档或安装了某个应用,这是因为相应内容已显示。但要弄清楚用户为什么访问您的网站呢?如何预测整个网站未来的成功状况属于 AI 完备问题:与计算机视觉或自然语言处理一样难。
第 40 条规则:让集成学习变得简单。
接受原始特征并直接对内容进行排名的统一模型是最容易调试和理解的模型。但是,集成学习模型(将其他模型的分数结合到一起的模型)的效果可能会更好。为简单起见,每个模型要么应该是仅接受其他模型的输入的集成学习模型,要么是接受许多特征的基本模型,但不能同时接受两者。如果您有基于单独训练的模型构建的模型,则组合这些模型可能会导致不良行为。
使用简单的模型进行集成学习,仅将“基本”模型的输出作为输入。您还需要对这些集成模型强制执行属性。例如,基本模型生成的分数的增加不应降低集成学习的分数。此外,最好将传入模型在语义上可解释(例如,经过校准),以免底层模型的更改不会混淆集成模型。此外,强制要求:如果基本分类器的预测概率增大,不会使集成学习模型的预测概率降低。
第 41 条规则:效果达到稳定状态后,应寻找新的定性信息来源,而不是优化现有信号。
您添加了一些有关用户的受众特征信息。您添加了有关文档中字词的一些信息。您已完成模板探索,并调整了正则化。在几个季度中,您的关键指标的发布情况仍未出现超过 1% 的提升。接下来我该如何操作?
是时候开始为截然不同的功能(例如,用户在过去一天、一周或一年内访问的文档的历史记录或来自其他媒体资源的数据)构建基础架构了。使用 wikidata 实体或公司内部信息(例如 Google 的知识图谱)。使用深度学习。开始调整您对投资回报的期望,并相应地扩大您的投资。与在任何工程项目中一样,您必须权衡添加新功能的好处与增加复杂性的代价。
第 42 条规则:不要指望多样性、个性化或相关性与热门程度相关。
一组内容中的多样性可能具有许多含义,其中内容来源的多样性最为常见。个性化意味着每个用户都有自己的结果。“相关性”是指,某个查询的结果比该查询的结果更合适。因此,这三个属性都定义为与平常不同。
但常态往往很难被打败。
请注意,如果您的系统在测量点击次数、观看时长、观看次数、+1 次数、转发次数等数据,那么您测量的是内容的热门程度。团队有时会尝试学习具有多样性的个人模型。为了进行个性化,他们会添加一些功能,以允许系统进行个性化(一些表示用户兴趣的功能)或进行多样化(表明此文档是否具有与其他返回文档相同的特征,例如作者或内容的功能),并发现这些功能的权重(或有时不同于其预期)高。
这并不意味着多样性、个性化或相关性不重要。 如上一条规则中所述,您可以进行后处理以提高多样性或相关性。如果您发现长期目标增加,则可以声明除了热门程度外,多样性/相关性也很有价值。然后,您可以继续使用后处理,也可以根据多样性或相关性直接修改目标。
第 43 条规则:在不同的产品中,您的好友往往是相同的。您的兴趣往往并不是。
Google 的团队通过建立模型来预测某个产品的连接接近程度,并使其在另一个产品上取得良好效果,因而备受青睐。您的好友就是他们。另一方面,我曾观察过几个团队难以跨产品划分使用个性化功能。是的,看起来应该可以。目前似乎并非如此。有时可行的方法是使用来自一个媒体资源的原始数据预测另一个媒体资源的行为。另请注意,即使知道用户已拥有其他媒体资源的历史记录,这也很有帮助。例如,在两个产品上存在用户活动本身就可以表明。
相关工作
Google 内部和外部有许多关于机器学习的文档。
- 机器学习速成课程:应用机器学习简介。
- 机器学习:概率法,凯文·墨菲著,帮助了解机器学习领域。
- 良好的数据分析:一种考虑数据集的数据科学方法。
- 深度学习,伊恩·古德费洛等著,帮助学习非线性模型。
- 关于技术债务的 Google 论文,其中提供了许多一般性建议。
- Tensorflow 文档。
致谢
非常感谢 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 Eldish、Halmins、Shirens {0}Halsien、Ghiremi、Shirensh、Halnith、Hal 剧人、Halnyan 和 Harmsen、此外,还要感谢 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 企业帐号。