Kapitel K2: Keras

Updates dieser Seite:

Überblick

In diesem Kapitel wird gezeigt, wie man in Keras systematisch die Hyperparameter optimieren (lassen) kann. Hyperparameter sind z.B. die Anzahl der Schichten, der Neuronen pro Schicht oder die Lernrate. Man nennt dies Hyperparameter Tuning.

Die Inhalte sind angelehnt an https://keras.io/guides/keras_tuner/getting_started

1 Einführung

Wenn man ein Neuronales Netz erstellt und später trainiert, muss man verschiedene Entscheidungen treffen:

Diese Aspekte fallen alle unter den Begriff Hyperparameter, weil dies Parameter sind, die sich während des Trainings nicht ändern.

Wie trifft man diese Entscheidungen? In der Regel orientiert man sich an Netzen, die man schonmal gesehen hat oder die in wissenschaftlichen Publikationen dargestellt sind, und anschließend "probiert" man mehr oder weniger systematisch, an den Hyperparametern zu drehen (und protokolliert hoffentlich die jeweiligen Outcomes). Natürlich kommt man schnell auf die Idee, diesen Prozess zu automatisieren. Das nennt man auch Hyperparameter Tuning oder Hyperparameter Optimization.

In Keras gibt es dazu das Paket keras-tuner, das hier vorgestellt wird.

Zunächst muss keras-tuner installiert sein - das behandeln wir hier nicht.

Importe

Wir benötigen die folgenden Importe:

Objekt vom Typ HyperParameters

Wir erstellen ein Objekt vom Typ HyperParameters, das später Werte für unsere Hyperparameter (z.B. Anzahl der Neuronen einer Schicht).

Ein Objekt hp vom Typ HyperParameters hat mehrere Funktionen. Bei diesen Funktionen wird ein Wert vom entsprechenden Typ generiert:

Beim Funktionsaufruf wird auch ein Bezeichner (z.B. "units") übergeben, damit das Objekt die verschiedenen Werte unterscheiden kann (z.B. Neuronenanzahl für Schicht 2 und Schicht 3).

Bei der folgenden Funktion wird eine Menge von Werten mit einer Liste definiert:

Beispiel:

Die komplette Liste von Funktionen und ihrer Parameter finden Sie hier: https://keras.io/api/keras_tuner/hyperparameters

2 Daten

Wir nehmen die CIFAR-10-Daten für unsere Versuche.

CIFAR-10 enthält 60000 Farbbilder (32x32x3) mit Abbildungen aus 10 Kategorien (= Label), z.B "ship" oder "dog".

3 Versuch mit einfachem Modell

Wir spielen zunächst alle Schritte anhand eines sehr einfachen Versuchs durch, wo wir in einem Netz lediglich die Größe der versteckten Schicht ändern. Wir haben also einen einzigen Hyperparameter.

3.1 Modell-Erzeugungsfunktion

Wir definieren eine Funktion, die ein Modell mit Hilfe eine HyperParameter-Objekts baut. Das Objekt trifft die Entscheidung über die Hyperparameter des generierten Modells.

Wir spezifizieren den Input hier explizit, weil wir sonst die Funktion summary nicht aufrufen können.

Sanity check: Wird ein Modell erzeugt und wie sieht es aus?

3.2 Tuning durchführen

Keras bietet verschiedene Suchmethoden an, um den Raum der Hyperparameter zu durchlaufen:

RandomSearch

Wir sehen uns die einfachste Methode RandomSearch an. Zunächst wird ein Objekt mit Konfigurationsdaten erstellt. Ein "Versuch" (trial) bezieht sich auf ein spezifisches Modell mit festgelegten Hyperparametern.

Uns reichen 6 Versuche. Bei jedem Versuch wird nur 1x trainiert. Wie viele Epochen pro Versuch durchlaufen werden, wird später festgelegt.

Suchraum

Man kann sich jetzt den Suchraum anzeigen lassen. Hier sieht man im Grunde, an welchen Stellen man einen Hyperparameter von Keras wählen lässt.

Wir sehen, dass es nur einen Hyperparameter gibt, der variiert wird.

Suche

Jetzt können wir die Suche starten. Für die Anzahl der Epochen nimmt man einen relativ niedrigen Wert, z.B. 4 oder 10, damit man auch viele Durchläufe in realistischer Zeit schafft.

Während der Suche wird immer der bislang beste Wert angezeigt. Die Suche dauert natürlich etwas...

Wir sehen, dass 6 Versuche unternommen wurden und die beste Performance 42.9% betrug.

3.3 Auswertung

Beste Modelle

Die Modelle werden gespeichert. Wir sehen uns die besten zwei an.

Was wurde probiert?

Mit der Funktion results_summary können Sie ausgeben, welche Versuche unternommen wurden, wie die jeweiligen Parameter gewählt wurden (hier nur "num_hidden") und welche Performance erzielt wurde.

3.4 Bestes Modell trainieren und evaluieren

Jetzt haben wir ja in der Suche nur für eine reduzierte Anzahl von Epochen trainiert.

Wir wählen jetzt das beste Modell und trainieren es mit einer Epochenzahl, die uns angemessen erscheint.

Training

Wir trainieren das Modell über 20 Epochen.

Visualisierung

3.5 Fazit

Wir haben also herausgefunden, dass ein Netz mit 950 Neuronen besser performt als ein Netz mit weniger Neuronen. Weil wir die Suche auf 6 Trials beschränkt hatten, wurde ein Netz mit 1000 Neuronen gar nicht ausprobiert. Und natürlich gibt es eine Reihe von anderen Möglichkeiten, die Netzarchitektur oder das Training zu ändern, etwa mehrere Schichten oder eine andere Lernrate.

Mit dem gefundenen Netz haben wir ca. 48% auf den Testdaten erzielt.

Wir haben aber einen ersten Schritt getan und sollten uns anschauen, wie man mehrere Hyperparameter einbinden kann.