Naprawdę łatwo jest zobaczyć i zrozumieć wartości skalarne w TensorBoard. Jednak nie jest jasne, jak rozumieć wykresy histogramów.
Na przykład są to histogramy moich wag sieci.
(Po naprawieniu błędu dzięki Sunside) Jak najlepiej je zinterpretować? Obciążniki warstwy 1 wyglądają w większości na płaskie, co to oznacza?
Dodałem tutaj kod budowy sieci.
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
źródło
źródło
tf.nn.softmax(tf.matmul(layer3_act, W4))
.B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())
ilayer1_bias = tf.add(layer1, B1)
itf.summary.histogram("bias", layer1_bias)
input_size
tak, abyśmy mogli go uruchomić i zobaczyć wyniktensorboard
Odpowiedzi:
Wygląda na to, że sieć nie nauczyła się niczego w warstwach od pierwszej do trzeciej. Ostatnia warstwa się zmienia, więc oznacza to, że albo coś może być nie tak z gradientami (jeśli manipulujesz nimi ręcznie), ograniczasz naukę do ostatniej warstwy, optymalizując tylko jej wagi lub naprawdę ostatnią warstwę. zjada wszystkie błędy. Może się również zdarzyć, że uczy się tylko uprzedzeń. Wydaje się, że sieć czegoś się uczy, ale może nie wykorzystywać swojego pełnego potencjału. Potrzebny byłby tutaj szerszy kontekst, ale warto spróbować wykorzystać współczynnik uczenia się (np. Używając mniejszego).
Ogólnie histogramy pokazują liczbę wystąpień wartości względem siebie nawzajem. Mówiąc najprościej, jeśli możliwe wartości mieszczą się w zakresie
0..9
i widzisz skokowy wzrost10
wartości0
, oznacza to, że 10 danych wejściowych przyjmuje wartość0
; Natomiast jeśli histogram pokazuje plateau1
dla wszystkich wartości0..9
, oznacza to, że dla 10 wejść każda możliwa wartość0..9
występuje dokładnie raz. Możesz także użyć histogramów do wizualizacji rozkładów prawdopodobieństwa, gdy normalizujesz wszystkie wartości histogramów według ich całkowitej sumy; jeśli to zrobisz, intuicyjnie uzyskasz prawdopodobieństwo, z jakim pojawi się określona wartość (na osi x) (w porównaniu z innymi danymi wejściowymi).Teraz
layer1/weights
płaskowyż oznacza, że:Powiedział inaczej, prawie taką samą liczbę ciężarków mają znaczenia
-0.15
,0.0
,0.15
i wszystko pomiędzy. Niektóre wagi mają nieco mniejsze lub wyższe wartości. Krótko mówiąc, wygląda to tak, jakby wagi zostały zainicjowane przy użyciu jednolitego rozkładu z zerową średnią i zakresem wartości-0.15..0.15
... dawaj lub bierz. Jeśli rzeczywiście używasz jednolitej inicjalizacji, jest to typowe, gdy sieć nie została jeszcze przeszkolona.Dla porównania,
layer1/activations
tworzy krzywą dzwonową (gaussa): w tym przypadku wartości są wyśrodkowane wokół określonej wartości0
, ale mogą być również większe lub mniejsze (równie prawdopodobne, ponieważ są symetryczne). Większość wartości jest zbliżona do średniej wartości0
, ale wartości mieszczą się w zakresie od-0.8
do0.8
. Zakładam, żelayer1/activations
jest to rozkład na wszystkie wyjścia warstwy w partii. Widać, że wartości zmieniają się w czasie.Histogram warstwy 4 nie mówi mi nic konkretnego. Od kształtu, to tylko pokazuje, że niektóre wartości wagi wokół
-0.1
,0.05
i0.25
wydają się być występować z większym prawdopodobieństwem; powodem może być to, że różne części każdego neuronu w rzeczywistości pobierają te same informacje i są w zasadzie zbędne. Może to oznaczać, że możesz faktycznie korzystać z mniejszej sieci lub że Twoja sieć ma potencjał uczenia się większej liczby wyróżniających cech, aby zapobiec nadmiernemu dopasowaniu. To jednak tylko przypuszczenia.Ponadto, jak już stwierdzono w komentarzach poniżej, należy dodać jednostki odchylenia. Pomijając je, na siłę ograniczasz swoją sieć do potencjalnie nieprawidłowego rozwiązania.
źródło
layer4/Qpred
wygląda na to, że może być znacznie lepiej. Jeśli chodzi o obciążenia, które pozostają takie same ... Uważam, że to podejrzane, ale nie mogę teraz tego zrozumieć. Możliwe, że to naprawdę jest poprawna dystrybucja, ale biorąc pod uwagę, że nie ma żadnej zmiany, trudno mi w to uwierzyć.