This blog used to be german, but I'll write in english from now on. Drop me a line if you think my english is too bad and I'd better switch back to german immediately ...
Angeregt durch eine Diskussion habe ich die 10 Ziffernpattern der PatternMatching Demo (ausgehend von
Release 2.7)
testweise mit 26 Buchstabenpattern (7x7 Matrix) ersetzt. Es
funktionierte auf Anhieb erstaunlich gut, brauchte nun aber statt den
gut 50 bei den Ziffern nun aber manchmal bis zu 250 Epochen bis alle
Patterns erkannt werden. Durch den grösseren Umfang wurde offenbar auch
der erwünschte Generalisierungseffekt mit der folgenden Rauschresistenz
merkbar grösser.
Um den Generalisierungseffekt noch zu verstärken habe ich ebenfalls
testweise eine Shuffle Funktion eingeführt, die während dem Training
die einzelnen Inputs mit einer einstellbaren Wahrscheinlichkeit
invertiert und somit ein Rauschen
approximiert. Damit werden auch verrauschte Patterns trainiert ohne das
man selber solche zusätzlichen Patterns erstellen müsste. Erste Tests
mit Invertierungswahrscheinlichkeiten von 0.05 bis 0.1 führen wie
erwartet zu erneut längerem AutoTraining und auf den ersten Blick
erneut besserer Rauschresistenz, genaue Vergleichszahlen kann ich
jedoch noch nicht liefern.
Auf Anfrage kann ich die Buchstabenpattern gerne weiterreichen, die Modifikation ist trivial.
Die neue Demo ist eine Abwandlung der vor kurzem vorgestellten Logic Operator Training Demo.
Statt mit nur einem Output Neuron immer nur genau einen Logik Operator
zu trainieren werden in der neuen Demo mit 16 Output Neuronen alle 16
Logik Operatoren gleichzeitig trainiert. Dabei stehen zwei
Netzwerkstrukturen zur Verfügung: Zum einen eine mit einem gemeinsamen
Hidden Layer von 32 Neuronen, zum anderen ein Netz mit in 16 4er
Gruppen geteilten 64 Hidden Neuronen, wobei jede Gruppe nur mit einem
Output Neuron verknüpft ist (was schlussendlich auf 16 parallele
isolierte Netzwerke hinausläuft).
Das Training ist vollständig, d.h. es werden alle möglichen
(boolschen) Eingabekombinationen trainiert. Dabei gibt es 16
unterschiedliche mögliche Ausgabefunktionen - jede dieser
Funktionen ist hier mit einem Ausgabeneuron realisiert.

Mit den gemeinsamen Hidden Neuronen lernt das Netz wie erwartet viel
schneller (mit weniger Epochen) als mit der gruppierten Struktur, aber
die beiden Operatoren XOR und XNOR lassen sich damit praktisch nicht
trainieren, trotz aktivierten Bias Neuronen. Die Gruppierte Version
braucht zwar etwas länger (mehr Epochen), trainiert dafür aber auch die
XOR Operatoren ohne Problem.
Multi Logic Operator Training Demo herunterladen (inkl. Sourcecode)
Die Demo des
Trainingsverhaltens der NeuroBox bei den 16 boolschen Logikfunktionen
basiert auf einer Testanwendung von Leopold Rehberger. Sie zeigt auch
den starken Einfluss der neu eingeführten Bias Neuronen sowie der Skalierung von Eingabe- und Trainingsvektoren.

Wie angekündigt,
habe ich heute die NeuroBox Release 2.4 freigegeben. Neben dem Wechsel
zurück zur GPL Lizenz kam neu die transparente Unterstützung von Bias
Neuronen hinzu.
Bias Neuronen (aka On-Neuronen) helfen, die Symetrie von Netzwerken
zu brechen und beheben somit z.b. das Problem des Nullvektors als
Netzeingabe. Das Training der jeweiligen Gewichtung des Bias Neurons
für die Neuronen erfolgt transparent beim normalen Training. Bias
Neuronen sind per default deaktiviert.
Aktivieren der Bias Neuronen:
network.Configuration.UseBiasNeuron = true;
Setzen der konstanten Ausgabe des Bias Neurons (default ist 0.9):
network.Configuration.BiasNeuronOutput = 0.8;
NeuroBox 2.4 Download
Ich glaube ich habe soeben herausgefunden, warum die NeuroBox bisher
speziell beim Trainieren logischer Operatoren teilweise so
unzufriedenstellend arbeitete. Verantwortlich dafür ist wieder mal eine
Symetrie im Netzwerk. Zwei verschiedene Netzwerksymetrien bezülich den
Gewichten habe ich bereits mit gezielten Optimierungen gebrochen (oder
zu brechen versucht), die neue Symetrie betrifft aber die ganze
Netzarchitektur als solches. Ich werde daher voraussichtlich in den
nächsten Tagen eine neue Release freigeben - speziell bei der Pattern
Matching Demo verspreche ich mir leicht bessere Resultate und
schnellere Trainings.
Wie bereits vor einer Woche angekündigt habe ich heute die NeuroBox 2.3 freigegeben. Sie steht ab sofort auf den SourceForge Mirrors zum Download zur Verfügung. Auch die Online Referenz wurde aktualisiert.
Neuerungen der Release 2.3 gegenüber ihrem Vorgänger
- Neue kleine (aber wachsende) Demo Sammlung: Simple Training Demo
- Wichtiger Fix eines Bugs bei der Berechnung des Gradienten,
der die BackPropagation stark verlangsamte. Das Netzwerk lernt nun
wesentlich schneller.
- Bugfix in der Erfolgsberechnung im Pattern Matching Building Block.
- Die Pattern Matching Demo zeigt nun anstelle des Outputs die (aussagekräftigere) Aktivität der Outputneuronen an.
- Einige zuvor fehlende Netzwerkmethoden des Unbound Szenarios wurden ergänzt.
- Vorbereitung für ein Batch Training (zusätzlich zum bisherigen inkrementellen Training).
- Neue Network Structure Factory, mit der neu ein Netzwerk
automatisch aufgrund einer Strukturbeschreibung in zwei Arrays
aufgebaut werden kann.
Beim erweitern der NeuroBox durch einen offline Batch
Lernalgorithmus (zusätzlich zum inkrementellen (on- und offline)) habe
ich einen kleinen Fehler mit grosser Wirkung im rekursiven
Backpropagation Algorithmus entdeckt. Durch den Fehler wurde das Delta
(berechnet aus der Fehlerfunktion) falsch oder gar nicht
berücksichtigt. Dies erklärt zb. den Umstand, das bisher manchmal nicht
mal 400 Durchgänge ausreichten um 10 einfache Patterns erfolgreich zu
trainieren.
In der korrigierten Version reichen in der PatternMatching Demo nun
meist schon wenige Durchgänge ( < 20% in der Progressbar) aus um
die 10 Patterns erfolgreich zu trainieren. Falls die Zeit ausreicht
werde ich daher noch heute eine neue Release 2.3 freigeben.
Ich habe soeben einen kurzen Artikel
geschrieben, der die ersten Schritte mit der NeuroBox etwas erleichtern
und eine Übersicht über das ganze verschaffen sollte, auch wenn nur ein
Bruchteil der Bibliothek darin behandelt wird:
Einführung in die NeuroBox Bibliothek
Die Version 2.2 der NeuroBox Library steht ab sofort inkl. Quelltext und Referenz auf den SourceForge Mirrors zum Download bereit.
Die bereits erwähnte Pattern Matching Demo ist nun auch mit dabei:

Das voreingestellte Pattern Set beinhaltet Muster für die Ziffern
0-9. Dank den neuen Optimierungen, einer verbesserten Parametrisierung
und v.a. der wesentlich besseren Synapsenstruktur zwischen der ersten
und der zweiten Neuronenschicht lassen sich damit auch häufig
erfolgreich alle 10 Patterns eintrainieren:

Einige Screenshots:
- Hauptfenster: Aktiviertes Pattern das nicht (erfolgreich) trainiert wurde.
- Designer: Ausschnitt, der schön die wesentlich bessere erste Verknüpfungsebene zeigt.
- Configuration: Alle Einstellungen können direkt geändert werden, einige wirken sich allerdings erst bei einem Netzwerk Reset aus.
- About Box
Neben einigen kleinen Fixes hat sich in der Version 2.2 v.a. folgendes geändert:
- PropertyGrid Unterstützung für die Konfigurationsklasse
- Einige neue Eigenschaften und Methoden, ein par Verschiebungen (zb.
können sich Neuronen nun selber durch Synapsen verknüpfen, ohne den
bisher nötigen Umweg über das Netzwerk).
- Verbesserte und neue Trainingsoptimierungen
- Neue Ereignisorientierte Architektur für eine bessere Integration.
- Building Blocks, Demo
Das Benutzen der Bibliothek wurde mit den Building Blocks nocheinmal
wesentlich vereinfacht. Ein grossteil der Logik, die zuvor bei jeder
Anwendung ausprogrammiert werden musste, wurde nun in die
GridPatternMatching Klasse verpackt - mit dem eigentlichen Netzwerk
kommt man nicht mehr zwingendermassen in Kontakt.
Ich habe heute wieder ein wenig an der NeuroBox und Pattern Matching Demo
gearbeitet. Die NeuroBox kann neu neben der symmetrischen Tangens
Hyperbolicus Aktivierung mit Bildbereich [-1..1] auch mit einer
temperaturabhängigen (parametrisierbar) asynchronen Logistisch
Sigmoiden Funktion arbeiten (Bereich [0..1]).
Die Pattern Matching Demo erhielt ein relativ primitives
automatisches Training, das die Neuronen der Reihe nach jeweils ein mal
trainiert (sofern sie nicht ohnehin schon erfolgreich sind) bis
entweder die gewünschte Anzahl erfolgreicher Patterns erreicht ist
(werden gleichzeitig erkannt) oder ein vorgegebene Anzahl Trainings
erreicht wurde (Timeout). Damit ist es mir vorhin gerade gelunden, ein
Set aus 6 überlagernder Patterns (überlagernd: alle Inputneuronen sind
bei mindestens 2 Patterns aktiv) vollständig zu erkennen. Interessant
dabei ist, dass die Gewichte zwischen fördernd und blockend etwa
gleichmässig verteilt sind. Die Aktivität der Neuronen im Zwischenlayer
sind dabei zwar vom Muster abhängig, innerhalb eines Musters aber
häufig in der gleichen Grössenordnung (z.B. Betrag zwischen 0.2 und 2,
oder zwischen 20 und 30). Das Netzwerk hat 63 Input-, 4 Hidden- und 6
Outputneuronen.
Beim Experimentieren mit der neuen Pattern Matching Demo
bin ich auf das Phenomen gestossen, dass sich bei einer gleichmässigen
Verteilung der Inputaktivitäten auf die verschiedenen Patterns sich mit
der Zeit die Gewichte der Synapsen auf den ersten Zwischenlayer
aneinander angleichen, womit eine Symmetrie entsteht, die ein
differenziertes Training erschwert wenn nicht verunmöglicht. Beim
Initialisieren des Netzwerkes setze ich zwar schon jetzt die Gewichte
auf kleine zufällige Werte um genau diese Symmetrie vorzubeugen
("Symmetry Breaking"), nicht aber danach im Verlaufe des Trainings.
Eine Möglichkeit, die Symmetrie auch danach zu Verhindern, könnte eine
Störfunktion sein, die Gewichte bei Neuronen mit gleicher Aktivität
leicht gegenseitig verschiebt, sodass die Summe zwar gleich bleibt, sie
sich aber bei unterschiedlichen Aktivierungen besser unabhängig
optimieren können.
Ein anderer Problempunkt sind sehr ungleich verteilte Patterns. Wenn
eine Mehrheit der Inputneuronen für (fast) alle Patterns die gleiche
Aktivität haben, so bekommen diese beim Traning mit der Zeit eine
ungewöhnlich hohe Bedeutung auf das Endresultat. Dies wirkt sich unter
anderem dadurch aus, dass die Ausgabe mit der Zeit immer unabhängiger
von den wenigen wechselnden Inputneuronen wird; man kann zwar dann noch
die Ausgabe trainieren, die hat dann aber nur noch wenig mit der
Eingabe zu tun. Dieser Punkt kann zwar mittels Vorbehandlung
(preprocessing) und Gruppierungen abgeschwächt werden, dieser Ansatz
ist aber nicht immer praktikabel da unflexibel. Ich werde mir daher
testweise mal einen Algorithmus ausdenken, der die ausgehenden Gewichte
eines "toten" (sich nicht ändernden) Neurons mit der Zeit stark
reduziert, womit diese an Bedeutung verlieren dürften. Mal sehen ob das
etwas hilft...
Bei Situationen wie der Pattern Matching Demo könnte sich zumidest
für das Basistraining auch ein Offline Training (anstelle des aktuellen
Onlinetrainings) gut eignen. Beim Offlinetraining werden alle Patterns
gleichzeitig berücksichtigt, womit u.a. der Vergessenseffekt beim
"Überschreiben" in anderen Trainings entfällt. Da hier aber ohnehin
alle Patterns von Anfang an vorliegen stellt dies kein Problem dar.
Neben dem Designer
habe ich heute auch mit der Pattern Matching Demonstration begonnen,
aufbauend auf einem Projekt von Tobias Finazzi. Mit der Demo kann ein
neuronales Netzwerk auf die Erkennung verschiedener Muster (Patterns)
trainiert werden. Der folgende Screenshot zeigt im Hauptfenster ein
erfolgreiches erstes Training des 4. Patterns, dahinter wird im
Designerfenster das Netzwerk graphisch dargestellt.

Dank der neuen Flatspot Optimierung und einer etwas verbesserten
Parametrisierung lässt sich das Netzwerk nun schon wesentlich besser
trainieren, allerdings bin ich im obigen Beispiel mit 7 Patterns
trotzdem noch nicht auf mehr als 4 gleichzeitig erkennende Patterns
gekommen.
Sobald Designer und Demo bereit sind werde ich voraussichtlich v2.1 releasen ..
Ich habe in den letzten Tagen etwas mit Netron
experimentiert. Die Bibliothek scheint sich bestens für den Netzwerk
Designer (und Visualisisierung) zu eignen, wie das erste
Screenshot eines aus einem bestehenden neuronalen Netzwerk automatisch
generierten Graphen zeigt:

Wenn nun auch noch das graphische Manipulieren des Netzwerkes (neue
Nodes hinzufügen etc.) ähnlich reibungslos verläuft werd ich das ganze
wohl bald publizieren können ...