11

Ich versuche, diese Kaggle Problem mit Neural Networks zu lösen. Ich benutze Pybrain Python Library.Anzahl der versteckten Schichten, Einheiten in versteckten Schichten und Epochen, bis Neural Network beginnt sich akzeptabel zu verhalten Trainingsdaten

Es ist ein klassisches überwachtes Lernproblem. Im folgenden Code: 'Daten' Variable ist numpy Array (892 * 8). 7 Felder sind meine Features und 1 Feld ist mein Ausgabewert, der '0' oder '1' sein kann.

from pybrain.datasets import ClassificationDataSet 
from pybrain.supervised.trainers import BackpropTrainer 
from pybrain.tools.shortcuts import buildNetwork 

dataset = ClassificationDataSet(7,1) 
for i in data: 
    dataset.appendLinked(i[1:],i[0]) 
net = buildNetwork(7,9,7,1, bias = True,hiddenclass = SigmoidLayer, outclass = TanhLayer) 
trainer = BackpropTrainer(net, learningrate = 0.04, momentum = 0.96, weightdecay = 0.02, verbose = True) 
trainer.trainOnDataset(dataset, 8000) 
trainer.testOnData(verbose = True) 

Nach meinem Neural Network Training, wenn ich es bin Prüfung auf Trainingsdaten, sein immer einen einzigen Ausgang für alle Eingänge zu geben. Wie:

Testing on data: 
out:  [ 0.075] 
correct: [ 1.000] 
error: 0.42767858 
out:  [ 0.075] 
correct: [ 0.000] 
error: 0.00283875 
out:  [ 0.075] 
correct: [ 1.000] 
error: 0.42744569 
out:  [ 0.077] 
correct: [ 1.000] 
error: 0.42616996 
out:  [ 0.076] 
correct: [ 0.000] 
error: 0.00291185 
out:  [ 0.076] 
correct: [ 1.000] 
error: 0.42664586 
out:  [ 0.075] 
correct: [ 1.000] 
error: 0.42800026 
out:  [ 0.076] 
correct: [ 1.000] 
error: 0.42719380 
out:  [ 0.076] 
correct: [ 0.000] 
error: 0.00286796 
out:  [ 0.076] 
correct: [ 0.000] 
error: 0.00286642 
out:  [ 0.076] 
correct: [ 1.000] 
error: 0.42696969 
out:  [ 0.076] 
correct: [ 0.000] 
error: 0.00292401 
out:  [ 0.074] 
correct: [ 0.000] 
error: 0.00274975 
out:  [ 0.076] 
correct: [ 0.000] 
error: 0.00286129 

ich versucht habe zu verändern learningRate, weightDecay, Impuls, die Anzahl der versteckten Einheiten, die Anzahl der verborgenen Schichten, Klasse von versteckten Schichten, Klasse von Ausgangsschichten, um es zu lösen, aber in jedem Fall gibt es gleiches Ausgabe für jeden Eingang, wenn die Eingabe von Trainingsdaten kommt.

Ich denke, ich sollte es mehr als 8000 mal laufen, denn als ich Neural Network für 'XOR' baute, dauerte es mindestens 700 Iterationen, bevor es begann, Fehler im Nanobereich zu geben. Die Trainingsdatengröße auf 'XOR' war nur 4, während es in diesem Fall 892 war. Also habe ich 8000 Iterationen auf 10% der Originaldaten ausgeführt (jetzt Größe der Trainingsdaten ist 89), selbst dann gab es dieselbe Ausgabe für jede Eingabe in Trainingsdaten. Und da ich die Eingabe in '0' oder '1' klassifizieren möchte, wenn ich die Klasse der Ausgabeschicht als Softmax benutze, gibt sie immer '1' als Ausgabe aus.

Egal welche Konfiguration (Anzahl der versteckten Einheiten, Klasse der Ausgabeschicht, Lernrate, Klasse der versteckten Ebene, Impuls), ich habe in 'XOR' mehr oder weniger angefangen, in jedem Fall zu konvergieren.

Es ist möglich, dass es eine Konfiguration gibt, die zu niedrigeren Fehlerraten führt. Einige Konfiguration, damit es nicht für alle Eingaben in Trainingsdaten dieselbe Ausgabe gibt.

Ich lief es für 80.000 Iteration (Training Datengröße ist 89). Ausgabe-Beispiel:

Testing on data: 
out:  [ 0.340] 
correct: [ 0.000] 
error: 0.05772102 
out:  [ 0.399] 
correct: [ 0.000] 
error: 0.07954010 
out:  [ 0.478] 
correct: [ 1.000] 
error: 0.13600274 
out:  [ 0.347] 
correct: [ 0.000] 
error: 0.06013008 
out:  [ 0.500] 
correct: [ 0.000] 
error: 0.12497886 
out:  [ 0.468] 
correct: [ 1.000] 
error: 0.14177601 
out:  [ 0.377] 
correct: [ 0.000] 
error: 0.07112816 
out:  [ 0.349] 
correct: [ 0.000] 
error: 0.06100758 
out:  [ 0.380] 
correct: [ 1.000] 
error: 0.19237095 
out:  [ 0.362] 
correct: [ 0.000] 
error: 0.06557341 
out:  [ 0.335] 
correct: [ 0.000] 
error: 0.05607577 
out:  [ 0.381] 
correct: [ 0.000] 
error: 0.07247926 
out:  [ 0.355] 
correct: [ 1.000] 
error: 0.20832669 
out:  [ 0.382] 
correct: [ 1.000] 
error: 0.19116165 
out:  [ 0.440] 
correct: [ 0.000] 
error: 0.09663233 
out:  [ 0.336] 
correct: [ 0.000] 
error: 0.05632861 

Durchschnittliche Fehler: 0,112558819082

('Max-Fehler:', ,21803000849096299 'Median-Fehler:', 0,096632332865968451)

Es gibt alle Ausgänge in Reichweite (0,33, 0,5) .

+1

Warum nicht der gemeldete Fehler Match | out-correct |? Haben Sie auch schon mehr als 8000 Iterationen trainiert? Wie viele verdeckte Knoten haben Sie probiert? – Junuxx

+0

Ich habe 2 versteckte Ebenen mit jeweils 11 Knoten ausprobiert. Es funktionierte nicht bis zu 8000 Iterationen. Im Moment benutze ich 2 versteckte Ebenen mit 9 und 7 Knoten und laufe 80.000 Iterationen, es läuft seit ungefähr 3 Stunden, wird Ergebnisse berichten, sobald es abgeschlossen ist, obwohl ich Total Error betrachte, glaube ich nicht wirklich, dass es sein wird etwas besser. Es tut mir leid, ich habe keine Ahnung, warum der gemeldete Fehler nicht mit | out-correct | übereinstimmt. –

+0

Ich habe die Frage mit den Ergebnissen der Ausführung für 80.000 Iteration aktualisiert. –

Antwort

6

Es gibt noch eine weitere neurale Netzwerkmetrik, die Sie nicht erwähnt haben - Anzahl der anpassbaren Gewichte. Ich beginne die Antwort daraus, weil es sich auf die Anzahl der versteckten Ebenen und Einheiten in ihnen bezieht.

Für eine gute Generalisierung muss die Anzahl der Gewichte viel weniger Np/Ny betragen, wobei Np eine Anzahl von Mustern und Ny eine Anzahl von Nettoausgängen ist. Was ist das "viel" genau ist diskutierbar, schlage ich mehrere Male Unterschied, sagen 10. Für etwa 1000 Muster und 1 Ausgabe in Ihrer Aufgabe wird dies 100 Gewichte implizieren.

Es macht keinen Sinn, 2 versteckte Ebenen zu verwenden. 1 ist für die meisten Aufgaben, bei denen Nichtlinearität eine Rolle spielt, ausreichend. In Ihrem Fall macht die zusätzliche versteckte Ebene nur den Unterschied, indem sie die Gesamtleistung beeinflusst. Wenn also eine versteckte Schicht verwendet wird, kann die Anzahl der Neuronen in dieser als Anzahl der Gewichtungen dividiert durch die Anzahl der Eingänge angenähert werden, das ist 100/7 = 14.

Ich schlage vor, die gleiche Aktivierungsfunktion in allen Neuronen zu verwenden, entweder Hypertanh oder überall Sigmoid. Ihre Ausgabewerte sind tatsächlich bereits für Sigmoid normalisiert. Wie auch immer, Sie können die NN-Leistung verbessern, indem Sie die Eingabedaten normalisieren, um in [0,1] in allen Dimensionen zu passen. Natürlich, normalisieren Sie jedes Feature für sich.

Wenn Sie mit der Pybrain-Bibliothek arbeiten können, beginnen Sie mit höherer Lernrate zu lernen und verringern Sie sie dann gleichmäßig proportional zum aktuellen Schritt (LR * (N - i)/N), wobei i der aktuelle Schritt ist, N - eine Grenze, LR - anfängliche Lernrate.

Als @Junuxx vorgeschlagen, Ausgangsstrom Fehler alle M Schritte (falls möglich) nur Ihr Programm, um sicherzustellen, wie erwartet funktioniert. Hören Sie auf zu lernen, wenn die Fehlerdifferenz in aufeinanderfolgenden Schritten unter einen Schwellenwert fällt. Nur für den Anfang und grobe Schätzung der richtigen NN-Parameter wählen Sie die Schwelle auf 0,1-0,01 (es gibt keine Notwendigkeit in "Nano-Skala").

Die Tatsache, dass ein Netzwerk aus 89 Mustern in 80000 Schritten ausgeführt und die Ergebnisse Sie haben immer ist seltsam. Bitte überprüfen Sie, ob Sie die korrekten Daten an das NN übergeben, und prüfen Sie, was die von Ihnen angegebenen Fehlerwerte bedeuten. Möglicherweise werden entweder die angezeigten Fehler oder Ausgaben von einem falschen Ort übernommen. Ich denke, 10000 Schritte müssen weit genug sein, um akzeptable Ergebnisse für 89 Muster zu erzielen.

Wie für die spezifische Aufgabe, denke ich SOM Netz eine andere Option sein könnte (possily besser geeignet als BP).

Als Nebenbemerkung, ich bin mit Pybrain nicht vertraut sind, haben aber einige NNs in C++ und andere Sprachen codiert, so dass Ihr Timing sieht sehr überdimensionalen.

+0

Ich begann mit einer Lernrate von 0.2 und nach jeder Iteration wurde es für 20.000 Iterationen mit 0.999 multipliziert, noch Ausgänge waren gleich. Ich habe die Daten erneut überprüft, es ist korrekt. –

+0

@JackSmith, Nun, dann kann es etwas sein, das Pybrain spezifisch ist, was außerhalb meines Umfangs liegt. Trotzdem solltest du versuchen zu verstehen, was die Fehler sind. Probiere reinen BP ohne Softmax. Haben Sie versucht, die Daten zu normalisieren? – Stan

+0

Ich habe früher ohne Softmax versucht, mit Softmax ist jeder Ausgang '1'. Und Normalisierung hat nicht funktioniert. –