2017-10-20 4 views
0

Ich bin ein Neuling zum maschinellen Lernen und dies ist eine der ersten echten ML Aufgaben.Wie kann man herausfinden, ob ein Datensatz ein neuronales Netzwerk trainieren kann?

Einige experimentelle Daten enthalten 512 unabhängige boolesche Funktionen und ein boolesches Ergebnis.

Es gibt ungefähr 1e6 reale Experimentdatensätze in dem bereitgestellten Datensatz.

In einem klassischen XOR-Beispiel werden alle 4 von 4 möglichen Zustände benötigt, um NN zu trainieren. In meinem Fall ist es nur 2^(10-512) = 2^-505, die nahe bei Null ist.

Ich habe keine weiteren Informationen über die Daten Natur, nur diese (512 + 1) * 1e6 Bits.

Versuchte NN mit 1 versteckter Schicht auf verfügbaren Daten. Die Ausgabe der trainierten NN auf den Samples selbst aus dem Trainingssatz ist immer nahe 0, keine einzige nahe "1". Gespielt mit Gewichten Initialisierung, Gradienten-Lernrate.

Mein code Verwendung TensorFlow 1.3, Python 3. Modell Auszug:

with tf.name_scope("Layer1"): 
    #W1 = tf.Variable(tf.random_uniform([512, innerN], minval=-2/512, maxval=2/512), name="Weights_1") 
    W1 = tf.Variable(tf.zeros([512, innerN]), name="Weights_1") 
    b1 = tf.Variable(tf.zeros([1]), name="Bias_1") 

    Out1 = tf.sigmoid(tf.matmul(x, W1) + b1) 

with tf.name_scope("Layer2"): 
    W2 = tf.Variable(tf.random_uniform([innerN, 1], minval=-2/512, maxval=2/512), name="Weights_2") 
    #W2 = tf.Variable(tf.zeros([innerN, 1]), name="Weights_2") 
    b2 = tf.Variable(tf.zeros([1]), name="Bias_2") 

    y = tf.nn.sigmoid(tf.matmul(Out1, W2) + b2) 

with tf.name_scope("Training"): 
    y_ = tf.placeholder(tf.float32, [None,1]) 

    cross_entropy = tf.reduce_mean(
     tf.nn.softmax_cross_entropy_with_logits(
      labels = y_, logits = y) 
    ) 

    train_step = tf.train.GradientDescentOptimizer(0.005).minimize(cross_entropy) 

with tf.name_scope("Testing"): 
    # Test trained model 
    correct_prediction = tf.equal(tf.round(y), tf.round(y_)) 
# ... 
# Train 
for step in range(500): 
    batch_xs, batch_ys = Datasets.train.next_batch(300, shuffle=False) 
    _, my_y, summary = sess.run([train_step, y, merged_summaries], 
     feed_dict={x: batch_xs, y_: batch_ys}) 

Ich vermute, zwei Fälle:

  1. meine Schuld - schlecht NN Implementierung, falsche Architektur;
  2. schlechte Daten. Verglichen mit dem XOR-Beispiel würden unvollständige Trainingsdaten zu einem fehlerhaften NN führen. Aber die Trainingsbeispiele, die dem trainierten NN gegeben werden, sollen richtige Vorhersagen geben, nicht wahr?

Wie zu beurteilen, ob es überhaupt möglich ist, ein neuronales Netz (ein 2-lagige perceptron) auf den zur Verfügung gestellten Daten zu trainieren um das Ergebnis zu prognostizieren? Ein Fall einer annehmbaren Menge wäre das XOR-Beispiel. Im Gegensatz zu einigen zufälligen Lärm.

+0

Ich wäre nicht geneigt, ein neuronales Netzwerk für Daten zu verwenden, die nur aus booleschen Eingängen bestehen. –

+0

@GordonLinoff Was ist ein besserer Ansatz in diesem Fall? – Serge

+2

Ich würde mit einem Entscheidungsbaum beginnen und schnell zu zufälligen Gesamtstrukturen wechseln. Abhängig von der Art der Daten haben Sie möglicherweise Glück mit SVMs (abhängig von der Struktur der Daten), aber ich denke, zufällige Gesamtstrukturen würden wahrscheinlich einen besseren Job machen. –

Antwort

1

Es gibt nur Ad-hoc-Möglichkeiten zu wissen, ob es möglich ist, eine Funktion mit einem differenzierbaren Netzwerk aus einem Datensatz zu lernen. Das heißt, diese Ad-hoc-Möglichkeiten funktionieren normalerweise. Zum Beispiel sollte das Netzwerk in der Lage sein, den Trainingssatz ohne irgendeine Regularisierung zu überfrachten.

Eine gängige Technik, um dies zu beurteilen, besteht darin, das Netzwerk nur an eine Teilmenge des vollständigen Datensatzes anzupassen. Überprüfen Sie, ob das Netzwerk sich anpassen kann, erhöhen Sie dann die Größe der Teilmenge und erhöhen Sie auch die Größe des Netzwerks. Leider ist es eine willkürliche Entscheidung, die Sie treffen müssen, ob Sie zusätzliche Ebenen hinzufügen oder mehr Einheiten in einer ausgeblendeten Ebene hinzufügen möchten.

jedoch in Ihrem Code suchen, gibt es ein paar Dinge, die falsch hier gehen könnte:

  1. ausgeglichen sind Ihre Ausgaben? Damit meine ich, haben Sie die gleiche Anzahl von 1s wie 0s in den Dataset-Zielen?
  2. Ihre Initialisierung in der ersten Schicht ist nur Nullen, die Steigung zu dieser wird Null sein, so dass es nichts lernen kann (obwohl Sie eine echte Initialisierung darüber auskommentiert haben).
  3. Sigmoid-Nichtlinearitäten sind schwieriger zu optimieren als einfachere Nichtlinearitäten wie ReLUs.

Ich würde empfehlen, die built-in definitions for layers in Tensorflow mit nicht um Initialisierung zu sorgen, und in irgendwelchen verborgenen Schichten zu relus Schalte (Sie müssen sigmoid am Ausgang für Ihr boolean Ziel).

Schließlich ist tiefes Lernen eigentlich nicht wirklich sehr gut in den meisten "Tasche der Funktionen" Lernschwierigkeiten, weil sie Struktur fehlt. Zum Beispiel spielt die Reihenfolge der Merkmale keine Rolle. Andere Methoden funktionieren oft besser, aber wenn Sie wirklich Deep Learning verwenden möchten, können Sie sich this recent paper ansehen und eine verbesserte Leistung zeigen, indem Sie nur eine ganz spezielle Nichtlinearität und Gewichtsinitialisierung verwenden (ändern Sie 4 Zeilen in Ihrem Code oben).

+0

1. Ausgänge sind ausgewogen, verifiziert. 2. sicher, dass ich auch mit zufälliger normaler init versucht habe; Probieren zufällige Wald Approach jetzt dauert es lange. Warten auf erste Ergebnisse, während die CPU zu 100% geladen ist und sich die Lüfter laut drehen. – Serge

+0

Vielleicht möchten Sie Naive Bayes ausprobieren, vorausgesetzt, Sie haben boolesche Eingaben und Ziele. Es läuft viel schneller ([geschlossene Form und lineare Zeit] (https://en.wikipedia.org/wiki/Naive_Bayes_classifier)) als die zufällige Gesamtstruktur und ist optimal unter bedingten Unabhängigkeitsannahmen. –

+0

Danke nochmal! Zufälliger Wald ergab schließlich eine miserable 0,5239 Genauigkeit nach ~ 1 Stunde CPU-Erwärmung. [Versuchte die Naiven Bayes] (https://gist.github.com/sergiqs/f3197087b53eeca153b9c4cad3e25a7e) ebenfalls, was eine Genauigkeit von 0,47 erreichte. Entweder mache ich etwas falsch oder die Daten sind nicht für ML-Algorithmen geeignet. – Serge

Verwandte Themen