web-dev-qa-db-fra.com

Comprendre les histogrammes TensorBoard (poids)

Il est très simple de voir et de comprendre les valeurs scalaires dans TensorBoard. Cependant, la compréhension des graphiques d'histogramme n'est pas claire.

Par exemple, ce sont les histogrammes des pondérations de mon réseau.

enter image description here

(Après avoir corrigé un bug grâce à sunside) enter image description here Quelle est la meilleure façon d’interpréter cela? Les poids de la couche 1 sont généralement plats, qu'est-ce que cela signifie?

J'ai ajouté le code de construction du réseau ici.

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)
92
Sung Kim

Il semble que le réseau n’ait rien appris dans les couches un à trois. La dernière couche change, ce qui signifie que l'un ou l'autre peut être erroné avec les dégradés (si vous les manipulez manuellement), vous contraignez l'apprentissage à la dernière couche en optimisant uniquement ses poids ou la dernière couche. ' mange toutes les erreurs. Il se pourrait aussi que seuls les préjugés soient appris. Le réseau semble apprendre quelque chose, mais il n’exploitera peut-être pas tout son potentiel. Il faudrait plus de contexte ici, mais jouer avec le taux d’apprentissage (par exemple, en utilisant un plus petit) pourrait valoir le coup.

En général, les histogrammes affichent le nombre d'occurrences d'une valeur par rapport à d'autres valeurs. En termes simples, si les valeurs possibles se situent dans une plage de 0..9 et que vous voyez un pic de 10 sur la valeur 0, cela signifie que 10 entrées prennent la valeur 0; en revanche, si l'histogramme indique un plateau de 1 pour toutes les valeurs de 0..9, cela signifie que pour 10 entrées, chaque valeur possible 0..9 apparaît exactement une fois. Vous pouvez également utiliser des histogrammes pour visualiser les distributions de probabilité lorsque vous normalisez toutes les valeurs de l'histogramme en fonction de leur somme totale. Si vous faites cela, vous obtiendrez intuitivement la probabilité avec laquelle une certaine valeur (sur l'axe des x) apparaîtra (par rapport à d'autres entrées).

Maintenant, pour layer1/weights, le plateau signifie que:

  • la plupart des poids vont de -0,15 à 0,15
  • il est (généralement) également probable qu'un poids ait l'une ou l'autre de ces valeurs, c'est-à-dire qu'ils sont (presque) uniformément répartis

Autrement dit, presque le même nombre de poids a les valeurs -0.15, 0.0, 0.15 et tout le reste. Certains poids ont des valeurs légèrement inférieures ou supérieures. En bref, cela donne simplement l’impression que les pondérations ont été initialisées à l’aide d’une distribution uniforme avec une moyenne et une plage de valeurs nulles -0.15..0.15 ... à un moment ou à un autre. Si vous utilisez effectivement une initialisation uniforme, cela est typique lorsque le réseau n’a pas encore été formé.

En comparaison, layer1/activations forme une forme semblable à une courbe en cloche (gaussienne): les valeurs sont centrées autour d'une valeur spécifique, dans ce cas 0, mais elles peuvent également être plus grandes ou plus petites que cela (tout aussi vraisemblable, car elles sont symétriques). La plupart des valeurs apparaissent proches de la moyenne de 0, mais elles vont de -0.8 à 0.8. Je suppose que le layer1/activations est pris comme distribution sur toutes les sorties de couche d'un lot. Vous pouvez voir que les valeurs changent avec le temps.

L'histogramme de la couche 4 ne me dit rien de spécifique. A partir de la forme, il montre simplement que certaines valeurs de poids autour de -0.1, 0.05 et 0.25 ont tendance à se produire avec une probabilité plus élevée; une raison pourrait être, que différentes parties de chaque neurone y récupèrent la même information et sont fondamentalement redondantes. Cela peut signifier que vous pouvez utiliser un réseau plus petit ou que votre réseau a le potentiel d’apprendre davantage de caractéristiques distinctives afin d’éviter les surajustements. Ce ne sont que des hypothèses cependant.

En outre, comme déjà indiqué dans les commentaires ci-dessous, ajoutez des unités de biais. En les omettant, vous contraignez avec force votre réseau à une solution éventuellement non valide.

111
sunside