Понимание тензорных (весовых) гистограмм
это действительно просто увидеть и понять скалярные значения в тензорной панели. Однако, неясно, как понимать графики, гистограммы.
например, это гистограммы моих весов сети.
(после исправления ошибки благодаря sunside) Каков наилучший способ их интерпретировать? Весы слоя 1 выглядят в основном плоскими, что это значит?
Я добавил код построения сети здесь.
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)
1 ответ:
похоже, что сеть ничего не узнала в слоях один-три. Последний слой действительно меняется, так что это означает, что либо может быть что-то не так с градиентами (если вы вмешиваетесь в них вручную), вы ограничиваете обучение до последнего слоя, оптимизируя только его веса, или последний слой действительно "съедает" всю ошибку. Возможно также, что изучаются только предубеждения. Сеть, похоже, чему-то учится, но она может не использовать свой полный потенциал. Здесь потребуется больше контекста, но играть со скоростью обучения (например, используя меньший), возможно, стоит попробовать.
в общем случае гистограммы отображают количество вхождений значения относительно друг друга значений. Проще говоря, если возможные значения находятся в диапазоне
0..9
и вы видите всплеск количества10
по стоимости0
, это означает, что 10 входов считать значение0
; напротив, если гистограмма показывает плато1
для всех значения0..9
, Это означает, что для 10 входов, каждое возможное значение0..9
происходит ровно раз. Вы также можете использовать гистограммы для визуализации распределения вероятностей, когда вы нормализуете все значения гистограммы по их общей сумме; если вы это сделаете, вы интуитивно получите вероятность, с которой появится определенное значение (по оси x) (по сравнению с другими входными данными).теперь
layer1/weights
, плато означает, что:
- большинство Весов в диапазоне от -0.15 до 0,15
- это (в основном), одинаково вероятно, для веса, чтобы иметь любое из этих значений, т. е. (почти) равномерно распределенной
сказал по-другому, почти такое же количество веса имеют значения
-0.15
,0.0
,0.15
и все между ними. Есть некоторые веса, имеющие несколько меньшие или более высокие значения. Короче говоря, это просто выглядит так, как будто веса были инициализированы с использованием равномерного распределения с нулевым средним и диапазон значений-0.15..0.15
... плюс-минус. Если вы действительно используете равномерную инициализацию, то это типично, когда сеть еще не обучена.по сравнению с
layer1/activations
образует колоколообразную (гауссовскую) форму: значения центрируются вокруг определенного значения, в этом случае0
, но они также могут быть больше или меньше, чем это (одинаково вероятно, так как это симметрично). Большинство значений отображаются близко к среднему значению0
, но значения варьируются от-0.8
to0.8
. Я предполагаю, чтоlayer1/activations
принимается как распределение по всем выходам слоя в пакете. Вы можете видеть, что значения меняются с течением времени.гистограмма слоя 4 не говорит мне ничего конкретного. От формы, это просто показывает, что некоторые значения веса вокруг
-0.1
,0.05
и0.25
как правило, происходят с большей вероятностью; причина может быть, что различные части каждого нейрона там на самом деле забрать ту же информацию и являются в основном избыточные. Это может означать, что вы действительно можете использовать меньшую сеть или что ваша сеть имеет потенциал, чтобы узнать больше отличительных особенностей, чтобы предотвратить переоборудование. Однако это всего лишь предположения.кроме того, как уже говорилось в комментариях ниже, добавьте единицы смещения. Оставляя их, вы принудительно ограничиваете свою сеть возможным недопустимым решением.