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.
(Después de corregir un error gracias a sunside) ¿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)
tensorflow
histogram
tensorboard
Sung Kim
fuente
fuente
tf.nn.softmax(tf.matmul(layer3_act, W4))
.B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())
ylayer1_bias = tf.add(layer1, B1)
etf.summary.histogram("bias", layer1_bias)
input_size
para que podamos ejecutarlo y ver el resultado entensorboard
Respuestas:
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..9
y ve un pico de cantidad10
en el valor0
, esto significa que 10 entradas asumen el valor0
; por el contrario, si el histograma muestra una meseta de1
para todos los valores de0..9
, significa que para 10 entradas, cada valor posible0..9
ocurre 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:Dicho de otra manera, casi el mismo número de pesos tienen los valores
-0.15
,0.0
,0.15
y 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/activations
forma una forma similar a una curva de campana (gaussiana): los valores se centran alrededor de un valor específico, en este caso0
, 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 de0
, pero los valores varían de-0.8
a0.8
. Supongo quelayer1/activations
se 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.05
y0.25
tienden 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.
fuente
layer4/Qpred
parece 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.