Zrozumienie histogramów Tensorowych (wagowych)

Jest bardzo proste, aby zobaczyć i zrozumieć wartości skalarne w TensorBoard. Jednak nie jest jasne, jak zrozumieć wykresy histogramu.

Na przykład, są histogramami moich wag sieciowych.

Tutaj wpisz opis obrazka

(po naprawieniu błędu dzięki sunside) Tutaj wpisz opis obrazka Jak najlepiej je interpretować? Wagi warstwy 1 wyglądają przeważnie płasko, 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)
Author: Sung Kim, 2017-02-18

1 answers

Wygląda na to, że sieć nie nauczyła się niczego w warstwach od 1 do 3. Ostatnia warstwa zmienia się, więc oznacza to, że może być coś nie tak z gradientami( jeśli manipulujesz nimi ręcznie), ograniczasz naukę do ostatniej warstwy, optymalizując tylko jej wagę lub ostatnia warstwa naprawdę "zjada" wszystkie błędy. Możliwe też, że uczą się tylko uprzedzeń. Wydaje się, że sieć czegoś się nauczy, ale może nie wykorzystywać swojego pełnego potencjału. Potrzebny byłby tu więcej kontekstu, ale warto spróbować poeksperymentować z szybkością uczenia się (np. używając mniejszego).

Ogólnie, histogramy wyświetlają liczbę wystąpień wartości względem siebie wartości. Mówiąc najprościej, jeśli Możliwe wartości mieszczą się w zakresie 0..9 i widzisz skok kwoty 10 na wartości 0, oznacza to, że 10 wejść przyjmuje wartość 0; natomiast jeśli histogram pokazuje Płaskowyż 1 dla wszystkich wartości 0..9, oznacza to, że że dla 10 wejść każda możliwa wartość 0..9 występuje dokładnie raz. Możesz również użyć histogramów do wizualizacji rozkładów prawdopodobieństwa, gdy znormalizujesz wszystkie wartości histogramu według ich całkowitej sumy; jeśli to zrobisz, intuicyjnie uzyskasz Prawdopodobieństwo, z którym pojawi się określona wartość (na osi x) (w porównaniu do innych danych wejściowych).

Teraz dla layer1/weights, Płaskowyż oznacza, że:

  • większość wag mieści się w zakresie od -0,15 do 0,15
  • jest (głównie) podobnie prawdopodobne, że waga ma którąkolwiek z tych wartości, tj. są one (prawie) równomiernie rozłożone

Mówiąc inaczej, prawie ta sama liczba wag ma wartości -0.15, 0.0, 0.15 i wszystko pomiędzy. Istnieje kilka wag o nieco mniejszych lub wyższych wartościach. Tak w skrócie, to po prostu wygląda na to, że Wagi zostały zainicjalizowane przy użyciu jednolitego rozkładu z zerowym średnim i przedziale wartości -0.15..0.15... mniej więcej. Jeśli rzeczywiście używasz uniform inicjalizacja, to jest to typowe, gdy sieć nie została jeszcze przeszkolona.

Dla porównania, layer1/activations tworzy kształt podobny do krzywej dzwonka (Gaussa): wartości są wyśrodkowane wokół określonej wartości, w tym przypadku 0, ale mogą być również większe lub mniejsze (równie prawdopodobne, ponieważ jest symetryczne). Większość wartości pojawia się blisko średniej 0, ale wartości wahają się od -0.8 do 0.8. Zakładam, że {[12] } jest traktowany jako rozkład na wszystkich wyjściach warstwy w Nr serii. Widać, że wartości zmieniają się w czasie.

Histogram warstwy 4 nie mówi mi nic konkretnego. Z kształtu, to tylko pokazuje, że niektóre wartości wagi wokół -0.1, 0.05 i 0.25 wydają się występować z większym prawdopodobieństwem; powodem Może być to, że różne części każdego neuronu odbierają te same informacje i są w zasadzie zbędne. Może to oznaczać, że w rzeczywistości możesz użyć mniejszej sieci lub że Twoja sieć ma możliwość zapoznania się z bardziej wyróżniającymi się cechami, aby zapobiec nadmiernemu dopasowaniu. To tylko założenia.

Również, jak już wspomniano w komentarzach poniżej, Dodaj Jednostki bias. Pomijając je, zdecydowanie ograniczasz swoją sieć do potencjalnie nieprawidłowego rozwiązania.

 77
Author: sunside,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-18 22:28:52