ハイパーパラメータ調整の使用

このページでは、モデルをトレーニングする際に Cloud Machine Learning Engine のハイパーパラメータの調整を使用する方法を示します。ハイパーパラメータ調整は、デベロッパーが指定するターゲット変数を最適化します。ターゲット変数は、ハイパーパラメータ指標と呼ばれます。ハイパーパラメータ調整ありのジョブを開始するときに、ハイパーパラメータ指標の名前を設定します。これは、トレーナーに追加するスカラー サマリーに割り当てる名前です。

ハイパーパラメータの調整の手順

トレーニング ジョブでハイパーパラメータ調整を使用するには、次の操作を行います。

  1. TrainingInput オブジェクトに HyperparameterSpec を含めることで、トレーニング ジョブ用のハイパーパラメータ調整の構成を指定します。

  2. トレーニング アプリケーションに次のコードを追加します。

    • 調整するハイパーパラメータを表すコマンドライン引数を解析し、その値を使用してトレーニング トライアルのハイパーパラメータを設定します。
    • ハイパーパラメータ指標をグラフのサマリーに追加します。

以下は各手順の詳細です。

トレーニング ジョブ用のハイパーパラメータ調整の構成の指定

トレーニング ジョブ用のハイパーパラメータ調整の構成を格納する HyperparameterSpec オブジェクトを作成し、HyperparameterSpechyperparameters オブジェクトとして TrainingInput オブジェクトに追加します。

HyperparameterSpec で、選択した指標を表す値を hyperparameterMetricTag に設定します。たとえば、metric1 です。hyperparameterMetricTag を指定しない場合、Cloud ML Engine は training/hptuning/metric という名前の指標を探します。

gcloud

ハイパーパラメータ構成の情報を、構成 YAML ファイルに追加します。下記の例をご覧ください。作業用構成ファイルについては、Estimator の国勢調査サンプルの hptuning_config.yaml をご覧ください。

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  hyperparameters:
    goal: MAXIMIZE
    hyperparameterMetricTag: metric1
    maxTrials: 30
    maxParallelTrials: 1
    enableTrialEarlyStopping: True
    params:
    - parameterName: hidden1
      type: INTEGER
      minValue: 40
      maxValue: 400
      scaleType: UNIT_LINEAR_SCALE
    - parameterName: numRnnCells
      type: DISCRETE
      discreteValues:
      - 1
      - 2
      - 3
      - 4
    - parameterName: rnnCellType
      type: CATEGORICAL
      categoricalValues:
      - BasicLSTMCell
      - BasicRNNCell
      - GRUCell
      - LSTMCell
      - LayerNormBasicLSTMCell

Python

HyperparameterSpec を表すディクショナリを作成し、トレーニング入力に追加します。次の例は、トレーニング ジョブ構成ガイドで説明されている TrainingInput 辞書(ここでの名前は training_inputs)が作成済みであることを前提としています。

# Add hyperparameter tuning to the job config.
hyperparams = {
    'goal': 'MAXIMIZE',
    'hyperparameterMetricTag': 'metric1',
    'maxTrials': 30,
    'maxParallelTrials': 1,
    'enableTrialEarlyStopping': True,
    'params': []}

hyperparams['params'].append({
    'parameterName':'hidden1',
    'type':'INTEGER',
    'minValue': 40,
    'maxValue': 400,
    'scaleType': 'UNIT_LINEAR_SCALE'})

hyperparams['params'].append({
    'parameterName':'numRnnCells',
    'type':'DISCRETE',
    'discreteValues': [1, 2, 3, 4]})

hyperparams['params'].append({
    'parameterName':'rnnCellType',
    'type': 'CATEGORICAL',
    'categoricalValues': [
        'BasicLSTMCell',
        'BasicRNNCell',
        'GRUCell',
        'LSTMCell',
        'LayerNormBasicLSTMCell'
    ]
})

# Add hyperparameter specification to the training inputs dictionary.
training_inputs['hyperparameters'] = hyperparams

# Build the job spec.
job_spec = {'jobId': my_job_name, 'trainingInput': training_inputs}

トレーニング アプリケーションのコードの確認

アプリケーションで、ハイパーパラメータのコマンドライン引数を処理し、指標をグラフのサマリーに追加します。

調整するハイパーパラメータのコマンドライン引数の処理

Cloud ML Engine は、トレーニング アプリケーションを呼び出すときにコマンドライン引数を設定します。次のようにコードでコマンドライン引数を使用します。

  1. 各ハイパーパラメータ引数の名前を定義し、任意の引数パーザー(通常は argparse)を使用して解析します。引数名は、前述のように、ジョブ構成で指定したパラメータ名と一致させる必要があります。

  2. コマンドライン引数の値をグラフのハイパーパラメータに割り当てます。

グラフのサマリーへのハイパーパラメータ指標の追加

Cloud ML Engine は、グラフのサマリー ライターが呼び出されると、ハイパーパラメータ指標を探します。注: あらかじめ準備されている TensorFlow Estimator は、トレーニングと評価に対して同じ指標名を使用します。Cloud ML Engine が指標のソースを特定できるようにするために、ハイパーパラメータ調整用の別個の指標が必要です。

コードは、TensorFlow Estimator API を使用するか、コア TensorFlow API を使用するかによって異なります。以下は両方の場合の例です。

Estimator

グラフのサマリーにハイパーパラメータ指標を追加するには、次のコードを使用します。この例は、指標の名前が metric1 であることを前提としています。

# Create metric for hyperparameter tuning
def my_metric(labels, predictions):
    pred_values = predictions['predictions']
    return {'metric1': tf.metrics.root_mean_squared_error(labels, pred_values)}

# Create estimator to train and evaluate
def train_and_evaluate(output_dir):

    estimator = tf.estimator.DNNLinearCombinedRegressor(...)

    estimator = tf.contrib.estimator.add_metrics(estimator, my_metric)

    train_spec = ...
    exporter = ...
    eval_spec = tf.estimator.EvalSpec(
        input_fn = ...,
        start_delay_secs = 60, # start evaluating after N seconds
        throttle_secs = 300,  # evaluate every N seconds
        exporters = exporter)
    tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

TensorFlow Estimator の国勢調査サンプルをご覧ください。

TensorFlow コア

シナリオ ライター tf.summary.FileWriter を作成し、指標をタグとしてライターにサマリーを追加します。次の例は、指標の名前が metric1 であることを前提としています。

from tensorflow.core.framework.summary_pb2 import Summary
...
summary = Summary(value=[Summary.Value(tag='metric1', simple_value=loss_val)])
eval_path = os.path.join(args['job_dir'], 'metric1')
summary_writer = tf.summary.FileWriter(eval_path)

# Note: adding the summary to the writer is enough for hyperparameter tuning.
# ML Engine looks for any summary added with the hyperparameter metric tag.
summary_writer.add_summary(summary)
summary_writer.flush()

TensorFlow コアの国勢調査サンプルをご覧ください。

実行中のハイパーパラメータ調整ジョブの詳細の取得

実行中のトレーニング ジョブの詳細なステータスを取得することで、ハイパーパラメータ調整をモニタリングできます。

レスポンスのジョブリソース内の TrainingOutput オブジェクトには、ハイパーパラメータ調整を使用したトレーニング ジョブ中に次の値が設定されます。

  • isHyperparameterTuningJobTrue に設定します。

  • trials が存在し、HyperparameterOutput オブジェクトのリストをトライアルごとに 1 つ含んでいます。

TF_CONFIG 環境変数からトライアル ID を取得することもできます。TF_CONFIG からの詳細の取得に関するガイドをご覧ください。

ハイパーパラメータ調整結果の取得

トレーニングの実行が完了したら、projects.jobs.get を呼び出して結果を取得できます。ジョブリソース内の TrainingOutput オブジェクトには、すべての実行の指標が含まれ、識別されて最適に調整された実行の指標があります。

処理中のジョブをモニタリングするために使用するのと同じ詳細なステータス リクエストを使用して、この情報を取得します。

ジョブの説明の各トライアルから結果を確認できます。ハイパーパラメータ指標に最適な値をもたらしたトライアルを探します。トライアルがモデルの成功の基準を満たしている場合、そのトライアルに対して示されているハイパーパラメータ値を、モデルの以後の実行で使用できます。

場合によっては、複数のトライアルが調整指標に対して同じ結果をもたらすことがあります。そのような場合は、他の手段で最も効果的なハイパーパラメータ値を決定する必要があります。たとえば、隠れ層のノード数を調整しているとして、値が 8 に設定されているときと 20 に設定されているときに同じ結果が得られた場合、ノードの数が多くても処理とコストがかさむだけでモデルが改善されるわけではないため、8 を使用することをおすすめします。

トライアル数の制限の設定

サービスによる実行を許可するトライアルの数を決めて、HyperparameterSpec オブジェクトの maxTrials 値を設定する必要があります。

許可するトライアル数を決定する際には、次の 2 つの競合する事項について考慮する必要があります。

  • 時間(結果として、費用)
  • 精度

トライアル数を増やすと一般には結果が向上しますが、常に向上するとは限りません。ほとんどの場合、収穫逓減点があり、それより後はトライアルを追加しても精度に影響がないか、ほとんど影響しません。最初はトライアル数を少なくして、選択したハイパーパラメータがモデルの精度に与える効果を測定してから、ジョブのトライアル数を増やすことをおすすめします。

ハイパーパラメータ調整を最大限に活用するには、設定する最大値がハイパーパラメータの数の 10 倍を下回らないようにしてください。

トライアルの並列実行

HyperparameterSpec オブジェクトで maxParallelTrials を設定することにより、並列で実行するトライアルの数を指定できます。

トライアルの並列実行には、トレーニング ジョブの所要時間を短縮できるというメリットがあります(リアルタイムの時間という意味であり、所要処理時間の合計は特に変わりません)。ただし、並列で実行すると、調整ジョブ全体の効果が減じることがあります。なぜなら、ハイパーパラメータ調整は、前のトライアルの結果を使用して、後続のトライアルのハイパーパラメータに割り当てる値を通知するからです。並列実行の場合、まだ実行中のトライアルの結果を利用できないままに開始するトライアルもでてくることになります。

トライアルを並列実行する場合、トレーニング サービスは複数のトレーニング処理クラスタ(または、単一プロセス トレーナーの場合は複数の個々のマシン)をプロビジョニングします。ジョブに対して設定するスケール階層は、個々のトレーニング クラスタに使用されます。

トライアルの早期停止

成功の見込みがないトライアルを自動的に停止するように Cloud ML Engine を設定できます。これにより、有効ではないトライアルの継続でかかるコストを節約できます。

トライアルの早期停止を有効にするには、HyperparameterSpecenableTrialEarlyStopping 値を TRUE に設定します。

完了したハイパーパラメータ調整ジョブの再開

完了したハイパーパラメータ調整ジョブを、部分的に最適化された状態から再開できます。これにより、以前のハイパーパラメータ調整ジョブで得られた知識を再利用できます。

ハイパーパラメータ調整ジョブを再開するには、次の構成を使用して新しいハイパーパラメータ調整ジョブを送信します。

  • HyperparameterSpecresumePreviousJobId 値を、前のトライアルのジョブ ID に設定します。
  • maxTrialsmaxParallelTrials の値を指定します。

Cloud ML Engine は、以前のジョブ ID を使用して同じ goalparamshyperparameterMetricTag 値を取得し、ハイパーパラメータ調整ジョブを継続します。

ジョブで異なるパラメータが使用される場合でも、類似するジョブに対して一定の hyperparameterMetricTag 名と params を使用します。これにより、Cloud ML Engine の処理性能を改善できます。

次の例は、resumePreviousJobId 構成の使用方法を示しています。

gcloud

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  hyperparameters:
    enableTrialEarlyStopping: TRUE
    maxTrials: 30
    maxParallelTrials: 1
    resumePreviousJobId: [PREVIOUS_JOB_IDENTIFIER]

Python

# Add hyperparameter tuning to the job config.
hyperparams = {
    'enableTrialEarlyStopping': True,
    'maxTrials': 30,
    'maxParallelTrials': 1,
    'resumePreviousJobId': [PREVIOUS_JOB_IDENTIFIER]}

# Add the hyperparameter specification to the training inputs dictionary.
training_inputs['hyperparameters'] = hyperparams

# Build the job spec.
job_spec = {'jobId': my_job_name, 'trainingInput': training_inputs}

Cloud TPU によるハイパーパラメータ調整

Cloud ML Engine の Cloud TPU でハイパーパラメータ調整ジョブを実行している場合は、TPUEstimatorSpeceval_metrics プロパティを使用することをおすすめします。

Cloud TPU でハイパーパラメータ調整を行うサンプルについては、ResNet-50 TPU ハイパーパラメータ調整のサンプルをご覧ください。

eval_metrics プロパティでハイパーパラメータ調整を使用するのではなく、host_calltf.summary を呼び出すこともできます。詳細については、TPUEstimatorSpec をご覧ください。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

TensorFlow 用 Cloud ML Engine