Entdecken Sie fortschrittliche Techniken zur Hyperparameteroptimierung mit Amazon SageMaker Automatic Model Tuning | Amazon Web Services

Entdecken Sie fortschrittliche Techniken zur Hyperparameteroptimierung mit Amazon SageMaker Automatic Model Tuning | Amazon Web Services

Die Entwicklung leistungsstarker Lösungen für maschinelles Lernen (ML) erfordert die Erforschung und Optimierung von Trainingsparametern, auch Hyperparameter genannt. Hyperparameter sind die Knöpfe und Hebel, mit denen wir den Trainingsprozess anpassen, z. B. Lernrate, Batch-Größe, Regularisierungsstärke und andere, abhängig vom jeweiligen Modell und der jeweiligen Aufgabe. Bei der Erforschung von Hyperparametern werden die Werte der einzelnen Parameter systematisch variiert und die Auswirkungen auf die Modellleistung beobachtet. Obwohl dieser Prozess zusätzliche Anstrengungen erfordert, sind die Vorteile erheblich. Hyperparameteroptimierung (HPO) kann zu schnelleren Trainingszeiten, verbesserter Modellgenauigkeit und besserer Verallgemeinerung auf neue Daten führen.

Wir setzen unsere Reise von der Post aus fort Optimieren Sie Hyperparameter mit Amazon SageMaker Automatic Model Tuning. Wir haben zuvor eine einzelne Joboptimierung untersucht, die Ergebnisse für den in SageMaker integrierten Algorithmus visualisiert und etwas über die Auswirkungen bestimmter Hyperparameterwerte gelernt. Zusätzlich zur Verwendung von HPO als einmalige Optimierung am Ende des Modellerstellungszyklus können wir es auch im Dialog über mehrere Schritte hinweg nutzen. Jeder Tuning-Job hilft uns, einer guten Leistung näher zu kommen. Darüber hinaus lernen wir aber auch, wie empfindlich das Modell auf bestimmte Hyperparameter reagiert, und können dieses Verständnis nutzen, um den nächsten Tuning-Job zu informieren. Wir können die Hyperparameter und ihre Wertebereiche basierend auf dem, was wir gelernt haben, überarbeiten und so diese Optimierungsbemühungen in ein Gespräch umwandeln. Und genauso wie wir als ML-Praktiker über diese Läufe Wissen ansammeln, Automatische Modelloptimierung von Amazon SageMaker (AMT) Mit Warmstarts kann das bei früheren Tuning-Aufgaben erworbene Wissen auch für die nächste Tuning-Aufgabe beibehalten werden.

In diesem Beitrag führen wir mehrere HPO-Jobs mit einem benutzerdefinierten Trainingsalgorithmus und verschiedenen HPO-Strategien wie Bayes'scher Optimierung und Zufallssuche aus. Wir setzen auch Warmstarts in die Tat um und vergleichen unsere Versuche visuell, um die Erforschung des Hyperparameter-Weltraums zu verfeinern.

Erweiterte Konzepte von SageMaker AMT

In den nächsten Abschnitten werfen wir einen genaueren Blick auf jedes der folgenden Themen und zeigen, wie SageMaker AMT Sie bei der Umsetzung in Ihren ML-Projekten unterstützen kann:

  • Verwenden Sie benutzerdefinierten Trainingscode und das beliebte ML-Framework Scikit-learn in SageMaker Training
  • Definieren Sie benutzerdefinierte Bewertungsmetriken basierend auf den Protokollen zur Bewertung und Optimierung
  • Führen Sie HPO mit einer geeigneten Strategie durch
  • Verwenden Sie Warmstarts, um eine einzelne Hyperparametersuche in einen Dialog mit unserem Modell umzuwandeln
  • Nutzen Sie fortschrittliche Visualisierungstechniken mithilfe unserer Lösungsbibliothek, um zwei HPO-Strategien zu vergleichen und die Ergebnisse von Optimierungsaufträgen zu ermitteln

Unabhängig davon, ob Sie die in unserem ersten Beitrag verwendeten integrierten Algorithmen oder Ihren eigenen Trainingscode verwenden, bietet SageMaker AMT eine nahtlose Benutzererfahrung für die Optimierung von ML-Modellen. Es bietet wichtige Funktionen, die es Ihnen ermöglichen, sich auf das jeweilige ML-Problem zu konzentrieren und gleichzeitig automatisch den Überblick über die Versuche und Ergebnisse zu behalten. Gleichzeitig verwaltet es automatisch die zugrunde liegende Infrastruktur für Sie.

In diesem Beitrag entfernen wir uns von einem in SageMaker integrierten Algorithmus und verwenden benutzerdefinierten Code. Wir verwenden einen Random Forest von SkLearn. Aber wir bleiben bei der gleichen ML-Aufgabe und dem gleichen Datensatz wie in unserem erster Beitrag, das handgeschriebene Ziffern erkennt. Wir behandeln den Inhalt des Jupyter-Notizbuchs 2_advanced_tuning_with_custom_training_and_visualizing.ipynb und laden Sie ein, den Code nebeneinander aufzurufen, um weiterzulesen.

Lassen Sie uns tiefer eintauchen und herausfinden, wie wir benutzerdefinierten Trainingscode verwenden, ihn bereitstellen und ausführen können, während wir gleichzeitig den Hyperparameter-Suchraum erkunden, um unsere Ergebnisse zu optimieren.

So erstellen Sie ein ML-Modell und führen eine Hyperparameteroptimierung durch

Wie sieht ein typischer Prozess zum Aufbau einer ML-Lösung aus? Obwohl es viele mögliche Anwendungsfälle und eine große Vielfalt an ML-Aufgaben gibt, schlagen wir das folgende mentale Modell für einen schrittweisen Ansatz vor:

  1. Verstehen Sie Ihr ML-Szenario und wählen Sie einen Algorithmus basierend auf den Anforderungen aus. Beispielsweise möchten Sie möglicherweise eine Bilderkennungsaufgabe mithilfe eines überwachten Lernalgorithmus lösen. In diesem Beitrag verwenden wir weiterhin das handschriftliche Bilderkennungsszenario und denselben Datensatz wie in unserem ersten Beitrag.
  2. Entscheiden Sie, welche Implementierung des Algorithmus in SageMaker Training Sie verwenden möchten. Es gibt verschiedene Optionen, innerhalb von SageMaker oder extern. Darüber hinaus müssen Sie definieren, welche zugrunde liegende Metrik am besten zu Ihrer Aufgabe passt und für die Sie optimieren möchten (z. B. Genauigkeit, F1-Score oder ROC). SageMaker unterstützt je nach Ihren Anforderungen und Ressourcen vier Optionen:
    • Verwenden Sie ein vorab trainiertes Modell über Amazon SageMaker-JumpStart, das Sie sofort verwenden oder einfach nur verfeinern können.
    • Verwenden Sie einen der integrierten Algorithmen für Training und Optimierung, wie z. B. XGBoost, wie wir es in unserem vorherigen Beitrag getan haben.
    • Trainieren und optimieren Sie ein benutzerdefiniertes Modell basierend auf einem der wichtigsten Frameworks wie Scikit-learn, TensorFlow oder PyTorch. AWS stellt hierfür eine Auswahl vorgefertigter Docker-Images zur Verfügung. Für diesen Beitrag verwenden wir diese Option, die es Ihnen ermöglicht, schnell zu experimentieren, indem Sie Ihren eigenen Code auf einem vorgefertigten Container-Image ausführen.
    • Bringen Sie Ihr eigenes benutzerdefiniertes Docker-Image mit, falls Sie ein Framework oder eine Software verwenden möchten, die ansonsten nicht unterstützt wird. Diese Option erfordert den größten Aufwand, bietet aber auch das höchste Maß an Flexibilität und Kontrolle.
  3. Trainieren Sie das Modell mit Ihren Daten. Abhängig von der Algorithmusimplementierung aus dem vorherigen Schritt kann dies so einfach sein wie das Referenzieren Ihrer Trainingsdaten und das Ausführen des Trainingsjobs oder die zusätzliche Bereitstellung von benutzerdefiniertem Code für das Training. In unserem Fall verwenden wir benutzerdefinierten Trainingscode in Python, der auf Scikit-learn basiert.
  4. Wenden Sie die Hyperparameteroptimierung an (als „Gespräch“ mit Ihrem ML-Modell). Nach dem Training möchten Sie in der Regel die Leistung Ihres Modells optimieren, indem Sie die vielversprechendste Wertekombination für die Hyperparameter Ihres Algorithmus finden.

Abhängig von Ihrem ML-Algorithmus und der Modellgröße kann sich der letzte Schritt der Hyperparameteroptimierung als größere Herausforderung als erwartet erweisen. Die folgenden Fragen sind für ML-Praktiker in dieser Phase typisch und kommen Ihnen vielleicht bekannt vor:

  • Welche Art von Hyperparametern sind für mein ML-Problem von Bedeutung?
  • Wie kann ich einen riesigen Hyperparameterraum effektiv durchsuchen, um die Werte mit der besten Leistung zu finden?
  • Wie beeinflusst die Kombination bestimmter Hyperparameterwerte meine Leistungsmetrik?
  • Kosten sind wichtig; Wie kann ich meine Ressourcen effizient nutzen?
  • Welche Tuning-Experimente lohnen sich und wie kann ich sie vergleichen?

Es ist nicht einfach, diese Fragen zu beantworten, aber es gibt gute Nachrichten. SageMaker AMT nimmt Ihnen die schwere Arbeit ab und ermöglicht es Ihnen, sich auf die Auswahl der richtigen HPO-Strategie und Wertebereiche zu konzentrieren, die Sie erkunden möchten. Darüber hinaus erleichtert unsere Visualisierungslösung den iterativen Analyse- und Experimentierprozess, um leistungsstarke Hyperparameterwerte effizient zu finden.

In den nächsten Abschnitten erstellen wir mit Scikit-learn ein Ziffernerkennungsmodell von Grund auf und zeigen alle diese Konzepte in Aktion.

Lösungsüberblick

SageMaker bietet einige sehr praktische Funktionen zum Trainieren, Bewerten und Optimieren unseres Modells. Es deckt alle Funktionen eines End-to-End-ML-Lebenszyklus ab, sodass wir nicht einmal unser Jupyter-Notebook verlassen müssen.

In unserem ersten Beitrag haben wir den in SageMaker integrierten Algorithmus XGBoost verwendet. Zu Demonstrationszwecken wechseln wir dieses Mal zu einem Random Forest-Klassifikator, da wir dann zeigen können, wie Sie Ihren eigenen Trainingscode bereitstellen. Wir haben uns dafür entschieden, unser eigenes Python-Skript bereitzustellen und Scikit-learn als Framework zu verwenden. Wie drücken wir nun aus, dass wir ein bestimmtes ML-Framework verwenden möchten? Wie wir sehen werden, nutzt SageMaker einen anderen AWS-Dienst im Hintergrund, um ein vorgefertigtes Docker-Container-Image für das Training abzurufen –Amazon Elastic Container-Registrierung (Amazon-ECR).

Wir behandeln die folgenden Schritte im Detail, einschließlich Codeausschnitten und Diagrammen, um die Punkte zu verbinden. Wie bereits erwähnt, öffnen Sie bei Gelegenheit das Notebook und führen Sie die Codezellen Schritt für Schritt aus, um die Artefakte in Ihrer AWS-Umgebung zu erstellen. Es gibt keine bessere Art des aktiven Lernens.

  1. Laden Sie zunächst die Daten und bereiten Sie sie vor. Wir gebrauchen Amazon Simple Storage-Service (Amazon S3), um eine Datei mit unseren handschriftlichen Zifferndaten hochzuladen.
  2. Bereiten Sie als Nächstes das Trainingsskript und die Framework-Abhängigkeiten vor. Wir stellen den benutzerdefinierten Trainingscode in Python bereit, verweisen auf einige abhängige Bibliotheken und führen einen Testlauf durch.
  3. Um die benutzerdefinierten Zielmetriken zu definieren, können wir mit SageMaker einen regulären Ausdruck definieren, um die benötigten Metriken aus den Container-Protokolldateien zu extrahieren.
  4. Trainieren Sie das Modell mit dem Scikit-Learn-Framework. Indem wir auf ein vorgefertigtes Container-Image verweisen, erstellen wir ein entsprechendes Estimator-Objekt und übergeben unser benutzerdefiniertes Trainingsskript.
  5. AMT ermöglicht es uns, verschiedene HPO-Strategien auszuprobieren. Wir konzentrieren uns in diesem Beitrag auf zwei davon: die Zufallssuche und die Bayes'sche Suche.
  6. Wählen Sie zwischen SageMaker HPO-Strategien.
  7. Visualisieren, analysieren und vergleichen Sie Tuning-Ergebnisse. Mit unserem Visualisierungspaket können wir anhand unserer Metriken herausfinden, welche Strategie besser abschneidet und welche Hyperparameterwerte die beste Leistung liefern.
  8. Setzen Sie die Erkundung des Hyperparameterraums fort und starten Sie HPO-Jobs warm.

AMT kümmert sich um die Skalierung und Verwaltung der zugrunde liegenden Recheninfrastruktur, auf der die verschiedenen Optimierungsaufgaben ausgeführt werden Amazon Elastic Compute-Cloud (Amazon EC2) Instanzen. Auf diese Weise müssen Sie sich nicht selbst mit der Bereitstellung von Instanzen, der Behebung von Betriebssystem- und Hardwareproblemen oder der Zusammenstellung von Protokolldateien belasten. Das ML-Framework-Image wird von Amazon ECR abgerufen und die Modellartefakte einschließlich der Optimierungsergebnisse werden in Amazon S3 gespeichert. Alle Protokolle und Metriken werden in gesammelt Amazon CloudWatch für bequemen Zugriff und weitere Analysen bei Bedarf.

Voraussetzungen:

Da es sich hierbei um eine Fortsetzung einer Reihe handelt, wird die Lektüre empfohlen, ist aber nicht unbedingt erforderlich unser erster Beitrag über SageMaker AMT und HPO. Darüber hinaus sind grundlegende Kenntnisse der ML-Konzepte und der Python-Programmierung hilfreich. Wir empfehlen außerdem, jeden Schritt im zu befolgen Begleitnotizbuch aus unserem GitHub-Repository beim Lesen dieses Beitrags. Das Notebook kann unabhängig vom ersten ausgeführt werden, benötigt jedoch Code aus Unterordnern. Stellen Sie sicher, dass Sie das vollständige Repository in Ihrer Umgebung klonen, wie in der README-Datei beschrieben.

Das Experimentieren mit dem Code und die Verwendung der interaktiven Visualisierungsoptionen verbessert Ihr Lernerlebnis erheblich. Schauen Sie sich das also bitte an.

Laden Sie die Daten und bereiten Sie sie vor

Als ersten Schritt stellen wir sicher, dass der Download erfolgt Zifferndaten Die Informationen, die wir für die Schulung benötigen, sind für SageMaker zugänglich. Mit Amazon S3 können wir dies auf sichere und skalierbare Weise tun. Den vollständigen Quellcode finden Sie im Notebook. Sie können ihn gerne mit Ihren eigenen Daten anpassen.

sm_sess = sagemaker.session.Session(boto_session=boto_sess, sagemaker_client=sm)
BUCKET = sm_sess.default_bucket()
PREFIX = 'amt-visualize-demo'
s3_data_url = f's3://{BUCKET}/{PREFIX}/data'
digits = datasets.load_digits()
digits_df = pd.DataFrame(digits.data)
digits_df['y'] = digits.target
digits_df.to_csv('data/digits.csv', index=False)
!aws s3 sync data/ {s3_data_url} —exclude '*' —include 'digits.csv'

Das digits.csv Die Datei enthält Feature-Daten und Beschriftungen. Jede Ziffer wird durch Pixelwerte in einem 8×8-Bild dargestellt, wie im folgenden Bild für die Ziffer 4 dargestellt.
Zifferndatensatz von Scikit-learn

Bereiten Sie das Trainingsskript und die Framework-Abhängigkeiten vor

Da die Daten nun in unserem S3-Bucket gespeichert sind, können wir basierend darauf unser benutzerdefiniertes Trainingsskript definieren Scikit-lernen in Python. SageMaker bietet uns die Möglichkeit, später für das Training einfach auf die Python-Datei zu verweisen. Alle Abhängigkeiten wie die Scikit-learn- oder Pandas-Bibliotheken können auf zwei Arten bereitgestellt werden:

  • Sie können in a explizit angegeben werden requirements.txt Datei
  • Sie sind im zugrunde liegenden ML-Container-Image vorinstalliert, das entweder von SageMaker bereitgestellt oder individuell erstellt wird

Beide Optionen gelten im Allgemeinen als Standardmethoden für das Abhängigkeitsmanagement, sodass Sie möglicherweise bereits damit vertraut sind. SageMaker unterstützt eine Vielzahl von ML-Frameworks in einer gebrauchsfertigen verwalteten Umgebung. Dazu gehören viele der beliebtesten Data-Science- und ML-Frameworks wie PyTorch, TensorFlow oder Scikit-learn, wie in unserem Fall. Wir verwenden kein zusätzliches requirements.txt Datei, aber Sie können gerne einige Bibliotheken hinzufügen, um es auszuprobieren.

Der Code unserer Implementierung enthält eine Methode namens fit(), der einen neuen Klassifikator für die Ziffernerkennungsaufgabe erstellt und trainiert. Im Gegensatz zu unserem ersten Beitrag, in dem wir den in SageMaker integrierten XGBoost-Algorithmus verwendet haben, verwenden wir jetzt a RandomForestClassifier bereitgestellt von der ML-Bibliothek sklearn. Der Ruf der fit() Die Methode für das Klassifikatorobjekt startet den Trainingsprozess mit einer Teilmenge (80 %) unserer CSV-Daten:

def fit(train_dir, n_estimators, max_depth, min_samples_leaf, max_features, min_weight_fraction_leaf): digits = pd.read_csv(Path(train_dir)/'digits.csv') Xtrain, Xtest, ytrain, ytest = train_test_split(digits.iloc[:, :-1], digits.iloc[:, -1], test_size=.2) m = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, min_samples_leaf=min_samples_leaf, max_features=max_features, min_weight_fraction_leaf=min_weight_fraction_leaf) m.fit(Xtrain, ytrain) predicted = m.predict(Xtest) pre, rec, f1, _ = precision_recall_fscore_support(ytest, predicted, pos_label=1, average='weighted') print(f'pre: {pre:5.3f} rec: {rec:5.3f} f1: {f1:5.3}') return m

Das vollständige Skript finden Sie in unserem Jupyter-Notizbuch unter GitHub.

Haben Sie versucht, das Skript direkt auszuführen, bevor Sie Containerressourcen für den gesamten Trainingsprozess hochfahren? Dies ist eine bewährte Methode, um schnell sicherzustellen, dass der Code keine Syntaxfehler aufweist, um frühzeitig zu prüfen, ob die Dimensionen Ihrer Datenstrukturen übereinstimmen, und um andere Fehler zu vermeiden.

Es gibt zwei Möglichkeiten, Ihren Code lokal auszuführen. Erstens können Sie es direkt im Notebook ausführen und so auch den Python-Debugger verwenden pdb:

# Running the code from within the notebook. It would then be possible to use the Python Debugger, pdb.
from train import fit
fit('data', 100, 10, 1, 'auto', 0.01)

Alternativ können Sie das Train-Skript über die Befehlszeile auf die gleiche Weise ausführen, wie Sie es möglicherweise in einem Container verwenden möchten. Dies unterstützt auch das Setzen verschiedener Parameter und das Überschreiben der Standardwerte nach Bedarf, zum Beispiel:

!cd src && python train.py --train ../data/ --model-dir /tmp/ --n-estimators 100

Als Ausgabe sehen Sie erste Ergebnisse zur Leistung des Modells basierend auf den objektiven Metriken Präzision, Rückruf und F1-Score. Zum Beispiel, pre: 0.970 rec: 0.969 f1: 0.969.

Nicht schlecht für ein so schnelles Training. Aber woher kommen diese Zahlen und was machen wir damit?

Definieren Sie benutzerdefinierte Zielmetriken

Denken Sie daran, dass unser Ziel darin besteht, unser Modell vollständig auf der Grundlage der objektiven Metriken zu trainieren und abzustimmen, die wir für unsere Aufgabe als relevant erachten. Da wir ein benutzerdefiniertes Trainingsskript verwenden, müssen wir diese Metriken explizit für SageMaker definieren.

Unser Skript gibt die Metriken Präzision, Rückruf und F1-Score während des Trainings aus, indem es einfach die verwendet print Funktion:

print(f'pre: {pre:5.3f} rec: {rec:5.3f} f1: {f1:5.3}')

Die Standardausgabe wird von SageMaker erfasst und als Protokollstream an CloudWatch gesendet. Um die Metrikwerte abzurufen und später in SageMaker AMT damit zu arbeiten, müssen wir einige Informationen zum Parsen dieser Ausgabe bereitstellen. Wir können dies erreichen, indem wir reguläre Ausdrucksanweisungen definieren (weitere Informationen finden Sie unter Überwachen und analysieren Sie Schulungsaufträge mithilfe von Amazon CloudWatch-Metriken):

metric_definitions = [ {'Name': 'valid-precision', 'Regex': r'pre:s+(-?[0-9.]+)'}, {'Name': 'valid-recall', 'Regex': r'rec:s+(-?[0-9.]+)'}, {'Name': 'valid-f1', 'Regex': r'f1:s+(-?[0-9.]+)'}] 

Lassen Sie uns gemeinsam die erste Metrikdefinition im vorherigen Code durchgehen. SageMaker sucht im Protokoll, das mit beginnt, nach Ausgaben pre: und es folgen ein oder mehrere Leerzeichen und dann eine Zahl, die wir extrahieren möchten, weshalb wir die runde Klammer verwenden. Jedes Mal, wenn SageMaker einen solchen Wert findet, wandelt es ihn in eine CloudWatch-Metrik mit dem Namen um valid-precision.

Trainieren Sie das Modell mit dem Scikit-learn-Framework

Nachdem wir unser Trainingsskript erstellt haben train.py und weisen SageMaker an, wie die Metriken in CloudWatch überwacht werden sollen, definieren wir a SageMaker-Schätzer Objekt. Es initiiert den Trainingsjob und verwendet den von uns angegebenen Instanztyp. Aber wie kann sich dieser Instanztyp von dem unterscheiden, den Sie ausführen? Amazon SageMaker-Studio Notebook an, und warum? SageMaker Studio führt Ihre Trainings- (und Inferenz-)Jobs auf anderen Recheninstanzen als Ihrem Notebook aus. Dadurch können Sie in Ihrem Notebook weiterarbeiten, während die Jobs im Hintergrund ausgeführt werden.

Der Parameter framework_version bezieht sich auf die Scikit-learn-Version, die wir für unsere Schulungsaufgabe verwenden. Alternativ können wir auch bestehen image_uri zu den estimator. Sie können überprüfen, ob Ihr bevorzugtes Framework oder Ihre bevorzugte ML-Bibliothek als verfügbar ist vorgefertigtes SageMaker Docker-Image und verwenden Sie es so wie es ist oder mit Erweiterungen.

Darüber hinaus können wir SageMaker-Trainingsjobs auf EC2-Spot-Instances ausführen, indem wir festlegen use_spot_instances zu True. Es handelt sich um Instanzen mit freier Kapazität, die dies können Sparen Sie bis zu 90 % der Kosten. Diese Instanzen bieten Flexibilität bei der Ausführung der Trainingsjobs.

estimator = SKLearn( 'train.py', source_dir='src', role=get_execution_role(), instance_type= 'ml.m5.large', instance_count=1, framework_version='0.23-1', metric_definitions=metric_definitions, # Uncomment the following three lines to use Managed Spot Training # use_spot_instances= True, # max_run= 60 * 60 * 24, # max_wait= 60 * 60 * 24, hyperparameters = {'n-estimators': 100, 'max-depth': 10, 'min-samples-leaf': 1, 'max-features': 'auto', 'min-weight-fraction-leaf': 0.1}
)

Nachdem das Estimator-Objekt eingerichtet ist, beginnen wir das Training mit dem Aufruf von fit() Funktion, die den Pfad zum Trainingsdatensatz auf Amazon S3 bereitstellt. Wir können dieselbe Methode verwenden, um Validierungs- und Testdaten bereitzustellen. Wir stellen das ein wait Parameter True Damit wir das trainierte Modell in den nachfolgenden Codezellen verwenden können.

estimator.fit({'train': s3_data_url}, wait=True)

Definieren Sie Hyperparameter und führen Sie Optimierungsjobs aus

Bisher haben wir das Modell mit einem Satz von Hyperparameterwerten trainiert. Aber waren diese Werte gut? Oder könnten wir nach besseren suchen? Benutzen wir das HyperparameterTuner-Klasse um eine systematische Suche über den Hyperparameterraum durchzuführen. Wie durchsuchen wir diesen Raum mit dem Tuner? Die notwendigen Parameter sind der Name der Zielmetrik und der Zieltyp, die die Optimierung steuern. Die Optimierungsstrategie ist ein weiteres wichtiges Argument für den Tuner, da sie den Suchraum weiter definiert. Im Folgenden stehen vier verschiedene Strategien zur Auswahl:

  • Rastersuche
  • Zufällige Suche
  • Bayesianische Optimierung (Standard)
  • Hyperband

Wir beschreiben diese Strategien weiter und geben Ihnen später in diesem Beitrag einige Hinweise zur Auswahl einer Strategie.

Bevor wir unser Tuner-Objekt definieren und ausführen, lassen Sie uns unser Verständnis aus Architekturperspektive noch einmal zusammenfassen. Wir haben den Architekturüberblick von SageMaker AMT in behandelt unser letzter Beitrag Der Einfachheit halber geben wir hier einen Auszug davon wieder.

Automatische Modelloptimierungsarchitektur von Amazon SageMaker

Wir können wählen, welche Hyperparameter wir optimieren oder statisch belassen möchten. Für dynamische Hyperparameter bieten wir hyperparameter_ranges Dies kann zur Optimierung für abstimmbare Hyperparameter verwendet werden. Da wir einen Random Forest-Klassifikator verwenden, haben wir die Hyperparameter aus verwendet Scikit-learn Random Forest-Dokumentation.

Außerdem begrenzen wir die Ressourcen durch die maximale Anzahl an Trainingsjobs und parallelen Trainingsjobs, die der Tuner nutzen kann. Wir werden sehen, wie diese Grenzwerte uns helfen, die Ergebnisse verschiedener Strategien miteinander zu vergleichen.

tuner_parameters = { 'estimator': estimator, 'base_tuning_job_name': 'random', 'metric_definitions': metric_definitions, 'objective_metric_name': 'valid-f1', 'objective_type': 'Maximize', 'hyperparameter_ranges': hpt_ranges, 'strategy': 'Random', 'max_jobs': n, # 50 'max_parallel_jobs': k # 2 } 

Ähnlich wie beim Schätzer fit Mit dieser Funktion starten wir einen Tuning-Job und rufen den Tuner auf fit:

random_tuner = HyperparameterTuner(**tuner_parameters)
random_tuner.fit({'train': s3_data_url}, wait=False)

Das ist alles, was wir tun müssen, damit SageMaker die Trainingsjobs ausführen kann (n=50) im Hintergrund, wobei jeder einen anderen Satz von Hyperparametern verwendet. Wir untersuchen die Ergebnisse später in diesem Beitrag. Aber vorher beginnen wir mit einer weiteren Optimierungsaufgabe, diesmal unter Anwendung der Bayes'schen Optimierungsstrategie. Wir werden beide Strategien nach ihrer Fertigstellung visuell vergleichen.

tuner_parameters['strategy'] = 'Bayesian'
tuner_parameters['base_tuning_job_name'] = 'bayesian'
bayesian_tuner = HyperparameterTuner(**tuner_parameters)
bayesian_tuner.fit({'train': s3_data_url}, wait=False)

Beachten Sie, dass beide Tuner-Jobs parallel ausgeführt werden können, da SageMaker die erforderlichen Recheninstanzen unabhängig voneinander orchestriert. Das ist sehr hilfreich für Praktiker, die gleichzeitig mit verschiedenen Ansätzen experimentieren, wie wir es hier tun.

Wählen Sie zwischen SageMaker HPO-Strategien

Wenn es um Optimierungsstrategien geht, stehen Ihnen mit SageMaker AMT mehrere Optionen zur Verfügung: Rastersuche, Zufallssuche, Bayes'sche Optimierung und Hyperband. Diese Strategien bestimmen, wie die automatischen Optimierungsalgorithmen die angegebenen Bereiche von Hyperparametern untersuchen.

Die Zufallssuche ist ziemlich einfach. Es wählt zufällig Kombinationen von Werten aus den angegebenen Bereichen aus und kann sequentiell oder parallel ausgeführt werden. Es ist, als würde man mit verbundenen Augen Darts werfen und hoffen, das Ziel zu treffen. Wir haben mit dieser Strategie begonnen, aber werden sich die Ergebnisse mit einer anderen verbessern?

Die Bayes'sche Optimierung verfolgt einen anderen Ansatz als die Zufallssuche. Es berücksichtigt den Verlauf früherer Auswahlen und wählt Werte aus, die wahrscheinlich die besten Ergebnisse liefern. Wenn Sie aus früheren Erkundungen lernen möchten, können Sie dies nur erreichen, indem Sie nach den vorherigen einen neuen Tuning-Job ausführen. Macht doch Sinn, oder? Auf diese Weise ist die Bayes'sche Optimierung von den vorherigen Durchläufen abhängig. Aber sehen Sie, welche HPO-Strategie eine höhere Parallelisierung ermöglicht?

Hyperband ist interessant! Es verwendet eine Multi-Fidelity-Strategie, was bedeutet, dass es Ressourcen dynamisch den vielversprechendsten Ausbildungsjobs zuweist und diejenigen stoppt, die leistungsschwach sind. Daher geht Hyperband recheneffizient mit Ressourcen um und lernt aus früheren Trainingsjobs. Nachdem die leistungsschwachen Konfigurationen gestoppt wurden, wird eine neue Konfiguration gestartet, deren Werte zufällig ausgewählt werden.

Abhängig von Ihren Anforderungen und der Art Ihres Modells können Sie als Optimierungsstrategie zwischen Zufallssuche, Bayes'scher Optimierung oder Hyperband wählen. Jeder hat seinen eigenen Ansatz und seine eigenen Vorteile. Daher ist es wichtig zu überlegen, welcher für Ihre ML-Erkundung am besten geeignet ist. Die gute Nachricht für ML-Praktiker ist, dass Sie die beste HPO-Strategie auswählen können, indem Sie die Auswirkungen jedes Versuchs auf die objektive Metrik visuell vergleichen. Im nächsten Abschnitt erfahren Sie, wie Sie die Auswirkungen verschiedener Strategien visuell identifizieren können.

Visualisieren, analysieren und vergleichen Sie Tuning-Ergebnisse

Wenn unsere Tuningarbeiten abgeschlossen sind, wird es spannend. Welche Ergebnisse liefern sie? Welche Steigerung können Sie bei unserer Kennzahl im Vergleich zu Ihrem Basismodell erwarten? Was sind die leistungsstärksten Hyperparameter für unseren Anwendungsfall?

Eine schnelle und unkomplizierte Möglichkeit, die HPO-Ergebnisse anzuzeigen, ist der Besuch der SageMaker-Konsole. Unter Hyperparameter-Tuning-Jobskönnen wir (pro Optimierungsauftrag) die Kombination von Hyperparameterwerten sehen, die getestet wurden und die beste Leistung lieferten, gemessen an unserer objektiven Metrik (valid-f1).

Metriken für Hyperparameter-Tuning-Jobs

Ist das alles was Sie brauchen? Als ML-Praktiker sind Sie möglicherweise nicht nur an diesen Werten interessiert, sondern möchten auf jeden Fall mehr über das Innenleben Ihres Modells erfahren, um sein volles Potenzial auszuschöpfen und Ihre Intuition durch empirisches Feedback zu stärken.

Ein gutes Visualisierungstool kann Ihnen erheblich dabei helfen, die Verbesserung durch HPO im Laufe der Zeit zu verstehen und empirisches Feedback zu Designentscheidungen Ihres ML-Modells zu erhalten. Es zeigt die Auswirkung jedes einzelnen Hyperparameters auf Ihre Zielmetrik und bietet Hinweise zur weiteren Optimierung Ihrer Tuning-Ergebnisse.

Wir nutzen die amtviz Benutzerdefiniertes Visualisierungspaket zur Visualisierung und Analyse von Tuning-Aufgaben. Es ist einfach zu bedienen und bietet hilfreiche Funktionen. Wir demonstrieren den Nutzen, indem wir einige einzelne Diagramme interpretieren und schließlich die Zufallssuche mit der Bayes'schen Optimierung vergleichen.

Erstellen wir zunächst eine Visualisierung für die Zufallssuche. Wir können dies telefonisch tun visualize_tuning_job() für amtviz und Übergabe unseres ersten Tuner-Objekts als Argument:

from amtviz import visualize_tuning_job
visualize_tuning_job(random_tuner, advanced=True, trials_only=True)

Sie werden ein paar Diagramme sehen, aber gehen wir es Schritt für Schritt an. Das erste Streudiagramm der Ausgabe sieht wie folgt aus und gibt uns bereits einige visuelle Hinweise, die wir in keiner Tabelle erkennen würden.

Ergebnisse des Hyperparameter-Optimierungsjobs

Jeder Punkt repräsentiert die Leistung einer einzelnen Trainingsaufgabe (unser Ziel). valid-f1 auf der y-Achse) basierend auf seiner Startzeit (x-Achse), erzeugt durch einen bestimmten Satz von Hyperparametern. Daher betrachten wir die Leistung unseres Modells im Laufe der Dauer des Optimierungsauftrags.

Die gepunktete Linie markiert das bisher beste Ergebnis und zeigt eine Verbesserung im Laufe der Zeit an. Die besten beiden Ausbildungsberufe erreichten einen F1-Score von rund 0.91.

Erkennen Sie neben der gepunkteten Linie, die den kumulativen Fortschritt anzeigt, einen Trend im Diagramm?

Wahrscheinlich nicht. Und das ist zu erwarten, denn wir sehen uns die Ergebnisse der Zufalls-HPO-Strategie an. Jeder Trainingsjob wurde mit einem anderen, aber zufällig ausgewählten Satz von Hyperparametern ausgeführt. Wenn wir unsere Optimierungsarbeit fortsetzten (oder eine andere mit derselben Einstellung ausführen würden), würden wir mit der Zeit wahrscheinlich bessere Ergebnisse sehen, aber wir können nicht sicher sein. Zufälligkeit ist eine heikle Sache.

Mithilfe der nächsten Diagramme können Sie den Einfluss von Hyperparametern auf die Gesamtleistung abschätzen. Alle Hyperparameter werden visualisiert, aber der Kürze halber konzentrieren wir uns auf zwei davon: n-estimators und max-depth.

Details zu Hyperparameter-Jobs

Unsere beiden wichtigsten Ausbildungsberufe waren Nutzung n-estimators von etwa 20 bis 80 und max-depth von etwa 10 bzw. 18. Die genauen Hyperparameterwerte werden per Tooltip für jeden Punkt (Trainingsjob) angezeigt. Sie werden sogar in allen Diagrammen dynamisch hervorgehoben und ermöglichen Ihnen eine mehrdimensionale Ansicht! Hast du das gesehen? Jeder Hyperparameter wird als separates Diagramm gegen die Zielmetrik aufgetragen.

Was für Erkenntnisse erhalten wir nun? n-estimators?

Basierend auf dem linken Diagramm scheint es, dass sehr niedrige Wertebereiche (unter 10) im Vergleich zu höheren Werten häufiger schlechte Ergebnisse liefern. Daher können höhere Werte dazu beitragen, dass Ihr Modell eine bessere Leistung erbringt – interessant.

Im Gegensatz dazu ist die Korrelation der max-depth Der Hyperparameter zu unserer objektiven Metrik ist eher niedrig. Wir können nicht eindeutig sagen, welche Wertebereiche aus allgemeiner Sicht besser abschneiden.

Zusammenfassend lässt sich sagen, dass die Zufallssuche Ihnen dabei helfen kann, selbst in relativ kurzer Zeit einen leistungsstarken Satz von Hyperparametern zu finden. Außerdem ist es nicht auf eine gute Lösung ausgerichtet, sondern bietet eine ausgewogene Sicht auf den Suchraum. Ihre Ressourcennutzung ist jedoch möglicherweise nicht sehr effizient. Es führt weiterhin Trainingsjobs mit Hyperparametern in Wertebereichen aus, die bekanntermaßen schlechte Ergebnisse liefern.

Lassen Sie uns die Ergebnisse unseres zweiten Optimierungsauftrags mithilfe der Bayes'schen Optimierung untersuchen. Wir können benutzen amtviz um die Ergebnisse auf die gleiche Weise zu visualisieren, wie wir es bisher für den Zufallssuchtuner getan haben. Oder, noch besser, wir können die Funktion der Funktion nutzen, um beide Tuning-Jobs in einem einzigen Diagrammsatz zu vergleichen. Ziemlich praktisch!

visualize_tuning_job([random_tuner, bayesian_tuner], advanced=True, trials_only=True)

Hyperparameter-Optimierungsjob Bayesian VS Random

Es gibt jetzt mehr Punkte, weil wir die Ergebnisse aller Trainingsjobs sowohl für die Zufallssuche (orange Punkte) als auch für die Bayes'sche Optimierung (blaue Punkte) visualisieren. Auf der rechten Seite sehen Sie ein Dichtediagramm, das die Verteilung aller F1-Scores visualisiert. Ein Großteil der Trainingsjobs erzielte Ergebnisse im oberen Bereich der F1-Skala (über 0.6) – das ist gut!

Was ist hier die wichtigste Erkenntnis? Das Streudiagramm zeigt deutlich den Nutzen der Bayes'schen Optimierung. Es liefert mit der Zeit bessere Ergebnisse, da es aus früheren Läufen lernen kann. Deshalb haben wir mit Bayesian im Vergleich zu Random (0.967 vs. 0.919) bei gleicher Anzahl an Trainingsjobs deutlich bessere Ergebnisse erzielt.

Es gibt noch mehr, was Sie tun können amtviz. Lassen Sie uns näher darauf eingehen.

Wenn Sie SageMaker AMT die Anweisung geben, eine größere Anzahl von Jobs zur Optimierung auszuführen, kann die gleichzeitige Anzeige vieler Versuche unübersichtlich werden. Das ist einer der Gründe, warum wir diese Diagramme interaktiv gestaltet haben. Sie können auf jedes Hyperparameter-Streudiagramm klicken und es ziehen, um bestimmte Wertebereiche zu vergrößern und Ihre visuelle Interpretation der Ergebnisse zu verfeinern. Alle anderen Diagramme werden automatisch aktualisiert. Das ist ziemlich hilfreich, nicht wahr? Sehen Sie sich die nächsten Diagramme als Beispiel an und probieren Sie es selbst in Ihrem Notizbuch aus!

Funktionen zur Jobvisualisierung zur Hyperparameteroptimierung

Als Tuning-Maximalist können Sie auch entscheiden, dass die Ausführung eines weiteren Hyperparameter-Tuning-Jobs die Leistung Ihres Modells weiter verbessern könnte. Dieses Mal kann jedoch ein spezifischerer Bereich von Hyperparameterwerten untersucht werden, da Sie bereits (ungefähr) wissen, wo Sie bessere Ergebnisse erwarten können. Beispielsweise können Sie sich auf Werte zwischen 100 und 200 konzentrieren n-estimators, wie in der Tabelle dargestellt. Dadurch kann sich AMT auf die vielversprechendsten Schulungsaufgaben konzentrieren und Ihre Tuning-Effizienz steigern.

Etwas zusammenfassen, amtviz bietet Ihnen umfangreiche Visualisierungsfunktionen, mit denen Sie die Auswirkungen der Hyperparameter Ihres Modells auf die Leistung besser verstehen und intelligentere Entscheidungen bei Ihren Optimierungsaktivitäten treffen können.

Setzen Sie die Erkundung des Hyperparameterraums fort und starten Sie HPO-Jobs warm

Wir haben gesehen, dass AMT uns dabei hilft, den Hyperparameter-Suchraum effizient zu erkunden. Was aber, wenn wir mehrere Optimierungsrunden benötigen, um unsere Ergebnisse iterativ zu verbessern? Wie eingangs erwähnt, möchten wir einen Optimierungs-Feedback-Zyklus etablieren – unser „Gespräch“ mit dem Modell. Müssen wir jedes Mal bei Null anfangen?

Werfen wir einen Blick auf das Konzept des Ausführens eines Hyperparameter-Tuning-Job warm starten. Es initiiert keine neuen Tuning-Jobs von Grund auf, sondern nutzt das, was in den vorherigen HPO-Läufen gelernt wurde. Dies hilft uns, unsere Optimierungszeit und Rechenressourcen effizienter zu nutzen. Wir können unsere vorherigen Ergebnisse weiter iterieren. Um Warmstarts zu nutzen, erstellen wir eine WarmStartConfig und angeben warm_start_type as IDENTICAL_DATA_AND_ALGORITHM. Das bedeutet, dass wir die Hyperparameterwerte ändern, aber weder die Daten noch den Algorithmus. Wir weisen AMT an, das bisherige Wissen auf unseren neuen Tuning-Auftrag zu übertragen.

Indem wir uns auf unsere früheren Aufgaben zur Bayes'schen Optimierung und Optimierung der Zufallssuche beziehen parents, wir können beide für den Warmstart verwenden:

warm_start_config = WarmStartConfig(warm_start_type=WarmStartTypes.IDENTICAL_DATA_AND_ALGORITHM, parents=[bayesian_tuner_name, random_tuner_name])
tuner_parameters['warm_start_config'] = warm_start_config

Um die Vorteile des Warmstarts zu erkennen, sehen Sie sich die folgenden Diagramme an. Diese werden generiert von amtviz auf ähnliche Weise wie zuvor, aber dieses Mal haben wir einen weiteren Tuning-Job hinzugefügt, der auf einem Warmstart basiert.

Warmstart des Hyperparameter-Optimierungsjobs

Im linken Diagramm können wir beobachten, dass neue Tuning-Jobs meist in der oberen rechten Ecke des Leistungsmetrikdiagramms liegen (siehe orange markierte Punkte). Beim Warmstart wurden tatsächlich die vorherigen Ergebnisse wiederverwendet, weshalb diese Datenpunkte in den Top-Ergebnissen für die F1-Wertung enthalten sind. Diese Verbesserung spiegelt sich auch im Dichtediagramm rechts wider.

Mit anderen Worten: AMT wählt basierend auf seinen Erkenntnissen aus früheren Versuchen automatisch vielversprechende Sätze von Hyperparameterwerten aus. Dies wird im nächsten Diagramm dargestellt. Beispielsweise würde der Algorithmus einen niedrigen Wert testen n-estimators seltener, da diese bekanntermaßen zu schlechten F1-Ergebnissen führen. Dank Warmstarts verschwenden wir dafür keine Ressourcen.

Visualisierte Jobs zur Hyperparameteroptimierung

Aufräumen

Um unerwünschte Kosten zu vermeiden, wenn Sie mit dem Experimentieren mit HPO fertig sind, müssen Sie alle Dateien in Ihrem S3-Bucket mit dem Präfix entfernen amt-visualize-demo und Fahren Sie die SageMaker Studio-Ressourcen herunter.

Führen Sie den folgenden Code in Ihrem Notebook aus, um alle S3-Dateien aus diesem Beitrag zu entfernen:

!aws s3 rm s3://{BUCKET}/amt-visualize-demo --recursive

Wenn Sie die Datensätze oder Modellartefakte behalten möchten, können Sie das Präfix im Code in ändern amt-visualize-demo/data die Daten nur zu löschen bzw amt-visualize-demo/output um nur die Modellartefakte zu löschen.

Zusammenfassung

Wir haben gelernt, dass die Kunst der Entwicklung von ML-Lösungen darin besteht, Hyperparameter zu erforschen und zu optimieren. Das Einstellen dieser Knöpfe und Hebel ist ein anspruchsvoller, aber lohnender Prozess, der zu schnelleren Trainingszeiten, verbesserter Modellgenauigkeit und insgesamt besseren ML-Lösungen führt. Die SageMaker AMT-Funktionalität hilft uns, mehrere Optimierungsjobs auszuführen und warm zu starten, und stellt Datenpunkte für die weitere Überprüfung, den visuellen Vergleich und die Analyse bereit.

In diesem Beitrag haben wir uns mit HPO-Strategien befasst, die wir mit SageMaker AMT verwenden. Wir begannen mit der Zufallssuche, einer einfachen, aber leistungsstarken Strategie, bei der Hyperparameter zufällig aus einem Suchraum ausgewählt werden. Als nächstes verglichen wir die Ergebnisse mit der Bayes'schen Optimierung, die probabilistische Modelle verwendet, um die Suche nach optimalen Hyperparametern zu steuern. Nachdem wir durch erste Versuche eine geeignete HPO-Strategie und gute Wertebereiche für Hyperparameter identifiziert hatten, zeigten wir, wie Warmstarts genutzt werden können, um zukünftige HPO-Jobs zu rationalisieren.

Sie können den Hyperparameter-Suchraum erkunden, indem Sie quantitative Ergebnisse vergleichen. Wir haben den visuellen Vergleich nebeneinander vorgeschlagen und das notwendige Paket für die interaktive Erkundung bereitgestellt. Teilen Sie uns in den Kommentaren mit, wie hilfreich es für Sie auf Ihrer Reise zur Optimierung der Hyperparameter war!


Über die Autoren

Uemit YoldasÜmit Yoldas ist Senior Solutions Architect bei Amazon Web Services. Er arbeitet mit Unternehmenskunden aller Branchen in Deutschland zusammen. Sein Antrieb ist es, KI-Konzepte in reale Lösungen umzusetzen. Außerhalb der Arbeit verbringt er gerne Zeit mit der Familie, genießt gutes Essen und treibt Fitness.

Elina LesykElina Lesyk ist ein Lösungsarchitekt mit Sitz in München. Ihr Fokus liegt auf Unternehmenskunden aus der Finanzdienstleistungsbranche. In ihrer Freizeit kann man Elina bei einigen IT-Treffen dabei beobachten, wie sie Anwendungen mit generativer KI entwickelt, eine neue Idee zur schnellen Bewältigung des Klimawandels vorantreibt oder im Wald läuft, um sich auf einen Halbmarathon mit einer typischen Abweichung vom geplanten Zeitplan vorzubereiten.

Mariano KampMariano Kamp ist Principal Solutions Architect bei Amazon Web Services. Er arbeitet mit Banken und Versicherungen in Deutschland im Bereich maschinelles Lernen. In seiner Freizeit wandert Mariano gerne mit seiner Frau.

Zeitstempel:

Mehr von AWS Maschinelles Lernen