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 ... Wink [;)]
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 ...