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


http://myblog.de/mycode

Gratis bloggen bei
myblog.de





FF-Netze in Matrizen-Form Teil 2

Willkommen zurück!

In diesem Teil gehe ich näher auf die genaue Form ein, die benötigt wird um Erfolgreich ein FeedForward zu realisieren, sowie auf den
Back-Propagation-Algorithmus.

Grundlegendes zuerst:
Ihr müsst jedes Zwischenergebnis (also Ergebnis der Matrix-Multiplikation) speichern, da sie für den Back-Propagation-Algo gebraucht werden.


1. Die Forward-Propagation

In den meisten Fällen werdet ihr eine eigene Matrix-Klasse anlegen wollen, da das ganze einfacher zu handeln ist.

Ich habe es folgendermaßen gelöst:

1 Array für die ErgebnissMatrizen, wobei der erste Eintrag
die EingangsMatrix ist und der letzte die AusgangsMatrix
darstellen soll

1 Array für die GewichtsMatrizen, wobei es genau 1 Matrix
weniger gibt, als es ErgebnisMatrizen gibt.

1 Array für die späteren FehlerMatrizen, wobei es genauso viele
Matrizen gibt, wie es GewichtsMatrizen gibt.

Die ReihenZahl der ersten GewichtsMatrix wird bestimmt
von der Anzahl an gleichzeitigen Eingängen.
Die SpaltenZahl von den benötigten Knoten in diesem Layer

Die ReihenZahlen der darauffolgenden GewichtsMatrizen
wird bestimmt durch die Anzahl der Knoten (Spalten)
der vorheringen GewichtsMatrix.
Die SpaltenZahl stellt wieder die Anzahl der Knoten dar.

Die letzte GewichtsMatrix ist definiert durch:
Reihen: Spalten der vorherigen Matrix
Spalten: Anzahl der Ausgänge.

Dabei zu beachten ist natürlich dass die Matrizen
1. Eine zusätzliche Spalte voller 1er braucht, falls es eine Werte-Matrix ist
2. Eine zusätzliche Reihe voller 1er braucht, falls es eine Gewichts-Matrix ist

Wenn ihr wie ich die ganzen Matrizen in Arrays gepackt habt, sieh das ganze wie folgt aus (wobei AF für die Aktivierungsfunktion für jedes
Element der Matrix steht und BiasIt der Matrix eine Spalte mit 1er
anhängt)

For i from 0 to Results.Length-2:

Results[i+1] = Results[i]*WeightMatrix[i]
Results[i+1] = AF(Results[i+1])

If(i < Results.Length-2)

BiasIt(Results[i+1])

EndIf

EndFor


Die letzte Matrix wird nicht mehr mit 1er Aufgefüllt.

Das ist die ganze Forward-Propagation.
Einfacher kann es gar nicht sein.



2. Die Back-Propagation

Hier wird das ganze auch versimpelt.

Wie im simplen Feed-Forward-Netzwerk wird zunächst der Ausgangsfehler berechnet.
Dies geschieht einfach durch Subtraktion
der Matrizen:
(DesiredOutput - CurrentOutput)

Die Matrix lege ich als letztes Element in das Array der FehlerMatrizen.

Im original FF-Netz werden die darauffolgenden Fehler
berechnet, indem man die Summe der gewichteten Ausgangsfehler
mit dem abgeleiteten Ergebnis multipliziert.

Nehmen wir an, wir haben eine tanh-Aktivierungsfunktion.
Dann sind die Abgeleiteten Werte 1 - Wert² für jeden
Eintrag in der Matrix.

Wir brauchen 4 Matrix-Operationen
-UnBiasIt gibt die Gewichtsmatrix ohne 1er Spalte zurück
-Transpose transponiert die Matrix
-Derivate gibt eine WerteMatrix zurück, die die abgeleiteten Werte beinhaltet
-Und die Operation .* stellt eine punktweise Verknüpfung dar
(Das heißt, so fern die beiden Matrizen die gleichen Dimensionen haben,
werden einfach nur die korrespondierenden Elemente multipliziert)


So könnte es aussehen:

For i from ErrorMatrix.Length-2 to 0:

TempMatrix = ErrorMatrix[i+1] * WeightMatrix[i+1].UnBiasIt().Transpose()

ErrorMatrix[i] = Results[i+1].UnBiasIt().Derivate() .* TempMatrix

EndFor

Jetzt haben wir also die Fehler-Matrizen. Fehlt nur noch
das Update der Gewichte über Delta-Werte.

Das berechnet sich normalerweise durch die Multiplikation des Fehlerwertes
mit der Lernrate sowie mit dem Ergebnis des vorherigen Knotens, der
zu dem Gewicht gehört.

Jetzt ist es genauso simpel. Alles was wir brauchen ist eine weitere Operation:
Skalar-Multplikation. Die verknüpft jeden Wert der Matrix mit einem einfachen Wert.

For i from 0 to WeightMatrix.Length:

WeightMatrix[i] += Results[i].Transpose() * ErrorMatrix[i] * learningRate

EndFor


Damit haben wir es geschafft!
Das Netz sollte jetzt gleichzeitig alle Trainingsbeispiele berechnen können.
26.3.16 13:30
 


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