您的位置:首页 > 其它

机器学习规则:ML工程的最佳实践[译]

2017-03-13 13:51 281 查看
Martin Zinkevich
本文档旨在帮助具有机器学习基础知识的人员从Google的机器学习中获得最佳实践的好处。 它提供了机器学习的风格,类似于Google C ++ Style Guide和其他实用程序设计的热门指南。 如果你在机器学习中学过一门课,或者在一个机器学习的模型上构建或工作,那么你有阅读本文档的必要背景。

术语

在我们的有效机器学习的讨论中,将重复出现以下术语:

实例:你想做出的预测的事情。例如,实例可能是您要分类为“关于猫”或“不关于猫”的网页。
标签:预测任务的答案是机器学习系统产生的答案,或者训练数据中提供的正确答案。例如,网页的标签可能是“关于猫”。
特征:预测任务中使用的实例的属性。例如,网页可能具有特征“包含词”cat“。
特征列:一组相关特征,例如用户可能居住的所有可能国家/地区的集合。示例可以具有存在于特征列中的一个或多个特征。特征列在VW系统(在Yahoo / Microsoft)或字段中称为“命名空间”。
示例:实例(具有其特征)和标签。
模型:预测任务的统计表示。你训练一个模型的例子,然后使用模型进行预测。
指标:你关心的数字。可能或可能不会直接优化。
目标:您的算法尝试优化的指标。
管道:围绕机器学习算法的基础设施。包括从前端收集数据,将其放入训练数据文件,训练一个或多个模型,以及将模型导出到生产。

概述

要做好产品:

做机器学习就像你是一个伟大的工程师,而不是像伟大的机器学习专家。--- Google

你将面临的大多数问题,事实上,工程问题。 即使有一个伟大的机器学习专家的所有资源,大部分的收益来自伟大的特征,而不是伟大的机器学习算法。 所以,基本的方法是:

    1.确保管道是端对端的

    2.从合理的目标开始

    3.以简单的方式添加常识特征

    4.确保管道保持稳固。

这种方法将赚取很多钱和/或使很多人长时间的幸福。 从这种方法分歧只有当没有更多的简单的技巧,让你更远。 添加复杂性会降低未来版本。

一旦你用完了这些简单的技巧,尖端的机器学习可能确实在你的未来。 请参阅第三阶段机器学习项目一节。

本文件分为四部分:

    1.第一部分应该帮助你理解时间是否适合建立一个机器学习系统。

    2.第二部分是关于部署你的第一个管道。

    3.第三部分是关于启动和迭代,同时向管道添加新特征,如何评估模型和训练服务偏斜。

    4.最后一部分是当你达到高原时该做什么。

    5.之后,有一份相关工作的清单和一份附录,其中包括本文件中常用作例子的系统的背景。

机器学习之前

规则 # 1:不要害怕在没有机器学习的情况下启动产品。

机器学习很酷,但它需要数据。 理论上,您可以从不同的问题获取数据,然后为新产品调整模型,但这可能会低于基本启发式。 如果你认为机器学习会给你一个100%的提升,那么一个启发式方法会让你50%的方式。

例如,如果您在应用市场中对应用进行排名,则可以使用安装率或安装次数。 如果您要检测垃圾邮件,请过滤掉之前已发送垃圾邮件的发布商。 不要害怕使用人工编辑。 如果您需要排名联系人,排名最近使用的最高(或甚至按字母顺序排序)。 如果机器学习不是绝对需要您的产品,不要使用它,直到有数据。

规则 # 2:首先,设计和实现度量。

在正式确定你的机器学习系统将做什么,在你的当前系统中尽可能跟踪。 执行此操作有以下原因:

    1.早些时候更容易获得系统用户的许可。

    2.如果你认为某些事情在将来可能是一个问题,最好是获得历史数据。

    3.如果您在设计系统时考虑到公制仪表,未来的事情会更好。 具体来说,你不想发现自己在日志中填充字符串来衡量你的指标!

    4.你会注意到什么东西改变,什么保持不变。 例如,假设您想直接优化一天活跃用户。 但是,在系统的早期操作过程中,您可能会注意到,用户体验的戏剧性改变不会显着改变此指标。

Google Plus小组会衡量每次阅读,每次阅读的转发次数,每次阅读的加权平均数,评论/阅读次数,每位用户的评论,每位用户的转发次数等展开次数,用于计算服务时间的信息质量。另外,请注意,实验框架很重要,您可以通过实验将用户分为桶和汇总统计信息。 参见规则12。

通过更加自由地收集指标,您可以获得更广泛的系统图像。 注意问题? 添加指标来跟踪它! 兴奋在最后一次发布的一些定量变化? 添加指标来跟踪它!

规则 # 3:选择机器学习复杂的启发式。

一个简单的启发法可以让你的产品出门。 复杂的启发式是不可维护的。 一旦你有了你想要完成的数据和一个基本的想法,继续进行机器学习。 与大多数软件工程任务一样,您将希望不断更新您的方法,无论是启发式还是机器学习模型,您会发现机器学习模型更容易更新和维护(参见规则16)。

ML第一阶段:您的第一条管道

专注于您的第一个管道的系统基础架构。 虽然想想你将要做的所有有想象力的机器学习是很有趣的,但如果你不首先信任你的管道,很难弄清楚发生了什么。

规则#4:保持第一个模型简单,基础设施正确。

第一个模型为您的产品提供了最大的提升,所以它不需要花哨。 但是你会遇到比你期望的更多的基础设施问题。 在任何人都可以使用你的新机器学习系统之前,你必须确定:

    1.如何获得你的学习算法的例子。

    2.关于什么是“好”和“坏”对您的系统意味着什么?

    3.如何将模型集成到应用程序中。 您可以直接应用模型,也可以在离线示例中预先计算模型,并将结果存储在表中。 例如,您可能希望预先分类网页并将结果存储在表中,但您可能要对聊天消息进行实时分类。

选择简单的特征更容易确保:

    1.这些特征正确地达到您的学习算法。

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

    3.这些特征正确地到达服务器中的模型。

一旦你有一个能够可靠地完成这三件事的系统,你就完成了大部分的工作。 您的简单模型为您提供基准指标和基准行为,可用于测试更复杂的模型。 一些团队的目的是“中立”的第一次开展:第一次开展,明确取消优先机器学习收获,以避免分心。

规则#5:独立于机器学习测试基础设施。

确保基础架构是可测试的,并且系统的学习部分被封装,以便您可以测试其周围的一切。 特别:

1.测试将数据输入算法。 检查是否应填充应填充的要素列。 在隐私允许的情况下,手动检查训练算法的输入。 如果可能,检查您的管道中的统计信息,与其他地方相比,如RASTA。

2.测试从训练算法中获得模型。 确保训练环境中的模型与服务环境中的模型具有相同的分数(见规则37)。

机器学习有一个不可预测的因素,所以要确保你有在训练和服务创建示例的代码测试,并且你可以在服务期间加载和使用一个固定的模型。 另外,了解您的数据很重要:请参阅大型复杂数据集分析的实用建议。

规则#6:复制管道时要小心丢弃的数据。

通常,我们通过复制现有管道(即货物编程)创建管道,旧管道丢弃我们需要的新管道的数据。 例如,Google Plus的管道“热门信息”会删除旧帖子(因为它试图对新帖进行排名)。 此管道已复制到Google Plus Stream中使用,旧的帖子仍然有意义,但管道仍在删除旧帖。 另一个常见的模式是只记录用户看到的数据。 因此,如果我们想要模拟为什么用户没有看到特定的帖子,这些数据是无用的,因为所有的否定例子都被删除了。 Play中也发生类似问题。 在Play Apps Home上工作时,创建了一个新管道,其中还包含其他两个着陆页(Play
Games Home和Play Home Home)的示例,但没有任何特征来消除每个示例的来源。

规则#7:将启发式(业务理解)转换为特征,或从外部处理。

通常机器学习试图解决的问题不是全新的。 有一个现有的系统,用于排名,或分类,或任何问题,你试图解决。 这意味着有一堆规则和启发式。 这些相同的启发法可以给你一个直观时调整与机器学习。 你的启发式应该挖掘他们有什么信息,有两个原因。 首先,到机器学习系统的过渡将更平滑。 第二,通常这些规则包含了很多关于你不想丢弃的系统的直观理解。 有四种方法可以使用现有的启发式方法:

    1.使用启发式预处理的预处理。如果特征是令人难以置信的真棒,那么这是一个选项。例如,如果在垃圾邮件过滤器中,发件人已被列入黑名单,请不要尝试重新学习“黑名单”的含义。阻止邮件。这种方法在二进制分类任务中最有意义。

    2.创建特征。直接从启发式创建一个特性是伟大的。例如,如果使用启发式计算查询结果的相关性分数,则可以将分数包括为要素的值。稍后您可能想使用机器学习技术来按值(例如,将值转换为有限组离散值之一,或将其与其他特征组合),但是首先使用启发式产生的原始值。

    3.挖掘启发式的原始输入。如果有一个启发式应用程序组合安装数量,文本中的字符数量和星期几的应用程序,然后考虑拉这些分开,并将这些输入单独进入学习。适用于集合的一些技术适用于这里(参见规则40)。

    4.修改标签。当您感觉启发式捕获标签中当前不包含的信息时,这是一个选项。例如,如果您试图最大限度地增加下载次数,但您还想获得高质量的内容,那么也许解决方案是将标签乘以应用程序收到的平均星数。这里有很多空间,留有余地。请参阅“您的第一个目标”一节。

在ML系统中使用启发式时,请注意增加的复杂性。 在新的机器学习算法中使用旧的启发式算法可以帮助创建一个平滑的过渡,但想想是否有一个更简单的方法来实现相同的效果。

监控

一般来说,实施良好的警报监控,例如使警报可操作并具有仪表板页面。

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

如果你有一天的模型,性能会下降多少? 一个星期? 四分之一? 此信息可以帮助您了解监控的优先级。 如果您的收入损失了10%,如果模型没有一天更新,那么让工程师连续观看它是有意义的。 大多数广告投放系统都有每天处理的新广告,并且必须每天更新。 例如,如果Google Play搜索的ML模型未更新,则可能会对不到一个月的收入产生影响。 Google Plus中的热门信息的某些模型在其模型中没有帖子标识符,因此他们可能不经常导出这些模型。 其他具有帖子标识符的模型更新频率更高。 另请注意,新鲜度可能会随时间而变化,特别是当您从模型中添加或删除要素列时。

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

许多机器学习系统有一个阶段,您可以将模型导出到服务。 如果导出的模型存在问题,则它是面向用户的问题。 如果以前有问题,那么它是一个训练问题,用户不会注意到。

在导出模型之前检查正确性。 具体来说,确保模型的性能在保存数据时是合理的。 或者,如果您对数据有问题,请不要导出模型。 许多团队持续部署模型在出口前检查ROC曲线下面积(或AUC)。有关尚未导出的模型的问题需要电子邮件警报,但面向用户的模型的问题可能需要一个页面。 所以最好等待并确保在影响用户之前。

规则#10:监视潜移故障。

这是机器学习系统比其他类型的系统更多的问题。 假设正在加入的特定表不再更新。 机器学习系统将进行调整,行为将继续相当好,逐渐衰减。 有时表发现是月份过时,和简单的刷新改善性能比任何其他发布季度! 例如,特征的覆盖可能由于实现变化而改变:例如,特征列可以在90%的示例中填充,并突然下降到60%的示例。 玩一次有一个陈旧的6个月,单独刷新表提高了2%的安装率。 如果您跟踪数据的统计信息,以及手动检查有关的数据,您可以减少这些类型的故障。

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

如果系统较大,并且有许多特征列,则知道是谁创建或维护每个特征列。 如果您发现理解特征列的人员已离开,请确保有人知道该信息。 虽然许多特征列都具有描述性名称,但对此特征的来源,来源以及预期的帮助有更详细的描述。

你的第一个目标

您有许多指标或关于您关心的系统的测量,但是您的机器学习算法通常需要一个目标,即您的算法“尝试”优化的数字。 我在这里区分目标和指标:指标是您的系统报告的任何数字,这可能重要,也可能不重要。 另见规则2。

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

你想赚钱,让你的用户快乐,并使世界变得更好的地方。 你关心的指标有很多,你应该测量它们(见规则2)。 然而,在机器学习过程的早期,你会注意到它们都在上升,即使那些你不直接优化。 例如,假设您关心点击次数,网站停留时间和每日活跃用户。 如果您针对点击次数进行优化,则可能会看到花费的时间增加。

因此,保持简单,并且在您仍然可以轻松地增加所有指标时,不要太费力平衡不同的指标。 不要采取这个规则太远:不要混淆你的目标与系统的最终健康(见规则39)。 而且,如果您发现自己增加了直接优化的指标,但决定不启动,则可能需要进行客观的修订。

规则#13:为您的第一个目标选择一个简单的,可观察的和可归因的指标。

通常你不知道真正的目标是什么。 你认为你做了,但你,当你盯着数据和并排分析你的旧系统和新的ML系统,你意识到你想调整它。 此外,不同的团队成员通常不能就真正的目标达成一致。 ML目标应该是容易测量的东西,并且是“真正的”目标的代表。所以训练简单的ML目标,并考虑在顶部有一个“政策层”,允许你添加额外的逻辑(希望很简单的逻辑)做最终排名。

最容易建模的是直接观察并归因于系统的动作的用户行为:

    1.这是排名链接点击吗?

    2.这是排名对象下载吗?

    3.这个排名对象是转发/回复/电子邮件吗?

    4.这是排名对象额定吗?

    5.这个显示的对象是否被标记为垃圾邮件/色情/攻击?

避免首先建模间接效应:

    1.用户是否访问了第二天?

    2.用户访问网站有多长时间?

    3.每日活跃用户是什么?

间接效应是伟大的指标,可用于A / B测试和发射决策。

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

    1.用户是否乐于使用产品?

    2.用户对体验是否满意?

    3.产品是否提高了用户的整体健康?

    4.这将如何影响公司的整体健康?

这些都很重要,但也难以置信。 相反,使用代理:如果用户很高兴,他们将留在网站更长。 如果用户满意,他们将再次访问明天。 在福利和公司健康方面,需要人为判断将任何机器学习的目标与您销售的产品的性质和您的业务计划联系起来,所以我们不会在这里结束。

规则#14:从一个可解释的模型开始,使调试更容易。

线性回归,逻辑回归和泊松回归直接由概率模型激发。 每个预测可解释为概率或期望值。 这使得它们比使用目标(0-1损失,各种铰链损失等)的模型更容易调试,其尝试直接优化分类精度或排序性能。 例如,如果训练的概率偏离了并排预测的概率或通过检查生产系统,这种偏差可能揭示一个问题。

例如,在线性,逻辑或泊松回归中,存在数据的子集,其中平均预测期望等于平均标记(1-力矩校准或刚刚校准)。 如果每个示例的特征为1或0,则校准该特征为1的示例集合。 此外,如果每个示例的特征都为1,则会校准所有示例的集合。

使用简单模型,更容易处理反馈循环(参见规则36)。

通常,我们使用这些概率预测来作出决定:例如。 以降低预期价值(即点击/下载的概率等)。 但是,记住选择使用哪个模型时,决策比模型提供数据的可能性更重要(见规则27)。

规则#15:在策略层中分离垃圾邮件过滤和质量排名。

质量排名是一门艺术,但垃圾邮件过滤是一场战争。 用于确定高质量帖子的信号将对那些使用您的系统的人显而易见,他们会调整他们的帖子以具有这些属性。 因此,您的质量排名应关注以诚信发布的内容排名。 你不应该打折的质量排名学习者排名垃圾邮件。 同样,“粗俗”内容应与质量排名分开处理。 垃圾邮件过滤是一个不同的故事。 你必须期望,你需要生成的特征将不断变化。 通常,会有明显的规则,你放入系统(如果一个帖子有三个以上的垃圾邮件投票,不检索它,等等)。 任何学习的模型将必须每天更新,如果不是更快。
内容创建者的声誉将发挥很大的作用。

在某种程度上,这两个系统的产出将必须被整合。 请注意,在搜索结果中过滤垃圾邮件可能比在电子邮件中过滤垃圾邮件更为积极。 此外,从质量分类器的训练数据中移除垃圾信息是一种标准做法。

ML第二阶段:特征工程

在机器学习系统的生命周期的第一阶段,重要的问题是将训练数据导入学习系统,获得任何关注的度量,并创建服务基础设施。 在您有一个工作的端到端系统,工具的单元和系统测试,阶段II开始。


在第二阶段,有很多尝试的结果。 有许多明显的特征可以被拉入系统。 因此,机器学习的第二阶段涉及牵引尽可能多的特征,并以直观的方式组合它们。 在此阶段,所有指标应该仍然在上升。 将有大量的启动,这是一个伟大的时间,拉大量的工程师,可以加入你需要创建一个真正的机器学习系统的所有数据。

规则#16:计划开展和迭代。

不要指望你正在工作的模型将是你将要推出的最后一个模型,甚至你将停止启动模型。 因此,考虑您在此次发布中添加的复杂性是否会减缓未来的发布速度。 许多团队已经每季度或多年推出了一个模型。 启动新模型有三个基本原因:

    1.你会想出新的特征,

    2.您正在以新的方式调整规则化和组合旧特征,和/或

    3.你正在调整目标。

无论如何,给一个模型有点关注可以是好的:看看数据反馈示例可以帮助找到新的信号以及旧的,破碎的。 所以,当你构建你的模型,想想添加,删除或重组特征是多么容易。 想想创建管道的新副本并验证其正确性是多么容易。 考虑是否可能有两个或三个副本并行运行。 最后,不要担心35的特征16是否会进入此版本的管道。 你会在下个季度得到。

规则#17:从直接观察和反映的特征开始,而不是学习的特征。

这可能是一个有争议的问题,但它避免了很多陷阱。 首先,让我们描述一个学习的特征是什么。 学习的特征是由外部系统(例如无监督的聚类系统)或学习者自身(例如,通过因子模型或深度学习)生成的特征。 这两个都可以是有用的,但他们可以有很多问题,所以他们不应该在第一个模型。

如果使用外部系统创建特征,请记住系统有自己的目标。 外部系统的目标可能只与您当前的目标微弱相关。 如果您抓取外部系统的快照,则可能会过时。 如果从外部系统更新特征,则其含义可能会更改。 如果使用外部系统提供特征,请注意,它们需要非常小心。

因子模型和深层模型的主要问题是它们是非凸的。 因此,不能保证可以近似或发现最优解,并且在每次迭代中发现的局部最小值可以不同。 这种变化使得很难判断改变对系统的影响是有意义的还是随机的。 通过创建没有深层特征的模型,您可以获得良好的基准性能。 在达到这个基准之后,您可以尝试更深奥的方法。

规则#18:探索内容的特征,在不同的上下文中推广。

通常机器学习系统是一个更大的图片的一小部分。 例如,如果您想象一个可能在“热门信息”中使用的信息,则很多人会在“热门信息”中显示之前对信息加+1,重新分享或评论。 如果您向学习者提供这些统计数据,它可以宣传它在优化的上下文中没有数据的新帖子。 YouTube观看“下一个”可以使用YouTube搜索中的手表数量或观看次数(一个视频在另一个视频观看后观看的次数)。 您也可以使用显式用户评分。 最后,如果您有一个用作标签的用户操作,在不同的上下文中查看文档上的操作可能是一个很好的特征。 所有这些特征都允许您将新内容带入上下文中。
注意,这不是关于个性化:找出是否有人喜欢这个上下文中的内容,然后找出谁或多或少喜欢它。

规则#19:当可以使用非常具体的特征。

有了大量的数据,比起几个复杂的特征,学习数百万个简单的特征更简单。 正在检索的文档的标识符和规范化的查询不提供太多的概括,但是在头部查询上将您的排名与您的标签对齐。因此,不要害怕每个特征应用于非常小部分数据的特征组, 但总体覆盖率高于90%。 您可以使用正则化来消除适用于过少示例的特征。

规则#20:组合和修改现有特征,以人类可理解的方式创建新特征。

有多种方式组合和修改特征。 机器学习系统,如TensorFlow允许您通过转换预处理您的数据。 两种最标准的方法是“离散化”和“交叉”。

离散包括获取连续特征和从中创建许多离散特征。 考虑一个连续的特征,如年龄。 您可以创建一个特征,当年龄小于18时为1,当年龄介于18和35之间时,另一个特征为1。 不要过分考虑这些直方图的边界:基本分位数将给你最大的影响。

交叉组合两个或多个特征列。 在TensorFlow的术语中,特征列是一组同质特征(例如{male,female},{US,Canada,Mexico}等)。 交叉是一个新特征列,其中包含{male,female}(美国,加拿大,墨西哥)等特征。 此新特征列将包含特征(男性,加拿大)。 如果你使用TensorFlow,你告诉TensorFlow为你创造这个交叉,这个(男性,加拿大)特征将出现在代表男性加拿大人的例子中。 请注意,需要大量数据来学习具有三个,四个或更多基本特征列的交叉的模型。

产生非常大的特征列的交叉可能过度拟合。 例如,假设您正在进行某种搜索,并且在查询中有一个包含字词的特征列,并且您在文档中有一个包含字词的特征列。 你可以将这些与交叉结合起来,但最终会有很多特征(见规则21)。 当使用文本时有两个选择。 最恶劣的是点积。 最简单形式的点积简单地计算查询和文档之间的共同词的数量。 然后可以离散该特征。 另一种方法是交集:因此,我们将具有当且仅当单词“pony”在文档和查询中时存在的特征,以及当且仅当单词“the”存在时的另一特征文档和查询。

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

有一个令人着迷的统计学习理论结果涉及模型的适当复杂程度,但这个规则基本上是你需要知道的。我曾经进行过一些对话,其中人们怀疑从一千个例子中可以学到什么,或者你需要超过一百万个例子,因为他们被困在某种学习方法中。关键是将您的学习扩展到您的数据的大小:

    1.如果您正在使用搜索排名系统,并且文档和查询中有数百万个不同的单词,并且有1000个标记的示例,则应该使用文档和查询要素(TF-IDF)之间的点积,一半的其他高度人工工程的特点。 1000个例子,一打特点。

    2.如果有百万个示例,则使用正则化和可能的特征选择来交叉文档和查询特征列。这将给你数百万的特征,但正则化你将有更少。一千万个例子,也许十万个特征。

    3.如果您有数十亿或数百亿个示例,则可以使用特征选择和正则化,将特征列与文档和查询令牌交叉。你将有十亿个例子,和1000万个特征。

统计学习理论很少给出严格的界限,但给出了一个起点的很好的指导。最后,使用规则#28来决定要使用的特征。

规则#22:清理您不再使用的特征。

未使用的特征创造技术累赘。 如果您发现您没有使用某项特征,并且将其与其他特征相结合无法使用,请将其从您的基础架构中删除。 您希望保持基础设施的清洁,以便尽可能快地尝试最有希望的特征。 如有必要,有人可以随时添加您的特征。

在考虑要添加或保留的特征时,请牢记覆盖。 该特征涵盖了多少示例? 例如,如果你有一些个性化特征,但只有8%的用户有任何个性化特征,它不会是非常有效。

同时,一些特征可能冲击超过它们的衡量。 例如,如果您有一个只涵盖1%数据的特征,但90%的特征为正的示例,则它将是一个很好的特征。

系统的人为分析

在进入机器学习的第三阶段之前,重要的是关注在任何机器学习类中没有教授的东西:如何查看现有模型并改进它。 这更多的是一门艺术而不是一门科学,但有几个反模式,它有助于避免。

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

这可能是一个团队陷入困境的最简单的方法。 虽然有很多好处(使用你的团队中的原型)和dogfooding(使用公司内的原型),员工应该看看性能是否正确。 虽然不应该使用明显不好的变化,但是任何看起来合理地接近生产的东西都应该进一步测试,通过支付普通人在众包平台上回答问题,或者通过真实用户的实时实验。

有两个原因。 第一个是你太贴近代码。 你可能正在寻找一个特定的方面的帖子,或者你只是太感情涉入(例如确认偏见)。 第二是你的时间太贵了。 考虑9名工程师参加一小时会议的成本,并考虑在众包平台上购买的人工标签数量。

如果您真的想要用户反馈,请使用用户体验方法。 在流程早期创建用户角色(一个描述在Bill Buxton的“设计用户体验”中),然后进行可用性测试(一个描述在Steve Krug的“Do not Make Me Think”中)。 用户角色涉及创建假设用户。 例如,如果您的团队是男性,可能有助于设计一个35岁的女性用户角色(完整的用户特征),看看它产生的结果,而不是10个结果25-40岁的男性。 让实际的人在可用性测试中看到他们对您的网站(本地或远程)的反应也可以让您有一个全新的视角。

规则#24:测量模型之间的差值。

在任何用户查看您的新模型之前,您可以做的最简单,有时最有用的测量之一是计算新结果与生产之间的差异。 例如,如果您有排名问题,请在整个系统的查询示例上运行这两个模型,并查看结果的对称差异的大小(按排名位置加权)。 如果差异非常小,那么你可以告诉没有运行实验,将没有什么变化。 如果差异非常大,那么您要确保更改是好的。 查看对称差异高的查询可以帮助您定性地理解更改是什么样的。 但是,请确保系统稳定。 确保模型与自身比较时具有低(理想地为零)对称差异。

规则 # 25:当选择模型时,实用性能优于预测能力。

您的模型可能会尝试预测点击率。 然而,最后,关键的问题是你用这个预测做什么。 如果你使用它来排序文档,那么最终排名的质量比预测本身更重要。 如果您预测文档是垃圾邮件的概率,然后对被阻止的内容进行截断,那么允许的精确度更重要。 大多数时候,这两件事情应该是一致的:当他们不同意时,它可能会有一个小的收益。 因此,如果有一些改进可以改善日志丢失,但会降低系统的性能,请寻找另一个特征。 当这种情况更频繁地发生时,是时候重新审视你的模型的目标。

规则#26:查找测量错误的模式,并创建新的特征。

假设你看到一个模型被“错误”的训练示例。 在分类任务中,这可能是假阳性或假阴性。 在排名任务中,它可以是一个阳性排名低于阴性的对。 最重要的一点是,这是机器学习系统知道它错了,想要修复如果给机会的例子。 如果给模型一个允许它修复错误的特征,模型将尝试使用它。

另一方面,如果您尝试基于示例创建特征,系统不会将其视为错误,则该特征将被忽略。 例如,假设在Play Apps搜索中,有人搜索“免费游戏”。 假设其中一个顶级结果是一个不太相关的gag应用程序。 所以你为“gag apps”创建一个特征。 但是,如果您最大限度地增加安装次数,并且人们在搜索免费游戏时安装gag应用,那么“gag apps”特征将不会产生您想要的效果。

一旦您有示例错误,请查找您当前的特征集之外的趋势。 例如,如果系统似乎降级较长的帖子,则添加帖子长度。 不要太具体的添加特征。 如果你要添加帖子长度,不要尝试猜测多长的意思,只是添加十几个特征,让模型找出它们做什么(见规则21)。 这是获得你想要的最简单的方法。

规则#27:尝试量化观察到的不期望行为。

你的团队的一些成员将开始对他们不喜欢的系统的属性感到沮丧,这些属性没有被现有的丢失特征捕获。 在这一点上,他们应该做任何事情,把他们的夹子变成固体数字。 例如,如果他们认为在Play搜索中显示的“gag应用”过多,他们可能会有人类识别gag应用。 (在这种情况下,您可以使用人工标记的数据,因为相对较小的查询占了流量的很大一部分。)如果您的问题是可衡量的,那么您可以开始使用它们作为特征,目标或指标。 一般规则是“测量第一,优化第二”。

规则 # 28:请注意,相同的短期行为并不意味着相同的长期行为。

假设您有一个新系统,它查看每个doc_id和exact_query,然后计算每个查询的每个文档的点击概率。 您发现它的行为几乎与您当前系统的并行和A / B测试相同,所以考虑到它的简单性,您启动它。 但是,您注意到没有显示新应用程式。 为什么? 那么,由于您的系统只显示基于其自己的查询历史的文档,因此无法了解应显示新文档。

了解这种系统如何长期工作的唯一方法是让它只训练模型生存时获得的数据。 这是非常困难的。

训练服务偏差

训练服务偏差是训练期间的性能和服务期间的性能之间的差异。 这种偏差可能是由以下原因引起的:

●如何处理训练和服务管道中的数据之间的差异,或

●在训练和服务之间的数据变化,或

●模型和算法之间的反馈循环。

我们观察到Google的生产机器学习系统,训练服务偏差对性能有负面影响。 最好的解决方案是明确监视它,以便系统和数据更改不会引入歪斜不注意。

规则#29:确保训练就像服务的最好方法是保存服务时使用的一组特征,然后将这些特征传递到日志,以便在训练时使用它们。

即使你不能为每个例子做这个,为一小部分,这样你可以验证服务和训练之间的一致性(见规则37)。 在Google进行此测量的团队有时对结果感到惊讶。 YouTube主页在服务时切换到日志记录特征,大大提高了质量并降低了代码复杂性,许多团队正在改变他们的基础设施。

规则#30:重要性权重采样数据,不要随意丢弃!

当你有太多的数据,有一个诱惑,采取文件1-12,并忽略文件13-99。 这是一个错误:在训练中丢弃数据导致过去的几个团队的问题(见规则6)。 虽然可以丢弃从未向用户显示的数据,但是重要性加权对于其余的是最好的。 重要性权重意味着,如果您决定以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:避免使用位置特征的反馈循环。

内容的位置显着地影响用户与它进行交互的可能性。 如果你把一个应用程序放在第一个位置,它会被点击更频繁,你会相信它是更有可能被点击。 处理这一点的一种方式是添加位置特征,即关于页面中的内容的位置的特征。 你训练你的模型的位置特征,它学会权重,例如,特征“1st-position”权重。 因此,对于“1st-position = true”的示例,您的模型对其他因素的权重较小。 然后在服务你不给任何实例的位置特征,或者给他们所有相同的默认特征,因为你是评分候选人,在你决定显示它们的顺序。

注意,重要的是保持任何位置特征与模型的其余部分有一些分离,因为训练和测试之间的这种不对称性。 使模型为位置特征的函数和其余特征的函数的和是理想的。 例如,不要使用任何文档要素来交叉位置要素。

规则#37:测量训练/服务偏差。

在最一般的意义上,有几个事情可能导致偏斜。 此外,您可以将其分为几个部分:

    1.训练数据和保持数据的性能之间的差异。 一般来说,这总是存在,并不总是坏。

    2.保留数据的性能与“下一天”数据之间的差异。 同样,这将永远存在。 您应该调整正则化以最大限度地提高第二天的性能。 然而,在保持和下一天数据之间的性能的大的下降可以指示一些特征是时间敏感的并且可能降低模型性能。

    3.“下一天”数据和实时数据的性能之间的差异。 如果将模型应用于训练数据中的示例和投放时的相同示例,则它应该给出完全相同的结果(参见规则5)。 因此,这里的差异可能表示工程误差。

ML阶段III:缓慢增长,优化改进和复杂模型

将有一些迹象表明第二阶段即将结束。 首先,你的每月收益将开始减少。 你将开始在指标之间权衡:在一些实验中,你会看到一些上升和其他的下降。 这是它有趣的地方。 由于增益更难实现,机器学习必须更复杂。

注意:这部分比以前的部分有更多的高级规则。 我们已经看到许多团队经历了第一阶段和第二阶段机器学习的快乐时光。 一旦达到阶段III,团队必须找到自己的路径。

规则#38:不要浪费时间在不一致目标的新特征上成为问题。

当您的测量达到高峰时,您的团队将开始查看超出您当前机器学习系统目标范围的问题。 如前所述,如果产品目标不在现有算法目标中,您需要更改您的目标或产品目标。 例如,您可以优化点击次数,加号或下载次数,但部分基于人为评估者做出发布决策。

规则 # 39:启动决策是长期产品目标的代理。

Alice有一个想法来减少预测安装的后勤损失。 她添加了一个特征。 后勤损失下降。 当她进行实时实验时,她会看到安装率提高。 然而,当她参加发布评审会议时,有人指出每天活跃用户的数量下降5%。 团队决定不启动模型。 Alice失望,但现在意识到启动决定取决于多个标准,其中只有一些可以使用ML直接优化。

事实是,现实世界不是地牢和龙:没有“生命点”来标识你的产品的健康。 团队必须使用它收集的统计数据,以尝试有效地预测系统在未来有多好。 他们需要关心参与度,1天活跃用户(DAU),30 DAU,收入和广告客户的投资回报率。 在A / B测试中可测量的这些指标本身只是一个更长期目标的代理:满足用户,增加用户,满足合作伙伴和利润,这甚至可以考虑代理有一个有用的,高质量的产品 和一个蓬勃发展的公司五年后。

唯一容易启动的决定是当所有指标都变得更好(或至少不变差)。 如果团队在复杂的机器学习算法和简单的启发式算法之间有选择,如果简单的启发式算法在所有这些指标上都有更好的工作,它应该选择启发式算法。 此外,没有对所有可能的度量值的显式排序。 具体来说,请考虑以下两种情况:

ExperimentDaily Active UsersRevenue/Day
A1 million$4 million
B2 million$2 million
如果当前系统是A,那么团队不太可能切换到B.如果当前系统是B,则团队不太可能切换到A.这似乎与合理行为冲突:然而,改变度量的预测 可能或可能不会泛化,因此,与这两种变化相关的风险很大。 每个指标涵盖了团队所关心的一些风险。

此外,没有一个公制涵盖了团队的最终关注,“我的产品将在五年后”?

另一方面,个人往往倾向于可以直接优化的一个目标。 大多数机器学习工具都喜欢这样的环境。 打破新特征的工程师可以在这样的环境中获得稳定的启动流。 有一种类型的机器学习,多目标学习,开始解决这个问题。 例如,可以制定在每个度量上具有下限的约束满足问题,并且优化度量的一些线性组合。 然而,即使这样,并不是所有的度量都容易被框架化为机器学习目标:如果文档被点击或应用被安装,则是因为内容被显示。 但是很难弄清楚为什么用户访问您的网站。 如何预测网站作为一个整体的未来成功是AI完整的,像计算机视觉或自然语言处理一样困难。

规则 # 40:保持集合简单。

采用原始特征并直接对内容进行排名的统一模型是最容易调试和理解的模型。 然而,一个模型的整体(一个“模型”,结合其他模型的分数)可以更好地工作。 为了保持简单,每个模型应该是一个只接受其他模型输入的集合,或者是一个采用许多特征的基本模型,但不能同时考虑两者。 如果您在其他单独训练的模型之上有模型,则组合它们可能导致不良行为。

使用一个简单的模型,只需要你的“基础”模型的输出作为输入。 您还希望在这些集合模型上强制执行属性。 例如,由基本模型产生的分数的增加不应该降低整体的分数。 此外,最好是输入模型在语义上可解释(例如,校准),以使基础模型的变化不会混淆整体模型。 此外,强制基础分类器的预测概率的增加不会降低系综的预测概率。

规则 # 41:当性能稳定时,寻找定性的新信息源来添加而不是改进现有信号。

您添加了一些有关用户的人口统计信息。 您已在文档中添加了关于单词的一些信息。 您已经通过模板探索,并调整正则化。 在几个季度中,您还没有看到一个发布的关键指标的改善超过1%。 怎么办?

现在是开始构建完全不同特征的基础设施的时候,例如该用户在过去一天,一周或一年访问的文档的历史记录,或来自不同属性的数据。 使用wikidata实体或公司内部的某些内容(例如Google的知识图)。 使用深度学习。 开始调整您对投资回报期望的预期,并相应地扩大您的努力。 在任何工程项目中,您必须权衡添加新特征的好处与增加复杂性的成本。

规则 # 42:不要指望多样性,个性化或相关性与你认为的流行度相关。

在一组内容中的多样性可以意味着许多事情,内容的源的多样性是最常见的之一。 个性化意味着每个用户都有自己的结果。 相关性意味着特定查询的结果比任何其他查询更适合该查询。 因此,这些性质的所有三个被定义为与普通的不同。

问题是普通倾向往往很难敲打。

请注意,如果您的系统正在衡量点击次数,所花费的时间,手表,+1次数,转发次数等,则会衡量内容的受欢迎程度。 团队有时试图学习一个具有多样性的个人模式。 为了个性化,他们添加允许系统个性化(表示用户的兴趣的一些特征)或多样化(指示该文档是否具有与返回的其他文档(例如作者或内容)共同的任何特征的特征)的特征,并且发现那些 特征获得比他们期望的更小的权重(或者有时不同的符号)。

这并不意味着多样性,个性化或相关性不是有价值的。 如前面的规则所指出的,您可以进行后处理以增加多样性或相关性。 如果你看到长期目标增加,那么你可以宣称多样性/相关性是有价值的,除了流行度。 然后,您可以继续使用后处理,或根据多样性或相关性直接修改目标。

规则#43:你的朋友在不同的产品中都是一样的。 你的兴趣往往不是。

Google的团队已经从预测一个产品中的连接的接近程度以及在另一个产品上正常工作的模型获得了很大的牵引力。 你的朋友是他们是谁。 另一方面,我观察了几个团队在产品分类上的个性化特征。 是的,它似乎应该工作。 现在,它似乎不像它。 有时工作是使用来自一个属性的原始数据来预测另一个属性的行为。 此外,请记住,即使知道用户有另一个属性的历史可以帮助。 例如,两个产品上的用户活动的存在本身可以是指示性的。

相关工作

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

●机器学习崩溃课程:应用机器学习的介绍

●机器学习:由Kevin Murphy理解机器学习领域的概率方法

●对大型复杂数据集分析的实用建议:数据科学思考数据集的方法。

●Ian Goodfellow等人用于学习非线性模型的深度学习

●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 Harmsen,Konstantinos Katsiapis,Glen Anderson, Dan Duckworth,Shishir Birmiwal,Gal
Elidan,Su Lin Wu,Jaihui Liu,Fernando Pereira和Hrishikesh Aradhye对本文档的许多更正,建议和有用的示例。 此外,感谢Kristen Lefevre,Suddha Basu和Chris Berg帮助了早期版本。 任何错误,遗漏或(喘息)不受欢迎的意见是我自己的。

附录

本文档中有多种Google产品参考。 为了提供更多的上下文,我给出了下面最常见的例子的简短描述。

YouTube概述

YouTube是一种流式视频服务。 YouTube观看下一页和YouTube首页小组都使用ML模式对视频推荐进行排名。 观看下一页推荐视频在当前播放之后观看,而首页推荐视频给浏览主页的用户。

Google Play概述

Google Play有许多模式可解决各种问题。 播放搜索,播放主页个性化推荐和“用户也安装”应用程序都使用机器学习。

Google Plus概述

Google Plus在各种情况下使用机器学习:在用户看到的帖子的“流”中排名帖子,排名“热门信息”帖子(现在很受欢迎的帖子),对您认识的人排名等。

原文链接:http://martin.zinkevich.org/rules_of_ml/rules_of_ml.pdf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息