Die Texte in diesem Artikel wurden teilweise mit Hilfe künstlicher Intelligenz erarbeitet und von uns korrigiert und überarbeitet. Für die Generierung wurden folgende Dienste verwendet:
Wie wir maschinelles Lernen bei der Erstellung unserer Artikel einsetzenEinordnung
Machine Learning spielt schon seit ein paar Jahren eine immer größere Rolle. Dabei wichtig: Die Fähigkeit, relativ simpel und zuverlässig Daten in gelernte Klassen einzuteilen, sogenannte Klassifikation. Vor allem neuronale Netze spielen hierbei immer häufiger eine Rolle, da diese vielseitig anwendbar und flexibel sind; weiterhin sind diese ebenfalls in der Lage starke Nichtlinearitäten in Daten abbilden zu können. Dieser Post soll eine Einführung in die Klassifizierung als Aufgabe im Supervised Learning geben und eine einfache Implementierung mittels künstlicher neuronaler Netze vorstellen.
Klassifikation als Aufgabe
Gegeben seien zwei Mengen, einmal jeweils die Menge der Eingangsvariablen und die Menge der Klassen . Gesucht ist nun eine Funktion , welche die Eingangsdaten auf geeignete Klassen abbildet:
In der Aufgabenstellung müssen jeweils sowohl die Eingansvariablen als auch die entsprechenden Klassen definiert sein, als auch eine gewisse Grundmenge an Daten vorliegen; andernfalls ist Konvergenz des Algorithmus entsprechend nicht zu erwarten. Die Anzahl der Datenpunkte variiert hierbei jeweils mit der Komplexität der Aufgabenstellung und Anzahl der Eingangsvariablen.
Loss-Metrik
Äquivalent zu nahezu allen Machine Learning-Modellen, wird zum Training eine entsprechende Loss-Metrik verwendet, um die Abweichung zwischen den vorliegenden Trainingsdaten und den Vorhersagen des Modells zu berechnen. Für eine Klassifizierung bietet sich hierbei die categorical Crossentropy (deut.: Kategorische Kreuzentropie) an, welche Abweichungen zwischen verschiedenen vorhergesagten Klassen gut darstellt.
Wenn wir uns in Richtung künstlicher neuronaler Netze bewegen, verwenden wir hierbei meist die diskrete Formulierung. Diese lautet für zwei diskrete Wahrscheinlichkeitsverteilungen wie folgt:
Das Ziel unseres Modells ist entsprechend, die Abweichung zwischen den Vorhersagen und Daten zu minimieren, was äquivalent dazu ist den Wert der Loss-Funktion zu minimieren.
Aktivierungsfunktionen
Bei einem neuronalen Netzwerk sind die Aktivierungsfunktionen relevant für den Erhalt eines sinnvollen Ergebnisses. In Zwischenlayern ergibt sich hierbei meist wieder die Rectified Linear Unit (ReLU) als sinnvolle Wahl, allerdings ist hierbei die Wahl der letzten Aktivierungsfunktion relevant.
Da es sich hier um eine Klassifizierung handelt, ergibt es Sinn als Ausgabe eine Wahrscheinlichkeitsverteilung zu erhalten, also einen Vektor , welcher
erfüllt. Hierfür gibt es zwei beliebte Ansätze, um dies zu garantieren:
- Eine einfache Transformation auf einen Einheitsvektor mittels der Vektornorm. Dies stellt den Ansatz dar, welcher in Mathematik in der Oberstufe von Gymnasien vermittelt wird.
In diesem Ansatz stellt die euklidische Norm dar. Das Ergebnis hierbei erfüllt die notwendige Bedingung, welche oben definiert wurde und stellt damit eine Wahrscheinlichkeitsverteilung dar. 1
- Transformation auf eine Wahrscheinlichkeitsverteilung mittels der softmax-Aktivierungsfunktion: Bei diesem Ansatz wird die Softmax-Aktivierungsfunktion 2 verwendet:
Auch diese erreicht eine entsprechende Wahrscheinlichkeitsverteilung . Vorteil dieser Funktion ist es, dass kleine Fehler nicht proportional skaliert werden, sondern auf größere Werte transformiert werden, was den Trainingsprozess beschleunigt.
Als weitere Möglichkeit kann eine beliebige Basis anstatt verwendet werden, um eine geeignete Skalierung selber bestimmen zu können.
Als letzte Aktivierungsfunktion kann auch wieder ReLU gewählt werden, dann müssen allerdings die Werte vor Weiterverwendung in eine Wahrscheinlichkeitsverteilung umgewandelt werden, um mit diesen trainieren zu können. Für eine Vorhersage einer Klasse reicht das typische
argmax()
um diese zu berechnen.
Implementierung mittels Tensorflow
Generierung des Datensets
In diesem Post wird das Datenset CIFAR-10, verwendet, welches verschiedene Objekte und Tiere klassifizieren lässt. Als Eingangsvariablen gibt es uns hierbei ein -Array, welches die Pixelintensität darstellt.
Die notwendigen Imports lauten wie folgt:
Das Datenset lässt sich simpel über die Tensorflow Datasets-API herunterladen:
Bei diesem Code erstellen wir zuerst einen Builder
, welcher eine Schnittstelle für den Download bereitstellt. Anschließend wird hier ein Train-Test-Split von zu durchgeführt.
Als Nächstes generieren wir uns die Daten in einem Format, sodass diese im weiteren Verlauf sinnvoll verwendet werden können. Beim Überprüfen können wir sehen, dass wir Datenpunkte im Trainingsdatensatz und im Testdatensatz vorhanden haben.
Ein Blick in den Datensatz zeigt uns Bilder wie das folgende Bild:
Hierbei handelt es sich um niedrig auflösendes Bild aus dem originalen Datensatz, dargestellt mit Matplotlib.
Zur Klassifizierung wird hierbei ein Convolutional Neural Network verwendet, welches sich durch die Verwendung von Conv2D, MaxPool2D und Flatten-Layern auszeichnet. Hierbei wird auf das Bild eine Filter- und Vereinigungsoperation angewandt, welche in der Praxis gute Ergebnisse erzielt.
Hinweis: Als Aktivierungsfunktion des letzten Layers wird die softmax-Aktivierung verwendet.
Das Training wird anschließend über die model.fit()
-Methode ausgeführt:
Alleine nach 20 Epochen erreicht man hier schon eine categorical accuracy von auf dem Trainingsset und auf dem Testset. Längeres Training verbessert die Präzision, allerdings auch das Overfitting. Ebenfalls eine Fehlerquelle kann die Netzwerkarchitektur sein, welche durch Hyperparameteroptimierung verbessert werden kann.
Im Folgenden findet sich einmal der Verlauf der Loss-Funktion
ebenso wie der Verlauf der kategoischen Genauigkeit:
Hinweise
-
Alternativ zu
model.fit()
kann auch ein eigenes Fitting programmiert werden, welches mit automatischer Differentiation durchtensorflow.GradientTape
funktioniert. Siehe hierbei tensorflow.com oder in die Beispiele vom Deep Q Learning. -
Für jede Art von Verwendung für neuronalen Netzen bietet es sich an, Eingangs- und Ausgangsdaten zu normalisieren.
Normalisierung bedeutet, die Werte der entsprechenden Variable auf den Wertebereich zu transformieren. Dies gelingt simpel und effizient beispielsweise mit einer linearen Transformation, siehe microsoft.com.