Empfehlungen in TensorFlow: In AI Platform trainieren und abstimmen

Dieser Artikel ist der zweite Teil einer mehrteiligen Reihe von Anleitungen, die Ihnen zeigen, wie Sie ein Empfehlungssystem für maschinelles Lernen (ML) mit TensorFlow und AI Platform implementieren. In diesem Teil erfahren Sie, wie Sie das Empfehlungssystem trainieren und Hyperparameter mithilfe von AI Platform in der Google Cloud Platform (GCP) optimieren.

Die Reihe besteht aus folgenden Teilen:

In dieser Anleitung wird davon ausgegangen, dass Sie den vorherigen Teil in dieser Reihe abgeschlossen haben.

Ziele

  • Trainingsjob in AI Platform ausführen, um MovieLens-Dataset-Empfehlungen zu geben
  • AI Platform-Hyperparameter anpassen und das TensorFlow WALS-Empfehlungsmodell für das Dataset MovieLens optimieren

Kosten

In dieser Anleitung werden die kostenpflichtigen Dienste Cloud Storage und AI Platform verwendet. Sie können mit dem Preisrechner die Kosten für die geplante Nutzung schätzen. Die voraussichtlichen Kosten für diese Anleitung sind 0,20 $. Wenn Sie die GCP zum ersten Mal nutzen, steht Ihnen möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

Befolgen Sie die Anweisungen in Teil 1, um Ihr GCP-Projekt einzurichten.

Modell trainieren

In der ersten Anleitung dieser Reihe ging es um die Implementierung des WALS-Algorithmus in TensorFlow. Diese Anleitung zeigt Ihnen, wie Sie das Modell mit AI Platform trainieren. In diesem Kontext steht der Begriff "Trainieren des Modells" für das Faktorisieren einer dünnbesetzten Bewertungsmatrix R in eine Nutzerfaktormatrix X und eine Elementfaktormatrix Y.. Die resultierenden Nutzerfaktoren dienen als Basismodell für ein Empfehlungssystem.

Sie implementieren das Empfehlungssystem auf der GCP in Teil 4.

Jobs in AI Platform trainieren

Wenn Sie ein Modell mit AI Platform trainieren möchten, müssen Sie ein Jobverzeichnis angeben, das ein Bucket-Ordner in Cloud Storage ist. Gehen Sie folgendermaßen vor, um einen Trainingsjob auszuführen:

  1. Erstellen Sie in Ihrem Projekt einen neuen Cloud Storage-Bucket oder verwenden Sie einen vorhandenen Bucket.

    Wählen Sie zum Erstellen eines neuen Buckets in der Cloud Console Cloud Storage > Browser aus und klicken Sie dann auf Bucket erstellen.

    Merken Sie sich den Namen, den Sie diesem Bucket geben. Es empfiehlt sich, den Bucket in derselben Region wie Ihre Compute Engine-Instanz zu platzieren.

  2. Setzen Sie in Ihrer Shell die Umgebungsvariable BUCKET auf die Cloud Storage-Bucket-URL des von Ihnen verwendeten Buckets.

    BUCKET=gs://[YOUR_BUCKET_NAME]
  3. Kopieren Sie die MovieLens-Datasets mit dem gsutil-Tool in den Bucket:

    gsutil cp -r data/u.data $BUCKET/data/u.data
    gsutil cp -r data/ratings.dat $BUCKET/data/ratings.dat
    gsutil cp -r data/ratings.csv $BUCKET/data/ratings.csv
  4. Führen Sie den Job, also das Trainingsskript im Verzeichnis wals_ml_engine aus, legen Sie die Option train fest und geben Sie die Cloud Storage-Bucket-URL sowie den Pfad zur Datendatei im Bucket an.

    Das zu verwendende Dataset hängt davon ab, welches Sie in Teil 1 verwendet haben. Legen Sie zusätzliche Optionen für die Datendatei fest, z. B. das Trennzeichen oder den Header:

    cd wals_ml_engine
    • Geben Sie für das Dataset MovieLens 100k den Pfad zur Datendatei 100k an:

      ./mltrain.sh train ${BUCKET} data/u.data
    • Fügen Sie für das Dataset 1m die Option --delimiter ein und geben Sie den Pfad zur Datendatei 1m an:

      ./mltrain.sh train ${BUCKET} data/ratings.dat --delimiter ::
    • Verwenden Sie für das Dataset 20m die Optionen --delimiter und --headers:

      ./mltrain.sh train ${BUCKET} data/ratings.csv --delimiter , --headers

    Sie können den Status und die Ausgabe des Jobs in der Cloud Console auf der Seite Jobs im Bereich AI Platform überwachen. Klicken Sie auf Logs, um die Jobausgabe aufzurufen. Die Ergebnisse werden auf dem Testset als Wurzel des mittleren quadratischen Fehlers (Root Mean Squared Error, RMSE) in Logs erfasst. RMSE repräsentiert den durchschnittlichen Fehler für das Modell der vorhergesagten Nutzerbewertung über den gesamten Testsatz von Bewertungen hinweg.

Modell speichern

Die Faktormatrizes werden nach dem Faktorisieren in fünf separaten Dateien im Format numpy gespeichert, damit sie zur Durchführung von Empfehlungen verwendet werden können. Teil 3 der Anleitungsreihe erläutert die Modelldateien und zeigt Ihnen, wie Sie mit ihnen Empfehlungen erstellen können. Teil 4 zeigt Ihnen, wie Sie ein Produktionssystem bereitstellen, um Empfehlungen zu geben. Wenn das Modell lokal trainiert wird, werden die Dateien im Ordner jobs des Codepakets gespeichert. Wenn das Modell in AI Platform trainiert wird, werden die Dateien in einem Cloud Storage-Bucket gespeichert. Dieser wird mit dem Argument job-dir für den AI Platform-Job bereitgestellt, wie im vorstehenden Abschnitt beschrieben.

Dataset-Ergebnisse von MovieLens

Die Ergebnisse der Näherungswerte aus der Matrixfaktorisierung basieren auf den vorhergesagten Bewertungen für den Testsatz. Der Testsatz wurde während der Aufbereitung aus der Bewertungsmatrix extrahiert. Verwenden Sie die in Teil 1 beschriebene Verlustformel, um die Differenz zwischen den vorhergesagten Bewertungen und den tatsächlichen vom Nutzer bereitgestellten Testgruppenbewertungen zu berechnen:

$$ L = \sum_{u,i}(r_{ui} - x^{T}_{u} \cdot y_{i})^{2} $$

Hier sind \(r_{ui}\) die Testgruppen-Bewertungen und \(x_{u}\) sowie \(y_{i}\) die Zeilen- und Spaltenfaktoren, die durch Anwendung der WALS-Faktorisierung auf den Trainingssatz berechnet werden.

Die Leistung der Matrixfaktorisierung hängt stark von mehreren Hyperparametern ab, auf die im nächsten Abschnitt dieses Dokuments näher eingegangen wird. Mit dem Dataset 1m MovieLens und dem in Tabelle 1 aufgeführten Standardsatz von Hyperparametern wurde für das Test-Dataset ein RMSE von 1, 06 erzielt. Der RMSE entspricht dem durchschnittlichen Fehler in den vorhergesagten Bewertungen verglichen mit dem Testsatz. Im Durchschnitt liegt jede vom Algorithmus erzeugte Bewertung innerhalb von ± 1,06 der tatsächlichen Nutzerbewertung im Test-Dataset 1m. Eine benutzerdefinierte Bewertung von 3 wird wahrscheinlich eine vorhergesagte Bewertung zwischen 2 und 4 ergeben, aber es ist unwahrscheinlich, dass sie 1 oder 5 ergibt. Das ist kein schlechtes Ergebnis. Veröffentlichte Ergebnisse für dieses Dataset erzielen stattdessen einen RMSE von weniger als 1,0.

Sie müssen die in Tabelle 1 aufgeführten Hyperparameter anpassen, um das Ergebnis zu verbessern.

Name und Beschreibung des Hyperparameters Standardwert Skala
latent_factors
Anzahl der latenten Faktoren K
5 UNIT_REVERSE_LOG_SCALE
regularization
Regularisierungskonstante L2
0,07 UNIT_REVERSE_LOG_SCALE
unobs_weight
Gewichtung der unbeobachteten Bewertungsmatrixeinträge
0,01 UNIT_REVERSE_LOG_SCALE
feature_wt_factor
Gewichtung der beobachteten Einträge
130 UNIT_LINEAR_SCALE
feature_wt_exp
Feature-Gewichtungsexponent
1 UNIT_LOG_SCALE
num_iters
Anzahl der alternierenden Iterationen der kleinsten Quadrate
20 UNIT_LINEAR_SCALE

Tabelle 1. Im Modell verwendete Hyperparameternamen und Standardwerte

Hyperparameter abstimmen

Für die Leistung von Machine-Learning-Modellen ist es besonders wichtig, die optimalen Hyperparameterwerte zu finden. Leider bietet die Theorie hierfür kaum Hilfestellung. Data Scientists müssen für die Optimierung mit verschiedenen Werten aus naheliegenden Bereichen experimentieren, die resultierende Leistung des Modells testen und dann eine Kombination von Parametern mit der besten Leistung auswählen. Dieser Vorgang kann viele manuelle Arbeitsstunden und Rechenressourcen erfordern, wodurch er sehr zeitaufwendig und teuer ist. Der Raum möglicher Kombinationen von Hyperparametern wächst exponentiell basierend auf der Anzahl verschiedener Parameter im Modell. Es ist nicht möglich, den gesamten Raum zu durchsuchen. Das zwingt Sie zu Annahmen darüber, welche Faktoren das Modell beeinflussen, basierend auf Heuristiken, früheren Erfahrungen und Kenntnissen der mathematischen Attribute der einzelnen Parameter.

AI Platform enthält eine Hyperparameter-Abstimmungsfunktion, die automatisch nach einer optimalen Menge von Hyperparametern sucht. Geben Sie eine Liste der Hyperparameter an, die Sie optimieren möchten, sowie erwartete Bereiche oder Werte für diese Parameter, um die Abstimmungsfunktion zu verwenden. AI Platform führt eine Suche über den Raum von Hyperparametern mit so vielen verschiedenen Tests durch, wie Sie möchten, und gibt eine Rangliste der Ergebnisse für die leistungsstärksten Hyperparameter zurück, die in allen Tests gefunden wurden. Sie können den vermuteten Maßstab des Parameters logarithmisch oder linear als zusätzlichen Hinweis für den Suchvorgang angeben.

Weitere Informationen zum Abstimmen von Hyperparametern finden Sie in der Dokumentation zur AI Platform. Weitere Informationen zum zugrunde liegenden Algorithmus für die Feinabstimmung von Hyperparametern finden Sie im Blogpost Hyperparameter tuning in Cloud Machine Learning Engine using Bayesian Optimization.

Hyperparameter-Konfigurationsdatei

Die Hyperparameterliste für AI Platform kann in einer JSON- oder YAML-Konfigurationsdatei bereitgestellt werden. Im Beispielcode dieser Anleitung wird die Konfiguration der Hyperparameter-Feinabstimmung durch config/config_tune.json definiert. Jeder der in dieser Anleitung abgestimmten Hyperparameter wird in dieser Datei aufgelistet, zusammen mit der minimalen Reichweite, der maximalen Reichweite und der Skalierung. Informationen zu gültigen Parameterskalenwerten finden Sie unter Überblick über die Feinabstimmung von Hyperparametern.

Der Maschinentyp standard_gpu wird im Parameter scaleTier angegeben, sodass die Feinabstimmung auf einer GPU-Maschine erfolgt. Die Konfigurationsdatei sieht so aus:

{
  "trainingInput":{
    "scaleTier":"CUSTOM",
    "masterType":"standard_gpu",
    "hyperparameters":{
      "goal":"MINIMIZE",
      "params":[
        {
          "parameterName":"regularization",
          "type":"DOUBLE",
          "minValue":"0.001",
          "maxValue":"10.0",
          "scaleType":"UNIT_REVERSE_LOG_SCALE"
        },
        {
          "parameterName":"latent_factors",
          "type":"INTEGER",
          "minValue":"5",
          "maxValue":"50",
          "scaleType":"UNIT_REVERSE_LOG_SCALE"
        },
        {
          "parameterName":"unobs_weight",
          "type":"DOUBLE",
          "minValue":"0.001",
          "maxValue":"5.0",
          "scaleType":"UNIT_REVERSE_LOG_SCALE"
        },
        {
          "parameterName":"feature_wt_factor",
          "type":"DOUBLE",
          "minValue":"1",
          "maxValue":"200",
          "scaleType":"UNIT_LOG_SCALE"
        }
      ],
      "maxTrials":500
    }
  }
}

Hyperparameter-Abstimmungscode

Der Modellcode enthält die folgenden Features, um die Abstimmung von Hyperparametern zu ermöglichen:

  • Jeder Hyperparameter wird als Argument an den Hyperparameter-Abstimmungsjob in AI Platform übergeben. In diesem Fall werden die Hyperparameterargumente von der Datei task.py verarbeitet, die als Einstiegspunkt für den Job dient. Achten Sie darauf, dass der Name des Arguments mit dem Namen des Hyperparameters übereinstimmt, der in der Hyperparameter-Konfigurationsdatei aufgeführt ist.
  • Das Modell schreibt eine TensorFlow-Zusammenfassung mit dem speziellen Tag training/hptuning/metric. Dieses Tag wird auf den Messwert gesetzt, der die Qualität des Modells auswertet. In diesem Fall ist RMSE der Messwert für das Test-Dataset. Dieser zusammenfassende Messwert ermöglicht den Suchvorgang des Hyperparameter-Abstimmungsdienstes von AI Platform zum Einstufen der Tests. Der Messwert summary wird in einer Dienstprogrammfunktion in util.py geschrieben:

    summary = Summary(value=[Summary.Value(tag='training/hptuning/metric',
                                           simple_value=metric)])
    
    eval_path = os.path.join(args['output_dir'], 'eval')
    summary_writer = tf.summary.FileWriter(eval_path)
    
    # Note: adding the summary to the writer is enough for hyperparam tuning.
    # The ml engine system is looking for any summary added with the
    # hyperparam metric tag.
    summary_writer.add_summary(summary)
  • Es ist wichtig, für jeden Versuch ein separates Ausgabeverzeichnis zu haben. Das Ausgabeverzeichnis wird zum Schreiben der TensorFlow-Zusammenfassung und des gespeicherten Modells verwendet. Wenn Sie kein eigenes Ausgabeverzeichnis für jede Testversion erstellen, überschreiben die Ergebnisse der einzelnen Testversionen die Ergebnisse der vorherigen. Ein eindeutiges Verzeichnis für jede Testversion in task.py wird mit dem folgenden Code in der Methode parse_arguments erstellt:

    if args.hypertune:
      # if tuning, join the trial number to the output path
      trial = json.loads(os.environ.get('TF_CONFIG', '{}')).get('task', {}).get('trial', '')
      output_dir = os.path.join(job_dir, trial)
    else:
      output_dir = os.path.join(job_dir, args.job_name)

    Hier unterscheidet die parse_arguments-Funktion zwischen Feinabstimmung und Standardausgabe und ändert output_dir entsprechend.

Hyperparameter-Abstimmungsjob ausführen

Mit dem folgenden Befehl wird der Abstimmungsjob für das Dataset 100k ausgeführt:

./mltrain.sh tune $BUCKET data/u.data

Achten Sie darauf, dass die Variable BUCKET auf den Bucket festgelegt ist, den Sie zuvor erstellt haben. Die geringe Größe des Datasets 100k ermöglicht die Durchführung einer großen Anzahl von Tests, in diesem Fall 500.

Abstimmungsergebnisse

Die Ergebnisse der Hyperparameter-Feinabstimmung werden in den AI Platform-Jobdaten gespeichert. In der Cloud Console auf der Seite Jobs im Bereich AI Platform können Sie darauf zugreifen Wie Sie in Abbildung 1 sehen können, enthalten die Jobergebnisse den besten RMSE-Wert für alle Tests des zusammenfassenden Messwerts. Sie sehen die Ergebnisse der Hyperparameter-Feinabstimmung mit 500 Tests für das Dataset 100k MovieLens. Die besten Ergebnisse traten beim 384. Test auf.

Ergebnisse des Hyperparameter-Abstimmungsjobs. Die Ergebnisse von Job 384 sind markiert
Abbildung 1. Ergebnisse des Hyperparameter-Abstimmungsjobs

Die Abstimmung der Hyperparameter kann einen großen Unterschied in den Endergebnissen machen. In diesem Fall hat die Hyperparameter-Feinabstimmung für das Test-Dataset 100k einen RMSE von 0,98 erreicht. Die Anwendung dieser Parameter auf die Datasets 1m und 20m führte zu RMSE-Werten von 0,90 bzw. 0,88. Die optimalen Parameter sind in Tabelle 2 aufgelistet und die RMSE-Werte vor und nach der Abstimmung sind in Tabelle 3 zusammengefasst.

Name des Hyperparameters Beschreibung Abstimmungswert
latent_factors Latente Faktoren K 34
regularization L2-Regularisierungskonstante 9,83
unobs_weight Unbeobachtetes Gewicht 0,001
feature_wt_factor Beobachtetes Gewicht 189,8
feature_wt_exp Feature-Gewichtsexponent
num_iters Anzahl der Iterationen

Tabelle 2. Durch die Hyperparameterabstimmung von AI Platform ermittelte Werte

Der Feature-Gewichtungsfaktor war nicht Teil der Feinabstimmungsparameter, da für das Dataset MovieLens die lineare beobachtete Gewichtung verwendet wird. Für num_iters, den Parameter für die Anzahl der Iterationen, wurde der Standardwert verwendet.

Dataset RMSE mit Standard-Hyperparametern RMSE nach Hyperparameter-Abstimmung
100k 1,06 0,98 $
1m 1,11 0,90 $
20m 1,30 0,88 $

Tabelle 3. Zusammenfassung der RMSE-Werte im Test-Dataset für die verschiedenen MovieLens-Datasets vor und nach der Hyperparameter-Feinabstimmung

Weitere Informationen

Der Artikel Empfehlungen in TensorFlow: Auf Daten aus Google Analytics anwenden (Teil 3) der Lösung zeigt, wie das Empfehlungsmodell auf Livedaten von Google Analytics angewendet wird.