KI / Neuronale Netze
Das Hauptziel dieser Reihe ist es, das Verständnis für Neuronale Netze aufzubauen. Den Weg, den ich gehe ist
die Programmierung eines kompletten Neuronalen Netzes in Java, welches anschließend für die Bilderkennung
und einem reinfored learning Programm genutzt wird. Den fertigen Code findet ihr in
GitHub. Das Gesamtthema wurde
in folgende Untergruppen geteilt:

Zuerst realisieren wir ein einzelnes Neuron und klären dessen Aufbau:
- Eingangsgrößen
- Gewichtung
- Aktivierungswert
- Aktivierungsfunktion
- Identitätsfunktion
- Sigmoidfunktion
- Tangenshyperbolicus
- Rectified linear unit (ReLU)

Die Neuronen werden nun vernetzt (oder "vermascht"). Der Einfachheit setzen ist unser Netz "vollvermascht" - sprich
jedes Neuron eines Layers ist mit allen Neuronen des Vorgänger-/Nachfolelayer verbunden.
- Eingangslayer
- Ausgangslayer
- Hidden Layer
- Vorwärtspropagation

Nun realisieren wir das erste Netz in Form eines Logikgatters. Dies hat den Vorteil, dass wir die Funktionalität in einem
dreidimensionalen Grafen darstellen können - Das Ausgangssignal über die beiden Eingangsgewichtungen.
- Vergleich Netz vs. Erwartung
- BIAS
- Fehlerermittlung
- Verlustfunktion/li>

Nun wollen wir die Gewichtungen unseres Netzes für Logikgatter optimieren - sprich die Verlustfunktion minimieren.
Mit Hilfe der Deltalernregel können wir dies umsetzen.
- Deltalernregel
- Anassungfaktor
- Lokale vs. globale Minima
- Gradientenabstieg

Das bisherige Modell hat ein ODER Gatter imitiert. Da die Funktion eines ODER Gatters linear separierbar ist, war unser
Netz recht einfach aufgebaut und trotzdem zuverlässig. Beim XOR sieht dies anders aus, da eine lineare Separierbarkeit hier
nicht vorliegt. Dies erklärt die Notwendigkeit von Hidden Layern und erfordert nun eine Erweiterung um die Backpropagation.
- Lineare Separierbarkeit
- Umsetzung der Hidden Layer
- Fehlerursache als Begründung für Backpropagation

Der MNIST (Modified National Institute of Standards and Technology)
Datensatz ist eine Sammlung von zigtausend handgeschriebenen Ziffern, welche "gelabeled" sind - es also eine technich
auswertbare Information gibt, welche Ziffer auf dem einzelnen Bild zu sehen ist. Dies ist der "Brot und Butter" Usecase für
angehende KI-Entwickler, also sowas wie "Hello World" für KI. In diesem Video machen wir uns darüber Gedanken, wie wir
Bilddaten überhaupt in ein Neurnales Netz einspeisen können und bauen uns ein Ladeprogramm für den MNIST Datensatz.
- Pixeldaten als NN Eingang
- Lernen vs. Testen
- Aufbau MNIST
- Aufbau der Datenhaltung in Java

Nun haben wir alles zusammen, um eine tatsächliche Bildklassifikation zu bauen. Als Ergebnis erhalten wir jedoch nur
"Wahrscheinlichkeiten", inwieweit auf dem Bild die eine oder andere Ziffer erkannt wurde. Weiterhin gehen wir auf
die Notwendigkeit des "Schwungs" einer Optimierung ein, um eventuelle lokale Minima schneller zu überwinden.
- Gewichtsinitialisierung bei großen Eingangsvektoren
- Optimierung durch Momentum
- Auswahl des wahrscheinlichsten Wertes

Zum Schluss sehen wir uns noch ein recht eindrucksvolles (wenn auch nicht sehr praxisrelevantes) Beispiel für
die Nutzung von Neuronalen Netzen an. Wir lassen ein Auto auf einer virtuellen Straße fahren, ohne die Steuerung
explizit zu programmieren. Vielmehr nutzen wir ein Neuronales Netz und lassen die Gewichte durch reinforced learning
optimieren (im Video wird fälschlicherweise von unsupervised learning gesprochen - das werde ich bei Gelegenheit
mal ausbessern).
- Struktur der Eingangs- und Ausgangsgrößen
- Optimierung durch Zufallswerte
- Notwendigkeit einer 100% simulierbaren Umgebung
