Machine Learning für Softwareentwickler. Paolo Perrotta
Чтение книги онлайн.
Читать онлайн книгу Machine Learning für Softwareentwickler - Paolo Perrotta страница 14
return w, b <
raise Exception("Couldn't converge within %d iterations" % iterations)
# Importiert den datensatz
X, Y = np.loadtxt("pizza.txt", skiprows=1, unpack=True)
# Trainiert das System
w, b = train(X, Y, iterations=10000, lr=0.01) <
print("\nw=%.3f, b=%.3f" % (w, b)) <
# Sagt die Anzahl der Pizzas vorher
print("Prediction: x=%d => y=%.2f" % (20, predict(20, w, b))) <
Die meisten Zeilen haben sich geändert, aber all diese Änderungen betreffen nur die Einführung des neuen Parameters b. Von besonderer Bedeutung sind die Änderungen in der Funktion predict(), die jetzt das neue Modell nutzt, und train(), in der b jetzt auf die gleiche Weise unter Berücksichtigung des Verlusts erhöht und erniedrigt wird wie w. Es war mir nicht ganz klar, wie ich w und b gleichzeitig verändern sollte, weshalb ich einen dieser provisorischen Hacks verwendet habe, die wir alle so lieben: Ich habe einfach ein paar neue Zweige zu der if-Anweisung hinzugefügt.
Probieren wir das Programm nun aus! Die Funktion train() braucht jetzt länger, um zu konvergieren, kommt aber schließlich doch zum Ziel:
Iteration 0 => Loss: 812.867
Iteration 1 => Loss: 804.821
Iteration 2 => Loss: 796.818
...
Iteration 1551 => Loss: 22.864
w=1.100, b=12.930
Prediction: x=20 => y=34.93
Der Graph mit der Näherungsgeraden sieht wie folgt aus:
Jetzt nähert sich die Gerade den Beispielen schon viel besser an! Vor allem ist der resultierende Verlust geringer als zuvor, was bedeutet, dass wir die Pizzaverkäufe auch viel genauer vorhersagen können. Roberto wird sich freuen.
Das war eine Menge Arbeit für die erste Version unseres Programms. Halten wir kurz inne, treten wir einen Schritt zurück und sehen wir uns das Gesamtbild an.
Hyperparameter
Beim überwachten Lernen resultiert die Trainingsphase in einem Satz von Werten, die wir im Modell verwenden können. In unserem Fall handelt es sich dabei um das Gewicht und den Bias, die wir in die Geradengleichung einsetzen. Diese Werte werden »Parameter« genannt, was in der Programmierung jedoch etwas unglücklich ist, da wir die Bezeichnung »Parameter« hier schon für etwas anderes verwenden. Es ist sehr leicht möglich, Parameter wie w und b mit den Parametern von Funktionen wie train() zu verwechseln.
Um das zu vermeiden, werden die Parameter der Funktion train() im ML-Umfeld als Hyperparameter bezeichnet, also als »Parameter höherer Ordnung«. Kurz gesagt, legen wir Hyperparameter wie iterations und lr fest, damit die Funktion train() Parameter wie w und b ermitteln kann.
Zusammenfassung
In den ersten beiden Kapiteln haben Sie eine Menge Informationen erhalten und viele neue Begriffe kennengelernt. Lassen Sie mich daher eine Zusammenfassung geben.
In diesem Kapitel haben wir unser erstes Programm zum überwachten Lernen geschrieben. Ein System für überwachtes Lernen wird mit Beispielen trainiert, die jeweils aus einer Eingabevariablen und einem Label bestehen. In unserem Fall waren die Eingabevariablen jeweils eine Anzahl von Reservierungen und die Labels jeweils eine Anzahl verkaufter Pizzas.
Beim überwachten Lernen werden die Beispiele mit einer Funktion angenähert, die oft als Modell bezeichnet wird. In unserem ersten Programm ist das Modell eine Gerade, die durch zwei Parameter bestimmt wird, nämlich Gewicht und Bias. Das Prinzip der Annäherung von Beispielen durch eine Gerade wird lineare Regression genannt.
Die erste Phase beim überwachten Lernen ist die Trainingsphase, in der das System die Parameter des Models anpasst, um eine Annäherung an die Beispiele zu erreichen. Bei dieser Suche richtet sich das System nach der Verlustfunktion, die die Abweichung des aktuellen Modells von der Grundwahrheit misst: je geringer der Verlust, umso besser das Modell. Unser Programm berechnet den Verlust mit der Formel für den mittleren quadratischen Fehler. Das Training resultiert in dem Gewicht und dem Bias, die zu dem geringsten Verlust führen, den das System finden konnte.
Die in der Trainingsphase ermittelten Parameter werden anschließend in der Vorhersagephase des überwachten Lernens genutzt. Dabei werden Eingaben ohne Labels an das parametrisierte Modell übergeben. Das Ergebnis ist eine Vorhersage wie: »Heute Abend können Sie erwarten, 42 Pizzas zu verkaufen.«
In gewisser Hinsicht entsprechen die Trainings- und die Vorhersagephase des überwachten Lernens der Kompilierungs- und Laufzeitphase in der Programmierung. Das Training ist gewöhnlich datenhungrig und erfordert umfassende Berechnungen, wohingegen die Vorhersage keinen großen Aufwand verursacht. Selbst in unserem kleinen Programm braucht die Funktion train() merkliche Zeit, um eine passende Gerade zu den Beispielen zu finden, während predict() einfach nur eine rasend schnelle Multiplikation durchführt.
In umfangreichen Systemen wird der Unterschied zwischen Training und Vorhersage noch deutlicher: Das Training eines Spracherkennungssystems kann Wochen dauern und die Verarbeitung von Millionen von Audiodateien auf mehreren Prozessoren erfordern. Anschließend können Sie das System auf einem Smartphone installieren und dazu verwenden, ohne großen Aufwand die Bedeutung einzelner Stichproben zu bestimmen.
Das war eine ganze Menge Stoff. Ich verspreche Ihnen aber, dass in keinem weiteren Kapitel so viele neue Begriffe auf einen Schlag eingeführt werden.
Auf der anderen Seite haben wir in diesem Kapitel von Grund auf ein Programm zum überwachten Lernen erstellt, was schon eine ziemliche Leistung ist. Heutzutage nutzt der Großteil der ML-Software, darunter auch die meisten der erstaunlichen Deep-Learning-Systeme, das Prinzip des überwachten Lernens. Diese Systeme sind natürlich viel komplizierter als unser Pizzavorhersageprogramm. Statt einer Liste von Reservierungszahlen nehmen sie hochauflösende Bilder als Eingabe entgegen, und statt eines einfachen Modells mit zwei Parametern haben sie komplexe Modelle mit Zehntausenden von Parametern. Allerdings funktionieren sie nach denselben Grundprinzipien wie unser bescheidenes Python-Programm.
Im nächsten Kapitel bauen wir auf dieser Grundlage auf und lernen einen der wichtigsten Algorithmen des Machine Learning kennen.
Praktische Übung: Die Lernrate optimieren
Bevor Sie fortfahren, können Sie noch ein wenig mit dem Code herumspielen. Das ist eine gute Möglichkeit, um die Prinzipien besser zu verinnerlichen.
Als Erstes können Sie sich dazu etwas besser mit den Hyperparametern des Systems vertraut machen (siehe den Kasten »Hyperparameter« auf Seite 37).