2012-10-07 13 views
5

Ich versuche ein neuronales Netzwerk zu verwenden, um ein Problem zu lösen. Ich erfuhr von ihnen aus dem Machine-Learning-Kurs, der auf Coursera angeboten wurde, und war froh zu entdecken, dass FANN eine Ruby-Implementierung neuronaler Netzwerke ist, so dass ich das Flugzeug nicht neu erfinden musste.Probleme beim Verstehen von neuronalen Netzwerken haben

Allerdings verstehe ich nicht wirklich, warum FANN mir so seltsame Ergebnisse gibt. Basierend auf dem, was ich von der Klasse gelernt habe,

Ich habe eine Reihe von Trainingsdaten, die Ergebnisse von Übereinstimmungen ist. Der Spieler erhält eine Nummer, sein Gegner bekommt eine Nummer und das Ergebnis ist 1 für einen Sieg und 0 für einen Verlust. Die Daten sind ein wenig laut wegen Verstimmungen, aber nicht so schlimm. Mein Ziel ist es, herauszufinden, welche Rating-Lücken anfälliger für Störungen sind. Zum Beispiel sagt mir meine Intuition, dass Spiele mit niedrigerem Rating eher zu Überraschungen führen, weil die Bewertungen weniger genau sind.

Also habe ich einen Trainingssatz von etwa 100 Beispielen bekommen. Jedes Beispiel ist (Rating, Delta) => 1/0. Es ist also ein Klassifizierungsproblem, aber nicht wirklich eines, von dem ich denke, dass es sich für ein logistisches Regressionsdiagramm eignet, und ein neuronales Netzwerk schien korrekter zu sein.

Mein Code beginnt

training_data = RubyFann::TrainData.new(:inputs => inputs, :desired_outputs => outputs) 

ich dann das neuronale Netz mit

network = RubyFann::Standard.new(
    :num_inputs=>2, 
    :hidden_neurons=>[8, 8, 8, 8], 
    :num_outputs=>1) 

In der Klasse einrichten, erfuhr ich, dass ein einigermaßen Standard jede verborgene Schicht mit der gleichen Nummer haben, ist von Einheiten. Da ich nicht wirklich weiß, wie ich das mache oder was ich noch mache, ging ich mit dem Standard.

network.train_on_data(training_data, 1000, 1, 0.15) 

Und dann endlich, ich durch eine Reihe von Abtastwerteingang Bewertungen ging in Schritten und bei jedem Schritt, erhöht Delta, bis das Ergebnis davon, dass> ,5-< 0,5 geschaltet, die ich etwa 0 bis sein nahm und etwa 1, obwohl sie eher wie 0,45 und 0,55 waren.

Wenn ich das einmal ausgeführt habe, gab es mir 0 für jeden Eingang. Ich habe es nochmal zweimal mit den gleichen Daten durchgeführt und einen rückläufigen Trend negativer Zahlen und einen steigenden Trend positiver Zahlen bekommen, völlig entgegengesetzte Vorhersagen.

Ich dachte, vielleicht habe ich nicht genug Funktionen enthalten, so fügte ich hinzu (rating**2 und delta**2). Leider habe ich dann jedes Mal angefangen, mein Anfangsdelta oder mein maximales Delta für jede Eingabe zu bekommen.

Ich verstehe nicht wirklich, warum ich so unterschiedliche Ergebnisse bekomme oder was Ruby-FANN mir erzählt, teilweise weil ich die Bibliothek nicht verstehe, aber auch, weil ich gerade angefangen habe über Neuronale Netze zu lernen und vermisse etwas Großes und Offensichtliches. Habe ich nicht genügend Trainingsdaten, muss ich mehr Funktionen hinzufügen, was ist das Problem und wie kann ich es entweder reparieren oder lernen, wie man die Dinge besser macht?

+0

Ich weiß nicht viel über ML, aber verzerrte Proben verursachen verzerrte Ergebnisse, wenn die meisten Ihrer Beispieldaten für Gewinne ist, wird es wahrscheinlich vorhersagen/führen zu einem Gewinn, wenn Sie Ihr Modell verwenden . – iouri

+0

Es ist mehr Gewinne als Verluste, aber warum sind die Ergebnisse in verschiedenen Läufen so unterschiedlich? –

Antwort

1

Wie wäre es, ein wenig mit Parametern zu spielen? Zuerst würde ich nur zwei Schichten empfehlen. Es sollte irgendwo mathematische Beweise geben, dass es für viele Probleme reicht. Wenn du zu viele Neuronen hast, wird dein NN nicht genug Epochen haben, um wirklich etwas zu lernen ... also kannst du auch mit der Anzahl der Epochen sowie mit gama spielen. Ich denke, in deinem Fall ist es 0.15 .. wenn du ein bisschen größer verwendest Wert Ihr NN sollte ein wenig schneller lernen (haben Sie keine Angst, 0,3 oder sogar 0,7 zu ​​versuchen), der richtige Wert von Gama hängt normalerweise von den Intervallen des Gewichts oder der eingegebenen Normalisierung ab.

Ihr NN zeigt wahrscheinlich so unterschiedliche Ergebnisse, weil in jedem Lauf eine neue Initialisierung erfolgt und dann ein völlig anderes Netzwerk existiert und es anders lernt als das vorhergehende (unterschiedliche Gewichte haben höhere Werte, also unterschiedliche Teile von NN wird die gleichen Dinge lernen).

Ich bin nicht vertraut mit dieser Bibliothek Ich schreibe gerade einige Erfahrungen mit NN. Hoffe, etwas von diesen wird helfen ..