超参数调节概览

在机器学习中,超参数调节用于确定学习算法的一组最佳超参数。超参数是一个模型参数,其值在学习过程开始之前就已设置。而其他参数的值(例如线性模型的系数)是通过学习获得的。

超参数调节可让您减少手动迭代超参数的时间,并腾出更多时间专注于挖掘数据洞见。

您可以为以下模型类型指定超参数调节选项:

对于这些类型的模型,当您为 CREATE MODEL 语句中的 NUM_TRIALS 选项指定值时即启用超参数调节。

以下模型也支持超参数调节,但不允许指定特定值:

如需了解每种模型类型支持的 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_
FACTORIZATION
(显式)
MEAN_SQUARED_ERROR NUM_FACTORS

L2_REG
[2, 200]

(0, ∞)
[2, 20]

(0, 10]
LINEAR

LOG
MATRIX_
FACTORIZATION
(隐式)
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_
COMBINED_
CLASSIFIER
PRECISION

RECALL

ACCURACY

F1_SCORE

LOG_LOSS

ROC_AUC(默认)
BATCH_SIZE

DROPOUT

HIDDEN_UNITS

L1_REG

L2_REG

ACTIVATION_FN
(0, ∞)

[0, 1)

Array of [1, ∞)

(0, ∞)

(0, ∞)

{RELU, RELU6, CRELU, ELU, SELU, SIGMOID, TANH}
[16, 1024]

[0, 0.8]

不适用

(0, 10]

(0, 10]

不适用
LOG

LINEAR

不适用

LOG

LOG

不适用
DNN_LINEAR_
COMBINED_
REGRESSOR
MEAN_ABSOLUTE_ERROR

MEAN_SQUARED_ERROR

MEAN_SQUARED_LOG_ERROR

MEDIAN_ABSOLUTE_ERROR

R2_SCORE(默认)

EXPLAINED_VARIANCE
BOOSTED_TREE_
CLASSIFIER
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_
REGRESSOR






MEAN_ABSOLUTE_ERROR

MEAN_SQUARED_ERROR

MEAN_SQUARED_LOG_ERROR

MEDIAN_ABSOLUTE_ERROR

R2_SCORE(默认)

EXPLAINED_VARIANCE
RANDOM_FOREST_
CLASSIFIER
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_
REGRESSOR






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_RANGEHPARAM_CANDIDATES 为超参数指定搜索空间,则搜索会从该超参数的默认值开始,如该模型类型的 CREATE MODEL 主题中所述。例如,如果您要为提升树模型运行超参数调节,并且您未指定 L1_REG 超参数的值,那么搜索会从默认值 0 开始。

如果您使用 HPARAM_RANGEHPARAM_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.EVALUATEML.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 超参数调节提高模型性能