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:
Top
Zuerst realisieren wir ein einzelnes Neuron und klären dessen Aufbau:
  • Eingangsgrößen
  • Gewichtung
  • Aktivierungswert
  • Aktivierungsfunktion
  • Identitätsfunktion
  • Sigmoidfunktion
  • Tangenshyperbolicus
  • Rectified linear unit (ReLU)
Top
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
Top
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>
Top
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
Top
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
Top
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
Top
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
Top
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
Top