亚马逊AWS官方博客

Amazon SageMaker Automatic Model Tuning:利用机器学习支持机器学习

Amazon SageMaker Automatic Model Tuning 已正式发布。Automatic Model Tuning 消除了为了搜索超参数空间,以获得更精确的模型,而必须执行的无差异化繁重工作。在训练和校正机器学习模型时,开发人员和数据科学家能够利用这项功能节省大量时间和工作。超参数校正任务会根据已完成的训练任务的结果,启动使用不同超参数组合的多项训练任务。SageMaker 根据贝叶斯优化训练“元”机器学习模型,为我们的训练任务推断超参数组合。我们稍微深入地探索一下这方面的内容。

机器学习过程中的模型校正

开发人员的常见机器学习流程包括 4 个步骤:探索性数据分析 (EDA)、模型设计、模型训练和模型评估。SageMaker 可访问服务内功能强大的 Jupyter 笔记本实例、内置算法和模型训练,从而简化了这些步骤。我们专注于流程的训练部分,通常会处理数据并将其馈送到模型之中,以根据我们的预期结果评估模型的预测结果。我们会将整体输入数据中的评估数据部分与用于训练模型的训练数据分隔开。我们可以利用评估数据来检查我们的模型处理其从未见过的数据时的行为。在许多情况下,在我们选择算法或构建自定义模型后,我们需要搜索该算法可能的超参数配置空间,以获得输入数据的最佳结果。

超参数控制底层算法的运行方式,会影响模型性能。它们可以是:训练的纪元数、网络中的层数、学习速率、优化算法等等。通常,您要从随机值或其他问题的常见值开始,并在开始看到变更所产生的影响后迭代调整。过去,这是一个费力的手动过程。然而,由于某些杰出研究人员的努力,如今我们可以使用 SageMaker 来消除几乎所有的手动工作。用户只需要选择要校正的超参数、要探索的每个参数的范围,以及要纳入预算的训练任务总数即可。我们来看看实际操作。

超参数校正

为了演示这项功能,我们将使用标准 MNIST 数据集、Apache MXNet 框架和 SageMaker Python 开发工具包。您在下方看到的所有内容均可在 SageMaker 示例笔记本中找到。

首先,我将在笔记本实例上使用 SageMaker Python 开发工具包创建一个传统的 MXNet 估算器:


import boto3
import sagemaker
from sagemaker.mxnet import MXNet
role = sagemaker.get_execution_role()
region = boto3.Session().region_name
train_data_location = 's3://sagemaker-sample-data-{}/mxnet/mnist/train'.format(region)
test_data_location = 's3://sagemaker-sample-data-{}/mxnet/mnist/test'.format(region)
estimator = MXNet(entry_point='mnist.py',
                  role=role,
                  train_instance_count=1,
                  train_instance_type='ml.m4.xlarge',
                  sagemaker_session=sagemaker.Session(),
                  base_job_name='HPO-mxnet',
                  hyperparameters={'batch_size': 100})

这可能与您在其他 SageMaker 示例中看到的内容非常相似。

现在,我们可以导入一些用于自动校正模型的工具,并创建我们的超参数范围。


from sagemaker.tuner import HyperparameterTuner, IntegerParameter, CategoricalParameter, ContinuousParameter
hyperparameter_ranges = {'optimizer': CategoricalParameter(['sgd', 'Adam']),
                         'learning_rate': ContinuousParameter(0.01, 0.2),
                         'num_epoch': IntegerParameter(10, 50)}

校正任务将从这些范围中选择参数,并使用这些参数来确定训练工作应重点攻克的最佳位置。参数有多种类型:

  • Categorical(分类型)参数使用来自离散集的一个值。
  • Continuous(连续型)参数可以使用介于最小值与最大值之间的任何实数值。
  • Integer(整数型)参数可使用指定界限内的任意整数。

既然我们已经定义了范围,下面就要定义成功指标,以及用于在培训任务日志中查找该指标的正则表达式。


objective_metric_name = 'Validation-accuracy'
metric_definitions = [{'Name': 'Validation-accuracy',
                       'Regex': 'Validation-accuracy=([0-9\\.]+)'}]

现在,仅需再定义几项内容,就可以开始校正了!


tuner = HyperparameterTuner(estimator,
                            objective_metric_name,
                            hyperparameter_ranges,
                            metric_definitions,
                            max_jobs=9,
                            max_parallel_jobs=3)
tuner.fit({'train': train_data_location, 'test': test_data_location})

现在,我们可以打开 SageMaker 控制台,选择 Hyperparameter tuning jobs (超参数校正任务) 子控制台,并查看所有校正任务。

我们可以单击刚刚创建的任务来查看更多详细信息,并了解校正结果。

默认情况下,控制台将向我们展示最佳任务和所用参数,但我们也可以查看其他所有任务。

跳转回我们的笔记本实例, tuner.analytics() 中有一个方便的分析对象,可用于通过一些 bokeh 绘图呈现训练结果。SageMaker 示例笔记本中提供了这方面的几个示例。

此功能适用于内置算法、使用 SageMaker Python 开发工具包创建的任务,甚至是 Docker 中的自带训练任务。

我们甚至可以单击 Create hyperparameter tuning job (创建超参数校正任务),直接在控制台中创建校正任务。

首先,我们选择任务名称、IAM 角色以及任务应该在其中运行的 VPC(如果有)。

接下来,我们对训练任务进行配置。此时可以使用内置算法,也可以使用自定义 Docker 映像。如果使用的是自定义映像,那么我们将该正则表达式定义为在日志中查找客观指标。现在我们只需选择 XGBoost 并单击“下一步”。

现在,我们将配置校正任务参数,与在笔记本示例中一样。我将选择曲线下面积 (AUC) 作为优化的客观指标。由于这是一种内置算法,因此先前的步骤已经填充了该指标的正则表达式。我将设置最小和最大轮次数,然后单击“下一步”。

在下一屏中,我们可以配置算法期望获得的输入通道以及输出模型的位置。我们通常不仅有“训练”通道,而且还有一个“评估”通道。

最后,我们可以配置此校正任务的资源限制。

现在,可以 快速进行 校正了!

其他资源

要利用自动校正模型功能,用户必须定义几项内容:超参数范围、成功指标和查找指标的正则表达式、并行运行的任务数以及要运行的任务数上限。对于内置算法,我们甚至不需要定义正则表达式。需要权衡所用的并行任务数和最终模型的准确性,并作出细微调整。增加 max_parallel_jobs 可加快完成校正任务,但较低的并行度通常会提供略好一些的最终结果。

使用 Amazon SageMaker Automatic Model Tuning 无需额外付费,您仅需为校正任务启动的训练任务所用的基础资源付费。此功能现已面向提供 SageMaker 的所有区域推出。该功能以 API 的形式提供,并且可在控制台中查看自动校正模型启动的训练任务。您可以阅读文档,了解更多信息。

我坚信这项功能可以帮助开发人员节省大量时间和精力,我也很期待看到客户利用这项功能取得的成果。

本篇作者

Randall Hunt

AWS 全球高级布道师。此前供职于 NASA, SpaceX 及 MongoDB。