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

X1 X2 Y = X1 ⊻ X2
0 0 0
0 1 1
1 0 1
1 1 0

 

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

θ11 =  2,7 θ12 =   3,1
θ13 =  5,6 θ14 = -6
θ15 = -5,4 θ16 =  6,2
Theta 2

θ21 =  9,6
θ22 = -6,6
θ23 = -6,5

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

 %--------------------- 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:

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.

Nico Hezel ist wissenschaftlicher Mitarbeiter und Dozent an der Hochschule für Technik und Wirtschaft in Berlin. Er unterrichtet unter anderem Machine Learning und Computer Vision. Die Forschungsprojekte an die er beteiligt ist, befassen sich mit Informationsrückgewinnung, kollaborativen Bildsuchsystemen und maschinellem Lernen.

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *

834 Views