你好,游客 登录
背景:
阅读新闻

谷歌机器学习白皮书43条黄金法则3

[日期:2017-07-29] 来源:36大数据  作者: [字体: ]

 

编者按:此白皮书为谷歌总结的机器学习(ML)最优实践方法,浓缩了其多年技术积累与经验,尤其是 YouTube、Google Play 和 Google+ 等平台背后的 ML 算法开发、维护经历。谷歌于白皮书中总结了四十三条 ML 黄金法则,旨在帮助已经掌握了基础知识的开发者少走弯路。本文上接”谷歌机器学习白皮书全解析 43条黄金法则(二)“

3.3 训练服务的偏差(Training­-Serving Skew)

这里训练服务偏差是指系统在训练时的性能表现和服务中的性能表现出现差别。造成这种差别的原因可能有如下三个方面:

  1. 在训练和服务中的数据处理流水线不同;

  2. 在训练和服务中使用了不同的数据;

  3. 模型和算法间的反馈回路引起。

我们注意到谷歌的机器学习系统也存在训练服务偏差,而且会对性能产生负面影响。这里需要说明的是:最好的解决办法就是明确地监视它,使系统和数据的改变不至于引发潜在的偏差。

29. 确保训练和服务一样好的最直接办法是:保存服务时使用的特征,然后将这些特征导入日志,以便在训练中使用

即使你不能对每个样例都这样做,做一小部分也比什么也不做好,这样你就可以验证服务和训练之间的一致性(见规则37)。在谷歌采取了这项措施的团队有时候会对其效果感到惊讶。比如YouTube主页在服务时会切换到日志记录特征,这不仅大大提高了服务质量,而且减少了代码复杂度。目前有许多团队都已经在其基础设施上采用了这种策略。

30. 重视采样数据

当数据太多时,有些团队可能会选择丢弃一部分以减轻负担。这是一个明显的错误:历史经验证明在训练过程中丢弃数据将引发一系列问题(详见规则6)。当然,有时候的确可以丢弃数据,比如那些从未向用户显示过的,但重要性加权却是更好的选择。重要性加权意味着,如果你决定以30%的概率对样例X进行抽样,则权重应该是3/10。值得一提的是,使用重要性加权并不影响规则14中讨论的校准属性。

31. 注意表格中的数据可能改变

假设你通过包含文件特征的表格(表格中还可能包含评论或点击的次数)加入文件的ID信息,那么需要注意表格中的特征可能会在训练和服务的不同时间点发生一些变化,造成模型对同一文档的预测也跟着改变。避免此类问题的最简单方法是在服务时记录特征(请参阅规则32)。如果表格的变化足够缓慢的话,你可以每天或每小时都记录一次表格以获得非常接近的数据,但需要注意的是,这并不能完全解决问题。

32. 尽量在训练和服务流水线中复用代码

首先需要明确的一点是:批处理与在线处理不同。在线处理中,你必须在每个请求到达时及时处理(例如必须为每个查询单独查找);而在批处理中,你可以组合任务(例如建立联结)。类似的,可以将服务视为在线处理过程,而训练视为批处理过程,而其中有许多代码是可以复用的。比如说,你可以创建特定于系统的对象,其中的所有联结和查询结果都以人类可读的方式存储,错误也可以被简单地测试。然后,一旦在服务或训练期间收集了所有信息,你就可以通过一种通用方法在这个特定对象和机器学习系统需要的格式之间形成互通,训练和服务的偏差也得以消除。另外,由此推知:最好不要在训练和服务期间使用不同的编程语言(因为不同的语言间几乎无法复用)。

33. 训练和测试的数据不能相同

一般来说,最好用不同的数据对模型进行训练和测试,例如你用1月5日之前的数据训练了一个模型,那么最好用1月6日之后的数据对模型展开测试。可能模型对新数据的性能表现不如训练数据,但也不会太糟。由于可能会产生每日效应(daily effects),因此你可能无法预测平均点击率或转化率,但曲线下方的面积(表示正面样例的分数高于反面样例的可能性)应该是接近的。

34. 在二进制分类过滤的应用场景中(例如垃圾邮件检测),不要为了纯净的数据做太大的性能牺牲

一般在过滤应用场景中,反面样例并不会对用户展示。不过假如你的过滤器在服务过程中阻止了75%的反面样例,那么你可能需要从向用户显示的实例中提取额外的训练数据并展开训练。比如说,用户将系统认可的邮件标记为垃圾邮件,那么你可能就需要从中学习。

但这种方法同时也引入了采样偏差。如果改为在服务期间将所有流量的1%标记为“暂停”,并将所有这样的样例发送给用户,那你就能收集更纯净的数据。现在你的过滤器阻止了至少74%的反面样例,这些样例可以成为训练数据。

需要注意的是,如果你的过滤器阻止了95%或更多的反面样例,那这种方法可能就不太适用。不过即使如此,如果你想衡量服务的性能,可以选择做出更细致的采样(例如0.1%或0.001%),一万个例子足以准确地估计性能。

35. 注意排序问题的固有偏差

当你彻底改变排序算法时,一方面会引起完全不同的排序结果,另一方面也可能在很大程度上改变算法未来可能要处理的数据。这会引入一些固有偏差,因此你必须事先充分认识到这一点。以下这些方法可以有效帮你优化训练数据。

1) 对涵盖更多查询的特征进行更高的正则化,而不是那些只覆盖单一查询的特征。这样,模型将偏好于那些基于一个或几个特定查询的特征,而不是所有的特征。这种方式可以有效防止那些最常见的查询结果泄漏到不相关的查询中。需要注意的是,这与一条更传统的建议相左:更多地正则化一些具有单一值的特征栏。

2) 只允许特征具有正向权重,这样一来就能保证任何好特征都会比未知特征合适。

3) 不要选择那些只处理文档数据的特征。例如,不管搜索请求是什么,即使一个给定的应用程序是当前的热门下载,你也不会想在所有地方都显示它。没有文档特征的话,这一点会很容易做到。

36. 避免具有位置特征的反馈回路

内容的位置会显著影响用户与它交互的可能性。很明显,如果你把一个App置顶,那它一定会更频繁地被点击。处理这类问题的一个有效方法是加入位置特征,即关于页面中的内容的位置特征。假如你用正向特征来训练模型,那模型就会更偏向“1st-position”这类的特征。因而模型对其他因素的权重就会相应地减小,例如对“1st-position = true”这种样例。在服务的时候,你可以选择不提供任何位置特征的实例,或者为所有位置特征设置相同的初始值,因为在决定以怎样的顺序显示它们之前,你具有决策权。

需要注意的是,因为训练和测试的不对称性,所以最好在一些位置特征和模型之间保持一定的分离性,这一点很重要。让模型成为位置特征函数和其他特征函数的和,是理想的状态。比如说,最好不要交叉任何文档特征和位置特征。

37. 测量训练/服务偏差

许多情况都会引起偏差,但它们大多可以分为如下三类:

  1. 训练数据和测试数据的性能之间的差异。一般来说,这总是存在的,但并不会太严重。

  2. 测试数据的性能与“第二天数据”(next-day data)之间的差异。同样,这也会一直存在。你可以不同程度地正则化以最大限度地提高第二天的性能(next-day performance)。然而,如果在测试数据和第二天数据之间存在很大的性能下降,这有可能意味着某些特征是时间敏感的,而且整个模型的性能也会跟着下降。

  3. “第二天数据”和实时数据的性能之间的差异。如果你将模型应用于训练数据的样例,也应用于相同的服务样例,则它们应该给出完全相同的结果(详见规则5)。因此,这里的差异可能是指工程误差。

收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻      
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款