Grundlegendes zu TensorBoard-Histogrammen (Gewichtshistogrammen)


120

Es ist wirklich einfach, die Skalarwerte in TensorBoard zu sehen und zu verstehen. Es ist jedoch nicht klar, wie Histogrammdiagramme zu verstehen sind.

Zum Beispiel sind sie die Histogramme meiner Netzwerkgewichte.

Geben Sie hier die Bildbeschreibung ein

(Nachdem ein Fehler dank Sunside behoben wurde) Geben Sie hier die Bildbeschreibung ein Wie lassen sich diese am besten interpretieren? Schicht 1 Gewichte sehen meistens flach aus. Was bedeutet das?

Ich habe hier den Netzwerkaufbaucode hinzugefügt.

X = tf.placeholder(tf.float32, [None, input_size], name="input_x")
x_image = tf.reshape(X, [-1, 6, 10, 1])
tf.summary.image('input', x_image, 4)

# First layer of weights
with tf.name_scope("layer1"):
    W1 = tf.get_variable("W1", shape=[input_size, hidden_layer_neurons],
                         initializer=tf.contrib.layers.xavier_initializer())
    layer1 = tf.matmul(X, W1)
    layer1_act = tf.nn.tanh(layer1)
    tf.summary.histogram("weights", W1)
    tf.summary.histogram("layer", layer1)
    tf.summary.histogram("activations", layer1_act)

# Second layer of weights
with tf.name_scope("layer2"):
    W2 = tf.get_variable("W2", shape=[hidden_layer_neurons, hidden_layer_neurons],
                         initializer=tf.contrib.layers.xavier_initializer())
    layer2 = tf.matmul(layer1_act, W2)
    layer2_act = tf.nn.tanh(layer2)
    tf.summary.histogram("weights", W2)
    tf.summary.histogram("layer", layer2)
    tf.summary.histogram("activations", layer2_act)

# Third layer of weights
with tf.name_scope("layer3"):
    W3 = tf.get_variable("W3", shape=[hidden_layer_neurons, hidden_layer_neurons],
                         initializer=tf.contrib.layers.xavier_initializer())
    layer3 = tf.matmul(layer2_act, W3)
    layer3_act = tf.nn.tanh(layer3)

    tf.summary.histogram("weights", W3)
    tf.summary.histogram("layer", layer3)
    tf.summary.histogram("activations", layer3_act)

# Fourth layer of weights
with tf.name_scope("layer4"):
    W4 = tf.get_variable("W4", shape=[hidden_layer_neurons, output_size],
                         initializer=tf.contrib.layers.xavier_initializer())
    Qpred = tf.nn.softmax(tf.matmul(layer3_act, W4)) # Bug fixed: Qpred = tf.nn.softmax(tf.matmul(layer3, W4))
    tf.summary.histogram("weights", W4)
    tf.summary.histogram("Qpred", Qpred)

# We need to define the parts of the network needed for learning a policy
Y = tf.placeholder(tf.float32, [None, output_size], name="input_y")
advantages = tf.placeholder(tf.float32, name="reward_signal")

# Loss function
# Sum (Ai*logp(yi|xi))
log_lik = -Y * tf.log(Qpred)
loss = tf.reduce_mean(tf.reduce_sum(log_lik * advantages, axis=1))
tf.summary.scalar("Q", tf.reduce_mean(Qpred))
tf.summary.scalar("Y", tf.reduce_mean(Y))
tf.summary.scalar("log_likelihood", tf.reduce_mean(log_lik))
tf.summary.scalar("loss", loss)

# Learning
train = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)

4
Mir ist gerade aufgefallen, dass Sie die Aktivierungen auf der letzten Ebene überhaupt nicht verwenden. Du hast es wahrscheinlich gemeint tf.nn.softmax(tf.matmul(layer3_act, W4)).
Sunside

@sunside Danke. Es stellt sich heraus, dass das Histogramm auch beim Debuggen sehr nützlich ist. Ich habe Bilder aktualisiert.
Sung Kim

1
@SungKim Ich verwende Ihre Implementierung als Referenz, aber wie fügen Sie die Verzerrung hinzu? So was? B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())und layer1_bias = tf.add(layer1, B1)undtf.summary.histogram("bias", layer1_bias)
Gert Kommer

1
@SungKim Wenn Sie das Protokollverzeichnis noch haben, können Sie es auf Aughie Boards hochladen ? Es wäre großartig, die Histogramme in einem interaktiven Dashboard zu sehen
Agost Biro

@SungKim würden Sie Ihren Code reparieren, indem Sie definieren, input_sizedamit wir ihn ausführen und das Ergebnis in sehen könnentensorboard
Mario

Antworten:


131

Es scheint, dass das Netzwerk in den Schichten eins bis drei nichts gelernt hat. Die letzte Ebene ändert sich, was bedeutet, dass entweder etwas mit den Verläufen nicht stimmt (wenn Sie sie manuell manipulieren). Sie beschränken das Lernen auf die letzte Ebene, indem Sie nur deren Gewichte oder die letzte Ebene wirklich optimieren. ' frisst 'alle Fehler auf. Es könnte auch sein, dass nur Vorurteile gelernt werden. Das Netzwerk scheint zwar etwas zu lernen, nutzt aber möglicherweise nicht sein volles Potenzial aus. Hier wäre mehr Kontext erforderlich, aber das Herumspielen mit der Lernrate (z. B. mit einer kleineren) könnte einen Versuch wert sein.

Im Allgemeinen zeigen Histogramme die Anzahl der Vorkommen eines Werts relativ zueinander an. Einfach ausgedrückt, wenn die möglichen Werte in einem Bereich von liegen 0..9und Sie einen Anstieg des Betrags 10auf dem Wert sehen 0, bedeutet dies, dass 10 Eingaben den Wert annehmen 0; Wenn das Histogramm dagegen ein Plateau von 1für alle Werte von zeigt 0..9, bedeutet dies, dass für 10 Eingaben jeder mögliche Wert genau einmal 0..9auftritt . Sie können auch Histogramme verwenden, um Wahrscheinlichkeitsverteilungen zu visualisieren, wenn Sie alle Histogrammwerte durch ihre Gesamtsumme normalisieren. Wenn Sie dies tun, erhalten Sie intuitiv die Wahrscheinlichkeit, mit der ein bestimmter Wert (auf der x-Achse) angezeigt wird (im Vergleich zu anderen Eingaben).

Jetzt für layer1/weightsdas Plateau bedeutet , dass:

  • Die meisten Gewichte liegen im Bereich von -0,15 bis 0,15
  • Es ist (meistens) gleich wahrscheinlich, dass ein Gewicht einen dieser Werte aufweist, dh sie sind (fast) gleichmäßig verteilt

Anders gesagt, fast die gleiche Anzahl von Gewichten hat die Werte -0.15, 0.0, 0.15und alles dazwischen. Es gibt einige Gewichte mit etwas kleineren oder höheren Werten. Kurz gesagt, dies sieht einfach so aus, als ob die Gewichte mit einer gleichmäßigen Verteilung mit einem Mittelwert von Null und einem Wertebereich initialisiert wurden -0.15..0.15... Geben oder Nehmen. Wenn Sie tatsächlich eine einheitliche Initialisierung verwenden, ist dies typisch, wenn das Netzwerk noch nicht trainiert wurde.

Im Vergleich dazu layer1/activationsbildet sich eine Glockenkurvenform (Gauß): Die Werte sind in diesem Fall um einen bestimmten Wert zentriert 0, können aber auch größer oder kleiner sein (ebenso wahrscheinlich, da sie symmetrisch sind). Die meisten Werte erscheinen nahe am Mittelwert von 0, aber die Werte reichen von -0.8bis 0.8. Ich gehe davon aus, dass das layer1/activationsals Verteilung über alle Layer-Ausgaben in einem Batch genommen wird. Sie können sehen, dass sich die Werte im Laufe der Zeit ändern.

Das Layer 4-Histogramm sagt mir nichts Bestimmtes. Aus der Form geht nur hervor, dass einige Gewichtswerte vorhanden -0.1sind 0.05und 0.25tendenziell mit einer höheren Wahrscheinlichkeit auftreten. Ein Grund könnte sein, dass verschiedene Teile jedes Neurons dort tatsächlich die gleichen Informationen aufnehmen und grundsätzlich redundant sind. Dies kann bedeuten, dass Sie tatsächlich ein kleineres Netzwerk verwenden könnten oder dass Ihr Netzwerk das Potenzial hat, mehr Unterscheidungsmerkmale zu erlernen, um eine Überanpassung zu verhindern. Dies sind jedoch nur Annahmen.

Fügen Sie außerdem, wie bereits in den Kommentaren unten angegeben, Bias-Einheiten hinzu. Wenn Sie sie weglassen, beschränken Sie Ihr Netzwerk zwangsweise auf eine möglicherweise ungültige Lösung.


5
Es kann eine sehr schlechte Idee sein , überhaupt keine Vorurteile zu haben - es ist wirklich so, als würde man versuchen, eine Linie durch eine (sehr hochdimensionale) Punktwolke zu ziehen, aber gezwungen sein, den Wert 0 zu durchlaufen. es könnte funktionieren und Ihnen eine Lösung geben, aber es besteht die Möglichkeit, dass es schlecht oder einfach falsch ist.
Sunside

1
Ich kann Ihnen leider nicht viel aus dem Histogramm sagen. (Meine Antwort wurde jedoch aktualisiert.)
Sunside

1
Es sollte jetzt wahrscheinlich etwas länger trainieren. Besonders angesichts Ihrer ersten Ergebnisse layer4/Qpredsieht es so aus, als könnte es viel besser werden. Was die Gewichte angeht, die gleich bleiben ... Ich finde das faul, aber ich kann es momentan nicht verstehen. Könnte sein, dass es wirklich die richtige Verteilung ist, aber da sich überhaupt nichts ändert, fällt es mir schwer zu glauben.
Sunside

1
@sunside Gibt es eine Methode, um die Aktualisierung der Netzwerkgewichte gegenüber den Verzerrungen zu priorisieren? Da scheinen die Vorurteile sowie die letzte Schicht den ganzen Fehler zu saugen. Ich habe ein ähnliches Problem, bei dem nur die Verzerrungen aktualisiert werden und das Gewichtshistogramm relativ unverändert bleibt.
Mamafoku

2
Keine Verzerrung zu haben ist in Ordnung, wenn die Chargennorm vor der Aktivierung verwendet wird
Tosha
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.