Über diese Lehreinheite
In dieser Lehreinheiten schauen wir uns an, wie man die Initialisierung von Gewichten richtig besser wählt, als sie einfach Standard-Normalverteilt zu sampeln.
Aufgabe 0: AI-Art Challenge
Überlegen Sie sich drei Kategorien zu denen die Gruppe auf dem letzten Blatt AI-Art mithilfe von Stable Diffusion erstellen wird. Die Abstimmung der Kategorien erfolgt in der nächsten Woche.
Aufgabe 1: Initialisierung von ReLU-Netzwerken
Wir haben in der letzten Woche die Datenverteilung so normiert, dass sie in etwa standardnormalverteilt ist. Dieses Wissen haben wir genutzt, um die Gewichte passend darauf auszurichten; wir haben die Initialisierung der Gewichte ebenfalls standardnormalverteilt gewählt.
Warum tun wir dies?
Die Idee dabei ist, dass die Varianz der Zwischenergebnisse ungefähr gleich groß bleiben soll.
Im Falle einer steigenden Varianz (über die Layer hinweg) würden wir irgendwann ein numerical Overflow in den Zwischenrechnungen erhalten, da dieser Effekt sich multiplikativ auswirken würde. Entsprechend würde eine sinkende Varianz numerical Underflow hervorrufen. Von den Gradienten haben wir hier noch gar nicht gesprochen.
Konkret schauen wir uns einen beliebigen Layer der Form \(y = a(Wx + b)\) an, wobei \(x\) die Ausgabe des Layers davor oder die Eingabe des Neuronalen Netzes selbst ist und \(a\) eine Aktivierungsfunktion darstellt. Unser Ziel ist es die resultierenden Varianzen zweier beliebig aufeinanderfolgenden linearer Layer (inklusive Nicht-Linearität) konstant zu halten, also die Gleichung \[
\operatorname{Var}(y) = \operatorname{Var}(x)
\] zu erfüllen.
Wir nehmen der Einfachheit halber an, dass alle Dimensionen von \(x\) stochastisch unabhängig sind. Streng genommen stimmt dies natürlich nicht, aber bessere Annäherungen sind zum einen nur schwierig zu bestimmen, zum anderen interessieren wir uns hier für die Initialisierung der Gewichte von \(W\). Zu Beginn des Trainings sehen die jeweiligen Eingabedaten-Dimensionen unkorrelliert aus.
Aufgaben:
- Angenomen, \(a(x) = x\). Wir betrachten zuerst rein-lineare Netzwerke.
- Bestimmen Sie nur \(Var(y_i)\), die Varianz einer beliebigen Komponente nach der Matrix-Vektor Multiplikation.
Hinweise:
- Drücken Sie die Varianz mithilfe der Varianz \(Var(x)\) und der Varianz \(Var(W_{ij})\) dar.
- Der Erwartungswert von \(x\) und somit aller nachfolgenden Layer ist 0. (Erinnern Sie sich, dass wir die Daten normiert hatten, bevor Sie in das Netz eingegeben wurden?)
- Wie müssen wir nun \(Var(W_{ij})\), die Skalierung der Standardnormalverteilung der Gewichte wählen, damit die Zwischenergebnisse auch bei Wiederholung des Vorgangs (Anzahl Layer \(\rightarrow \infty\)) stets numerisch stabil bleiben?
- Bestimmen Sie Layer-weise den jeweiligen Erwartungswert und die jeweilige Varianz praktisch.
- Was können Sie beobachten?
- Ändern Sie nun die Layer-Anzahl auf 11. Das Training sollte nun nicht mehr funktionieren. Können Sie dies mithilfe des Erwartungswertes und der Varianz erklären?
- Wir nehmen nun an \(a(x) = \operatorname{ReLU}(x) := \operatorname{max}(0,x)\). Wir können also nicht mehr so einfach darauf schließen, dass alle Zwischenergebnisse gemittelt bleiben.
Bestimmen Sie die Varianz \(Var(y)\) für den Fall, dass der Biasterm stets 0 ist.
Wie müssen wir unter diesen Bedingungen den die Gewichte sampeln, damit die Zwischenergebnisse numerisch stabil bleiben? - Implementieren Sie das bestimmte Initialisierungsschema und testen Sie das Training erneut mit \(11\) Layern. (Diesmal sollte es klappen).
Aufgabe 2: Visualisierung
Die starke Expressivität der Neuronalen Netze kommt von den Nichtlinearitäten. Falls wir uns alle nichtlinearen Layer im Netzwerk \(f\) wegdenken würden, könnten wir nämlich alle linearen Teile in einen einzigen linearen Layer zusammenfassen. In der Vorlesung wurde erklärt, wie ein Neuronales Netz den Eingaberaum in Zellen unterteilt und es so schafft in verschiedenen Bereichen des Eingaberaumes unterschiedliche Rechnungen durchzuführen. Wir wollen dies hier nachimplementieren.
- Zeigen Sie, dass ein Neuronales Netz ohne Aktivierungsfunktionen durch einen einzigen linearen Layer dargestellt werden kann.
- Wir definieren ein festes Gitter von 2D-Punkten, zum Beispiel \(\{(h,w) |h,w \in \{-5,-4.9,-4.8,\dots\}\}\). Wir können dies beispielsweise als Bild verstehen, das wir per
matplotlib.plt.imshow
darstellen. Einfach erklärt „fotografieren“ wir den Eingaberaum durch die Linse des Neuronalen Netzwerkes. - Nun zur Farbe: Wir möchten die Zellen „sehen“, in die das Neuronale Netz den Eingaberaum unterteilt. Die Funktion des Softmax ist es die Auswahl Operation \(\max\) ableitbar in allen Argumenten zu formulieren. Der entsprechend gewählte Index \(\arg\max\) gibt uns die vom Netz gewählte Klasse zurück. Diesen Index können wir verwenden, um den Eingaberaum entsprechend der Klassifizierung einzufärben — je eine ein-eindeutige Farbe für jede Klasse.
- Ähnlich können wir auch alle Zwischenergebnisse in einem Layer \(i\) auswerten.
Dazu inferieren alle Zwischenergebnisse bis zu genau diesem Layer \(i\) und weisen allen möglichen Ausgaben möglichst verschiedene Farben zu.
Konkret schauen wir uns also zuerst das Zwischenergebniss des \(i\)-ten linearen Layers an, \[
y_i(x) := \left(f_{i} \circ a \circ \dots a \circ f_2 \circ a \circ f_1\right)(x).
\] Dadurch, dass im nächsten Layer die Aktivierungsfunktion alle Komponenten, die kleiner als 0 sind auf 0 setzt, können wir die Zellen messen, indem wir alle Punkte gleich einfärben, die das selbe Aktiviergunsmuster \(\operatorname{sign}(y_i(x)) \in \{-1,1\}^{c_i}\) haben. (Den Fall, dass wir die 0 genau treffen ignorieren wir).
Färben Sie die Pixel des Bildes nach den Aktiviergunsmustermustern. (Also alle Pixel mit dem Muster \({-1,1,-1,...}\) gelb, alle Pixel mit dem Muster \({1,1,1,...}\) grün, usw. - Was haben alle Eingaben der selben Farbe gemeinsam?
- Was ist der Grund, dass der in 4. beschriebene Algorithmus Voronoi-artige Zellen aufzeigt? (Schauen Sie dazu noch einmal in die Vorlesungsvideos rein.)
- Was können Sie nun „interaktiv“ beobachten?
- In der Initialisierung des Netzwerkes (noch keine Optimierung geschehen?)
- Im fertig trainierten Netz?
- Wie verhält sich die Visualisierung während des Trainings?
- Insbesondere: Was ist der Anteil an mit Daten gefüllten Zellen zur Anzahl an möglichen Zellen?
- Wie ändert sich die Visualisierung mit:
- breiteren/schmaleren Layern
- mehr/weniger Layern
- einer anderen Initialisierung, konkret: was ändert sich, wenn die Initialisierung der Gewichte nicht \(\mathcal{N}(0,1)\), sondern \(\mathcal{N}(0,s)\) verteilt sind.