ハイパーパラメータ チューニングの概要
ML では、ハイパーパラメータ チューニングを行うことで、学習アルゴリズム用の一連の最適なハイパーパラメータを特定できます。ハイパーパラメータはモデルの引数で、その値は学習プロセスが始まる前に設定されます。一方で、線形モデルの係数などの他のパラメータ値は学習されます。
ハイパーパラメータ チューニングを使用すると、手動でハイパーパラメータを繰り返しテストする時間を減らし、データから分析情報を得るための作業により多くの時間を振り分けられるようになります。
次のモデルタイプにハイパーパラメータ チューニング オプションを指定できます。
これらのタイプのモデルでは、CREATE MODEL
ステートメントの NUM_TRIALS
オプションに値を指定すると、ハイパーパラメータ チューニングが有効になります。
線形回帰モデルでハイパーパラメータ チューニングの実行を試すには、BigQuery ML ハイパーパラメータ チューニングを使用してモデルのパフォーマンスを改善するをご覧ください。
次のモデルもハイパーパラメータ チューニングをサポートしていますが、特定の値の指定はできません。
- AutoML Tables モデルでは、デフォルトでモデル トレーニングにハイパーパラメータの自動調整が組み込まれています。
- ARIMA_PLUS モデルでは、
AUTO_ARIMA
引数を設定すると、auto.ARIMA アルゴリズムを使用してハイパーパラメータ チューニングを行うことができます。このアルゴリズムによって、トレンド モジュールのハイパーパラメータ チューニングが実行されます。ハイパーパラメータ チューニングは、モデリング パイプライン全体ではサポートされていません。
各モデルタイプでサポートされている SQL ステートメントと関数については、各モデルのエンドツーエンドのユーザー ジャーニーをご覧ください。
ロケーション
ハイパーパラメータ チューニングをサポートする場所については、BigQuery ML の場所をご覧ください。
ハイパーパラメータを設定する
ハイパーパラメータを調整するには、モデルが一連のトライアルに使用できるハイパーパラメータの値の範囲を指定する必要があります。これを行うには、CREATE MODEL
ステートメントでハイパーパラメータを設定する際に、単一の値を指定するのではなく、次のいずれかのキーワードを使用します。
HPARAM_RANGE
: ハイパーパラメータに対して連続値の探索空間の最小値と最大値を定義する 2 要素の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]
という値を指定すると、探索はデフォルト値の40
に最も近い値である30
から開始されます。
データ分割
NUM_TRIALS
オプションの値を指定すると、このサービスではハイパーパラメータ チューニングが行われていると判断され、入力データに対して自動的に 3 方向分割が実行されて、トレーニング セット、評価セット、テストセットに分割されます。デフォルトでは、入力データはランダム化され、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
で失敗した場合、トレーニング ジョブは停止し、ユーザーエラーを返します。NUM_TRIALS
値の 10% 未満がINTERNAL_ERROR
で失敗した場合、トレーニングは継続され、失敗したトライアルはML.TRIAL_INFO
関数の出力でFAILED
と表示されます。
モデル提供関数
ハイパーパラメータ チューニングからの出力モデルを、既存のさまざまなモデル サービング関数で使用できます。これらの関数を使用するには、次のルールに従います。
関数が入力データを受け取ると、1 つのトライアルの結果のみが返されます。デフォルトではこれは最適なトライアルですが、特定の関数の引数として
TRIAL_ID
を指定することで、特定のトライアルを選択することもできます。TRIAL_ID
は、ML.TRIAL_INFO
関数の出力から取得できます。次の関数がサポートされています。関数が入力データを受け取らない場合、すべてのトライアル結果が返され、最初の出力列は
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 価格モデルと同じです。
よくある質問
モデルの調整に必要なトライアルの回数
1 つのハイパーパラメータに対して少なくとも 10 回のトライアルを使用することをおすすめします。このため、トライアルの合計数は 10 * num_hyperparameters
以上にする必要があります。デフォルトの探索空間を使用している場合は、ハイパーパラメータと目標テーブルのハイパーパラメータ列を参照して、特定のモデルタイプに対してデフォルトで調整されたハイパーパラメータの数を確認してください。
ハイパーパラメータ チューニングを使用してもパフォーマンスが向上しない場合はどうすればよいですか?
公正な比較を行うために、必ずこのドキュメントのガイダンスに従ってください。それでもパフォーマンスの改善が見られない場合は、デフォルトのハイパーパラメータがすでにうまく機能している可能性があります。ハイパーパラメータ チューニングを再度行う前に、特徴量エンジニアリングに集中するか、他のモデルタイプを試すことをおすすめします。
モデルの調整を続ける場合はどうすればよいですか?
同じ探索空間を使用して新しいハイパーパラメータ チューニング モデルをトレーニングします。組み込みの転移学習を使用すると、事前に調整されたモデルに基づいて調整を続けることができます。
すべてのデータと最適なハイパーパラメータでモデルを再トレーニングする必要がありますか?
これは、次の要因によって異なります。
K 平均法モデルはすべてのデータをトレーニング データとしてすでに使用しているため、モデルを再トレーニングする必要はありません。
行列分解モデルの場合、選択したハイパーパラメータとすべての入力データでモデルを再トレーニングして、ユーザーとアイテムの範囲を広げることができます。
他のすべてのモデルタイプでは、通常、再トレーニングは不要です。このサービスはで、デフォルトのランダムデータ分割中に、トレーニング用の入力データの 80% をすでに保持しています。データセットが小さい場合は、より多くのトレーニング データと選択したハイパーパラメータでモデルを再トレーニングできますが、早期停止のために評価データがほとんど残らないと、過剰適合が悪化する可能性があります。
次のステップ
ハイパーパラメータ チューニングの実行を試すには、BigQuery ML ハイパーパラメータ チューニングを使用してモデルのパフォーマンスを改善するをご覧ください。