超参数调节概览
在机器学习中,超参数调节用于确定学习算法的一组最佳超参数。超参数是一个模型参数,其值在学习过程开始之前就已设置。而其他参数的值(例如线性模型的系数)是通过学习获得的。
超参数调节可让您减少手动迭代超参数的时间,并腾出更多时间专注于挖掘数据洞见。
您可以为以下模型类型指定超参数调节选项:
对于这些类型的模型,当您为 CREATE MODEL
语句中的 NUM_TRIALS
选项指定值时即启用超参数调节。
如需尝试在线性回归模型上运行超参数调优,请参阅使用 BigQuery ML 超参数调优提高模型性能。
以下模型也支持超参数调节,但不允许指定特定值:
- 默认情况下,AutoML Tables 模型在模型训练中嵌入自动超参数调节。
- ARIMA_PLUS 模型可让您设置
AUTO_ARIMA
参数,以使用 auto.ARIMA 算法执行超参数调节。此算法针对趋势模块执行超参数调节。不支持针对整个建模流水线进行超参数调节。
如需了解每种模型类型支持的 SQL 语句和函数,请参阅每个模型的端到端用户体验历程。
位置
如需了解哪些位置支持超参数调节,请参阅 BigQuery ML 位置。
设置超参数
如需调节超参数,您必须为该超参数指定一系列值,供模型用于进行一组试验。为此,您可以在 CREATE MODEL
语句中设置超参数时使用以下关键字之一,而不是提供单个值:
HPARAM_RANGE
:一个双元素ARRAY(FLOAT64)
值,用于定义超参数连续值的搜索空间的最小和最大边界。使用此选项可为超参数指定值范围,例如LEARN_RATE = HPARAM_RANGE(0.0001, 1.0)
。HPARAM_CANDIDATES
:用于为超参数指定一组离散值的ARRAY(STRUCT)
值。使用此选项可为超参数指定一组值,例如OPTIMIZER = HPARAM_CANDIDATES(['ADAGRAD', 'SGD', 'FTRL'])
。
超参数和目标
下表列出了支持超参数调节的每个模型类型支持的超参数和目标:
模型类型 | 超参数目标 | 超参数 | 有效范围 | 默认范围 | 刻度类型 |
---|---|---|---|---|---|
LINEAR_REG
|
MEAN_ABSOLUTE_ERROR
MEAN_SQUARED_ERROR
MEAN_SQUARED_LOG_ERROR
MEDIAN_ABSOLUTE_ERROR
R2_SCORE (默认)
EXPLAINED_VARIANCE
|
L1_REG
L2_REG
|
(0, ∞]
(0, ∞]
|
(0, 10]
(0, 10]
|
LOG
LOG
|
LOGISTIC_REG
|
PRECISION
RECALL
ACCURACY
F1_SCORE
LOG_LOSS
ROC_AUC (默认)
|
L1_REG
L2_REG
|
(0, ∞]
(0, ∞]
|
(0, 10]
(0, 10]
|
LOG
LOG
|
KMEANS
|
DAVIES_BOULDIN_INDEX
|
NUM_CLUSTERS
|
[2, 100]
|
[2, 10]
|
LINEAR
|
MATRIX_ (显式)
|
MEAN_SQUARED_ERROR
|
NUM_FACTORS
L2_REG
|
[2, 200]
(0, ∞)
|
[2, 20]
(0, 10]
|
LINEAR
LOG
|
MATRIX_ (隐式)
|
MEAN_AVERAGE_PRECISION (默认)
MEAN_SQUARED_ERROR
NORMALIZED_DISCOUNTED_CUMULATIVE_GAIN
AVERAGE_RANK
|
NUM_FACTORS
L2_REG
WALS_ALPHA
|
[2, 200]
(0, ∞)
[0, ∞)
|
[2, 20]
(0, 10]
[0, 100]
|
LINEAR
LOG
LINEAR
|
AUTOENCODER
|
MEAN_ABSOLUTE_ERROR
MEAN_SQUARED_ERROR (默认)
MEAN_SQUARED_LOG_ERROR
|
LEARN_RATE
BATCH_SIZE
L1_REG
L2_REG
L1_REG_ACTIVATION
DROPOUT
HIDDEN_UNITS
OPTIMIZER
ACTIVATION_FN
|
[0, 1]
(0, ∞)
(0, ∞)
(0, ∞)
(0, ∞)
[0, 1)
[1, ∞) 数组
{ ADAM , ADAGRAD , FTRL , RMSPROP , SGD }
{ RELU , RELU6 , CRELU , ELU , SELU , SIGMOID , TANH }
|
[0, 1]
[16, 1024]
(0, 10]
(0, 10]
(0, 10]
[0, 0.8]
不适用 { ADAM , ADAGRAD , FTRL , RMSPROP , SGD }
不适用 |
LOG
LOG
LOG
LOG
LOG
LINEAR
不适用 不适用 不适用 |
DNN_CLASSIFIER
|
PRECISION
RECALL
ACCURACY
F1_SCORE
LOG_LOSS
ROC_AUC (默认)
|
BATCH_SIZE
DROPOUT
HIDDEN_UNITS
LEARN_RATE
OPTIMIZER
L1_REG
L2_REG
ACTIVATION_FN
|
(0, ∞)
[0, 1)
[1, ∞) 数组
[0, 1]
{ ADAM , ADAGRAD , FTRL , RMSPROP , SGD }
(0, ∞)
(0, ∞)
{ RELU , RELU6 , CRELU , ELU , SELU , SIGMOID , TANH }
|
[16, 1024]
[0, 0.8]
不适用 [0, 1]
{ ADAM , ADAGRAD , FTRL , RMSPROP , SGD }
(0, 10]
(0, 10]
不适用 |
LOG
LINEAR
不适用 LINEAR
不适用 LOG
LOG
不适用 |
DNN_REGRESSOR
|
MEAN_ABSOLUTE_ERROR
MEAN_SQUARED_ERROR
MEAN_SQUARED_LOG_ERROR
MEDIAN_ABSOLUTE_ERROR
R2_SCORE (默认)
EXPLAINED_VARIANCE
|
||||
DNN_LINEAR_
|
PRECISION
RECALL
ACCURACY
F1_SCORE
LOG_LOSS
ROC_AUC (默认)
|
BATCH_SIZE
DROPOUT
HIDDEN_UNITS
L1_REG
L2_REG
ACTIVATION_FN
|
(0, ∞)
|
[16, 1024]
[0, 0.8]
不适用 (0, 10]
(0, 10]
不适用 |
LOG
LINEAR
不适用 LOG
LOG
不适用 |
DNN_LINEAR_
|
MEAN_ABSOLUTE_ERROR
MEAN_SQUARED_ERROR
MEAN_SQUARED_LOG_ERROR
MEDIAN_ABSOLUTE_ERROR
R2_SCORE (默认)
EXPLAINED_VARIANCE
|
||||
BOOSTED_TREE_
|
PRECISION
RECALL
ACCURACY
F1_SCORE
LOG_LOSS
ROC_AUC (默认)
|
LEARN_RATE
L1_REG
L2_REG
DROPOUT
MAX_TREE_DEPTHMAX_TREE_DEPTH
SUBSAMPLE
MIN_SPLIT_LOSS
NUM_PARALLEL_TREE
MIN_TREE_CHILD_WEIGHT
COLSAMPLE_BYTREE
COLSAMPLE_BYLEVEL
COLSAMPLE_BYNODE
BOOSTER_TYPE
DART_NORMALIZE_TYPE
TREE_METHOD
|
[0, ∞)
(0, ∞)
(0, ∞)
[0, 1]
[1, 20]
(0, 1]
[0, ∞)
[1, ∞)
[0, ∞)
[0, 1]
[0, 1]
[0, 1]
{ GBTREE , DART }
{ TREE , FOREST }
{ AUTO , EXACT , APPROX , HIST }
|
[0, 1]
(0, 10]
(0, 10]
不适用 [1, 10]
(0, 1]
不适用 不适用 不适用 不适用 不适用 不适用 不适用 不适用 不适用 |
LINEAR
LOG
LOG
LINEAR
LINEAR
LINEAR
LINEAR
LINEAR
LINEAR
LINEAR
LINEAR
LINEAR
不适用 不适用 不适用 |
BOOSTED_TREE_ |
MEAN_ABSOLUTE_ERROR
MEAN_SQUARED_ERROR
MEAN_SQUARED_LOG_ERROR
MEDIAN_ABSOLUTE_ERROR
R2_SCORE (默认)
EXPLAINED_VARIANCE
|
||||
RANDOM_FOREST_
|
PRECISION
RECALL
ACCURACY
F1_SCORE
LOG_LOSS
ROC_AUC (默认)
|
L1_REG
L2_REG
MAX_TREE_DEPTH
SUBSAMPLE
MIN_SPLIT_LOSS
NUM_PARALLEL_TREE
MIN_TREE_CHILD_WEIGHT
COLSAMPLE_BYTREE
COLSAMPLE_BYLEVEL
COLSAMPLE_BYNODE
TREE_METHOD
|
(0, ∞)
(0, ∞)
[1, 20]
(0, 1)
[0, ∞)
[2, ∞)
[0, ∞)
[0, 1]
[0, 1]
[0, 1]
{ AUTO , EXACT , APPROX , HIST }
|
(0, 10]
(0, 10]
[1, 20]
(0, 1)
不适用 [2, 200]
不适用 不适用 不适用 不适用 不适用 |
LOG
LOG
LINEAR
LINEAR
LINEAR
LINEAR
LINEAR
LINEAR
LINEAR
LINEAR
不适用 |
RANDOM_FOREST_ |
MEAN_ABSOLUTE_ERROR
MEAN_SQUARED_ERROR
MEAN_SQUARED_LOG_ERROR
MEDIAN_ABSOLUTE_ERROR
R2_SCORE (默认)
EXPLAINED_VARIANCE
|
大多数 LOG
刻度超参数使用 0
作为开区间最小边界值。您仍然可以通过使用 HPARAM_RANGE
关键字设置超参数范围来将 0
设置为最小边界值。例如,在提升树分类器模型中,您可以将 L1_REG
超参数的范围设置为 L1_REG = HPARAM_RANGE(0, 5)
。值 0
将转换为 1e-14
。
支持有条件超参数。例如,在提升树回归器模型中,如果 BOOSTER_TYPE
超参数的值为 DART
,您只能调节 DART_NORMALIZE_TYPE
超参数。在这种情况下,您可以指定自动处理搜索空间和条件,如以下示例所示:
BOOSTER_TYPE = HPARAM_CANDIDATES(['DART', 'GBTREE'])
DART_NORMALIZE_TYPE = HPARAM_CANDIDATES(['TREE', 'FOREST'])
搜索起点
如果您没有使用 HPARAM_RANGE
或 HPARAM_CANDIDATES
为超参数指定搜索空间,则搜索会从该超参数的默认值开始,如该模型类型的 CREATE MODEL
主题中所述。例如,如果您要为提升树模型运行超参数调节,并且您未指定 L1_REG
超参数的值,那么搜索会从默认值 0
开始。
如果您使用 HPARAM_RANGE
或 HPARAM_CANDIDATES
为超参数指定了搜索空间,搜索起点取决于指定的搜索空间是否包含该超参数的默认值,如该模型类型的 CREATE MODEL
主题中所述:
- 如果指定的范围包含默认值,则默认值是搜索的起点。例如,如果您要为隐式矩阵分解模型运行超参数调节,并为
WALS_ALPHA
超参数指定值[20, 30, 40, 50]
,则搜索会从默认值40
开始。 - 如果指定的范围不包含默认值,则搜索会从指定范围内最接近默认值的点开始。例如,如果您为
WALS_ALPHA
超参数指定值[10, 20, 30]
,则搜索会从30
开始,这是与默认值40
最接近的值。
数据拆分
当您为 NUM_TRIALS
选项指定值时,服务会识别到您要执行超参数调节并自动将输入数据拆分为三部分,即训练集、评估集和测试集。默认情况下,输入数据会随机拆分,80% 用于训练,10% 用于评估,10% 用于测试。
训练集和评估集用于每个试验训练,这与不使用超参数调节的模型相同。试验超参数建议是根据该模型类型的模型评估指标计算的。在每个试验训练结束时,测试集会用于测试试验并在模型中记录其指标。这样可以通过使用模型尚未分析的数据来确保最终报告评估指标的客观性。评估数据用于计算超参数建议的中间指标,而测试数据用于计算最终的目标模型指标。
如果您只想使用训练集,请为 CREATE MODEL
语句的 DATA_SPLIT_METHOD
选项指定 NO_SPLIT
。
如果您只想使用训练集和评估集,请为 CREATE MODEL
语句的 DATA_SPLIT_TEST_FRACTION
选项指定 0
。当测试集为空时,评估集用作最终评估指标报告的测试集。
只有当数据拆分比例相等时,通过正常训练作业生成的模型指标与超参数调节训练作业生成的指标才可进行比较。例如,以下模型是可比较的:
- 非超参数调节:
DATA_SPLIT_METHOD='RANDOM', DATA_SPLIT_EVAL_FRACTION=0.2
- 超参数调节:
DATA_SPLIT_METHOD='RANDOM', DATA_SPLIT_EVAL_FRACTION=0.2, DATA_SPLIT_TEST_FRACTION=0
性能
使用超参数调节时的模型性能通常不低于使用默认超空间且不使用超参数调节时的模型性能。使用默认搜索空间且不使用超参数调节的模型在第一次试验中始终使用默认超参数。
如需确认超参数调节导致的模型性能提升,请将超参数调节模型的最佳试验与非超参数调节模型的第一个试验进行比较。
迁移学习
当您将 CREATE MODEL
语句中的 HPARAM_TUNING_ALGORITHM
选项设置为 VIZIER_DEFAULT
时,系统会默认启用迁移学习。如果模型符合以下要求,则该模型的超参数调节可以从之前调节的模型中学习:
- 它与之前调节的模型类型相同。
- 它与之前调节的模型属于同一项目。
- 它使用与之前调节的模型相同的超参数搜索空间或该超参数搜索空间的子集。子集使用相同的超参数名称和类型,但不需要具有相同的范围。例如,
(a:[0, 10])
被视为(a:[-1, 1], b:[0, 1])
的子集。
迁移学习不要求输入数据相同。
迁移学习有助于解决冷启动问题,即系统在第一批试验期间执行随机探索。迁移学习为系统提供了一些有关超参数及其目标的初步知识。如需持续提高模型质量,请始终使用相同的超参数或这些超参数的子集来训练新的超参数调节模型。
迁移学习可帮助超参数调节更快地收敛,而不是帮助子模型收敛。
错误处理
超参数调节通过以下方式处理错误:
取消:如果训练作业在运行时取消,则所有成功的试验仍然可用。
输入无效:如果用户输入无效,则服务会返回用户错误。
超参数无效:如果超参数对于试验无效,则该试验会被跳过,并在
ML.TRIAL_INFO
函数的输出中标记为INFEASIBLE
。试验内部错误:如果
NUM_TRIALS
值中有超过 10% 因INTERNAL_ERROR
失败,则训练作业会停止并返回用户错误。如果不到 10% 的
NUM_TRIALS
值因INTERNAL_ERROR
失败,训练会继续,但失败的试验会在ML.TRIAL_INFO
函数的输出中标记为FAILED
。
模型服务函数
您可以将超参数调节的输出模型与许多现有的模型服务函数搭配使用。如需使用这些函数,请遵循以下规则:
当函数接受输入数据时,仅返回一个试验的结果。默认情况下,这是最佳试验,但您也可以通过指定
TRIAL_ID
作为给定函数的参数来选择特定试验。您可以从ML.TRIAL_INFO
函数的输出中获取TRIAL_ID
。支持以下函数:当函数不接受输入数据时,返回所有试验结果,第一个输出列为
TRIAL_ID
。支持以下函数:
ML.FEATURE_INFO
的输出不会改变,因为所有试验共享相同的输入数据。
由于输入数据的拆分方式,ML.EVALUATE
和 ML.TRIAL_INFO
的评估指标可能会有所不同。默认情况下,ML.EVALUATE
针对测试数据运行,而 ML.TRIAL_INFO
针对评估数据运行。如需了解详情,请参阅数据拆分。
不受支持的函数
ML.TRAINING_INFO
函数会返回每次迭代的信息,并且迭代结果不会保存在超参数调节模型中,而是会保存试验结果。您可以使用 ML.TRIAL_INFO
函数获取有关试验结果的信息。
模型导出
您可以使用 EXPORT MODEL
语句将使用超参数调节创建的模型导出到 Cloud Storage 位置。您可以导出默认的最佳试验或任何指定的试验。
价格
超参数调节训练的费用是所有已执行试验的费用之和。试验价格与现有的 BigQuery ML 价格模式一致。
常见问题解答
调节模型需要多少个试验?
我们建议一个超参数至少使用 10 个试验,因此试验总数应至少为 10 * num_hyperparameters
。如果您使用默认搜索空间,请参阅超参数和目标表中的超参数列,以获取默认为给定模型类型调节的超参数数量。
如果使用超参数调节后性能没有提升,该怎么办?
请务必遵循本文档中的指导以进行公平的比较。如果性能仍然没有提升,则可能表示默认超参数的表现已经非常好。建议您关注特征工程或尝试其他模型类型,然后再尝试进行一轮超参数调节。
如果我想继续调节模型,该怎么办?
使用相同的搜索空间训练新的超参数调节模型。内置的迁移学习功能可根据您先前调节的模型继续进行调节。
我需要使用所有数据和最佳超参数重新训练模型吗?
这取决于以下因素:
K-means 模型已使用所有数据作为训练数据,因此无需重新训练模型。
对于矩阵分解模型,您可以使用选定的超参数和所有输入数据重新训练模型,以更好地覆盖用户和项。
对于所有其他模型类型,通常无需重新训练。在默认的随机数据拆分期间,服务已经保留 80% 的输入数据用于训练。如果您的数据集较小,您仍然可以使用更多训练数据和选定的超参数重新训练模型,但使用太少的评估数据以实现早停可能会使过拟合恶化。
后续步骤
如需尝试运行超参数调节,请参阅使用 BigQuery ML 超参数调节提高模型性能。