KNN: Vorwärtspass
Wenn die Gewichte eines künstlichen neuronalen Netzwerkes trainiert sind, kann es verwendet werden, um Vorhersagen über eine am Eingang angelegte Beobachtung zu treffen. Hierzu werden Schicht für Schicht, in einem sogenannten Vorwärtspass (Forward-Pass), die Aktivierungen der einzelnen Neuronen ermittelt, bis ein Ergebnis an der Ausgabeschicht anliegt. Der ganze Prozess hat zwar einen eigenen Namen (Vorwärtspass), ist aber im Endeffekt nur ein iteratives durchführen von mehreren logistischen Regressionen und entspricht dem Vorgehen aus dem Artikel „KNN: künstliche Neuronen“.
Anwendungsbeispiel
Im folgenden Beispiel verwenden wir die Wahrheitstabelle von einem X-OR Logikgatter (siehe Abbildungen unten links) als Ground Truth Data. Ziel ist es, den Ausgangwert Y, für einen beliebig anliegenden Eingangsvektor [X1, X2] vorherzusagen. Die Aufgabe ist recht komplex, so dass eine einfache lineare oder logistische Regression keine zufriedenstellende Lösung finden wird. Die zum Einsatz kommende Netzwerkstruktur ist ein 2-schichtiges Feedforward Netzwerk mit zwei Eingangsneuronen, einer verborgenen Schicht und einem Ausgangsneuron.
XOR Wahrheitstabelle
|
Da das Netzwerk wie anfänglich erwähnt, bereits trainiert ist, gebe ich die Gewichte (Theta) vor. Werden die Werte als Matrix dargestellt, können mit Hilfe der linearen Algebra die Aktivierungswahrscheinlichkeiten aller Neuronen einer Schicht auf einmal ausgerechnet werden.
Theta 1
|
Theta 2
|
Programmcode
Für die eigentlichen Berechnungen verwenden wir die Programmiersprache Octave oder MATLAB. Octave ist eine kostenlose alternative zu MATLAB. Wobei es nicht notwendig ist irgendetwas zu installieren, da es auch eine Online Variante von MATLAB/Octave gibt:
http://www.tutorialspoint.com/execute_matlab_online.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
%--------------------- Daten ----------------------- X = [0 0; % Eingangsdaten 0 1; 1 0; 1 1] Y = [0;1;1;0] % erwartete XOR Ausgangsdaten theta1 = [2.7, 3.1; % antrainierte Gewichte der ersten Schicht 5.6, -6; -5.4, 6.2] theta2 = [9.6; % antrainierte Gewichte der zweiten Schicht -6.6; -6.5] m = length(X) % Anzahl der Eingangsdaten %--------------------- Vorwärtspass ----------------------- V = X % anlegen der Eingangsdaten an die Eingangsschicht % 1. berechne die Aktivierungen der verborgenen Schicht V = [ones(m,1) V] % hinzufügen der Bias Units (sind immer 1) Zv = V * theta1 % Summe aus den Eingangswerten multipliziert mit deren Gewichten H = 1 ./ (1 .+ e.^-Zv) % anwenden der Sigmoid Funktion auf die Aktivierungsstärke Zv % 2. berechne die Aktivierungen der Ausgangsschicht H = [ones(m,1) H] % hinzufügen der Bias Units an die verborgene Schicht Zh = H * theta2 % Produkt aus den Aktivierungen der Neuronen in H und Theta2 O = 1 ./ (1 .+ e.^-Zh) % Vorhersage von dem Netzwerk % 3. berechne die Vorhersageungenauigkeit loss = (O .- Y) .^ 2 % quadratischer Fehler von der Vorhersage und der Zielvorgabe Y mse = sum(loss) / m % durchschnittlicher quadratischer Fehler aller Vorhersagen |
Ein paar Sätze zu den verwendeten Befehlen. Der Punkt vor manchen Operationen gibt an, dass die Operation Elementweise durchzuführen ist (wichtig bei der Sigmoid Funktion). Die Methode ones(M,N) erzeugt eine MxN große Matrix gefüllt mit den Werten 1. Wir erzeugen damit einen Spaltenvektor der unseren Bias Units entspricht und den wir anschließend an eine vorhandene Matrix horizontal anfügen.
Wird das Programm ausgeführt schreibt es unter anderem die Werte von der Ausgabeschicht O (Output Layer) auf die Konsole. Da wir alle XOR Variationen auf einmal ausgerechnet haben, erhalten wir auch vier Vorhersagen. Verglichen mit der Zielvorgaben Y sind die Werte von O sehr vielversprechend (ähnlich).
X1 | X2 | Y | O |
0 | 0 | 0 | 0.057099 |
0 | 1 | 1 | 0.936134 |
1 | 0 | 1 | 0.934786 |
1 | 1 | 0 | 0.050952 |
Komplexe Netzwerke
Hätte das Netzwerk noch weitere verborgene Schichten, müssen Teile des Programmcodes wiederholt ausgeführt werden. Grundsätzlich sind drei Befehle pro Schicht notwendig:
1 2 3 |
H1 = [ones(m,1) H1] % hinzufügen der Bias Units an die verborgene Schicht Zh1 = H1 * theta2 % Produkt aus den Aktivierungen der Neuronen in H1 und Theta2 H2 = 1 ./ (1 .+ e.^-Zh1) % Aktivierungswahrscheinlichkeiten für die nächste verborgene Schicht |
Im nächsten Artikel schauen wir uns das Training solcher Netzwerke an.