Neue Dokumentation online

Weil die neue CTP ja nun doch anders ist als die erste  und vielleicht auch nicht immer einfach zu handhaben, hab ich jetzt mal hier noch ein paar neue Sachen hochgeladen um den Einstieg leichter zu machen und, dass man mal ein praktisches Beispiel hat.

Es geht zunächst um das And-Beispiel um zu zeigen wie das Programm funktioniert, nicht wie neuronale Netze funktionieren. Richtig praktische Beispiele mach ich selbstverständlich auch noch, man kann ja auch einfach mal selbst den Contrastive Divergence Algorithmus unter die Lupe nehmen(z.B. mit dem MNIST data set mal probieren, findet man auch einige Beispiele im Netz), geht ungefähr so:

1.Unterste Schicht mit CD trainieren

2.Netz erstellen, test klicken(statt ausführen), bias nicht vergessen, MNIST Daten auf die untere Schicht geben, obere Schicht ausgeben lassen und in Datei speichern(geht nur Textdatei, sorry)

3.Mit der generierten Datei die nächste Schicht mit CD trainieren… und so weiter bis zur letzten Schicht, dann labels mit Backprop und das wars..

Kommt natürlich auf die Genauigkeit an mit der man das betreibt aber das ganze dauert schon eine Weile auf einem normalen Rechner, das lässt sich aber nicht ändern, die Datenmengen der MNIST sind sehr sehr groß.

Feedback zur neuen Version bitte über das Kontakt-Formular (Contact).

NNSpace CTP 2 veröffentlicht

Endlich, nach einiger Verspätung hab ich jetzt die zweite CTP von NNSpace veröffentlicht. Außer den typischen Bugfixes und UI-Verbesserungen, die man sicherlich gleich beim ersten Start bemerken wird gibt es folgende richtige Änderungen:

  1. Die Speicherverwaltung: NNSpace ist jetzt in der Lage so große Netze zu erstellen, wie auf die Festplatte passen, weil zwar der Arbeitsspeicher ziemlich ausgelastet wird, aber alles unnötige sofort auf die platte weggeschreiben wird, wo es dann bei Bedarf ohne, dass man sich Gerdanken darüber machen muss wieder geladen wird. Man sollte allerdings darauf achten mindestens ein paar Gigabyte freien Festplattenspeicher zu haben, sonst bringt die ganze Sache natürlich überhaupt nichts
  2. Die Implementierung der NNS: Die Neural Network Specification(hab ich zum ersten Mal in meinem post am 3.10. letztes Jahr erwähnt) wird vollständig implementiert. Ich denke ich werd da  mal noch ein Beispiel dazu machen, man findet einige Erklärungen dazu hier: compositedevtec.tk/nnspace
  3. Lokalisierung: wer sich dafür interessiert NNSpace in einer Fremdsprache zu verwenden kann mir eine EMail schicken. Englisch wird schon unterstützt(auf amerikanisch-englischen Systemen schaltet das Programm automatisch die Sprache um).
  4. Neue und verbesserte Trainingsalgorithmen
  5. Testfunktion: Man kann jetzt das Netz außer der Ausführung noch zum Generieren von Daten verwenden

Downloadlink binaries: selensoft.tk(Silverlight wird benötigt)

Natürlich braucht man wie immer das .NET Framework 4.0

Fortschritte mit der Speicherverarbeitung

Nach einigen weit ausschweifenden Gedanken (s. vorheriger Post) möchte ich doch jetzt erst mal über meine wirkliche Arbeit zurzeit berichten: Wie bereits vor Kurzem erwähnt schlag ich mich mit der Tatsache rum, dass mein Arbeitsspeicher für alle Trainings- und Ausführungsvorgänge meiner neuronalen Netze mit NNSpace zu klein ist. Ich bin also dabei über die erwähnten Klassen StorageMatrix und StorageVector zu erreichen, dass alle meine Daten auch auf der Festplatte existieren, und so nicht im Arbeitsspeicher gehalten werden müssen. Dabei ist natürlich eine Matrix eine Auflistung von Vektoren, es geht also darum sehr viele Vektoren in einem Dateiformat möglichst effizient abzuspeichern. Dafür ist eine weitere Instanz notwendig, die den Speicher verwaltet. Es macht wahrscheinlich keinen Sinn für jeden Vektor eine eigene Datei zu erstellen, weil das zusätzlichen Aufwand bedeuten würde, wir müssen also mit einer Datei für alle auskommen (oder zumindest einigen wenigen Dateien). Auf diese dritte Klasse (FileStorage) greift nun ein Vektor intern zu und reserviert über einen Befehl eine bestimmte Menge an Speicherplatz. Dann kann er über weitere Befehle diesen Speicherplatz beschreiben. Die Vektoren werden dabei über spezielle Schlüssel identifiziert und den richtigen Positionen in der Datei vom System zugeordnet.

Ich bin allerdings inzwischen der Meinung, dass dieses System nicht nur für neuronale Netze geeignet ist. Es könnte durchaus auch an anderen Stellen, wenn man sehr große Datenmengen verarbeiten muss (vor allen Dingen hochdimensionale Arrays wie in diesem Fall, z.B. Listen von Matrizen…) sinnvoll sein diese einfach mal in eine Datei wegzuschreiben. Natürlich kann man da mit der Geschwindigkeit auch noch eine ganze Menge optimieren (z.B. durch geschickte Speicherverwaltung mit der Datei), aber letztendlich ist ja das Problem, dass Programmiersprachen wie C# einfach nicht dafür ausgelegt sind sehr große Datenmengen zu verwalten. Man kann und muss dieses Problem lösen, Ansätze gibt es aber bestimmt viele und das Problem ist sicherlich auch nicht neu auch wenn wahrscheinlich kaum jemand mit C# solche großen neuronalen Netze einlernen will wie ich. Das ist aber denke ich noch lange nicht alles an Problemen was man in dieser Richtung so hat, also wäre es vielleicht sogar mal sinnvoll eine Art Framework für die Speicherverwaltung in .Net herauszubringen. Ich hoffe ich stoße nicht auf neue große Probleme und die CTP 2 verzögert sich nicht noch weiter, aber es hat für mich einfach keinen Sinn gemacht etwas derartig unvollständig funktionierendes herauszubringen, das bei großen Datenmengen einfach abstürzt. Ich finde diesen (wenn auch aufwendigen) Schritt sehr nötig und hoffe, dass damit die CTP 2 wirklich einsetzbar wird.

Die Macht der Cluster

Letztens einen Artikel vom Spiegel gelesen, über Mieten von einem Cluster. Mich hat schon immer mal der Gedanke umgetrieben, dass meine Trainingsalgorithmen von NNSpace einfach viel zu langsam auf einem einzelnen Computer laufen. Es gibt ja auch viele andere Sachen, die man eigentlich gerne auf die Computer im ganzen Haus verteilen würde, zugegeben das geht nicht mit Allem aber ich denke das was Amazon hier zum Beispiel anbietet ist schon eine Richtung, die in Zukunft auch genutzt werden wird. So weit denk ich aber noch gar nicht, mir gehts vielmehr um das Prinzip. Es wäre doch mal interessant zu Testen ob man fähig ist so eine Clusterstruktur aufzubauen, jetzt mal ohne Amazon und 1000 Prozessoren, sondern einfach nur mit 2 oder 3 Computern im eigenen Haus. Letztendlich ist dann der Schritt (falls man das Aufteilen der Arbeit in 1000 Teile vorher schon erledigt hat) nicht mehr so groß zum Rechenzentrum. Es geht ja vielmehr um die Fähigkeit der Anwendung überhaupt auf irgend so einem System zu laufen.

  1. Ich glaube wir haben dabei erst mal zwei Typen von Teilnehmern, ich nenne sie jetzt mal Distributor(davon gibts einen) und Calculator(davon kann es unendlich viele geben). Das heißt jetzt nicht unbedingt, dass nicht auch mehrere solcher Typen auf derselben Maschine laufen können, aber wir brauchen irgendwie eine Instanz(Distributor), die Befehle vom Benutzer annimmt und die dann auf die Arbeitspferde(Calculator) verteilt.
  2. Dann ist noch ein Format nötig über das sich Distributor und Calculator unterhalten. Dabei denk ich jetzt nicht an irgendein Protokoll oder oder Ähnliches, das ist Implementierung und gehört nicht zur Architektur, sondern vielmehr die Art der Ergebnisse und Aufträge. Man muss dann eben immer beachten, dass die Übertragung eine kurze Weile dauert, und deshalb die Daten nicht zu oft gesendet werden dürfen und nicht zu groß sein dürfen.

Dabei ist selbstverständlich das Hauptproblem das Aufteilen der Arbeit, denn die Calculators sollten schon eine Weile zu Rechnen haben, bevor sie das Ergebnis zurückschicken, damit sich die ganze Sache lohnt.

Einen Anwendungsfall sehe ich hier zum Beispiel wenn man viele parallele Ausführungen von einem Netz durchführen möchte, mit dem Lernen sieht es hier schon etwas komplizierter aus, weil sich ja die Gewichte ständig ändern und deshalb immer hin und hergeschickt werden müssten. Letztendlich werde ich wohl zuerst über eine generelle Infrastruktur zum Zusammenschließen eines solchen Rechenclusters nachdenken müssen, die mein Netze-Programm dann benutzen kann. Aber diese Funktionen werden natürlich noch nicht mit der CTP 2 kommen, aber wenn sowas funktioniert, dann wäre das sicherlich ein Release für sich wert.