Startseite
  Über...
  Archiv
  Gästebuch
  Kontakt
  Abonnieren


http://myblog.de/mycode

Gratis bloggen bei
myblog.de





FF-Netze in Matrizen-Form Teil 1

Hi @all.
Wie versprochen, starte ich meine Reihe "FF-Netze in Matrizen-Form".

Ich finde, diese Form der Darstellung extrem elegant und schön (wenn man ein Code so nennen darf).
Außerdem hat das ganze den Vorteil, dass die GPU massiv parallel Matrizen multiplizieren kann, was natürlich ein Performance-Gewinn ist.

Fangen wir zunächst mit den Grundlagen an.

1. Warum in einer Matrix?

Wie oben erwähnt ist es die elegantere Darstellung.
Wenn man sich mal erinnert, wie eine Matrix-Multiplikation
funktioniert, merkt man auch, warum.

Für die, die es nicht eben nachschlagen wollen.

Zunächst müssen die Spaltenzahl von Matrix A mit der
Reihenzahl der Matrix B übereinstimmen.

Nehmen wir an wir haben eine Matrix A in einer 3x4 Form (3 Reihen, 4 Spalten) und eine Matrix B in 4x2 Form.

A =
|1 | 2 | 3 | 4|
|5 | 6 | 7 | 8|
|9 | 1 | 2 | 3|

B =
|1 | 2|
|3 | 4|
|5 | 6|
|7 | 8|

Die Matrix C = A*B hat die Form 3x2.

Berechnen wir C mal

C =
|1*1 + 2*3 + 3*5 + 4*7 | 1*2 + 2*4 + 3*6 + 4*8|
|5*1 + 6*3 + 7*5 + 8*7 | 5*2 + 6*4 + 7*6 + 8*8|
|9*1 + 1*3 + 2*5 + 3*7 | 9*2 + 1*4 + 2*6 + 3*8|

C =
| 50 | 60 |
| 114 | 140|
| 43 | 49 |

Das Prinzip ist ziemlich einfach.
Man nimmt den Vektor der n-ten Reihe von Matrix A
und Multipliziert ihn mit dem Vektor der m-ten Spalte von Matrix B

sagen wir mal n1 bis n3 währen die Reihen-Vektoren von A
und m1 bis m2 die Spalten-Vektoren von B

Dann ist C=

n1*m1 | n1*m2
n2*m1 | n2*m2
n3*m1 | n3*m2

Gut. Soweit müsste alles klar sein.

Wer aufgepasst hat, dem wird aufgefallen sein, dass
jeder Eintrag in C die Summe der Multiplikationen ist.

Wenn wir jetzt unser Neuron betrachten:

Ein Neuron hat gewichtete Eingänge.
Das Ergebnis des Neurons (bevor es durch die Aktivierungsfunktion
gejagt wird) ist die Summe der gewichteten Eingänge.

Also Result = Sum(w*x)

Sehen wir also noch einmal auf unsere Matrizen aus dem Beispiel:

A =
|1 | 2 | 3 | 4|
|5 | 6 | 7 | 8|
|9 | 1 | 2 | 3|

B =
|1 | 2|
|3 | 4|
|5 | 6|
|7 | 8|

Sagen wir A ist eine Eingangs-Matrix und B ist die Gewichtungs-Matrix.

Dann ist schnell klar:
Die Spalten von A stellen die Eingänge eines Neurons dar.
Da jedes Neuron die gleichen Eingänge erhält stellen also
die Spalten von B die Neuronen dar, während die Reihen
die Eingangsgewichtungen darstellen.

B =
|1 | 2|
|3 | 4|
|5 | 6|
|7 | 8|
->Spalte x = Neuron x
->Reihe y = Eingang y von Neuron x

Was aber genau stellen dann die Reihen von Matrix A dar?
Hier wird es interessant.
In unserem simplen FF-Netz vom letzten mal mussten wir,
wenn wir verschiedene Eingangswerte hatten die nicht gleichzeitig
anlagen, immer wieder von vorne das Netz einen FeedForward
machen lassen.
Jetzt aber stellen die Reihen von A diese Werte dar und können
gleichzeitig verarbeitet werden.


A =
|1 | 2 | 3 | 4|
|5 | 6 | 7 | 8|
|9 | 1 | 2 | 3|
->Spalte x = Gleichzeitige Eingänge
->Reihe y = Beispiel y mit den Werten x(1 bis n)

Wenn wir nun auf jedes Element C = A*B die Aktivierungsfunktion
anwenden ist C das Ergebnis eines Neuronalen Netzes
mit einer Hidden-Schicht in denen 2 Neuronen sitzen, die
je 4 Werte akzeptieren.

Dabei haben wir 3 Beispiele in das Netz propagiert, die
alle 4 Werte haben.

Da C immer genauso viel Reihen hat wie A
bekommen wir auch 3 Ergebnis-Sets.
Da C immer so viel Spalten hat wie B, bekommen wir
je 2 Werte für jedes Set.

Wir definieren also die Gewichtsmatrix folgendermaßen:
1.
Sie hat genauso viele Reihen, wie Werte pro Beispiel
aus der Werte-Matrix A (also Spalten).

2.
Sie hat genauso viele Spalten, wie Werte in der nächsten
Werte-Matrix C vorhanden sein sollen (also Spalten).

Nun können wir in einer Einzigen Matrix eine komplette Schicht an Neuronen darstellen.


Wo bleiben aber die Bias-Werte?
Die sind relativ simpel zu erzeugen.

Wir setzen einfach eine Spalte voller 1er in die Eingangsmatrix
und eine Reihe voller 1er in die Gewichtsmatrix.
Die 1er der Gewichtsmatrix werden sich hierbei verändern (ist klar, da es ja die Gewichtsmatrix ist).

Zum Abschluss ein kleiner Tipp:
Wenn ihr eine Matrix-Multiplikation implementiert, benutzt
einfach den normalen Algorithmus dafür.
Heutige PCs sind schnell genug um das zu realisieren.
26.3.16 12:35
 


bisher 0 Kommentar(e)     TrackBack-URL

Name:
Email:
Website:
E-Mail bei weiteren Kommentaren
Informationen speichern (Cookie)



 Smileys einfügen



Verantwortlich für die Inhalte ist der Autor. Dein kostenloses Blog bei myblog.de! Datenschutzerklärung
Werbung