超参数调节利用 Google Cloud 的处理基础架构在训练模型时测试不同的超参数配置。它可以为超参数提供优化值,从而最大限度地提高模型的预测准确率。
什么是超参数?
超参数包含监管训练过程本身的数据。
在您的训练应用训练模型时,会处理三类数据:
您的输入数据(也称为训练数据)是一种记录集合,其中的每条记录(实例)都包含对于您的机器学习问题至关重要的特征。此数据用于在训练过程中配置模型,以准确地预测类似数据的新实例。但是,输入数据中的值永远不会直接成为模型的一部分。
模型的参数是您选定的机器学习技术用于调整数据的变量。例如,深度神经网络 (DNN) 由处理节点(神经元)组成,每个处理节点都具有在数据通过网络时对数据执行的操作。在您的 DNN 经过训练后,每个节点都带有一个权重值,告知模型该节点对最终预测的影响程度。这些权重值是模型参数的一个示例。从许多方面来看,模型的参数本身也是模型 - 它们将您的特定模型与处理类似数据的同类其他模型区分开来。
超参数是管理训练过程本身的变量。例如,设计 DNN 的一部分,决定输入和输出层之间应使用多少个隐藏层,以及每个隐藏层应使用多少节点。这些变量与训练数据没有直接关系。它们属于配置变量。 请注意,参数在训练作业执行期间会发生变化,而超参数在作业执行期间通常保持不变。
您的模型参数由训练过程进行优化(也可以说“调节”):您通过操控模型来运行数据,将所得到的预测与各数据实例的实际值比较,评估准确性,并进行调节,直至找到最佳值为止。超参数通过您的整个训练作业的运行进行调节,它会关注聚合准确度并做出相应调整。在两种情况下,您都要修改模型的组成,以便找到最佳组合来处理您的问题。
如果没有 Vertex AI 超参数调节等自动化技术,您需要在非常多次的训练运行过程中手动调节超参数,才能使其达到最优值。超参数调节使确定最佳超参数设置的过程更容易、不繁琐。
超参数调节的工作原理
超参数调节通过运行您指定的训练应用的多个试验,并在您指定的限制范围内运行。Vertex AI 会跟踪每次试验的结果,并针对后续试验进行调整。在作业完成后,您可以根据指定标准获得所有试验的摘要以及最有效的值配置。
超参数调节需要在 Vertex AI 与您的训练应用之间进行明确通信。您的训练应用定义了模型所需的全部信息。 您可以定义要调节的超参数(变量),以及用于评估每个试验的目标变量。
除了贝叶斯优化之外,Vertex AI 还可以优化超参数调节作业。如果您正在针对类似模型进行超参数调节,仅更改目标函数或添加新输入列,则 Vertex AI 可以随着时间的推移而实现改进,使超参数调节更加有效。
超参数调节优化哪些方面
超参数调节可优化您指定的目标变量,称为超参数指标。通过评估过程计算得出的模型准确率是一个常见的指标。指标必须是数字。
配置超参数调节作业时,您可以定义每个指标的名称和目标。目标用于指定是否要调整模型,以便最大化或最大限度地降低此指标的值。
Vertex AI 如何获取您的指标
使用 cloudml-hypertune
Python 软件包将指标传递给 Vertex AI。此库提供用于向 Vertex AI 报告指标的辅助函数。
超参数值流
如果不使用超参数调节,您可以在训练应用中通过自己喜爱的任何方法设置超参数。例如,您可以将命令行参数传递给主应用模块来配置超参数,或者在配置文件中将超参数提供给应用。
使用超参数调节时,您必须使用以下过程设置用于调节的超参数值:
在主训练模块中为每个经过调节的超参数定义命令行参数。
使用这些参数中传递的值,在应用的代码中设置相应的超参数。
配置超参数调节作业时,您需要定义要调节的每个超参数、其数据类型以及要尝试的值范围。使用与主模块中定义的相应参数相同的名称标识每个超参数。训练服务包括运行应用时使用这些名称的命令行参数。
选择要调节的超参数
关于应如何选择要调节的超参数,可以提供的普遍性建议少之又少。如果您对自己所使用的机器学习技术有经验,那么可能十分了解其超参数的行为方式。您也可以在机器学习社区中找到建议。
无论您作出怎样的选择,了解其含义都很重要。您选择调节的每个超参数都有可能导致成功的调节作业所需的试验次数增加。当您在 Vertex AI 上运行超参数调节作业时,您需要支付的费用基于您的超参数调节作业运行的试验时长。精心选择超参数,可扩缩超参数调节作业的时间和费用。
超参数数据类型
在 ParameterSpec 对象中,您可以将超参数数据类型指定为参数值规范的实例。下表列出了支持的参数值规范。
类型 | 数据类型 | 值范围 | 值数据 |
---|---|---|---|
DoubleValueSpec |
DOUBLE |
minValue 和 maxValue |
浮点值 |
IntegerValueSpec |
INTEGER |
minValue 和 maxValue |
整数值 |
CategoricalValueSpec |
CATEGORICAL |
categoricalValues |
类别字符串列表 |
DiscreteValueSpec |
DISCRETE |
discreteValues |
按升序排列的值列表 |
扩缩超参数
在 ParameterSpec
对象中,您可以指定应在此超参数上执行扩缩操作。建议对 DOUBLE 和 INTEGER 数据类型执行扩缩。可用的扩缩类型如下:
SCALE_TYPE_UNSPECIFIED
:此超参数没有应用扩缩。UNIT_LINEAR_SCALE
:将可行空间线性扩展为 0 到 1。UNIT_LOG_SCALE
:将可行空间扩展为 0 到 1。整个可行空间必须严格为正。UNIT_REVERSE_LOG_SCALE
:将对空间的“反向”缩放为 0 到 1。因此,靠近可行空间顶部的值比靠近底部的点分布得更多。整个可行空间必须严格为正。
条件式超参数
通过 ConditionalParameterSpec
对象,您可以在其父级超参数的值与您指定的条件匹配时向试验添加超参数。
例如,您可以定义超参数调节作业,以使用线性回归或深度神经网络 (DNN) 找到最佳模型。要让调节作业指定训练方法,您可以定义一个名为training_method
选项:LINEAR_REGRESSION
和DNN
。当 training_method
为 LINEAR_REGRESSION
时,您的调节作业必须为学习速率指定超参数。当 training_method
为 DNN
时,您的调节作业必须指定学习速率和隐藏层数的参数。
由于隐藏层的数量仅在试验的 training_method
等于 DNN
时您可以定义条件参数,当 training_method
等于 DNN
时,将添加名为 num_hidden_layers
的超参数。
由于两个 training_method
选项都使用学习速率,因此您必须确定是否应共享此条件超参数。如果超参数共享,则调节作业会使用从 LINEAR_REGRESSION
和 DNN
试验中学到的规律来调整学习速率。在这种情况下,合理的做法是为每个 training_method
单独学习速率,因为使用 LINEAR_REGRESSION
训练模型的学习速率不会影响训练的学习速率使用 DNN
构建模型。因此,您需要定义以下条件超参数:
- 在
training_method
为LINEAR_REGRESSION
时添加名为learning_rate
的超参数。 - 在
training_method
为DNN
时添加名为learning_rate
的超参数。
借助条件超参数,您可以将调节作业的超参数定义为图表。这样您便可以使用不同的训练技术调整训练过程,每种方法都有自己的超参数依赖项。
搜索算法
您可以在 StudySpec
对象中指定搜索算法。如果您没有指定算法,则您的作业将使用默认的 Vertex AI 算法。默认算法使用贝叶斯优化来找到最佳解决方案,对参数空间进行更有效的搜索。
可用的值包括:
ALGORITHM_UNSPECIFIED
:等同于不指定算法。Vertex AI 会在高斯过程搜索、线性组合搜索和它们的变体之间选择最优搜索算法。GRID_SEARCH
:在可行空间内执行简单的网格搜索。如果您要指定的试验次数超过可行空间中的点数,则此选项特别有用。这种情况下,如果您未指定网格搜索,Vertex AI 默认算法可能会生成重复的建议。要使用网格搜索,所有参数都必须是INTEGER
、CATEGORICAL
或DISCRETE
类型。RANDOM_SEARCH
:在可行空间内执行的简单随机搜索。
后续步骤
- 了解如何为训练作业实现超参数调节
- 阅读有关贝叶斯优化和超参数调节的博文。