date-created: 2024-06-18 02:15:19 date-modified: 2024-07-16 06:14:24
Neuronal Networks
anchored to 116.00_anchor_machine_learning
Motivation
Wir wollen diverse Bereiche, die aktuell boomen und an Wichtigkeit gewinne, betrachten und verstehen. Dafür werden wir uns mit Neuronalen Netzen beschäftigen, sodass folgende Bereiche besser verständlich werden:
- Bildsegmentierung
- Bildgenerierung
- Sprachgenerierung
Vorab möchten wir aber nochmal diverse Grundlagen betrachten, um anschließend den Bogen zu Neuronalen Netzen, mit ihren Vorteilen / Ansätzen betrachten und definieren.
Supervised learning
Hat sich schon mit der Idee beschäftigt, eine Optimierung automatisch zu finden, indem wir zu jeder Evaluation der generierten Funktion - die die Eingabe passend zu einer Ausgabe transformieren soll - dann Feedback geben, um sie zu verbessern. –> Dafür haben wir einen Gradientenabstieg definiert und angewandt.
Das waren ferner:
Vergleich
Wir haben bei der linearen Regression gesehen, dass wir eine Gerade suchen, die unsere Daten gut aufteilen kann. Dabei haben wir dann ferner auch gesehen, dass das ziemlich statisch ist.
–> Wir wollen mit neuronalen Netzwerken jetzt eine flexiblere Lösung finden, die besser modellieren / entscheiden kann..
Beschränkungen | Motivation
Wir sehen aus der obigen Betrachtung, dass es mit diesen linearen Modellen diverser Probleme, gerade in der Flexibilität gibt.
Das wollen wir jetzt durch das nachahmen von Neuronen - Biologie - passender umsetzen und eventuell ein neues Modell bauen.
Künstliche Neuronen
[!Idea] Motivation für künstliche Neuronen
Wir wollen ein künstliches Neuron unter Nachahmung der biologischen Variante beschreiben / erschaffen.
Uns dient dabei folgende Struktur als Vorlage:
Wir möchten jetzt Werte erzeugen, die quasi die Eingabe eines Neurons beschreibt.
Wie wird jetzt ein Neuron weiter beschrieben? Was sind die Inputs, was wird bei diesen berechnet was sind outputs und woran machen wir den Output fest? #card
ein einfaches künstliches Neuron ist folgend aufgebaut:
Wir sehen hierbei:
- es gibt viele Eingabe-Werte ( Inputs von anderen Neuronen etwa), die wir in einer Summe unter Betrachtung von Gewichten zusammenfassen.
- Zu dieser Summe addieren wir einen Bias , welcher für das einzelne Neuron gegeben ist!
- Die Ausgabe ist dann diese Berechnung in einer Aktivierungsfunktion eingesetzt, beschrieben mit
Dabei berechnen wir das also folgend:
Die Aktivierungsfunktion kann hierbei verschieden sein:
- etwa tanh(z)
- ReLU
- Sigmoid
- Linear –> etwa wenn man einen Wert übernehmen und berechnen möchte!
Im Core ist das also eine Abfolge von:
einer linearen Operation - Summe + bias - dann in eine Nicht-lineare Struktur eingeworfen
Historische Einordnung
Als Grundlage definieren wir folgend Perceptrons - welche historisch den Anfang gesetzt und definiert haben. (etwa 1957)
NY Times in 1958: the embryo of an electronic computer that [the Navy] expects will be able to walk, talk, see, write, reproduce itself and be conscious of its existence
Learning von Neuronen
[!Definition] Jetzt muss man diesen Neuronen Gewichte beibringen , bzw. am besten müssen sie diese durch ein Training erhalten!
Dafür möchten wir ferner eine Loss-Funktion definieren / beschreiben, die in diesem Kontext angewandt werden kann!
Welche Loss-Funktion beschreiben wir hier? Was meinen wir mit ERM? Wie bestimmen wir dann das Optimum? #card
Die Loss-Funktion beschreiben wir etwa mit dem Mean-Squared-Error (wieder):
Hierbei setzen wir also den Output des Neurons ein und subtrahieren von dem erwarteten Wert (wie auch zuvor also)
Das Optimieren wir dann auch mit Gradient Descent, wie zuvor:
Infos dazu:
[!Req] Loss-Funktion
Was genau wird mit der Loss-Funktion beschrieben / verknüpft? Wie suchen wir ein optimum? #card
Wir wissen, dass die Loss-Funktion primär die Qualität unseres Modells beeinflussen / bestimmen kann –> Wenn wir gute Parameter haben, dann wird der Loss gering sein und wir somit ziemlich akkurat agieren.
Die Ableitung des Loss beschreibt oft wie eine lokale Änderung der Parameter den Loss verändert / verändern kann.
Der Gradient - mehrdim! - zeigt hierbei immer in die Richtung des höchsten Loss - weswegen wir auch descenden!
[!Bemerkung]
Wir wollen hier eine Risikominimierung - ERM - umsetzen - also im Bezug der Erwartung über der Verteilung der Daten
Wir beschreiben diesen Loss folgend:
was ist das Problem in dieser Betrachtung, weswegen nutzen wir ERM? #card
Wir haben keinen Zugriff auf die Daten –> den Parametern unseres Modells <– und müssen somit Empirisch Risk Minimization - ERM - anwenden, um für gegebene Daten diese Minimierung umsetzen zu können ( weil wir also auf den Daten lernen!)
[!Tip] Nutzen der Lernrate: #card
Wir nutzen sie, um entsprechend der optimalen Lösung näher zu kommen –> also wenn wir einen gewissen Loss haben, den wir optimieren wollen, dann müssen wir uns dem Optimum Schritt für Schritt annähern. Wie schnell wir diese Schritte setzen bzw wie groß er ist, wird durch die Lernrate definiert / beschrieben
(Behoben wird das etwa durch ein Momentum was den Gradient Descent besser umsetzt)
Delta - Regel
[!Definition] Updateregel für ein Neuron.
Wir wollen den Gradient descent auf anwenden, also folgend:
beschreibt.
Wie können wir jetzt die Ableitung für das Neuron beschreiben? #card
Die Ableitung des Gewichtes ist folgend beschrieben:
und also Vektor sieht das folgend aus:
Interpretation | Delta-Regel
[!Definition]
Die Ableitung ist folgend gegeben mit:
Was kann uns die Delta-Regel nun intuitiv bezüglich der Abweichung , und dem Input sagen? #card
Wir wissen jetzt, dass die Gewicht proportional zu den Parametern sein muss:
- zur Abweichung
- zur Empfindlichkeit eines Neurons
- auch iwe star die Änderung der inneren Aktivierung ist und wie sie die Ausgabe verändert!
- auch zum Input
–> das ganze wird dann über alle Eingaben gemittelt und somit bestimmt.
Beispiel |
Wir wollen ein Beispiel betrachten, um die Nutzung und das Verständnis zu verbessern:
[!Example]
Wir haben jetzt beispielhaft folgenden Input die gegebene Gewichte und
Die Ableitung ist folgend gegeben mit:
Wie können wir jetzt die gewollte Gleichung aufstellen? wie wird dann die Abbildung berechnet? #card
Wir berechnen zuerst den aktuellen Wert:
Jetzt bilden wir die Abweichung den Loss mit
Also –> da wir den tangens nehmen!
Ferner berechnen wir die Ableitung folgend:
und somit folgt für die neuen Gewichte:
Damit haben wir eine neue Ausgabe erzeugt, wenn wir die neuen Gewichte anwenden:
Artificial Neural Networks
Diese Idee möchten wir jetzt skalieren –> Wir wollen nicht nur ein Neuron verwenden - dann wäre es wie eine einfache Regression etc - sondern wir wollen ein Netz definieren, was aus vielen verschiedenen Neuronen besteht, die dann komplexe Funktionen lernen und berechnen können!
Skalieren zu einem Netwerk
[!Idea]
Wir wollen jetzt die Idee eines einzelnen Neuron nehmen und sie durch gewisse Netzwerke zusammenschließen.
Visuell also etwa:
Wie ist eine Schicht aufgebaut, was passiert mit den Gewichten für einen Vektor? Wie / Wo wird der Output des Netzes beschrieben? #card
- Wir ordnen jetzt also Neuronen parallel an, um eine Schicht zu beschreiben
- hierbei sind sie immer mit vorherigen Schichten verbunden - teils auch nicht vollständig - und jedes der Gewichte - eine Verbindung von Neuron zu Neuron - wird dann jetzt als Vektor aufgefasst und das wiederum als eine Matrize zusammengefasst.
Dabei ist jetzt der Output der letzte Layer - die letzte Schicht des Netzes.
Sie wird dann beschrieben mit: , wobei beschreibt, welche Schicht es ist!
[!Attention] Struktur der Operation auf Eingabe
Betrachten wir eine Eingabe , und ein einfaches Netz:
Wie beschreiben wir die Berechnung von der Ausgabe als Matrizenmultiplikation? #card
Wir beschreiben es mit:
Also wir haben pro Layer jeweils eine Menge von Gewichten - logisch weil wir die Eingaben des vorherigen ja irgendwie verarbeiten müssen!
[!Definition]
Wir möchten jetzt Feed Forward neural networks beschreiben:
Was ist die relevante Struktur eines solchen Netzes? #card
- Es weist einen Input layer - x - auf!
- Es befinden sich zwischen In und Output hidden layer - beliebig viele dabei!
- Es gibt einen Output Layer –> Der die letzte Schicht ist und den gesamten Output des Netzes wiedergibt
(Hier wird logischerweise Der Input von jedem Layer verarbeitet und verändert) –> Da wird die Berechnung erprobt und nach und nach definiert!
Warum brauchen wir die Wichtung in den hidden layern. Wenn jetzt also die inneren Linear wären - da wird die Identitäþsfunktion, statt verwendet, dann erhalten wir keinen Mehrwert, weil die Matrizenmultiplikation uns nicht viele Informationen liefern kann / wird.
Nennt man: Multi-Layer-Perceptron oder Feed-Forward neural network ( weil sie ihr Feedback von Schicht zu Schicht durchschieben)
Jeder Layer hat immernoch eine Wichtung, die die generelle Relevanz des Layers angibt. Wir brauchen da für eine Ausgabe dann zusätzlic noch Wenn wir einen Wert 0 geben, dann kann das Netzwerk keine Aussage treffen, das wollen wir verihindern.
Forward=Path ist
Wir wollen den Loss wieder berechen, haben jetzt aber verschiedene Wichtungen - pro Layer eine Matrix an Wichtungen - die wir dann in der Berechnen betrachten werden. Wenn wir den Los berchen wollen, gehen wir so vor, dass wir von dem Optimalwert die Berechnen von “rechts” nach links durhcführen, um auf die besseren Werte zu kommen.
Ferner ist hier möglich:
-
an jedem Schritt, wenn wir das Optimum für eine matrix berechen, werden wir anschließend entweder die Wichtungen updatend oder zum nächsten Layer übergehen!
-
Der Gradient bezüglich . Der erste Term gibt uns an wie viel sich die Wichtung je nach Eingabe?
-
zweiter Term
Lernen mit Backpropagation
[!Definition] Backpropagation
unter Betrachtung des gegebenen Netzes möchten wir jetzt für Daten jeweils Predictions machen und anschließend unser Netz so updaten –> Dass der Loss geringer wird!
Das, wass wir etwa mit ERM für ein einziges Neuron gemacht haben, möchten wir jetzt für das gesamte Netz definieren:
Als Anfang: Der Regression Loss ist beschrieben mit:
Ferner wird hierbei dann der Foward-Pass - also wie wir von der Eingabe zur Ausgabe kommen - folgend beschrieben: –> also verkettet berechnen wir erst den innersten, danach die weiteren etc.
Wie können wir jetzt den Gradient beschreiben? #card
Herleitung: Wir können den Gradient wieder betrachten und hier unter Verwendung der Idee der Kettenregel berechnen:
Unser Gradient sieht am Ende also folgend aus:
Algorithmische Anwendung:
Wir können jetzt den Algorithmus für die Backprop und der Prediction - also Forward-Pass - folgend beschreiben:
Predicting ()
[!Definition] Prediction
Wie verläuft der Algorithmus für die Prediction eines Neuronalen Netzes? #card
- Also wir wollen zuerst die Gewichte initialisieren - dafür haben wir hier gegeben!
- Es wird jetzt die Eingabe getätigt
- und wir berechnen jetzt immer zuerst ( der innere Term vor der Aktivierungsfunktion!)
- die Aktivierung des Neurons, also
- Wir speichern diesen Wert!
- Das machen wir natürlich für alle Schichten!
Back-prob ()
[!Definition] Backprop Algorithmus
Wie verläuft der Algorithmus für die Backpropagation? #card
Hier berechnen wir einfach entsprechend von erwartetem Wert zurück, durch unser Netz und vergleichen mit dem erwarteten!
Jetzt muss man diese Struktur noch so erweitern, dass sie entsprechend für eine Menge von Daten angewandt wird und nach und nach das Netzt trainiert/ verbessert:
SGD - Stochastic Gradient Descent
[!Definition]
Wenn wir jetzt den Descent mit allen Daten, die uns in den Trainingsdaten zur Verfügung stehen, kann es teils sein, dass diese Bearbeitung sehr langwierig wird -> gerade wenn die Struktur sehr groß ist.
Wir wollen uns der stochastischen Verteilung solcher Daten anwenden und somit mit kleinen Batches versuchen, eine Aussage über den gesamten Datensatz zu trefffen, bzw damit zu trainieren
Wie wird der SGD umgesetzt / angewandt? #card
Beispiele | Lernen von Strukturen
[!Definition]
Betrachten wir ein einfaches Netzwerk mit: 1 Eingabe, 50 hidden layers - tanh - und 20 versteckten (relu) hidden layers und 1 Ausgabe.
Wir trainieren es hier mit plain gradient Descent (und anschließend mit SGD)
Wir erhalten folgendes Modell:
was ist ein Problem des plain gradient descents und wie können wir das etwa mit dem SGD verändern / verbessern? Was können wir über große Mengen von Daten aussagen? –> trainingszeit #card
Wir sehen, dass Training funktioniert aber sehr viele Schritte benötigt!
Ferner sehen wir auch, dass das sehr sehr teuer ist.
Unter Anwendung von SGD im gleichen Beispiel
Haben wir viel stärkeres rauschen und es ist langsamer als unserer plain-gradient descent.
(Das gilt jedoch nur bei den kleinen Eingaben hier).
Wenn wir jetzt Skalieren, dann wird SGD sehr viel schneller und besser sein:
Weiterhin wird SGD auch ein besseres Minimum in dieser Funktion finden – während plain eventuell in einem lokalen Minima hängen bleibt!
2-Class Classification
[!Definition]
Wir möchten noch betrachten, wie man mit einem neuronalen Netz eine Klassifikations-Aufgabe bearbeiten und beschreiben kann. Exemplarisch wird das nur für Klassen gemacht, funktioniert aber auch mit mehr - obv.
Dabei möchten wir das Problem wieder also Regressionsaufgabe beschreiben mit und somit gilt
Wie stellen wir jetzt sicher, dass das Netz am Ende eine WSK ausgibt? #card
Das können wir unter Verwendung einer Sigmoid-Funktion umsetzen: Denn sie hat folgende Form: –> Sie wird also seehr breit auf abbilden!
somit folgt dann:
Dafür müssen wir jetzt aber auch noch ein Loss definieren:
[!Tip] Loss Funktion für Classification Problem:
Wir wollen das Loss für die entsprechende Funktion - dem neuronalen Netz - unter Betrachtung der Sigmoid betrachten:
Wie können wir den Loss hier gut darstellen? (Betrachte, dass wir hier schon Cross-Entropy betrachtetet hatten und es äquivalent zu etwas war) #card
Wir verwenden dann die Log-Likelihood von Bernoulli, also
und wir wissen, dass maximiere likelihood minimier negative log-likelihood ist ( aufgrund von Cross-Entropy-Loss!)
Was resultiert zu:
[!Bsp] Anwendung | Praxis
Praktisch baut man das System dann so auf, dass es am Ende nur noch einen Output Neuron hat, was die Klassifizierung angibt.
Wie berechnen wir dann also unseren Wert y? #card
Es folgt somit:
und hier können wir den Backprop wieder anwenden, jedoch mit der Anpassung von da wir hier jetzt die Sigmoid haben!
Multi-Class Classification
[!Definition]
Die Multiclass-Adaption ist nicht soo schwer, denn wir können das Prinzip einfach auf viele Klassen verallgemeinern.
Wie bauen wir das Netz dann auf/ Was muss für die Aktivierungsfunktion gelten? #card
Für Klassen, werden wir dann auch Einheiten - Neuronen - im Output-Layer positionieren.
Ferner wenden wir den softmax als Aktivierungsfunktion an –> da er ja ganz gut eine WSK angeben kann!
somit folgt:
Und der Cross-entropy-Loss wird adaptiert zu: