机器学习工程最佳实践的43条黄金法则

·

本文源自Google机器学习专家Martin Zinkevich的实践总结,系统阐述了从基础设施搭建到复杂模型优化的全流程指南。

核心术语解析

在深入探讨最佳实践之前,我们首先需要明确一些机器学习领域的核心概念:

机器学习实践总体原则

要打造卓越的产品,请遵循这一核心准则:以优秀工程师的思维方式进行机器学习,而非仅仅以机器学习专家的视角。

实践中,大多数挑战本质上是工程问题。即使拥有顶尖的机器学习专家资源,系统性能的提升也往往来自于优质的特征工程,而非复杂的算法。因此,基础方法论应包含以下要点:

  1. 确保整个流水线的端到端稳健性
  2. 从设定合理目标开始
  3. 以简单方式融入常识性功能
  4. 确保系统发布后保持稳定

这种方法具有长期有效性。只有在简单技巧无法带来显著进步时,才应考虑引入更复杂的解决方案。增加复杂性往往会延缓未来版本的迭代速度。

掌握基础方法后,可开始探索前沿机器学习技术。👉 探索更多进阶策略

机器学习项目启动前的关键决策

规则1:不依赖机器学习也能发布优秀产品

机器学习虽强大,但需要数据支撑。理论上可从其他问题迁移数据,但效果往往不如简单的启发式方法。如果机器学习能带来100%的提升,启发式方法可能实现50%的改进。

例如,应用市场排名可使用安装率作为启发指标;垃圾内容检测可过滤历史违规发布者。在获得足够数据前,不必强制使用机器学习。

规则2:优先设计和实施指标系统

在构建机器学习系统前,应在现有系统中尽可能多地跟踪指标,因为:

建立实验框架至关重要,需能够将用户分组并汇总实验统计数据。

规则3:选择机器学习替代复杂启发式方法

简单启发式方法有助于产品启动,但复杂启发式难以维护。获得数据并明确目标后,机器学习模型将更易于更新和维护(参见规则16)。

第一阶段:构建初始流水线

首轮流水线构建应聚焦系统基础设施。虽然畅想各种机器学习可能性很有趣,但不可靠的流水线会使问题诊断变得困难。

规则4:保持初始模型简单,确保基础设施正确

第一个模型通常带来最大提升,无需过于复杂。但基础设施问题往往超出预期。在部署前必须确认:

选择简单特征可确保:

可靠完成这三项工作后,大部分任务已经完成。简单模型提供了测试更复杂模型的基准。

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

确保基础设施可测试,并封装学习部分以便测试周围组件:

  1. 测试数据输入流程,检查特征填充情况
  2. 测试从训练算法获取模型,确保训练与服务环境一致性

机器学习具有不可预测性,因此必须测试示例创建代码,并能在服务期加载固定模型。

规则6:复制流水线时警惕数据丢失

复制现有流水线时,旧流水线可能丢弃新流水线需要的数据。例如,热门内容流水线可能丢弃旧内容,但当新场景需要历史数据时就会产生问题。

规则7:将启发式方法转化为特征或外部处理

现有系统通常已有规则和启发式方法。通过机器学习微调这些方法可带来显著好处。四种使用方式:

在ML系统中使用启发式时,需注意增加的复杂性。

监控体系建立

规则8:了解系统新鲜度需求

明确模型老化对性能的影响:一天、一周或一季度?这有助于确定监控优先级。大多数广告系统需每日更新,而某些内容推荐系统可更新频率较低。

规则9:模型导出前检测问题

模型导出阶段出现问题将直接影响用户。导出前应进行完整性检查,确保在预留数据上表现合理。未导出模型的问题可邮件提醒,但用户端问题可能需要页面警报。

规则10:监控静默故障

机器学习系统更容易发生静默故障。例如,数据表停止更新后,系统性能可能逐渐衰减而难以察觉。定期检查数据统计信息可减少此类问题。

规则11:为特征列指定所有者和文档

大型系统包含许多特征列时,需明确每个特征的创建和维护责任。即使特征名称具有描述性,也应详细说明其含义、来源和预期作用。

目标选择策略

系统可能关注多个指标,但机器学习算法通常只需优化单一目标。

规则12:避免过度优化目标选择

早期阶段,即使不直接优化,所有指标也可能提升。保持简单,当所有指标都能轻松提升时,不必过度纠结平衡问题。但也不要将目标与系统最终健康度混淆。

规则13:选择简单、可观察、可归因的初始目标

通常很难确定真正目标。机器学习目标应易于测量,并作为“真实”目标的代理。最容易建模的是直接观察且可归因的用户行为:

避免初始阶段建模间接影响:

间接影响是优秀的A/B测试和发布决策指标。

切勿让机器学习算法解决:

这些重要但难以衡量的指标应使用代理指标替代。

规则14:从可解释模型开始便于调试

线性回归、逻辑回归和泊松回归直接受概率模型启发,每个预测可解释为概率或期望值,更易于调试。例如,训练概率与生产系统预测不一致可能表明问题存在。

规则15:在策略层分离垃圾过滤与质量排名

质量排名是精细艺术,垃圾过滤是持续战斗。质量排名应专注于善意内容,垃圾内容应单独处理。同样,露骨内容也应与质量排名分离。垃圾过滤必须频繁更新(甚至每日更新),内容创作者声誉至关重要。

第二阶段:特征工程

第一阶段完成后,拥有正常运行的全流程系统,第二阶段便可开始。此阶段包含大量简单有效的改进机会,所有指标应持续上升。

规则16:规划发布和迭代周期

不要假设当前模型是最终版本。考虑新增复杂性是否会减慢未来发布速度。许多团队每季度甚至更频繁发布模型。新模型发布通常源于:

构建模型时,考虑特征添加、移除或重组的难易程度。

规则17:优先使用直接观察和报告的特征

学习特征(由外部系统或学习器自身生成的特征)虽然有用,但存在许多陷阱,不应在初始模型中使用。外部系统的目标可能与你不同,且可能过时。分解模型和深度模型存在非凸性问题,难以保证最优解。

规则18:使用跨上下文泛化的内容特征

机器学习系统通常是大系统的一部分。例如,帖子在正式展示前可能已获得点赞、分享或评论。向学习器提供这些统计信息,可在新内容没有数据时进行推广。

规则19:尽可能使用具体特征

海量数据下,学习数百万简单特征比学习少量复杂特征更容易。文档标识符和规范化查询可能缺乏通用性,但能保持主查询的标签一致性。使用正则化消除覆盖过少示例的特征。

规则20:以可理解方式组合修改现有特征

组合和修改特征有多种方式,最常用的是离散化和交叉:

注意大型特征列交叉可能过拟合。文本处理时可使用点积或交集作为替代方案。

规则21:线性模型特征权重数量与数据量成正比

根据数据规模调整学习复杂度:

规则22:清理未使用特征

未使用特征产生技术债务。如果特征未被使用且组合无效,应从基础设施中移除。保持基础设施简洁,以便快速试验最有希望的特征。同时注意特征覆盖率,低覆盖率但高正例率的特征可能很有价值。

系统人工分析

进入第三阶段前,需掌握分析改进现有模型的技能。

规则23:避免以典型最终用户自居

团队内部测试虽有益处,但员工应检查性能是否正确。接近正式的更改应通过众包或真实用户实验进一步验证。使用用户体验方法:创建用户角色并进行可用性测试。

规则24:衡量模型间差异

用户评估前,最简单有用的衡量之一是计算新结果与生产结果的差异。若差异很小,可能无需实验;若差异很大,需确保更改正确。同时确保系统自身一致性。

规则25:实用性能优于预测能力

模型可能预测点击率,但最终关键是预测结果的使用方式。如果预测用于排名,则排名质量比预测本身更重要。大多数情况下两者应一致,否则可能只能获得微小收益。

规则26:从错误中寻找规律并创建新特征

模型对某些示例预测错误时,这是系统自知错误并希望修正的机会。提供修正错误的特征,模型会尝试使用。但根据系统认为正确的示例创建特征可能被忽略。

发现错误示例后,寻找当前特征集外的规律。添加特征时不要过度特定,添加多个特征让模型自行处理。

规则27:量化观察到的不良行为

团队成员常对损失函数未捕获的系统属性不满。应将这些抱怨转化为具体数据。如果问题可衡量,就可开始作为特征、目标或指标使用。

规则28:注意短期行为相同不保证长期一致

新系统可能在测试中与现有系统行为相似,但长期可能无法展示新内容。要了解系统长期行为,唯一方法是仅使用启用后获取的数据进行训练。

训练-服务偏差

训练-服务偏差指训练期与服务期性能差距,可能源于:

明确监控可防止系统和数据更改引入难以察觉的偏差。

规则29:保存服务时特征用于训练

确保训练服务一致的最佳方法是保存服务时使用的特征集,并传输到日志供训练使用。即使不能对每个示例执行,也应对部分示例执行以验证一致性。

规则30:重要性权重抽样数据不应随意丢弃

数据过多时,可能想忽略部分文件。可丢弃从未向用户展示的数据,但对其他数据最好使用重要性权重。重要性权重下,所有校准属性仍然适用。

规则31:注意联接表数据可能变化

训练和服务期间联接表特征可能变化,导致同一文档预测不同。最简单解决方法是在服务时记录特征。如果表变化缓慢,可按时快照获取接近数据。

规则32:尽可能复用训练服务流水线代码

在线处理需即时处理请求,批处理可组合任务。服务是在线处理,训练是批处理任务。可创建特定系统对象存储查询结果,然后在服务训练期运行通用方法转换格式。尽量避免训练服务使用不同编程语言。

规则33:使用未来数据测试模型

通常应使用训练数据之后收集的数据衡量模型性能,这更能反映生产环境表现。可能无法预测每日效果,但曲线下面积应接近。

规则34:过滤二元分类中可短期牺牲性能获取干净数据

过滤任务中,系统不向用户显示负例。可从用户显示实例获取更多训练数据,但这会引入采样偏差。也可服务期间保留部分流量发送给用户,获取更清晰数据。

规则35:注意排名问题固有偏差

排名算法彻底更改导致不同结果时,实际上改变了算法将来看到的数据。应设计模型考虑此偏差,方法包括:

规则36:避免位置特征反馈循环

内容位置极大影响用户互动可能性。添加位置特征训练模型,模型会学习降低其他因素权重。服务时不提供位置特征或提供相同默认特征。

注意训练测试间不对称性,位置特征应与模型其余部分分离。

规则37:衡量训练/服务偏差

偏差可能来自多种因素,可划分为:

如果相同示例在训练和服务时结果不同,可能表示工程错误。

第三阶段:增长放缓与复杂模型

第二阶段结束的标志是月度收益开始减少,需要在指标间权衡。效果提升变得更难,机器学习技术需更加复杂。

规则38:目标不一致时勿浪费新功能

效果衡量稳定后,团队开始关注超出当前机器学习目标的问题。如果现有算法目标不涵盖产品目标,需要更改目标或产品目标。

规则39:发布决策是长期产品目标的代理

现实世界没有简单的“健康值”衡量产品状态。团队必须使用收集的统计数据预测系统未来效果,关注参与度、日活跃用户、收入等指标。这些A/B测试可衡量指标本身又是更长远目标的代理。

所有指标都提升(或至少未恶化)时最容易做出发布决策。如果简单启发式在所有指标上表现更好,应选择启发式。

规则40:保持集成简单

接受原始特征直接排名的统一模型最易调试理解。但模型集成(组合其他模型得分的模型)效果往往更好。为简化,每个模型应仅是其他模型输入的集合模型,或接受多特征的基础模型,而非两者兼具。

集成模型应简单,仅将基础模型输出作为输入。还应强制执行属性,如基准模型得分增加不降低集成得分。

规则41:效果停滞时寻找新信息源而非优化现有信号

添加用户人口统计、文档词条信息,完成模板探索和正则化调整后,若关键指标提升不足1%,应开始构建完全不同功能的基础架构,如用户历史访问记录或其他属性数据。

规则42:内容多样性不等于内容差异化

内容多样性通常指来源多元化,个性化意味每个用户获得自己的结果,相关性意味查询结果更适用。问题是普通内容往往难以击败。

如果系统衡量点击、时间、观看、点赞、分享等,实际衡量的是内容受欢迎程度。团队有时尝试学习多样化个性化模型,添加用户兴趣或多样化特征,但发现这些特征权重低于预期。

这不意味多样性、个性化或相关性没有价值。可进行后处理提高多样性或相关性。如果长期目标提升,可继续使用后处理或直接修改目标。

规则43:产品间好友往往相同,兴趣通常不同

Google团队通过将预测关联紧密程度的模型用于其他产品取得显著成效。但跨产品部署个性化功能时可能遇到困难。即使知道用户在其他属性上的历史记录也可能有帮助。

常见问题

机器学习项目启动前最重要的准备是什么?

确保基础设施稳健性和指标系统完整性。在拥有可靠的数据流水线和监控体系前,不应过早引入复杂机器学习模型。优先设计可测试的基础架构,明确系统的好坏标准,并建立完整的数据收集和评估机制。

如何选择合适的机器学习目标?

选择简单、可观察、可归因的指标作为初始目标。避免一开始就优化间接影响或难以衡量的抽象概念。机器学习目标应易于测量且能代表真实业务目标,同时确保在早期阶段所有关键指标都能随目标优化而提升。

特征工程中最常见的错误是什么?

过度依赖复杂的学习特征而非直接观察的特征,以及忽视特征覆盖率的重要性。优先使用直接可解释的特征,确保每个特征都有明确的所有者和文档说明,并定期清理不再使用的特征以减少技术债务。

如何有效避免训练-服务偏差?

最佳实践是在服务时保存特征集并传输到日志供训练使用,确保训练和服务环境的一致性。尽可能复用训练和服务流水线的代码,避免使用不同的编程语言,并定期检查相同示例在两个环境中的预测结果是否一致。

当模型性能停滞时应该怎么办?

不应继续优化现有信号,而应寻找新的优质信息源。考虑引入完全不同类型的数据,如用户历史行为记录、外部知识图谱或跨产品数据。同时需要调整投资回报预期,权衡新功能的收益与复杂性成本。