2015-12-11 6 views
20

Kürzlich begann ich mit neuronalen Netzen zu spielen. Ich habe versucht, ein AND Tor mit Tensorflow zu implementieren. Ich habe Probleme zu verstehen, wann verschiedene Kosten und Aktivierungsfunktionen verwendet werden. Dies ist ein grundlegendes neuronales Netzwerk mit nur Eingabe- und Ausgabeschichten, keine versteckten Schichten.Auswahl aus verschiedenen Kostenfunktion und Aktivierungsfunktion eines neuronalen Netzes

Zuerst habe ich versucht, es auf diese Weise zu implementieren. Wie Sie sehen können, ist dies eine schlechte Implementierung, aber ich denke, dass es die Aufgabe erledigt, zumindest in gewisser Weise. Also habe ich nur die echten Ausgänge ausprobiert, keine heißen Ausgänge. Für Aktivierungsfunktionen verwendete ich eine Sigmoid-Funktion und für die Kostenfunktion verwendete ich die quadratische Fehlerkostenfunktion (ich glaube, sie heißt das, korrigiere mich, wenn ich falsch liege).

Ich habe versucht, ReLU und Softmax als Aktivierungsfunktionen (mit der gleichen Kostenfunktion) und es funktioniert nicht. Ich habe herausgefunden, warum sie nicht arbeiten. Ich habe auch versucht, die Sigmoid-Funktion mit Cross Entropy Kostenfunktion, es funktioniert auch nicht.

import tensorflow as tf 
import numpy 

train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]]) 
train_Y = numpy.asarray([[0],[0],[0],[1]]) 

x = tf.placeholder("float",[None, 2]) 
y = tf.placeholder("float",[None, 1]) 

W = tf.Variable(tf.zeros([2, 1])) 
b = tf.Variable(tf.zeros([1, 1])) 

activation = tf.nn.sigmoid(tf.matmul(x, W)+b) 
cost = tf.reduce_sum(tf.square(activation - y))/4 
optimizer = tf.train.GradientDescentOptimizer(.1).minimize(cost) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    for i in range(5000): 
     train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y}) 

    result = sess.run(activation, feed_dict={x:train_X}) 
    print(result) 

nach 5000 Iterationen:

[[ 0.0031316 ] 
[ 0.12012422] 
[ 0.12012422] 
[ 0.85576665]] 

Frage 1 - Gibt es eine andere Aktivierungsfunktion und Kostenfunktion, die (weiteren) für das oben Netzwerk arbeiten kann, ohne die Parameter zu ändern (was bedeutet, ohne W zu ändern, x, b).

Frage 2 - ich las von einem Stackoverflow Post here:

[Aktivierungs-Funktion] Auswahl auf das Problem abhängt.

Also gibt es keine Kostenfunktionen, die überall verwendet werden können? Ich meine, es gibt keine Standard Kostenfunktion, die auf jedem neuronalen Netzwerk verwendet werden kann. Recht? Bitte korrigieren Sie mich dazu.


ich implementiert auch das AND Tor mit einem anderen Ansatz, wobei der Ausgang als One-Hot wahr. Wie Sie sehen können, train_Y[1,0] bedeutet, dass der 0. Index ist 1, also ist die Antwort 0. Ich hoffe, Sie bekommen es.

Hier habe ich eine Softmax-Aktivierungsfunktion verwendet, mit Kreuz-Entropie als Kostenfunktion. Die Sigmoidfunktion als Aktivierungsfunktion versagt kläglich.

import tensorflow as tf 
import numpy 

train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]]) 
train_Y = numpy.asarray([[1,0],[1,0],[1,0],[0,1]]) 

x = tf.placeholder("float",[None, 2]) 
y = tf.placeholder("float",[None, 2]) 

W = tf.Variable(tf.zeros([2, 2])) 
b = tf.Variable(tf.zeros([2])) 

activation = tf.nn.softmax(tf.matmul(x, W)+b) 

cost = -tf.reduce_sum(y*tf.log(activation)) 

optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(cost) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    for i in range(5000): 
     train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y}) 

    result = sess.run(activation, feed_dict={x:train_X}) 
    print(result) 

nach 5000 Iteration

[[ 1.00000000e+00 1.41971401e-09] 
[ 9.98996437e-01 1.00352429e-03] 
[ 9.98996437e-01 1.00352429e-03] 
[ 1.40495342e-03 9.98595059e-01]] 

Frage 3 Also in diesem Fall, was Kostenfunktion und Aktivierungsfunktion kann ich verwenden? Wie kann ich verstehen, welche Art von Kosten und Aktivierungsfunktionen ich verwenden soll? Gibt es einen Standardweg oder eine Standardregel oder nur Erfahrung? Muss ich jede Kosten- und Aktivierungsfunktion rohe Gewalt anwenden? Ich habe eine Antwort gefunden here. Aber ich hoffe auf eine ausführlichere Erklärung.

Frage 4 Ich habe festgestellt, dass es viele Iterationen braucht, um zu einer nahezu genauen Vorhersage zu konvergieren.Ich denke, dass die Konvergenzrate von der Lernrate abhängt (zu viel davon wird die Lösung verfehlen) und die Kostenfunktion (korrigiere mich, wenn ich falsch liege). Gibt es also einen optimalen Weg (dh die schnellste) oder Kostenfunktion für die Konvergenz zu einer korrekten Lösung?

Antwort

30

Ich beantworte Ihre Fragen ein wenig außer Betrieb, beginnend mit allgemeineren Antworten, und schließe mit den für Ihr spezielles Experiment spezifischen ab.

Aktivierungsfunktionen Verschiedene Aktivierungsfunktionen haben tatsächlich unterschiedliche Eigenschaften. Betrachten wir zunächst eine Aktivierungsfunktion zwischen zwei Schichten eines neuronalen Netzes. Der einzige Zweck einer Aktivierungsfunktion besteht darin, als Nichtlinearität zu dienen. Wenn Sie keine Aktivierungsfunktion zwischen zwei Schichten einfügen, dann dienen zwei Schichten zusammen nicht mehr als einer, da ihre Wirkung immer noch nur eine lineare Transformation ist. Lange Zeit benutzten die Menschen Sigmoid-Funktion und Tanh und wählten so ziemlich willkürlich, wobei Sigmoid populärer war, bis vor kurzem, als ReLU die dominante Nicht-Relativität wurde. Der Grund, warum Benutzer ReLU zwischen Layern verwenden, ist, dass sie nicht sättigend ist (und auch schneller zu berechnen ist). Denken Sie an den Graphen einer Sigmoidfunktion. Wenn der Absolutwert von x groß ist, dann ist die Ableitung der Sigmoidfunktion klein, was bedeutet, dass, wenn wir den Fehler rückwärts propagieren, der Gradient des Fehlers sehr schnell verschwinden wird, wenn wir durch die Schichten zurückgehen. Bei ReLU ist die Ableitung 1 für alle positiven Eingänge, so dass der Gradient für die gezündeten Neuronen von der Aktivierungseinheit überhaupt nicht geändert wird und den Gradientenabfall nicht verlangsamt.

Für die letzte Schicht des Netzwerks hängt die Aktivierungseinheit auch von der Aufgabe ab. Für die Regression sollten Sie die Sigmoid- oder Tanh-Aktivierung verwenden, da das Ergebnis zwischen 0 und 1 liegen soll. Für die Klassifizierung möchten Sie nur einen Ihrer Ausgänge als Eins und alle anderen als Nullen, aber es gibt keinen differenzierbaren Weg genau das, also wirst du ein softmax verwenden wollen, um es zu approximieren.

Ihr Beispiel. Sehen wir uns nun Ihr Beispiel an. Ihr erstes Beispiel versucht, den Ausgang von AND in folgenden Form zu berechnen:

sigmoid(W1 * x1 + W2 * x2 + B) 

Beachten Sie, dass W1 und W2 immer auf den gleichen Wert konvergieren, da der Ausgang für (x1, x2) sollte mit dem Ausgang gleich sein von (x2, x1). Daher ist das Modell, das Sie passend sind:

sigmoid(W * (x1 + x2) + B) 

x1 + x2 nur einer der drei Werte annehmen kann (0, 1 oder 2), und Sie wollen 0 für den Fall zurückzukehren, wenn x1 + x2 < 2 und 1 für den Fall, wenn x1 + x2 = 2 . Da die Sigmoid-Funktion ziemlich glatt ist, werden sehr große Werte von W und B benötigt, um die Ausgabe in die Nähe des gewünschten zu bringen, aber aufgrund einer kleinen Lernrate können sie nicht schnell zu diesen großen Werten gelangen. Durch Erhöhen der Lernrate in Ihrem ersten Beispiel wird die Konvergenzgeschwindigkeit erhöht.

Ihr zweites Beispiel konvergiert besser, weil die softmax-Funktion gut darin ist, genau einen Ausgang gleich 1 und alle anderen zu 0 zu machen. Da dies genau Ihr Fall ist, konvergiert es schnell. Beachten Sie, dass sigmoid auch zu guten Werten konvergieren würde, aber es wird wesentlich mehr Iterationen (oder höhere Lernrate) benötigen.

Was zu verwenden ist.Nun zur letzten Frage, wie wählt man aus, welche Aktivierungs- und Kostenfunktionen zu verwenden sind. Diese Ratschläge werden für die meisten Fälle arbeiten:

  1. Wenn Sie Klassifizierung tun, verwenden softmax für die letzte Schicht der Nicht-Linearität und cross entropy als Kostenfunktion.

  2. Wenn Sie Regression Verwenden Sie dazu sigmoid oder tanh für die Nicht-Linearität der letzten Schicht und squared error als Kostenfunktion.

  3. Verwenden Sie ReLU als Nichtlienarität zwischen den Schichten.

  4. Verwenden besser Optimizern (AdamOptimizer, AdagradOptimizer) statt GradientDescentOptimizer oder Impulse für eine schnellere Konvergenz verwenden,

Verwandte Themen