Hyperparameter-Abstimmung verwenden

Auf dieser Seite erfahren Sie, wie Sie die Hyperparameter-Abstimmung von Cloud Machine Learning Engine verwenden, um Ihr Modell zu trainieren. Durch Hyperparameter-Abstimmung wird eine von Ihnen angegebene Zielvariable optimiert. Die Zielvariable wird als Hyperparameter-Messwert bezeichnet. Wenn Sie einen Job mit Hyperparameter-Abstimmung starten, legen Sie den Namen Ihres Hyperparameter-Messwerts fest. Dies ist der Name, den Sie der skalaren Zusammenfassung zuordnen, die Sie Ihrer Trainingsanwendung hinzufügen.

Schritte der Hyperparameter-Abstimmung

Gehen Sie so vor, um die Hyperparameter-Abstimmung in einem Trainingsjob zu verwenden:

  1. Legen Sie die Konfiguration der Hyperparameter-Abstimmung für Ihren Trainingsjob fest. Fügen Sie dazu ein HyperparameterSpec-Objekt in das Objekt TrainingInput ein.

  2. Fügen Sie der Trainingsanwendung folgenden Code hinzu:

    • Parsen Sie die Befehlszeilenargumente, die die abzustimmenden Hyperparameter darstellen, und verwenden Sie die Werte, um die Hyperparameter für Ihren Trainingstest festzulegen.
    • Fügen Sie Ihren Hyperparameter-Messwert zur Zusammenfassung für Ihre Grafik hinzu.

Im Folgenden finden Sie nähere Angaben zu den einzelnen Schritten.

Konfiguration der Hyperparameter-Abstimmung für einen Trainingsjob festlegen

Erstellen Sie ein HyperparameterSpec-Objekt mit der Konfiguration der Hyperparameter-Abstimmung für Ihren Trainingsjob und fügen Sie HyperparameterSpec als hyperparameters-Objekt in das Objekt TrainingInput ein.

Legen Sie in HyperparameterSpec einen Wert für hyperparameterMetricTag fest, der den von Ihnen ausgewählten Messwert darstellt. Beispiel: metric1. Wenn Sie kein hyperparameterMetricTag angeben, sucht Cloud ML Engine nach einem Messwert mit dem Namen training/hptuning/metric.

gcloud

Fügen Sie Ihre Hyperparameter-Konfigurationsinformationen zu Ihrer Konfigurations-YAML-Datei hinzu. Ein Beispiel dafür sehen Sie unten. Eine funktionsfähige Konfigurationsdatei finden Sie unter hptuning_config.yaml im Beispiel mit den Erhebungsdaten.

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

Erstellen Sie ein Wörterbuch für HyperparameterSpec und fügen es Ihrer Trainingseingabe hinzu. Im folgenden Beispiel wird angenommen, dass Sie bereits ein TrainingInput-Wörterbuch erstellt haben (in diesem Fall training_inputs), wie in der Anleitung "Trainingsjob ausführen" unter "Job konfigurieren" beschrieben.

# 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}

Code in der Trainingsanwendung überprüfen

Bearbeiten Sie in Ihrer Anwendung die Befehlszeilenargumente für die Hyperparameter und fügen Sie der Grafikzusammenfassung Ihren Messwert hinzu.

Befehlszeilenargumente für die abzustimmenden Hyperparameter bearbeiten

Cloud ML Engine legt beim Aufruf Ihrer Trainingsanwendung Befehlszeilenargumente fest. Nutzen Sie die Befehlszeilenargumente in Ihrem Code:

  1. Legen Sie einen Namen für jedes Hyperparameterargument fest und parsen Sie es mit einem Argument-Parser Ihrer Wahl (in der Regel argparse). Die Argumentnamen müssen mit den Parameternamen übereinstimmen, die Sie in der Jobkonfiguration angegeben haben, wie oben beschrieben.

  2. Weisen Sie den Hyperparametern in Ihrer Grafik die Werte aus den Befehlszeilenargumenten zu.

Hyperparameter-Messwert der Grafikzusammenfassung hinzufügen

Cloud ML Engine sucht nach dem Hyperparameter-Messwert, wenn der Zusammenfassungsautor Ihrer Grafik aufgerufen wird. Hinweis: Die TensorFlow Estimator-Vorlage verwendet für Training und Bewertung denselben Messwertnamen. Für die Hyperparameter-Abstimmung benötigen Sie einen separaten Messwert, damit die Cloud ML Engine die Quelle des Messwerts ermitteln kann.

Ihr Code ist abhängig davon, ob Sie die TensorFlow Estimator-API oder die TensorFlow Core-APIs verwenden. Nachfolgend finden Sie Beispiele für beide Fälle:

Estimator

Verwenden Sie den folgenden Code, um der Zusammenfassung für Ihre Grafik den Hyperparameter-Messwert hinzuzufügen. In diesem Beispiel wird angenommen, dass der Name des Messwerts metric1 lautet:

# 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)

Weitere Informationen finden Sie im Volkszählungsbeispiel für TensorFlow Estimator.

TensorFlow Core

Erstellen Sie den SummaryWriter tf.summaryFileWriter und (fügen Sie eine Zusammenfassung ein), die Ihren Messwert als Tag enthält. Im folgenden Beispiel wird angenommen, dass der Name des Messwerts metric1 lautet:

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()

Weitere Informationen finden Sie im Volkszählungsbeispiel für TensorFlow Core.

Details eines Hyperparameter-Abstimmungsjobs während der Ausführung abrufen

Sie können die Hyperparameter-Abstimmung überprüfen, indem Sie den detaillierten Stand Ihres laufenden Trainingsjobs abrufen.

Im Objekt TrainingOutput in der Jobressource der Antwort sind die folgenden Werte während eines Trainingsjobs mit Hyperparameter-Abstimmung festgelegt:

  • isHyperparameterTuningJob auf True gesetzt

  • trials ist vorhanden und enthält für jeden Test eine Liste der HyperparameterOutput-Objekte

Sie können die Test-ID auch über die Umgebungsvariable TF_CONFIG beziehen. Weitere Informationen finden Sie in der Anleitung zum Abrufen von Details aus TF_CONFIG.

Ergebnisse von Hyperparameter-Abstimmung abrufen

Nach Abschluss der Trainingsläufe können Sie mit projects.jobs.get die Ergebnisse abrufen. Das Objekt TrainingOutput in der Jobressource enthält die Messwerte für alle Läufe, wobei die Messwerte für den am besten abgestimmten Trainingslauf gekennzeichnet wird.

Verwenden Sie die gleiche detaillierte Statusanfrage wie für die laufende Überwachung des Jobs, um diese Informationen abzurufen.

Die Ergebnisse der einzelnen Tests sehen Sie in der Jobbeschreibung. Bestimmen Sie den Test, der den besten Wert für Ihren Hyperparameter-Messwert erzielt hat. Wenn der Test im Hinblick auf den Erfolg des Modells Ihren Anforderungen entspricht, können Sie die für diesen Test gezeigten Hyperparameter-Werte für nachfolgende Läufe Ihres Modells verwenden.

Manchmal liefern mehrere Tests für Ihren Abstimmungsmesswert identische Ergebnisse. In einem solchen Fall sollten Sie feststellen, welche der Hyperparameterwerte aufgrund anderer Kriterien am vorteilhaftesten sind. Wenn Sie zum Beispiel die Knotenanzahl in einer versteckten Ebene abstimmen und identische Ergebnisse für den Wert 8 und den Wert 20 erhalten, sollten Sie 8 verwenden, da eine größere Knotenanzahl mit einem größeren Verarbeitungsvolumen und höheren Kosten einhergeht, ohne dass Verbesserungen des Modells erzielt werden.

Beschränkung für die Anzahl der Versuche festlegen

Sie sollten die Anzahl der Versuche beschränken, die der Dienst maximal ausführen darf. Legen Sie dazu im Objekt HyperparameterSpec den Wert maxTrials fest.

Beim Festlegen der zulässigen Versuche müssen Sie zwischen zwei Faktoren abwägen:

  • Zeit (und damit Kosten)
  • Genauigkeit

Die Erhöhung der Anzahl der Versuche führt in der Regel zu besseren Ergebnissen, aber dies ist nicht immer so. In den meisten Fällen gibt es einen Punkt, ab dem rückläufige Ergebnisse geliefert werden und zusätzliche Versuche danach wenig oder keinen Einfluss auf die Genauigkeit haben. Am besten beginnen Sie mit einer kleinen Versuchsanzahl, um die Auswirkung der gewählten Hyperparameter auf die Genauigkeit des Modells zu messen, bevor Sie einen Job mit einer großen Anzahl von Versuchen starten.

Der maximale Wert sollte nicht niedriger als das Zehnfache der Anzahl der Hyperparameter sein, die Sie verwenden, um die Hyperparameter-Abstimmung optimal zu nutzen.

Parallele Versuche ausführen

Sie können angeben, wie viele Versuche parallel ausgeführt werden können. Legen Sie dazu im Objekt HyperparameterSpec einen Wert für maxParallelTrials fest.

Das parallele Ausführen von Tests hat den Vorteil, dass die Dauer des Trainingsjobs reduziert wird (Echtzeit – die erforderliche Gesamtverarbeitungszeit ändert sich in der Regel nicht). Das parallele Ausführen kann jedoch die Effektivität des Abstimmungsjobs insgesamt reduzieren. Grund hierfür ist, dass die Hyperparameter-Abstimmung die Ergebnisse vorheriger Versuche verwendet, um die Werte anzugeben, die den Hyperparametern in zukünftigen Versuchen zugewiesen werden sollen. Bei der Parallelausführung starten einige Tests, ohne den Vorteil der Ergebnisse noch laufender Tests zu nutzen.

Wenn Sie parallele Versuche verwenden, belegt der Trainingsdienst mehrere Trainingsverarbeitungscluster (oder mehrere Einzelmaschinen im Falle einer Einzelprozess-Trainingsanwendung). Die Skalierung, die Sie für Ihren Job eingestellt haben, wird für jeden einzelnen Trainingscluster verwendet.

Tests vorzeitig beenden

Sie können festlegen, dass die Cloud ML Engine einen Test, der offensichtlich nicht erfolgreich ist, automatisch beendet. Dies erspart Ihnen die Kosten für die Fortsetzung eines Tests, der wahrscheinlich nicht sinnvoll ist.

Wenn Sie festlegen möchten, dass Tests vorzeitig beendet werden können, setzen Sie den Wert enableTrialEarlyStopping in HyperparameterSpec auf TRUE.

Abgeschlossenen Hyperparameter-Abstimmungsjob fortsetzen

Sie können einen abgeschlossenen Hyperparameter-Abstimmungsjob fortsetzen, um von einem teilweise optimierten Zustand aus zu starten. Dies bietet die Möglichkeit, die im vorherigen Hyperparameter-Abstimmungsjob gewonnenen Kenntnisse wiederzuverwenden.

Wenn Sie einen Hyperparameter-Abstimmungsjob fortsetzen möchten, senden Sie einen neuen Hyperparameter-Abstimmungsjob mit folgender Konfiguration:

  • In der HyperparameterSpec als Wert für resumePreviousJobId die Job-ID des vorherigen Tests festlegen.
  • Für maxTrials und maxParallelTrials sind Werte angegeben.

Cloud ML Engine sucht mit der vorherigen Job-ID nach den gleichen Werten für goal, params und hyperparameterMetricTag, um diese wiederzuverwenden und damit den Hyperparameter-Abstimmungsjob fortzusetzen.

Verwenden Sie für ähnliche Jobs einheitliche hyperparameterMetricTag-Namen und params, auch wenn die Jobs verschiedene Parameter haben. Durch diese Vorgehensweise kann Cloud ML Engine im Lauf der Zeit die Optimierung voranbringen.

In den folgenden Beispielen wird die Nutzung der Konfiguration resumePreviousJobId gezeigt:

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}

Hyperparameter-Abstimmung mit Cloud TPU

Wenn Sie den Job zur Hyperparameter-Abstimmung mit Cloud TPU in Cloud ML Engine ausführen, verwenden Sie in TPUEstimatorSpec das Attribut eval_metrics.

Ein Beispiel für die Hyperparameter-Abstimmung mit Cloud TPU finden Sie unter Beispiel für ResNet-50 TPU-Hyperparameter-Abstimmung.

Statt das Attribut eval_metrics zu verwenden, können Sie alternativ tf.summary in host_call aufrufen, um den Dienst für die Hyperparameter-Abstimmung zu verwenden. Weitere Informationen finden Sie unter TPUEstimatorSpec.

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

AI Platform für TensorFlow