Розуміння гістограм TensorBoard (вага)


120

Побачити і зрозуміти скалярні значення в TensorBoard дуже просто. Однак не зрозуміло, як зрозуміти графіки гістограми.

Наприклад, це гістограми моєї мережевої ваги.

введіть тут опис зображення

(Після виправлення помилки завдяки sunside) введіть тут опис зображення Який найкращий спосіб їх інтерпретувати? Ваги першого рівня виглядають переважно плоскими, що це означає?

Я додав сюди код побудови мережі.

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)

4
Я щойно помітив, що ви зовсім не використовуєте активації на останньому шарі. Ви , ймовірно , мав в виду tf.nn.softmax(tf.matmul(layer3_act, W4)).
захід

@sunside Дякую Виявляється, гістограма дуже корисна і для налагодження. Я оновив фотографії.
Співав Кім

1
@SungKim Я використовую вашу реалізацію як орієнтир, але як ви додаєте упередженість? Подобається це? B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())і layer1_bias = tf.add(layer1, B1)таtf.summary.histogram("bias", layer1_bias)
Герт Комер

1
@SungKim, якщо у вас все ще є каталог журналів, ви можете завантажити його до Дошки Aughie ? Було б чудово побачити гістограми на інтерактивній інформаційній панелі
Agost Biro

@SungKim ви б виправили свій код, визначившись, input_sizeщоб ми могли його запустити і побачити результат уtensorboard
Маріо

Відповіді:


131

Здається, що мережа нічого не вивчила в шарах один-три. Останній шар змінюється, тож це означає, що з градієнтами може бути щось не так (якщо ви вручаєте їх вручну), ви обмежуєте навчання останнім шаром, оптимізуючи лише його ваги або дійсно останній шар " з'їдає всі помилки. Також може бути, що вивчаються лише упередження. Здається, мережа дізнається щось, але, можливо, не використовує свого повного потенціалу. Тут потрібно більше контексту, але, можливо, варто пограти зі швидкістю навчання (наприклад, використовувати менший).

Загалом, гістограми відображають кількість зустрічань значення у відношенні один до одного значень. Простіше кажучи, якщо можливі значення знаходяться в діапазоні 0..9і 10на значенні ви бачите шип суми 0, це означає, що 10 входів приймають значення 0; на відміну від цього, якщо гістограма показує плато 1для всіх значень 0..9, це означає, що для 10 входів кожне можливе значення 0..9виникає рівно один раз. Ви також можете використовувати гістограми для візуалізації розподілу ймовірностей, коли ви нормалізуєте всі значення гістограми на їх загальну суму; якщо ви це зробите, ви інтуїтивно отримаєте ймовірність появи певного значення (на осі х) (порівняно з іншими входами).

Тепер для layer1/weightsплато означає, що:

  • більшість ваг знаходяться в діапазоні від -0,15 до 0,15
  • (здебільшого) однаково ймовірно, що вага може мати будь-яке з цих значень, тобто вони (майже) рівномірно розподілені

Інакше кажучи, майже така ж кількість ваг має значення -0.15, 0.0, 0.15і все між ними. Деякі ваги мають трохи менші або більші значення. Отже, коротше, це просто виглядає так, що ваги були ініціалізовані за допомогою рівномірного розподілу з нульовою середньою та діапазонною величиною -0.15..0.15... подати або взяти. Якщо ви дійсно використовуєте рівномірну ініціалізацію, то це характерно, коли мережа ще не була навчена.

Для порівняння, layer1/activationsформує криву дзвіночку (гауссова) -подібна форма: значення в цьому випадку орієнтовані на певне значення 0, але вони також можуть бути більшими або меншими, ніж це (однаково ймовірно, оскільки це симетрично). Більшість значень виявляються близькими до середнього значення 0, але значення варіюються від -0.8до 0.8. Я припускаю, що значення layer1/activationsприймається як розподіл по всіх виводах шару в партії. Ви можете бачити, що значення з часом змінюються.

Гістограма шару 4 не говорить мені нічого конкретного. З форми, це просто показує, що деякі значення ваги навколо -0.1, 0.05і, 0.25як правило, відбуваються з більшою ймовірністю; Причиною може бути те, що різні частини кожного нейрона насправді набирають однакову інформацію і в основному є зайвою. Це може означати, що ви насправді можете використовувати меншу мережу або що ваша мережа має потенціал, щоб дізнатися більше відмінних функцій, щоб уникнути перевиконання. Це лише припущення.

Крім того, як уже було сказано в коментарях нижче, додайте одиниці зміщення. Залишаючи їх поза межами, ви насильно обмежуєте свою мережу можливим недійсним рішенням.


5
Відсутність упередженості взагалі може бути дуже поганою ідеєю - це насправді так, як намагатися провести лінію через (дуже високу) хмару точок, але бути змушеним пройти через значення 0; це може спрацювати і дасть вам певне рішення, але ймовірно, що це поганий або просто неправильний.
захід

1
Я не можу вам сказати багато з гістограми. (Оновлено мою відповідь, хоча.)
неділя

1
Зараз, мабуть, варто тренуватися трохи довше. Особливо, враховуючи ваші перші результати, layer4/Qpredсхоже, що це може стати набагато кращим. Щодо ваг, що залишаються однаковими ... Я вважаю це рибним, але зараз не можу зрозуміти це. Можливо, це насправді правильний розподіл, але враховуючи, що змін взагалі немає, мені важко повірити.
захід

1
@sunside Чи існує який-небудь метод для визначення пріоритетності оновлення мережевих ваг над ухилами? Оскільки упередження та останній шар, здається, висмоктують всю помилку. У мене є аналогічна проблема, коли оновлюються лише зміщення, а гістограма ваги залишається відносно незмінною.
mamafoku

2
Не мати упередженості нормально, якщо використовувати пакетну норму перед активацією
Tosha
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.