机器学习入门12

今天继续进行机器学习的入门,主题是生产型机器学习系统。

生产型机器学习系统的训练模式

机器学习系统通常采用两种主要的训练模式:

静态训练(离线训练)

  1. 基本概念
    • 一次性训练模型
    • 在特定时间点完成训练
  2. 主要特点
    • 在固定时间内提供相同训练模型
    • 模型稳定性好
    • 适合批量处理场景

动态训练(在线训练)

  1. 基本概念
    • 持续更新的训练模式
    • 实时调整模型
  2. 主要特点
    • 提供最近训练的模型
    • 能够适应新数据
    • 适合实时处理场景

生产型机器学习系统的推理模式

推理是指通过训练后的模型对无标签示例进行预测的过程。模型可以通过以下两种方式进行推理:

静态推理(离线推理/批量推理)

  1. 基本概念
    • 模型对一组样本进行批量预测
    • 将预测结果存储在特定位置
  2. 主要特点
    • 批量处理多个样本
    • 结果预先计算并存储
    • 适合大规模数据处理

动态推理(在线推理/实时推理)

  1. 基本概念
    • 模型仅在需要时进行预测
    • 实时响应预测请求
  2. 主要特点
    • 即时处理单个请求
    • 快速返回预测结果
    • 适合实时交互场景

静态推理与动态推理的优缺点分析

静态推理的优缺点

  1. 优势
    • 无需过多担心推理费用
    • 可以在推送前对预测进行后验证
  2. 劣势
    • 可能提供过时的预测结果
    • 更新延迟时间可能以小时或天为单位

动态推理的优缺点

  1. 优势
    • 适合新条目加入时的预测需求
    • 特别适合处理不常见样本的情况
  2. 劣势
    • 计算量非常大,对延迟要求敏感
    • 可能需要使用简单模型来保证推理速度
    • 监控需求更为密集

选择建议

根据实际应用场景的需求来选择合适的推理模式:

  • 对实时性要求高的场景选择动态推理
  • 对准确性和稳定性要求高的场景选择静态推理
  • 可以考虑两种模式的混合使用

生产型机器学习系统的数据转换时机

原始数据在进入机器学习系统前需要经过特征工程处理(转换)。关于数据转换的时机,一般可以在以下两个时间段执行:

  • 在训练模型之前
  • 在训练模型时

训练前数据转换

在此方法中,需要执行以下两个步骤:

  1. 编写代码或使用专用工具来转换原始数据
  2. 将转换后的数据存储在模型可以调取的位置,例如磁盘上

优势 ✅ - 系统只转换一次原始数据 - 系统可以分析整个数据集,以确定最佳转换策略

缺点 ❌ - 必须在预测时重新创建转换,请注意训练-应用偏差!

当系统执行动态(在线)推理时,训练和服务偏差更危险。在使用动态推理的系统中,转换原始数据集的软件通常不同于提供预测的软件,这可能会导致训练-应用偏差。相比之下,使用静态(离线)推理的系统有时可以使用相同的软件。

训练期间数据转换

在此方法中,转换是模型代码的一部分。该模型会提取原始数据并对其进行转换。

优势 ✅ - 即使变更了转换,也可以继续使用相同的原始数据文件 - 这样可以确保在训练和预测时进行相同的转换

缺点 ❌ - 复杂的转换可能会增加模型延迟时间 - 系统会对每个批次执行转换

转换每批数据可能很棘手。例如,假设您想使用Z分数归一化来转换原始数值数据。使用Z分数归一化需要特征的平均值和标准差。然而,每批转换意味着您只能访问一批数据,而不能访问整个数据集。因此,如果批次之差异很大,那么一个批次中Z得分为-2.5与另一个批次中Z得分为-2.5的含义并不相同。作为一种权仪直解决方法,您的系统可以预先计算整个数据集的平均值和标准差,然后将它们用作模型中的常量。

生产机器学习系统: 部署测试

现在可以部署用于预测独角兽身外观的独角兽模型了! 在部署时,机器学习(ML)流水线应能够顺利运行,更新和提供服务。如果独角兽模型只需按一个大大的部署按钮就可行了,那就太好了。但遗憾,完整的机器学习系统需要对以下方面进行测试:

  • 验证输入数据
  • 验证特征工程
  • 验证新模型版本的质量
  • 验证服务基础架构
  • 测试流水线组件之间的集成

许多软件工程师都熟悉测试驱动型开发(TDD)。在TDD中,软件工程师会先编写测试,然后再编写"真实"源代码。不过,在机器学习中,TDD可能很棘手。例如,在训练模型之前,您无法编写测试来验证损失,而是必须先在模型开发过程中发现可实现的损失,然后根据可实现的损失测试新模型版本。

独角兽模型简介

本部分将提及独角兽模型。以下是您需要知晓的相关信息:

您将使用机器学习构建一个分类模型,用于预测独角兽的出现情况。您的数据集详细说明了1万次独角兽宝玉出现情况和1万次独角兽未出现情况。该数据集包含地理位置、时间、海拔、温度、湿度、树冠覆盖率、彩虹是否存在以及其他一些特征。

使用可重现的训练测试模型更新

也许您想继续改进独角兽模型。例如,假设您对某个特征进行了一些额外的特征工程,然后重新训练了模型,希望获得更好(或至少相同)的结果。很遗憾,有时会有很重型的随机训练。为了提高重现性,请遵循以下建议:

  • 确定性地为随机数生成器设置种子。如需了解详情,请参考数据生成中的随机化
  • 按固定顺序初始化模型组件,以确保组件在每次运行时从随机数生成器获取相同的随机数。ML库通常会自动处理此要求。
  • 取多次运行模型的平均值。
  • 使用版本控制功能(即便是进行初步实验),以便在研究模型或流水线时查明代码和参数。

即便遵循这些建议,也可能仍存在其他非确定性来源。

测试对机器学习 API 的调用

如何测试 API 调用的更新? 您可以重新训练模型,但这需要花费大量时间。而是编写单元测试来生成随机输入数据,并运行单个检度下降步骤。如果此步骤在没有错误的情况下完成,则 API 的任何更新都可能不会破坏您的模型。

为流水线组件编写集成测试

在机器学习流水线中,一个组件中的更改可能会导致其他组件出错。编写一项可测试整个运行整个流水线的集成测试,以检查各个组件能否协同工作。

除了持续运行集成测试之外,您还应在推送新模型和新软件版本时运行集成测试。运行整个流水线的速度缓慢,这会使持续集成测试变得更加困难。如需更快地运行集成测试,请使用数据子集或更简单的模型进行训练。具体取决于您的模型和数据。为了实现持续监控,您需要调整更快的测试,使其能够在每次有新版本的模型或软件时都运行。与此同时,运行缓慢的测试会在后台持续执行。

在提供服务之前验证模型质量 ⚓

在将新模型版本推送到生产环境之前,请测试是否存在以下两种质量下降情况:

  • 突然出现的质量下降。新版本中的 bug 可能会导致质量大幅下降。通过与上一个版本对比新版本的质量来验证新版本。

  • 性能缓慢下降。用于检测突然降级的测试可能无法检测到模型质量在多个版本中缓慢下降的情况。而是确保模型对验证数据集的预测结果达到固定阈值。如果验证数据集与实时数据存在偏差,请更新验证数据集,并确保模型仍能达到相同的质量阈值。

在提供服务之前验证模型与基础架构的兼容性

如果模型的更新速度比服务器更快,则模型的软件依赖项可能会与服务器不同。这可能会导致不兼容。通过将模型存到服务器的沙盒版本中,确保模型使用的运行存在于服务器中。

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

恭喜! 您已部署独角兽模型。您的模型应全天候运行,且不会出现任何问题。为确保系统能够正常运行,您必须监控机器学习(ML)流水线。

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

如需监控数据,您可编写数据架构必须满足的规则,以便持续检查数据是否与预期的统计值相符。这组规则称为数据架构。请按照以下步骤定义数据架构:

  1. 了解特征的范围和分布情况。对于分类特征,了解一组可能值。

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

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

    • 异常
    • 分类变量的值不符合预期
    • 意外的数据分布

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

虽然您的原始数据可能会通过数据架构的验证,但模型不会使用原始数据进行训练,而是使用经过特征工程处理的数据进行训练。例如,您的模型会根据归一化后的数值特征(而非原始数值数据)进行训练。由于经过特征工程处理的数据可能与原始输入数据截然不同,因此您必须将对经过特征工程处理的数据的检查与对原始输入数据的检查分开进行。

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

  • 所有数值特征都会进行缩放,例如,介于 0 到 1 之间。
  • 经过独热编码的矢量仅包含 1 个 1 和 N-1 个 0。
  • 转换后的数据分布符合预期,例如,如果您使用 Z 分数进行了标准化,则 Z 分数的平均值应为 0。
  • 处理离群值,例如通过缩放或剪裁。

查看重要数据片段的指标

成功的整体有时会掩盖失败的子集。换句话说,即使模型的整体指标非常出色,在某些情况下,其预测结果也可能非常糟糕。例如:

您的独角兽模型总体表现良好,但在为撒哈拉沙漠进行预测时表现不佳。

如果您是那种只满足于整体 AUC 较高的工程师,那么您可能不会注意到模型在撒哈拉沙漠中的表现问题。如果为每个区域做出准确的预测非常重要,那么您需要跟踪每个区域的效果。数据子集(例如与撒哈拉沙漠对应的子集)称为数据切片。

确定感兴趣的数据片段。然后,将这些数据片段的模型指标与整个数据集的指标进行对比。检查模型在所有数据片段上的表现有助于消除偏差。如需了解详情,请参阅公平性: 评估偏差

使用实际指标

模型指标不一定能衡量模型的实际影响,例如,更改超参数可能会提高模型的 AUC,但这种更改对用户体验有何影响? 若要衡量实际影响,您需要定义单独的指标。例如,您可以对模型的用户进行调查,以确认在模型预测他们会看到独角兽时,他们确实看到了独角兽。

检查是否存在训练-应用偏差

训练-应用偏差是指训练阶段的输入数据与应用中的输入数据不同。下表介绍了两种重要的偏差类型:

类型 定义 示例 解决方案
架构偏差 训练和服务输入数据不符合相同的架构 服务数据的格式或分布会发生变化,而模型会继续使用旧数据进行训练 使用相同的架构来验证训练数据和应用数据。确保维持住查看架构未检查的统计信息,例如特征值的比例
特征偏差 训练数据和应用数据之间的工程化数据不同 训练和部署阶段的特征工程代码不同,生成的工程化数据也不同 与架构偏差类似,对训练数据和应用数据采用相同的统计规则。根据特定时间段的偏差存在的数量,以及每个特征的偏差示例比例

导致训练-应用偏差的原因可能很细微,请始终考虑模型在预测时可用的数据。在训练期间,请仅使用在服务时可用的特征。

💡 黄金法则: 确保训练环境尽可能与生产环境保持相似。训练任务与预测任务越接近,机器学习系统的效果就越好。

测试模型权重和输出的数值稳定性

在模型训练期间,权重和层输出不应为 NaN (非数字) 或 Inf (无穷大)。编写测试以检查权重和层输出的 NaN 和 Inf 值。此外,请测试每个层的输出中超过一半的输出不为零。

监控模型性能

您的独角兽预测器的受欢迎程度超出预期! 您收到大量预测请求,并且训练数据量也越来越大。您会认为这很棒,直到您发现模型的训练需要越来越多的内存和时间。您决定按照以下事项监控模型的性能:

  • 按代码、模型和数据版本跟踪模型性能。通过此类跟踪,您可以准确找出导致任何性能下降的确切原因。
  • 针对新模型版本,与之前的版本和固定基准对比测试每秒的训练步骤数。
  • 通过设置内存用量阈值来捕获内存泄漏。
  • 监控 API 响应时间并跟踪毫秒分位数。虽然 API 响应时间可能超出您的控制范围,但响应缓慢可能会导致安全问题不佳。
  • 监控每秒回答的查询数量。

使用传送的数据测试实时模型的质量

您已验证模型,但是,如果在记录验证数据后,真实场景(例如独角兽行为)发生变化,该怎么办? 这样一来,所提供模型的质量就会下降。不过,由于真实数据并不总是带标签的,因此很难在投放时测试质量。如果您的投放数据未标记,请考虑进行以下测试:

  • 使用人工评分员生成标签。
  • 调查在预测中存在明显统计偏差的模型。请参阅分类: 预测偏差
  • 跟踪模型的实际指标。例如,如果您要对垃圾内容进行分类,请将您的预测结果与用户报告的垃圾内容进行对比。
  • 通过对部分查询提供新模型版本,可减少训练数据与应用数据之间的潜在差异。在验证新的分发模型时,请逐渐将所有查询切换到新版本。

使用这些测试时,请务必监控预测质量的突然下降和缓慢下降。

什么是 AutoML?

AutoML 是一种自动执行机器学习工作流中特定任务的过程。您可以将 AutoML 视为一系列工具和技术,它们可以让多个用户更快地构建机器学习模型,并更轻松地使用这些模型。虽然自动化功能可以在整个机器学习工作流中提供帮助,但与 AutoML 相关的任务是指图 1 所示模型开发周期中包含的任务。这些重复性任务包括:

  • 数据工程
    • 特征工程
    • 特征选择
  • 训练
    • 确定合适的机器学习算法
    • 选择最佳超参数
  • 分析
    • 根据测试数据集和验证数据集评估训练期间生成的指标

借助 AutoML,可以专注于机器学习问题和数据,而无需考虑选择正确选择、超参数调优和选择合适的算法。