生产型机器学习系统:监控流水线

恭喜!您已经部署了 unicorn 模型。 您的模型应能全天候运行,而不会出现任何问题。为此 您必须监控机器学习 (ML) 流水线。

编写数据架构以验证原始数据

如需监控数据,您应该根据预期持续检查数据 例如,您可以编写数据必须满足的规则。此集合 称为“数据架构”。按以下方式定义数据架构 具体步骤:

  1. 了解特征的范围和分布。对于分类 来理解可能的值的集合。

  2. 将您的理解编码到数据架构中。以下是 规则:

    • 确保用户提交的评分始终介于 1 到 5 之间。
    • 检查单词 the 的出现频率是否最高(对于英语文本) 功能)。
    • 检查每个分类特征是否设置为固定集中的值 一组可能的值。
  3. 根据数据架构测试数据。您的架构应捕获数据 错误,例如:

    • 异常
    • 分类变量的意外值
    • 意外的数据分布

编写单元测试以验证特征工程

虽然您的原始数据可能会传递数据架构,但您的模型不会训练 原始数据。更确切地说,您的模型使用已 进行过工程设计。例如,您的模型基于归一化的数值特征进行训练 而不是原始数值数据。因为特征工程数据 与原始输入数据不同,您必须检查特征工程数据, 与对原始输入数据的检查分开。

根据您对特征工程数据的理解来编写单元测试。 例如,您可以编写单元测试来检查 以下:

  • 所有数字特征都会缩放(例如,介于 0 到 1 之间)。
  • 独热编码 它们仅包含一个 1 和 N-1 零。
  • 转换后的数据分布符合预期。 例如,如果您使用 Z 分数进行了标准化, Z 得分应为 0。
  • 离群值 例如通过扩缩剪辑

查看重要数据切片的指标

成功的整个流程有时会掩盖失败的子集。也就是说, 如果模型的整体指标值较高, 。例如:

独角兽模型在整体上表现良好,但在 对撒哈拉沙漠做出预测

如果您是一位对整体曲线下面积感到满意的工程师,那么 模型在撒哈拉沙漠中存在的问题可能就没有注意到。如果正在进行 在每个区域进行良好预测至关重要,因此您需要 效果数据子集,例如 称为数据切片

识别感兴趣的数据切片。 然后将这些数据切片的模型指标与 整个数据集中。检查您的模型是否在所有数据切片中表现良好 有助于消除偏见请参阅 公平性:评估偏差

使用实际指标

模型指标不一定能衡量模型的实际影响。 例如,更改超参数可能会增加模型的 AUC, 这一变化是否影响了用户体验?若要衡量现实世界的影响,您需要 定义单独的指标例如,你可以对使用你的模型的用户进行问卷调查 模型预测它们是否确实看到了独角兽 。

检查训练-应用偏差

训练-应用偏差 这意味着您在训练期间的输入数据 从输入数据中提取出来。下表介绍了 两种重要的偏差:

类型 定义 示例 解决方案
架构偏差 训练和传送输入数据不遵循同一架构。 投放数据的格式或分布发生变化 而模型会继续使用旧数据进行训练。 使用同一架构来验证训练数据和服务数据。 请务必单独检查 未检查的统计信息 您的架构,例如缺失值的比例
特征偏差 训练和传送的工程数据有所不同。 训练和部署的特征工程代码有所不同, 从而产生不同的工程数据。 与架构偏差类似,在整个训练中应用相同的统计规则 和提供工程数据。跟踪号码 检测到的偏差特征的百分比,以及每个特征的偏差样本比率。

训练-应用偏差的原因可能很细微。 在预测时,请始终考虑哪些数据可供模型使用。 在训练期间,请仅使用您在提供服务时可用的功能。

练习:检查您的理解情况

假设您拥有一家网店,并希望 你某一天能赚多少钱。您的机器学习目标是每天预测 利用客户数量作为一项特征,以此来增加收入。

您可能会遇到什么问题?
点击此处查看答案

检查标签是否泄露

标签泄露表示 标准答案标签 预测操作意外进入了训练特征。标签 有时很难发现。

练习:检查您的理解情况

假设您构建一个二元分类模型来预测 一位医院新病人患有癌症。您的模型使用如下特征:

  • 患者年龄
  • 患者性别
  • 以往的疾病
  • 医院名称
  • 生命体征
  • 测试结果
  • 遗产

标签如下所示:

  • 布尔值:患者是否患有癌症?

您需要仔细划分数据,确保训练集运行良好, 与验证集和测试集隔离开来。模型执行 在验证集和测试集上表现出色;指标 太棒了遗憾的是,模型对新患者表现极差 真实世界。

为什么这个在测试集上表现出色的模型表现非常糟糕 该怎么办?
点击此处查看答案

监控整个流水线中的模型存在时间

如果服务数据会随着时间的推移而变化,但您的模型没有定期重新训练, 模型质量会下降。跟踪自从使用该模型 根据新数据重新训练,并设置提醒的阈值。除了监控 模型的存在时间,那么您应该监控整个流水线中的模型的存在时间 找出流水线停滞点

测试模型权重和输出在数值上是否稳定

在模型训练期间,您的权重和层输出不应为 NaN (不是数字)或 Inf(无限)。 编写测试以检查权重和层输出的 NaN 和 Inf 值。 此外,测试确保一个层有超过一半的输出不为零。

监控模型性能

你的独角兽外观预测程序的受欢迎程度超出了预期!您 以获得更多预测请求和训练数据。你觉得 但在发现模型占用的内存越来越多之前 和训练时间。您决定通过以下方式监控模型的性能: 具体步骤:

  • 按代码、模型和数据版本跟踪模型性能。此类跟踪 让您可以精确找出导致性能下降的确切原因。
  • 根据以下数据测试新模型版本的每秒训练步数: 与固定阈值进行比较。
  • 通过设置内存用量阈值来捕获内存泄漏。
  • 监控 API 响应时间并跟踪其百分位数。虽然 API 响应 有时响应速度可能超出了您的控制范围,响应速度缓慢可能会导致 实际指标较差。
  • 监控每秒应答的查询数。

使用提供的数据测试实时模型的质量

您已验证模型。但如果在现实世界中的情景,比如独角兽 行为,在记录验证数据后发生变化?然后,您的 提供的模型会降级。然而,测试广告投放质量并非易事, 现实世界数据不一定总是带有标签。如果您的投放数据未添加标签 请考虑进行以下测试:

  • 通过人工评分者生成标签

  • 研究在预测中存在显著统计偏差的模型。请参阅 分类 (Classification):预测 偏差

  • 跟踪模型的实际指标。例如,如果您要对 请将您的预测与用户举报的垃圾邮件进行比较。

  • 通过以下方式缩小训练数据与提供数据之间可能存在的差异: 基于一小部分查询提供新的模型版本。在验证时 逐步将所有查询切换到新版本。

使用这些测试时,请记住在 Cloud SQL 中监控 预测质量。

随机

使数据生成流水线可重现。假设您想添加一项功能 以了解它对模型质量的影响。为了实现公平的实验,您的数据集应 除了这项新功能外,其他部分完全相同 秉承这一理念,确保在数据生成过程中, 确定性:

  • 为随机数生成器设定种子 (RNG)。“种子”规则可确保 RNG 每次运行时都会以相同的顺序输出相同的值,重新创建 数据。
  • 使用不变的哈希键哈希是拆分 或示例数据。你可以对每个样本进行哈希处理,并使用生成的整数 决定将样本放入哪个分块。哈希函数的输入 不应在每次运行数据生成程序时更改。请勿使用 或哈希值 您可以按需重新创建哈希值。

上述方法既适用于数据采样,也适用于拆分数据。

哈希处理的注意事项

再想象一下,您在收集搜索查询并使用哈希技术 来包含或排除查询如果哈希键仅使用查询, 那么对于多日的数据,您可以始终添加 该查询或始终排除该查询。始终包含或始终排除 查询都不好,因为:

  • 您的训练集看到的查询会不太多样化。
  • 评估集会人为难以评估, 与训练数据重叠的情况。实际上,在投放时 已经从训练数据中看到过一些实时流量, 评估应反映这一点。

相反,您可以针对查询 + 日期进行哈希处理,但这会产生不同的哈希处理 。

 

图 7. 直观图示:仅对
            查询会导致数据每天都进入同一个存储分区,
            加上查询时间会使数据进入
            存储分区。三个分区分别为训练、评估和
            已忽略。
图 7. 对查询进行哈希处理与对查询 + 查询时间进行哈希处理。