2009-12-02 3 views
7

Für mein Universitätsprojekt erstelle ich ein neuronales Netzwerk, das die Wahrscheinlichkeit klassifiziert, dass eine Kreditkartentransaktion betrügerisch ist oder nicht. Ich trainiere mit Backpropagation. Ich schreibe das in Java. Ich möchte Multithreading anwenden, weil mein Computer ein Quad-Core i7 ist. Es nervt mich, stundenlang zu trainieren und die meisten meiner Kerne im Leerlauf zu sehen.Wie kann ich Multithreading auf das Backpropagation Neural Network Training anwenden?

Aber wie würde ich Multithreading auf Backpropagation anwenden? Backprop funktioniert, indem die Fehler rückwärts durch das Netzwerk angepasst werden. Eine Schicht muss gemacht werden, bevor die andere fortfahren kann. Gibt es irgendeine Möglichkeit, dass ich mein Programm ändern kann, Multicore-Hintergrund zu tun?

Antwort

10

Verwenden Sie in erster Linie nicht Backpropagation. Es gibt viele andere Möglichkeiten da draußen. Ich würde vorschlagen, RPROP (elastische Ausbreitung) zu versuchen. Es wird nicht so viele Änderungen an Ihrem Backpropagation-Algorithmus geben. Sie müssen Lernrate oder Impuls nicht angeben. Es ist fast so, als ob Sie eine individuelle, variable Lernrate für jede Verbindung im neuronalen Netzwerk haben.

Zum Multithreading auf Backpropagation anwenden. Ich habe gerade einen Artikel zu diesem Thema geschrieben.

http://www.heatonresearch.com/encog/mprop/compare.html

Grundsätzlich schaffe ich eine Anzahl von Threads und unterteilen die Trainingsdaten, so jeder Thread eine nahezu gleiche Menge aufweist. Ich berechne die Gradienten in jedem Thread und sie werden in einem Reduzierungsschritt summiert. Wie die Gradienten auf die Gewichte angewendet werden, hängt vom verwendeten Trainingsalgorithmus ab, aber die Gewichtsaktualisierung wird in einem kritischen Abschnitt durchgeführt.

Wenn Sie wesentlich mehr Trainingsproben als Gewichte haben, verbringt der Code viel mehr Zeit in der Multithreading-Gradientenberechnung als die Gewichtsaktualisierung des kritischen Abschnitts.

Ich biete einige der Leistungsergebnisse auf dem obigen Link. Es beschleunigt die Dinge wirklich!

+1

Wie verschmelzen Sie die Gewichte? Was "Zusammenführen" bedeutet hier, Sie fügen sie alle hinzu? – PeeS

+0

Gewichte werden nicht zusammengeführt. Ich berechne die Gradienten in jedem Thread und sie werden in einem Reduzierungsschritt summiert. Wie die Gradienten auf die Gewichte angewendet werden, hängt vom verwendeten Trainingsalgorithmus ab, aber die Gewichtsaktualisierung wird in einem kritischen Abschnitt durchgeführt. Wenn Sie wesentlich mehr Trainings-Samples als Gewichte haben, verbringt der Code viel mehr Zeit in der Multithreading-Gradientenberechnung als die Gewichtsaktualisierung des kritischen Abschnitts. – JeffHeaton

+1

Ihr Link liefert eine "Seite nicht gefunden". –

0

Weiteren CPU-Kern mit Java verwenden, können Sie einfach mehr Optionen für die JVM versuchen, ohne den Code zu ändern:

  • -Server
  • -d64
  • -XX: -UseParallelGC

und andere Optionen unter http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

+3

Diese Optionen können die Ausführung beschleunigen, aber sie werden Ihren Algorithmus nicht parallelisieren ... Wenn Sie mehrere Kerne verwenden möchten, um einen Algorithmus auszuführen, müssen Sie ihn ändern. – paradigmatic

+0

Ja. Offensichtlich. Diese Optionen sind nur minimal erforderlich, wenn Sie in Java irgendetwas parallel versuchen. –

Verwandte Themen