当现有的损失函数没有捕获您团队中的部分成员不喜欢的某些系统属性时,他们会开始有挫败感。此时,他们应该竭尽所能将抱怨转换成具体的数字。例如,如果他们认为 Play 搜索中显示的“搞笑应用”过多,则可以通过人工评分识别搞笑应用。(在这种情况下,您可以使用人工标记的数据,因为相对较少的一部分查询占了很大一部分流量。)如果您的问题是可衡量的,那么您可以开始将它们用作特征、目标或指标。一般规则是“先量化,再优化”。
第 28 条规则:请注意,短期行为相同并不意味着长期行为也相同。
假设您的新系统会查看每个 doc_id 和 exact_query,然后计算每个查询的每个文档的点击概率。您发现在并排分析和 A/B 测试中,其行为与您当前系统的行为几乎完全相同,考虑到它的简单性,您发布了它。不过,您发现它没有显示任何新应用。为什么?那是因为您的系统仅根据自己的查询历史记录显示文档,所以不知道应该显示新文档。
了解这种系统长期行为的唯一方法是,仅使用模型在线时获得的数据对其进行训练。这一点非常难。
训练-应用偏差
训练-应用偏差是指训练效果与应用效果之间的差异。出现这种偏差的原因可能是:
训练管道和应用管道中数据的处理方式有差异。
训练时和应用时所用数据有变化。
模型和算法之间有反馈环。
我们注意到 Google 的生产机器学习系统也存在训练-应用偏差,这种偏差对性能产生了负面影响。最好的解决方案是明确进行监控,以避免在系统和数据改变时引入容易被忽视的偏差。
第 29 条规则:确保训练效果和应用效果一样的最佳方法是,保存在应用时使用的特征集,然后将这些特征通过管道传输到日志,以便在训练时使用。
即使您不能对每个样本都这样做,也对一小部分样本这样做,以便验证应用和训练之间的一致性(请参阅第 37 条规则)。采取了这项措施的 Google 团队有时会对结果感到惊讶。YouTube 首页改用这种在应用时记录特征的做法后,不仅大大提高了质量,而且减少了代码复杂度。目前有许多团队都已经在其基础设施上采用了这种方法。
第 30 条规则:按重要性对采样数据加权,不要随意丢弃它们!
数据过多时,总会忍不住采用前面的文件而忽略后面的文件。这是错误的做法。尽管可以丢弃从未向用户展示过的数据,但对于其他数据来说,按重要性加权是最佳选择。按重要性加权意味着,如果您决定以 30% 的概率对样本 X 进行抽样,那么向其赋予 10/3 的权重。按重要性加权时,您仍然可以使用第 14 条规则中讨论的所有校准属性。
第 31 条规则:如果您在训练和应用期间关联表格中的数据,请注意,表格中的数据可能会变化。
假设您将文档 ID 与包含这些文档的特征(例如评论次数或点击次数)的表格相关联。表格中的特征在训练时和应用时可能有所不同。那么,您的模型在训练时和应用时对同一文档的预测就可能会不同。要避免这类问题,最简单的方法是在应用时记录特征(请参阅第 32 条规则)。如果表格只是缓慢发生变化,那么您还可以每小时或每天创建表格快照,以获得非常接近的数据。请注意,这仍不能完全解决问题。
第 32 条规则:尽可能在训练管道和应用管道间重复使用代码。
批处理不同于在线处理。进行在线处理时,您必须在每个请求到达时对其进行处理(例如,您必须为每个查询单独进行查找),而进行批处理时,您可以组合任务(例如进行关联)。应用时,您进行的是在线处理,而训练时,您进行的是批处理。不过,您可以通过一些方法来重复使用代码。例如,您可以专门为自己的系统创建一个对象,其中所有查询结果和关联都能以非常易于人类读取的方式进行存储,且错误也可以轻松进行测试。然后,收集了所有信息后,您可以在应用和训练期间使用一种共同的方法,在人类可读对象(特定于您的系统)和机器学习需要的任何格式之间架起一座桥梁。这样可以消除训练-应用偏差的一个根源。由此推知,在训练和应用时,尽量不要使用两种不同的编程语言。如果这样做,就几乎不可能共享代码了。