Die Dropout Layer ist eine Schicht, die beim Aufbau von Neuronalen Netzwerken genutzt wird, um das Overfitting zu verhindern. Dabei werden einzelne Knoten in verschiedenen Trainingsabläufen mithilfe einer Wahrscheinlichkeit ausgeschlossen, so, als ob sie gar nicht Bestandteil der Netzwerkarchitektur wären.
Bevor wir jedoch zu den Details dieser Schicht kommen können, sollten wir erstmal verstehen, wie ein Neuronales Netz funktioniert und wieso es zu Overfitting kommen kann.
Wie funktioniert ein Perceptron?
Das Perceptron ist ein ursprünglich mathematisches Modell und wurde erst später in der Informatik und im Machine Learning genutzt, aufgrund der Eigenschaft komplexe Zusammenhänge erlernen zu können. In der einfachsten Form besteht es aus genau einem sogenannten Neuron, das den Aufbau des menschlichen Gehirns nachahmt.
Das Perceptron hat dabei mehrere Eingänge, die sogenannten Inputs, an denen es numerische Informationen, also Zahlenwerte erhält. Je nach Anwendung kann sich die Zahl der Inputs unterscheiden. Die Eingaben haben verschiedene Gewichte, die angeben, wie einflussreich die Inputs für die schlussendliche Ausgabe sind. Während des Lernprozesses werden die Gewichte so geändert, dass möglichst gute Ergebnisse entstehen.

Das Neuron selbst bildet dann die Summe der Inputwerte multipliziert mit den Gewichten der Inputs. Diese gewichtete Summe wird weitergeleitet an die sogenannte Aktivierungsfunktion. In der einfachsten Form eines Neurons gibt es genau zwei Ausgaben, es können also nur binäre Outputs vorhergesagt werden, beispielsweise „Ja“ oder „Nein“ oder „Aktiv“ oder „Inaktiv“ etc.

Wenn das Neuron binäre Ausgabewerte hat, wird eine Funktion genutzt, deren Werte auch zwischen 0 und 1 liegen. Ein Beispiel für eine häufig genutzt Aktivierungsfunktion ist die Sigmoid-Funktion. Die Werte der Funktion schwanken zwischen 0 und 1 und nehmen eigentlich auch fast ausschließlich diese Werte an. Ausschließlich bei x = 0 gibt es einen steilen Anstieg und den Sprung von 0 zu 1. Wenn die gewichtete Summe des Perceptrons also x = 0 überschreitet und das Perceptron Sigmoid als Aktivierungsfunktion nutzt, dann ändert sich der Output auch entsprechend von 0 auf 1.
Was ist Overfitting?
Der Begriff Overfitting wird im Zusammenhang mit Vorhersagemodellen genutzt, die zu spezifisch auf den Trainingsdatensatz angepasst sind und dadurch die Streuung der Daten mit erlernen. Dies passiert häufig, wenn das Modell eine zu komplexe Struktur hat für die zugrundeliegenden Daten. Das Problem ist dann, dass das trainierte Modell nur sehr schlecht generalisiert, also nur unzureichende Vorhersagen für neue, ungesehene Daten liefert. Die Performance auf dem Trainingsdatensatz hingegen war sehr gut, weshalb man von einer hohen Modellgüte ausgehen könnte.

Bei tiefen Neuronalen Netzwerken kann es dazu kommen, dass das komplexe Modell den statistischen Noise des Trainingsdatensatzes erlernt und dadurch gute Ergebnisse im Training liefert. Im Testdatensatz jedoch und vor allem nachher in der Anwendung liegt dieser Noise jedoch nicht mehr vor und deshalb ist die Generalisierung des Modells nur sehr schlecht.
Jedoch wollen wir nicht auf die tiefe und komplexe Architektur des Netzwerkes verzichten, da sich nur so komplexe Zusammenhänge erlernen und somit schwierige Probleme lösen lassen. Vor der Vorstellung der Dropout Layer war dies eine komplizierte Gratwanderung die richtige Architektur zu finden, die noch komplex genug ist für das zugrundeliegende Problem ist, aber auch nicht zum Overfitting neigt.
Wie funktioniert die Dropout Layer?
Beim Dropout werden bestimmte Knoten in einem Trainingsdurchlauf auf den Wert Null gesetzt, also aus dem Netzwerk entfernt. Somit haben sie bei der Vorhersage und auch bei der Backpropagation keinerlei Einfluss. Dadurch wird in jedem Durchlauf eine neue, leicht abgeänderte Netzwerkarchitektur gebaut und das Netzwerk erlernt, auch gute Vorhersagen ohne bestimmte Inputs zu erzeugen.
Beim Einbau der Dropout Layer muss auch eine sogenannte Dropout Wahrscheinlichkeit angegeben werden. Diese legt fest, wie viele der Knoten in der Schicht gleich 0 gesetzt werden. Wenn wir eine Inputschicht mit zehn Eingabewerten haben, bedeutet eine Dropout-Probability von 10 %, dass in jedem Trainingsdurchlauf ein zufälliger Input gleich Null gesetzt wird. Wenn es sich stattdessen um eine Hidden Layer handelt, wird dieselbe Logik auf die Hidden Nodes angewandt. Also eine Dropoutwahrscheinlichkeit von 10 % bedeutet, dass in jedem Durchlauf 10 % der Knoten nicht genutzt werden.
Die optimale Wahrscheinlichkeit hängt auch stark von der Schichtart ab. Wie verschiedene Paper herausgefunden haben, ist bei der Input-Layer eine Dropoutwahrscheinlichkeit nahe der eins optimal. Bei den Hidden Layers hingegen führt eine Wahrscheinlichkeit nahe der 50 % zu besseren Ergebnissen.
Warum verhindert die Dropout Layer Overfitting?
In tiefen Neuronalen Netzwerken entsteht Overfitting meist dadurch, dass bestimmte Neuronen von verschiedenen Schichten sich gegenseitig beeinflussen. Einfach gesagt führt das zum Beispiel dazu, dass gewisse Neuronen die Fehler von vorherigen Knoten ausbessern und somit voneinander abhängen oder die guten Ergebnisse der vorherigen Schicht ohne große Änderungen einfach weiterreichen. Dadurch wird eine vergleichsweise schlechte Generalisierung erreicht.
Durch die Nutzung der Dropout Layer können sich die Neuronen hingegen nicht mehr auf die Knoten von vorherigen oder folgenden Schichten verlassen, da sie nicht davon ausgehen können, dass diese in dem jeweiligen Trainingsdurchlauf überhaupt existieren. Dies führt dazu, dass die Neuronen, nachweislich, grundlegendere Strukturen in Daten erkennt, die nicht von der Existenz einzelner Neuronen abhängen. Diese Abhängigkeiten treten in regulären Neuronalen Netzwerken tatsächlich relativ häufig auf, da dies eine einfache Möglichkeit ist, die Verlustfunktion schnell zu verringern und dadurch dem Ziel des Modells schnell näher zu kommen.
Außerdem verändert, wie bereits erwähnt, der Dropout die Architektur des Netzwerks leicht. Somit ist das austrainierte Modell dann eine Kombination aus vielen, leicht unterschiedlichen Modellen. Diese Vorgehensweise kennen wir bereits aus dem Ensemble Learning, wie beispielsweise in Random Forests. Dabei stellt sich heraus, dass das Ensemble von vielen, relativ ähnlichen Modellen meist bessere Ergebnisse liefert, als ein einziges Modell. Dieses Phänomen ist unter dem Namen „Wisdom of the Crowds“ bekannt.
Wie baut man Dropout in ein bestehendes Netzwerk ein?
In der Praxis wird die Dropout Layer oft nach einer Fully-Connected Layer verwendet, da diese vergleichsweise viele Parameter hat und somit die Wahrscheinlichkeit der sogenannten „Co-Adaption“, also der Abhängigkeit von Neuronen untereinander sehr hoch ist. Jedoch kann man theoretisch auch nach jeder beliebigen Schicht eine Dropout Layer einfügen, jedoch kann es dann auch zu schlechteren Ergebnissen führen.
Praktisch gesehen wird die Dropout Layer einfach nach der gewünschten Schicht eingefügt und nutzt dann die Neuronen der vorhergehenden Schicht als Inputs. Je nach Wert der Wahrscheinlichkeit wird ein Teil dieser Neuronen dann auf Null gesetzt und an die darauffolgende Schicht weitergegeben.
Es bietet sich dabei vor allem an, die Dropout Layer in größeren Neuronalen Netzwerken zu nutzen. Denn eine Architektur mit vielen Schichten tendiert deutlich stärker zum Overfitting als kleinere Netzwerke. Dabei ist es auch wichtig, die Anzahl der Nodes entsprechend zu erhöhen, wenn eine Dropout Layer hinzugefügt wird. Als Daumenregel wird dazu die Anzahl der Nodes vor Einführung des Dropouts durch die Dropout Rate geteilt.
Was passiert mit dem Dropout während der Prediction?
Wie wir nun festgestellt haben, ist die Nutzung einer Dropout Layer während des Trainings ein wichtiger Faktor zur Vermeidung von Overfitting. Jedoch stellt sich noch die Frage, ob diese Systematik auch genutzt wird, wenn das Modell fertig trainiert wurde und dann für Vorhersagen für neue Daten genutzt wird.
Tatsächlich werden die Dropout Schichten nach dem Training nicht mehr für Vorhersagen genutzt. Das bedeutet, dass alle Neuronen für die schlussendliche Vorhersage bleiben. Jedoch hat das Modell nun mehr Neuronen zur Verfügung, als es während dem Training der Fall war. Dadurch sind jedoch die Gewichtungen in der Ausgabeschicht deutlich höher als dies während dem Training erlernt wurde. Deshalb werden die Gewichte mit der Höhe der Dropout Rate skaliert, damit das Modell trotzdem weiterhin gute Vorhersagen macht.
Wie kann man die Dropout Layer in Python nutzen?
Für Python gibt es bereits viele vordefinierte Implementierungen mit denen man Dropout Layers nutzen kann. Die bekannteste ist wahrscheinlich die von Keras bzw. TensorFlow. Diese kann man, wie andere Schichtarten auch, über „tf.keras.layers“ importieren:
tf.keras.layers.Dropout(.2, input_shape=(2,))
outputs = layer(data, training=True)
Anschließend übergibt man die Parameter, also zum einen die Größe des Inputvektors und die Dropoutwahrscheinlicht, die man abhängig von der Schichtart und dem Netzwerkaufbau wählen sollte. Die Schicht kann man dann mit der Übergabe von tatsächlichen Werten in der Variable „data“ nutzen. Außerdem gibt es noch den Parameter „training“, der angibt, ob die Dropout Layer lediglich im Training und nicht bei der Vorhersage von neuen Werten, der sogenannte Inference, genutzt wird.
Wenn der Parameter nicht explizit gesetzt wird, wird die Dropout Layer lediglich bei „model.fit()“, also dem Training, aktiv und nicht bei „model.predict()“, also der Vorhersage von neuen Werten.
Das solltest Du mitnehmen
- Als Dropout bezeichnet man eine Schicht in einem Neuronalen Netzwerk, die mit einer definierten Wahrscheinlichkeit Neuronen auf Null setzt, also diese in einem Trainingsdurchlauf nicht beachtet.
- Dadurch lässt sich in tiefen Neuronalen Netzwerken die Gefahr des Overfittings verringern, da die Neuronen untereinander keine sogenannte Adaption bilden, sondern tieferliegende Strukturen in den Daten erkennen.
- Die Dropout Layer lässt sich sowohl in der Eingabeschicht als auch in den verborgenen Schichten verwenden. Jedoch hat sich gezeigt, dass je nach Schichttyp unterschiedliche Dropoutwahrscheinlichkeiten genutzt werden sollten.
- Sobald das Training austrainiert wurde, wird die Dropout Layer jedoch nicht mehr für Vorhersagen genutzt. Damit das Modell jedoch weiterhin gute Ergebnisse liefert werden die Gewichte mithilfe der Dropout Rate skaliert.
Andere Beiträge zum Thema Dropout Layer
Die Dokumentation der TensorFlow Dropout Layer findest Du hier.