Comprender los histogramas de TensorBoard (peso)

120

Es realmente sencillo ver y comprender los valores escalares en TensorBoard. Sin embargo, no está claro cómo entender los gráficos de histograma.

Por ejemplo, son los histogramas de los pesos de mi red.

ingrese la descripción de la imagen aquí

(Después de corregir un error gracias a sunside) ingrese la descripción de la imagen aquí ¿Cuál es la mejor manera de interpretarlos? Los pesos de la capa 1 se ven en su mayoría planos, ¿qué significa esto?

Agregué el código de construcción de la red aquí.

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)
Sung Kim
fuente
4
Acabo de notar que no estás usando las activaciones en la última capa. Probablemente quisiste decir tf.nn.softmax(tf.matmul(layer3_act, W4)).
Sunside
@sunside Gracias. Resulta que el histograma también es muy útil para depurar. Actualicé las fotos.
Sung Kim
1
@SungKim Estoy usando su implementación como referencia, pero ¿cómo agrega el sesgo? ¿Me gusta esto? B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())y layer1_bias = tf.add(layer1, B1)etf.summary.histogram("bias", layer1_bias)
Gert Kommer
1
@SungKim, si todavía tiene el directorio de registro, ¿podría subirlo a Aughie Boards ? Sería genial ver los histogramas en un panel interactivo
Agost Biro
@SungKim, ¿podría arreglar su código definiéndolo input_sizepara que podamos ejecutarlo y ver el resultado entensorboard
Mario

Respuestas:

131

Parece que la red no ha aprendido nada en las capas uno a tres. La última capa cambia, lo que significa que puede haber algún problema con los degradados (si los está manipulando manualmente), está limitando el aprendizaje a la última capa optimizando solo sus pesos o la última capa realmente ' se come todo el error. También podría ser que solo se aprendan los sesgos. Sin embargo, la red parece aprender algo, pero es posible que no esté utilizando todo su potencial. Se necesitaría más contexto aquí, pero jugar con la tasa de aprendizaje (por ejemplo, usar una más pequeña) podría valer la pena intentarlo.

En general, los histogramas muestran el número de apariciones de un valor en relación con los demás valores. Simplemente hablando, si los valores posibles están en un rango de 0..9y ve un pico de cantidad 10en el valor 0, esto significa que 10 entradas asumen el valor 0; por el contrario, si el histograma muestra una meseta de 1para todos los valores de 0..9, significa que para 10 entradas, cada valor posible 0..9ocurre exactamente una vez. También puede usar histogramas para visualizar distribuciones de probabilidad cuando normaliza todos los valores del histograma por su suma total; si lo hace, obtendrá intuitivamente la probabilidad con la que aparecerá un determinado valor (en el eje x) (en comparación con otras entradas).

Ahora bien layer1/weights, la meseta significa que:

  • la mayoría de los pesos están en el rango de -0,15 a 0,15
  • Es (en su mayoría) igualmente probable que una ponderación tenga alguno de estos valores, es decir, están distribuidos (casi) uniformemente

Dicho de otra manera, casi el mismo número de pesos tienen los valores -0.15, 0.0, 0.15y todo lo demás. Hay algunos pesos que tienen valores ligeramente más pequeños o más altos. En resumen, esto simplemente parece que los pesos se han inicializado usando una distribución uniforme con media cero y rango de valores -0.15..0.15... más o menos. Si realmente usa la inicialización uniforme, esto es típico cuando la red aún no ha sido entrenada.

En comparación, layer1/activationsforma una forma similar a una curva de campana (gaussiana): los valores se centran alrededor de un valor específico, en este caso 0, pero también pueden ser mayores o menores que ese (igualmente probable, ya que es simétrico). La mayoría de los valores aparecen cerca de la media de 0, pero los valores varían de -0.8a 0.8. Supongo que layer1/activationsse toma como la distribución de todas las salidas de capa en un lote. Puede ver que los valores cambian con el tiempo.

El histograma de la capa 4 no me dice nada específico. De la forma, es sólo que muestra que algunos valores de peso alrededor de -0.1, 0.05y 0.25tienden a ser produce con una probabilidad más alta; una razón podría ser que diferentes partes de cada neurona recogen la misma información y son básicamente redundantes. Esto puede significar que en realidad podría usar una red más pequeña o que su red tiene el potencial de aprender más características distintivas para evitar el sobreajuste. Sin embargo, estas son solo suposiciones.

Además, como ya se indicó en los comentarios a continuación, agregue unidades de sesgo. Al omitirlos, está restringiendo enérgicamente su red a una solución posiblemente no válida.

Sunside
fuente
5
No tener ningún sesgo puede ser una muy mala idea: es realmente como tratar de trazar una línea a través de una nube de puntos (de muy alta dimensión), pero verse obligado a pasar por el valor 0; podría funcionar y le dará alguna solución, pero es probable que sea mala o simplemente incorrecta.
sunside
1
Lamentablemente, no puedo decirte mucho del histograma. (Sin embargo
actualicé
1
Probablemente debería entrenar un poco más ahora. Especialmente dados tus primeros resultados, layer4/Qpredparece que podría mejorar mucho. En cuanto a que los pesos se mantengan igual ... Me parece sospechoso, pero no puedo encontrarle sentido en este momento. Podría ser que realmente sea la distribución correcta, pero dado que no hay ningún cambio, me cuesta creerlo.
Sunside
1
@sunside ¿Existe algún método para priorizar la actualización de los pesos de la red sobre los sesgos? Como los sesgos, así como la última capa, parecen absorber todo el error. Tengo un problema similar en el que solo se actualizan los sesgos y el histograma de peso permanece relativamente sin cambios.
mamafoku
2
No tener un sesgo está bien si se usa la norma por lotes antes de la activación
Tosha