使用 Amazon SageMaker 自动模型调整探索超参数优化的先进技术 | 亚马逊网络服务

使用 Amazon SageMaker 自动模型调整探索超参数优化的先进技术 | 亚马逊网络服务

创建高性能机器学习 (ML) 解决方案依赖于探索和优化训练参数(也称为超参数)。 超参数是我们用来调整训练过程的旋钮和杠杆,例如学习率、批量大小、正则化强度等,具体取决于手头的具体模型和任务。 探索超参数涉及系统地改变每个参数的值并观察对模型性能的影响。 尽管这个过程需要额外的努力,但好处是显着的。 超参数优化 (HPO) 可以缩短训练时间、提高模型准确性并更好地推广到新数据。

我们从邮局继续我们的旅程 使用 Amazon SageMaker Automatic Model Tuning 优化超参数。 我们之前探索了单个作业优化,可视化 SageMaker 内置算法的结果,并了解特定超参数值的影响。 除了在模型创建周期结束时使用 HPO 作为一次性优化之外,我们还可以以对话方式在多个步骤中使用它。 每个调优工作都可以帮助我们更接近良好的性能,但此外,我们还了解模型对某些超参数的敏感程度,并可以利用这种理解来指导下一个调优工作。 我们可以根据我们学到的知识修改超参数及其值范围,从而将这种优化工作转化为对话。 就像我们作为 ML 从业者通过这些运行积累知识一样, Amazon SageMaker 自动模型调整 (AMT) 热启动也可以为下一次调整工作保留在之前的调整工作中获得的知识。

在这篇文章中,我们使用自定义训练算法和不同的 HPO 策略(例如贝叶斯优化和随机搜索)运行多个 HPO 作业。 我们还将热情的启动付诸行动,并直观地比较我们的试验,以完善超参数空间探索。

SageMaker AMT 的高级概念

在接下来的部分中,我们将仔细研究以下每个主题,并展示 SageMaker AMT 如何帮助您在 ML 项目中实现它们:

  • 在 SageMaker 训练中使用自定义训练代码和流行的 ML 框架 Scikit-learn
  • 根据日志定义自定义评估指标以进行评估和优化
  • 使用适当的策略执行 HPO
  • 使用热启动将单个超参数搜索转变为与我们的模型的对话
  • 利用我们的解决方案库使用先进的可视化技术来比较两种 HPO 策略并调整作业结果

无论您使用我们第一篇文章中使用的内置算法还是您自己的训练代码,SageMaker AMT 都能为优化 ML 模型提供无缝的用户体验。 它提供的关键功能使您能够专注于手头的 ML 问题,同时自动跟踪试验和结果。 同时,它会自动为您管理底层基础设施。

在这篇文章中,我们放弃 SageMaker 内置算法并使用自定义代码。 我们使用随机森林 SKLearn。 但我们坚持使用与我们的相同的 ML 任务和数据集 第一篇文章,正在检测手写数字。 我们涵盖了 Jupyter Notebook 的内容 2_advanced_tuning_with_custom_training_and_visualizing.ipynb 并邀请您并排调用代码以进一步阅读。

让我们更深入地了解如何使用自定义训练代码、部署和运行它,同时探索超参数搜索空间来优化我们的结果。

如何构建 ML 模型并执行超参数优化

构建机器学习解决方案的典型流程是什么样的? 尽管有许多可能的用例和各种各样的机器学习任务,但我们建议采用以下逐步方法的思维模型:

  1. 了解您当前的 ML 场景并根据需求选择算法。 例如,您可能想使用监督学习算法来解决图像识别任务。 在这篇文章中,我们继续使用手写图像识别场景和与第一篇文章中相同的数据集。
  2. 决定您要在 SageMaker Training 中使用哪种算法实现。 SageMaker 内部或外部有多种选项。 此外,您需要定义最适合您的任务并且想要优化的基础指标(例如准确性、F1 分数或 ROC)。 SageMaker 支持四种选项,具体取决于您的需求和资源:
    • 使用预先训练的模型 亚马逊SageMaker JumpStart,您可以开箱即用或对其进行微调。
    • 使用一种内置算法进行训练和调整,例如 XGBoost,就像我们在上一篇文章中所做的那样。
    • 基于 Scikit-learn、TensorFlow 或 PyTorch 等主要框架之一训练和调整自定义模型。 为此,AWS 提供了一系列预制 Docker 镜像。 在这篇文章中,我们使用此选项,它允许您通过在预制容器映像上运行您自己的代码来快速进行实验。
    • 如果您想要使用不受其他支持的框架或软件,请携带您自己的自定义 Docker 映像。 此选项需要最多的努力,但也提供了最高程度的灵活性和控制。
  3. 使用您的数据训练模型。 根据上一步的算法实现,这可以像引用训练数据并运行训练作业一样简单,或者另外提供用于训练的自定义代码。 在我们的例子中,我们使用一些基于 Scikit-learn 的 Python 自定义训练代码。
  4. 应用超参数优化(作为与您的 ML 模型的“对话”)。 训练后,您通常希望通过为算法的超参数找到最有希望的值组合来优化模型的性能。

根据您的机器学习算法和模型大小,超参数优化的最后一步可能会比预期的挑战更大。 以下问题是现阶段 ML 从业者的典型问题,您可能听起来很熟悉:

  • 什么样的超参数对我的机器学习问题有影响?
  • 如何有效地搜索巨大的超参数空间以找到那些性能最佳的值?
  • 某些超参数值的组合如何影响我的性能指标?
  • 成本很重要; 我怎样才能有效地利用我的资源?
  • 什么样的调优实验是值得的,我该如何比较它们?

回答这些问题并不容易,但有个好消息。 SageMaker AMT 卸下您的繁重工作,让您专注于选择您想要探索的正确 HPO 策略和价值范围。 此外,我们的可视化解决方案有助于迭代分析和实验过程,以有效地找到性能良好的超参数值。

在接下来的部分中,我们使用 Scikit-learn 从头开始​​构建数字识别模型,并展示所有这些概念的实际应用。

解决方案概述

SageMaker 提供了一些非常方便的功能来训练、评估和调整我们的模型。 它涵盖了端到端 ML 生命周期的所有功能,因此我们甚至不需要离开 Jupyter 笔记本。

在我们的第一篇文章中,我们使用了 SageMaker 内置算法 XGBoost。 出于演示目的,这次我们切换到随机森林分类器,因为我们可以展示如何提供您自己的训练代码。 我们选择提供自己的 Python 脚本并使用 Scikit-learn 作为我们的框架。 现在,我们如何表达我们想要使用特定的 ML 框架? 正如我们将看到的,SageMaker 在后台使用另一个 AWS 服务来检索预构建的 Docker 容器映像以进行训练 -Amazon Elastic Container注册 (Amazon ECR)。

我们详细介绍以下步骤,包括代码片段和连接点的图表。 如前所述,如果有机会,请打开笔记本并逐步运行代码单元以在您的 AWS 环境中创建工件。 没有比主动学习更好的方法了。

  1. 首先,加载并准备数据。 我们用 亚马逊简单存储服务 (Amazon S3)上传包含我们的手写数字数据的文件。
  2. 接下来,准备训练脚本和框架依赖项。 我们提供了Python中的自定义训练代码,引用了一些依赖库,并进行了测试运行。
  3. 为了定义自定义目标指标,SageMaker 让我们定义一个正则表达式,以从容器日志文件中提取我们需要的指标。
  4. 使用 scikit-learn 框架训练模型。 通过引用预先构建的容器映像,我们创建相应的 Estimator 对象并传递我们的自定义训练脚本。
  5. AMT 使我们能够尝试各种 HPO 策略。 在这篇文章中,我们主要关注其中的两个:随机搜索和贝叶斯搜索。
  6. 在 SageMaker HPO 策略之间进行选择。
  7. 可视化、分析和比较调整结果。 我们的可视化包使我们能够根据我们的指标发现哪种策略表现更好,以及哪些超参数值提供最佳性能。
  8. 继续探索超参数空间并热启动 HPO 作业。

AMT 负责扩展和管理底层计算基础设施,以在其上运行各种调整作业 亚马逊弹性计算云 (Amazon EC2) 实例。 这样,您就不需要自己负担配置实例、处理任何操作系统和硬件问题或自行聚合日志文件的负担。 ML 框架图像是从 Amazon ECR 检索的,模型构件(包括调优结果)存储在 Amazon S3 中。 所有日志和指标都收集在 亚马逊CloudWatch 以便在需要时方便访问和进一步分析。

先决条件

因为这是一个系列的延续,所以建议但不一定需要阅读 我们关于 SageMaker AMT 和 HPO 的第一篇文章。 除此之外,对 ML 概念和 Python 编程的基本熟悉也很有帮助。 我们还建议遵循中的每个步骤 随身笔记本 在阅读本文时从我们的 GitHub 存储库中获取。 该笔记本可以独立于第一个笔记本运行,但需要子文件夹中的一些代码。 确保按照 README 文件中的说明在您的环境中克隆完整存储库。

试验代码并使用交互式可视化选项可以极大地增强您的学习体验。 所以,请检查一下。

加载并准备数据

第一步,我们确保下载的 数字数据 我们需要的培训可供 SageMaker 访问。 Amazon S3 使我们能够以安全且可扩展的方式做到这一点。 请参阅笔记本以获取完整的源代码,并随时根据您自己的数据进行调整。

sm_sess = sagemaker.session.Session(boto_session=boto_sess, sagemaker_client=sm)
BUCKET = sm_sess.default_bucket()
PREFIX = 'amt-visualize-demo'
s3_data_url = f's3://{BUCKET}/{PREFIX}/data'
digits = datasets.load_digits()
digits_df = pd.DataFrame(digits.data)
digits_df['y'] = digits.target
digits_df.to_csv('data/digits.csv', index=False)
!aws s3 sync data/ {s3_data_url} —exclude '*' —include 'digits.csv'

digits.csv 文件包含特征数据和标签。 每个数字都由 8×8 图像中的像素值表示,如下图所示的数字 4。
来自 Scikit-learn 的数字数据集

准备训练脚本和框架依赖项

现在数据已存储在我们的 S3 存储桶中,我们可以根据以下内容定义自定义训练脚本 Scikit学习 在Python中。 SageMaker 为我们提供了稍后简单引用 Python 文件进行训练的选项。 任何依赖项(例如 Scikit-learn 或 pandas 库)都可以通过两种方式提供:

  • 它们可以在 requirements.txt 文件
  • 它们预先安装在底层 ML 容器映像中,该映像由 SageMaker 提供或定制

这两个选项通常被认为是依赖关系管理的标准方法,因此您可能已经熟悉它了。 SageMaker 支持 各种ML框架 在即用型托管环境中。 这包括许多最流行的数据科学和机器学习框架,如 PyTorch、TensorFlow 或 Scikit-learn,就像我们的例子一样。 我们不使用额外的 requirements.txt 文件,但请随意添加一些库来尝试一下。

我们的实现代码包含一个名为 fit(),它为数字识别任务创建一个新的分类器并对其进行训练。 与我们使用 SageMaker 内置 XGBoost 算法的第一篇文章相反,我们现在使用 RandomForestClassifier 由 ML 库 sklearn 提供。 的召唤 fit() 分类器对象上的方法使用 CSV 数据的子集 (80%) 开始训练过程:

def fit(train_dir, n_estimators, max_depth, min_samples_leaf, max_features, min_weight_fraction_leaf): digits = pd.read_csv(Path(train_dir)/'digits.csv') Xtrain, Xtest, ytrain, ytest = train_test_split(digits.iloc[:, :-1], digits.iloc[:, -1], test_size=.2) m = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, min_samples_leaf=min_samples_leaf, max_features=max_features, min_weight_fraction_leaf=min_weight_fraction_leaf) m.fit(Xtrain, ytrain) predicted = m.predict(Xtest) pre, rec, f1, _ = precision_recall_fscore_support(ytest, predicted, pos_label=1, average='weighted') print(f'pre: {pre:5.3f} rec: {rec:5.3f} f1: {f1:5.3}') return m

请参阅我们的 Jupyter 笔记本中的完整脚本 GitHub上.

在为完整的训练过程启动容器资源之前,您是否尝试直接运行脚本? 这是一个很好的做法,可以快速确保代码没有语法错误,尽早检查数据结构的匹配维度以及其他一些错误。

有两种方法可以在本地运行代码。 首先,您可以立即在笔记本中运行它,这还允许您使用 Python 调试器 pdb:

# Running the code from within the notebook. It would then be possible to use the Python Debugger, pdb.
from train import fit
fit('data', 100, 10, 1, 'auto', 0.01)

或者,以与在容器中使用它相同的方式从命令行运行训练脚本。 这还支持根据需要设置各种参数并覆盖默认值,例如:

!cd src && python train.py --train ../data/ --model-dir /tmp/ --n-estimators 100

作为输出,您可以看到基于客观指标精度、召回率和 F1 分数的模型性能的第一个结果。 例如, pre: 0.970 rec: 0.969 f1: 0.969.

对于如此快速的训练来说还不错。 但这些数字从何而来以及我们如何处理它们呢?

定义自定义目标指标

请记住,我们的目标是根据我们认为与任务相关的客观指标来充分训练和调整我们的模型。 由于我们使用自定义训练脚本,因此需要明确为 SageMaker 定义这些指标。

我们的脚本只需使用以下函数即可在训练期间发出指标精度、召回率和 F1 分数 print 功能:

print(f'pre: {pre:5.3f} rec: {rec:5.3f} f1: {f1:5.3}')

标准输出由 SageMaker 捕获并作为日志流发送到 CloudWatch。 为了检索指标值并稍后在 SageMaker AMT 中使用它们,我们需要提供一些有关如何解析该输出的信息。 我们可以通过定义正则表达式语句来实现这一点(更多信息,请参阅 使用 Amazon CloudWatch 指标监控和分析训练作业):

metric_definitions = [ {'Name': 'valid-precision', 'Regex': r'pre:s+(-?[0-9.]+)'}, {'Name': 'valid-recall', 'Regex': r'rec:s+(-?[0-9.]+)'}, {'Name': 'valid-f1', 'Regex': r'f1:s+(-?[0-9.]+)'}] 

让我们一起看一下前面代码中的第一个指标定义。 SageMaker 将在以以下开头的日志中查找输出 pre: and 后面跟着一个或多个空格,然后是我们要提取的数字,这就是我们使用圆括号的原因。 每次 SageMaker 找到这样的值时,它都会将其转换为名为 CloudWatch 的指标 valid-precision.

使用 Scikit-learn 框架训练模型

创建训练脚本后 train.py 并指导 SageMaker 如何监控 CloudWatch 中的指标,我们定义了一个 SageMaker 估算器 目的。 它启动训练作业并使用我们指定的实例类型。 但是这个实例类型与您运行的实例类型有何不同? 亚马逊SageMaker Studio 笔记本上,为什么? SageMaker Studio 在与笔记本不同的计算实例上运行训练(和推理)作业。 这允许您在后台运行作业时继续在笔记本中工作。

参数 framework_version 指我们用于训练工作的 Scikit-learn 版本。 或者,我们可以通过 image_uriestimator。 您可以检查您最喜欢的框架或 ML 库是否可以作为 预构建的 SageMaker Docker 镜像 并按原样使用它或 带扩展名.

此外,我们可以通过设置在 EC2 Spot 实例上运行 SageMaker 训练作业 use_spot_instancesTrue。 它们是备用容量实例,可以 节省高达 90% 的成本。 这些实例为训练作业的运行时间提供了灵活性。

estimator = SKLearn( 'train.py', source_dir='src', role=get_execution_role(), instance_type= 'ml.m5.large', instance_count=1, framework_version='0.23-1', metric_definitions=metric_definitions, # Uncomment the following three lines to use Managed Spot Training # use_spot_instances= True, # max_run= 60 * 60 * 24, # max_wait= 60 * 60 * 24, hyperparameters = {'n-estimators': 100, 'max-depth': 10, 'min-samples-leaf': 1, 'max-features': 'auto', 'min-weight-fraction-leaf': 0.1}
)

设置 Estimator 对象后,我们通过调用 fit() 函数,提供 Amazon S3 上训练数据集的路径。 我们可以使用相同的方法来提供验证和测试数据。 我们设置 wait 参数 True 所以我们可以在后续的代码单元中使用训练好的模型。

estimator.fit({'train': s3_data_url}, wait=True)

定义超参数并运行调整作业

到目前为止,我们已经使用一组超参数值训练了模型。 但这些价值观好吗? 或者我们可以寻找更好的吗? 让我们使用 超参数Tuner类 对超参数空间进行系统搜索。 我们如何使用调谐器搜索这个空间? 必要的参数是指导优化的目标指标名称和目标类型。 优化策略是调优器的另一个关键参数,因为它进一步定义了搜索空间。 以下是四种不同的策略可供选择:

  • 网格搜索
  • 随机搜索
  • 贝叶斯优化(默认)
  • 超频带

我们将在本文后面进一步描述这些策略,并为您提供一些选择策略的指导。

在定义和运行调谐器对象之前,让我们从架构的角度回顾一下我们的理解。 我们在中介绍了 SageMaker AMT 的架构概述 我们的上一篇文章 并为方便起见,在此处复制其摘录。

Amazon SageMaker 自动模型调优架构

我们可以选择要调整的超参数或保持静态。 对于动态超参数,我们提供 hyperparameter_ranges 可用于优化可调超参数。 因为我们使用随机森林分类器,所以我们利用了来自 Scikit-learn 随机森林文档.

我们还通过调优器可以使用的最大训练作业和并行训练作业数量来限制资源。 我们将看到这些限制如何帮助我们比较各种策略的结果。

tuner_parameters = { 'estimator': estimator, 'base_tuning_job_name': 'random', 'metric_definitions': metric_definitions, 'objective_metric_name': 'valid-f1', 'objective_type': 'Maximize', 'hyperparameter_ranges': hpt_ranges, 'strategy': 'Random', 'max_jobs': n, # 50 'max_parallel_jobs': k # 2 } 

与估算器类似 fit 函数,我们开始一个调优工作,调用调优器的 fit:

random_tuner = HyperparameterTuner(**tuner_parameters)
random_tuner.fit({'train': s3_data_url}, wait=False)

这就是我们需要做的所有事情,让 SageMaker 运行训练作业(n=50)在后台,每个都使用一组不同的超参数。 我们将在本文后面探讨结果。 但在此之前,让我们开始另一项调优工作,这次应用贝叶斯优化策略。 我们将在这两种策略完成后对其进行直观比较。

tuner_parameters['strategy'] = 'Bayesian'
tuner_parameters['base_tuning_job_name'] = 'bayesian'
bayesian_tuner = HyperparameterTuner(**tuner_parameters)
bayesian_tuner.fit({'train': s3_data_url}, wait=False)

请注意,两个调优器作业可以并行运行,因为 SageMaker 彼此独立地编排所需的计算实例。 这对于同时尝试不同方法的从业者来说非常有帮助,就像我们在这里所做的那样。

在 SageMaker HPO 策略之间进行选择

在调整策略方面,SageMaker AMT 有多种选择:网格搜索、随机搜索、贝叶斯优化和 Hyperband。 这些策略决定了自动调整算法如何探索指定的超参数范围。

随机搜索非常简单。 它从指定范围中随机选择值的组合,并且可以按顺序或并行方式运行。 这就像蒙着眼睛扔飞镖,希望能够击中目标。 我们已经从这一策略开始,但如果采用另一种策略,结果会有所改善吗?

贝叶斯优化采用与随机搜索不同的方法。 它考虑以前选择的历史并选择可能产生最佳结果的值。 如果您想从以前的探索中学习,您只能通过在之前的调整作业之后运行新的调整作业来实现这一点。 有道理,对吧? 这样,贝叶斯优化就依赖于之前的运行。 但是您知道什么 HPO 策略可以实现更高的并行化吗?

超频带 很有趣! 它使用多保真度策略,这意味着它会动态地将资源分配给最有前途的培训工作,并停止那些表现不佳的培训工作。 因此,Hyperband 在资源方面具有计算效率,可以从以前的训练作业中学习。 停止性能不佳的配置后,将启动新的配置,并随机选择其值。

根据您的需求和模型的性质,您可以选择随机搜索、贝叶斯优化或 Hyperband 作为调整策略。 每种方法都有自己的方法和优点,因此考虑哪种方法最适合您的 ML 探索非常重要。 对于 ML 从业者来说,好消息是您可以通过直观地比较每个试验对客观指标的影响来选择最佳的 HPO 策略。 在下一节中,我们将了解如何直观地识别不同策略的影响。

可视化、分析和比较调整结果

当我们的调优工作完成后,一切都会变得令人兴奋。 他们带来什么结果? 与您的基本模型相比,您期望我们的指标有什么样的提升? 对于我们的用例来说,性能最佳的超参数是什么?

查看 HPO 结果的一种快速、直接的方法是访问 SageMaker 控制台。 在下面 超参数调整作业,我们可以看到(每个调整作业)经过测试并提供了根据我们的目标指标衡量的最佳性能的超参数值的组合(valid-f1).

超参数调整作业的指标

这就是你所需要的吗? 作为一名 ML 从业者,您可能不仅对这些值感兴趣,而且肯定希望更多地了解模型的内部工作原理,以探索其全部潜力并通过经验反馈增强您的直觉。

一个好的可视化工具可以极大地帮助您了解 HPO 随着时间的推移所取得的改进,并获得有关 ML 模型设计决策的经验反馈。 它显示了每个单独的超参数对目标指标的影响,并提供进一步优化调整结果的指导。

我们使用 amtviz 自定义可视化包,用于可视化和分析调整作业。 它使用起来很简单,并提供有用的功能。 我们通过解释一些单独的图表来证明它的好处,最后将随机搜索与贝叶斯优化进行比较。

首先,让我们创建随机搜索的可视化。 我们可以通过调用来做到这一点 visualize_tuning_job()amtviz 并将我们的第一个调谐器对象作为参数传递:

from amtviz import visualize_tuning_job
visualize_tuning_job(random_tuner, advanced=True, trials_only=True)

您将看到几个图表,但让我们一步一步来。 输出的第一个散点图如下所示,并且已经为我们提供了一些我们在任何表格中都无法识别的视觉线索。

超参数优化作业结果

每个点代表个人训练工作的表现(我们的目标 valid-f1 y 轴)基于其开始时间(x 轴),由一组特定的超参数生成。 因此,我们会关注模型在调优工作期间的进展情况的性能。

虚线突出显示了迄今为止发现的最佳结果,并表明随着时间的推移有所改进。 最好的两个训练作业的 F1 分数约为 0.91。

除了显示累积进度的虚线之外,您在图表中看到了趋势吗?

可能不会。 这是预期的,因为我们正在查看随机 HPO 策略的结果。 每个训练作业都使用不同但随机选择的一组超参数来运行。 如果我们继续我们的调优工作(或使用相同的设置运行另一项调优工作),随着时间的推移,我们可能会看到一些更好的结果,但我们不能确定。 随机性是一件棘手的事情。

下一个图表可帮助您衡量超参数对整体性能的影响。 所有超参数都是可视化的,但为了简洁起见,我们重点关注其中两个: n-estimatorsmax-depth.

超参数作业详细信息

我们最重要的两项培训工作正在使用 n-estimators 大约20和80,以及 max-depth 分别约为10和18。 通过每个点(训练作业)的工具提示显示确切的超参数值。 它们甚至会在所有图表中动态突出显示,并为您提供多维视图! 你看到了吗? 每个超参数都根据目标指标绘制为单独的图表。

现在,我们得到了什么样的见解 n-estimators?

根据左图,与较高值相比,非常低的值范围(低于 10)通常会产生较差的结果。 因此,较高的值可能有助于您的模型表现更好——有趣。

相比之下,相关性 max-depth 我们的目标指标的超参数相当低。 从一般角度来看,我们无法清楚地判断哪些值范围表现更好。

总之,即使在相对较短的时间内,随机搜索也可以帮助您找到一组性能良好的超参数。 此外,它并不偏向于好的解决方案,而是提供了搜索空间的平衡视图。 然而,您的资源利用可能不是很有效。 它继续使用超参数运行训练作业,这些超参数的值范围已知会产生较差的结果。

让我们检查使用贝叶斯优化的第二次调整工作的结果。 我们可以用 amtviz 以与我们迄今为止对随机搜索调谐器所做的相同的方式可视化结果。 或者,更好的是,我们可以使用该函数的功能在一组图表中比较两个调整作业。 相当方便!

visualize_tuning_job([random_tuner, bayesian_tuner], advanced=True, trials_only=True)

超参数优化作业贝叶斯 VS 随机

现在有更多的点,因为我们可视化了随机搜索(橙色点)和贝叶斯优化(蓝色点)的所有训练作业的结果。 在右侧,您可以看到密度图,直观地显示所有 F1 分数的分布。 大部分训练作业都取得了 F1 等级上半部分的结果(超过 0.6)——这很好!

这里的关键要点是什么? 散点图清楚地显示了贝叶斯优化的好处。 随着时间的推移,它可以提供更好的结果,因为它可以从以前的运行中学习。 这就是为什么在相同数量的训练作业下,使用贝叶斯方法取得的结果明显优于随机方法(0.967 与 0.919)。

您还可以做更多事情 amtviz。 让我们深入了解一下。

如果您向 SageMaker AMT 指示运行大量作业进行调优,那么同时看到许多试验可能会变得混乱。 这就是我们使这些图表具有交互性的原因之一。 您可以单击并拖动每个超参数散点图,以放大到某些值范围并完善对结果的视觉解释。 所有其他图表都会自动更新。 这很有帮助,不是吗? 请参阅下面的图表作为示例,并在笔记本中亲自尝试一下!

超参数优化作业可视化功能

作为调优最大化主义者,您还可能认为运行另一个超参数调优作业可以进一步提高模型性能。 但这一次,可以探索更具体的超参数值范围,因为您已经(大致)知道在哪里可以获得更好的结果。 例如,您可以选择关注 100–200 之间的值 n-estimators,如图所示。 这让 AMT 专注于最有前途的训练工作并提高您的调优效率。

把它们加起来, amtviz 为您提供了一组丰富的可视化功能,使您可以更好地了解模型的超参数对性能的影响,并在调整活动中做出更明智的决策。

继续探索超参数空间并热启动 HPO 作业

我们已经看到 AMT 帮助我们有效地探索超参数搜索空间。 但是,如果我们需要多轮调整来迭代改进我们的结果怎么办? 正如一开始提到的,我们想要建立一个优化反馈循环——我们与模型的“对话”。 我们每次都需要从头开始吗?

让我们来看看运行的概念 热启动超参数调整作业。 它不会从头开始启动新的调整作业,而是重用之前 HPO 运行中学到的知识。 这有助于我们更有效地调整时间和计算资源。 我们可以在之前的结果的基础上进一步迭代。 为了使用热启动,我们创建一个 WarmStartConfig 并指定 warm_start_type as IDENTICAL_DATA_AND_ALGORITHM。 这意味着我们更改超参数值,但不更改数据或算法。 我们告诉 AMT 将以前的知识转移到我们新的调优工作中。

参考我们之前的贝叶斯优化和随机搜索调整工作 parents,我们可以使用它们来热启动:

warm_start_config = WarmStartConfig(warm_start_type=WarmStartTypes.IDENTICAL_DATA_AND_ALGORITHM, parents=[bayesian_tuner_name, random_tuner_name])
tuner_parameters['warm_start_config'] = warm_start_config

要了解使用热启动的好处,请参阅以下图表。 这些是由生成的 amtviz 与我们之前所做的类似,但这次我们添加了另一个基于热启动的调整工作。

超参数优化作业热启动

在左图中,我们可以观察到新的调优作业大部分位于性能指标图的右上角(参见橙色标记的点)。 热启动确实重用了之前的结果,这就是为什么这些数据点位于 F1 分数的顶部结果中。 这种改进也反映在右侧的密度图表中。

换句话说,AMT 根据之前试验的知识自动选择有希望的超参数值集。 下图显示了这一点。 例如,该算法将测试一个较低的值 n-estimators 较少出现,因为已知这些会产生较差的 F1 分数。 由于热启动,我们不会在这方面浪费任何资源。

超参数优化可视化作业

清理

为避免在完成 HPO 试验后产生不必要的费用,您必须删除 S3 存储桶中前缀为 amt-visualize-demo 并且 关闭 SageMaker Studio 资源.

在笔记本中运行以下代码以删除本文中的所有 S3 文件:

!aws s3 rm s3://{BUCKET}/amt-visualize-demo --recursive

如果您希望保留数据集或模型工件,您可以将代码中的前缀修改为 amt-visualize-demo/data 仅删除数据或 amt-visualize-demo/output 仅删除模型工件。

结论

我们了解了构建机器学习解决方案的艺术如何涉及探索和优化超参数。 调整这些旋钮和杠杆是一个要求很高但回报丰厚的过程,可以缩短训练时间、提高模型准确性并提供更好的整体机器学习解决方案。 SageMaker AMT 功能帮助我们运行多个调优作业并热启动它们,并提供数据点以供进一步审查、可视化比较和分析。

在这篇文章中,我们研究了与 SageMaker AMT 结合使用的 HPO 策略。 我们从随机搜索开始,这是一种简单但高性能的策略,其中超参数是从搜索空间中随机采样的。 接下来,我们将结果与贝叶斯优化进行比较,贝叶斯优化使用概率模型来指导搜索最佳超参数。 在我们通过初步试验确定了合适的 HPO 策略和良好的超参数值范围后,我们展示了如何使用热启动来简化未来的 HPO 作业。

您可以通过比较定量结果来探索超参数搜索空间。 我们建议进行并排视觉比较,并提供交互式探索所需的包。 请在评论中告诉我们它对您的超参数调整之旅有多大帮助!


关于作者

尤米特·约达斯尤米特·约达斯 是 Amazon Web Services 的高级解决方案架构师。 他与德国各行业的企业客户合作。 他致力于将人工智能概念转化为现实世界的解决方案。 工作之余,他享受与家人在一起的时光,品尝美食,追求健身。

埃琳娜·莱西克埃琳娜·莱西克 是一位位于慕尼黑的解决方案架构师。 她专注于金融服务行业的企业客户。 在空闲时间,您可以发现 Elina 在一些 IT 聚会上使用生成式 AI 构建应用程序,推动快速解决气候变化的新想法,或者在森林中跑步,准备一场与计划日程有典型偏差的半程马拉松。

马里亚诺坎普马里亚诺坎普 是 Amazon Web Services 的首席解决方案架构师。 他与德国的银行和保险公司合作研究机器学习。 业余时间,马里亚诺喜欢和妻子一起徒步旅行。

时间戳记:

更多来自 AWS机器学习