Memahami histogram TensorBoard (bobot)

120

Sangat mudah untuk melihat dan memahami nilai skalar di TensorBoard. Namun, tidak jelas bagaimana memahami grafik histogram.

Misalnya, mereka adalah histogram dari bobot jaringan saya.

masukkan deskripsi gambar di sini

(Setelah memperbaiki bug berkat sunside) masukkan deskripsi gambar di sini Apa cara terbaik untuk menafsirkannya? Anak timbangan lapisan 1 sebagian besar terlihat datar, apa artinya ini?

Saya menambahkan kode konstruksi jaringan di sini.

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)
Sung Kim
sumber
4
Saya baru saja memperhatikan bahwa Anda tidak menggunakan aktivasi sama sekali di lapisan terakhir. Anda mungkin bermaksud tf.nn.softmax(tf.matmul(layer3_act, W4)).
sisi matahari
@ Terima kasih. Ternyata histogram juga sangat berguna untuk debugging. Saya memperbarui foto.
Sung Kim
1
@SungKim Saya menggunakan implementasi Anda sebagai referensi, tetapi bagaimana Anda menambahkan bias? Seperti ini? B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())dan layer1_bias = tf.add(layer1, B1)dantf.summary.histogram("bias", layer1_bias)
Gert Kommer
1
@SungKim jika Anda masih memiliki direktori log, dapatkah Anda mengunggahnya ke Aughie Boards ? Sangat menyenangkan melihat histogram di dasbor interaktif
Agost Biro
@SungKim maukah Anda memperbaiki kode Anda dengan menentukan input_sizesehingga kami dapat menjalankannya dan melihat hasilnya ditensorboard
Mario

Jawaban:

131

Tampaknya jaringan belum mempelajari apa pun di lapisan satu hingga tiga. Lapisan terakhir memang berubah, jadi itu berarti mungkin ada sesuatu yang salah dengan gradien (jika Anda merusaknya secara manual), Anda membatasi pembelajaran ke lapisan terakhir dengan hanya mengoptimalkan bobotnya atau lapisan terakhir benar-benar ' memakan 'semua kesalahan. Bisa juga hanya bias yang dipelajari. Jaringan tampaknya mempelajari sesuatu, tetapi mungkin tidak menggunakan potensi penuhnya. Lebih banyak konteks akan dibutuhkan di sini, tetapi bermain-main dengan kecepatan pembelajaran (misalnya menggunakan yang lebih kecil) mungkin layak dicoba.

Secara umum, histogram menampilkan jumlah kemunculan suatu nilai relatif satu sama lain. Sederhananya, jika nilai yang mungkin berada dalam kisaran 0..9dan Anda melihat lonjakan jumlah 10pada nilai 0, ini berarti 10 input mengasumsikan nilai 0; Sebaliknya, jika histogram menunjukkan dataran tinggi 1untuk semua nilai 0..9, berarti untuk 10 input, setiap nilai yang mungkin 0..9terjadi tepat satu kali. Anda juga dapat menggunakan histogram untuk memvisualisasikan distribusi probabilitas saat Anda menormalkan semua nilai histogram dengan jumlah totalnya; jika Anda melakukan itu, Anda akan secara intuitif mendapatkan kemungkinan nilai tertentu (pada sumbu x) akan muncul (dibandingkan dengan input lain).

Sekarang layer1/weights, dataran tinggi berarti:

  • sebagian besar bobot berada di kisaran -0,15 hingga 0,15
  • itu (sebagian besar) sama mungkinnya untuk bobot memiliki salah satu dari nilai-nilai ini, yaitu mereka (hampir) terdistribusi secara seragam

Kata berbeda, hampir jumlah yang sama berat memiliki nilai-nilai -0.15, 0.0, 0.15dan segala sesuatu di antaranya. Ada beberapa bobot yang nilainya sedikit lebih kecil atau lebih tinggi. Jadi singkatnya, ini hanya terlihat seperti bobot telah diinisialisasi menggunakan distribusi seragam dengan rata-rata nol dan rentang nilai -0.15..0.15... memberi atau menerima. Jika Anda memang menggunakan inisialisasi seragam, ini biasanya terjadi ketika jaringan belum dilatih.

Sebagai perbandingan, layer1/activationsmembentuk kurva seperti lonceng (gaussian): Nilai dipusatkan di sekitar nilai tertentu, dalam kasus ini 0, tetapi mungkin juga lebih besar atau lebih kecil dari itu (kemungkinan besar sama, karena simetris). Sebagian besar nilai tampak dekat di sekitar mean 0, tetapi nilainya berkisar dari -0.8hingga 0.8. Saya berasumsi bahwa layer1/activationsdiambil sebagai distribusi atas semua output lapisan dalam satu batch. Anda dapat melihat bahwa nilainya berubah seiring waktu.

Histogram layer 4 tidak memberi tahu saya sesuatu yang spesifik. Dari bentuknya, hanya terlihat beberapa nilai bobot disekitarnya -0.1, 0.05dan 0.25cenderung terjadi dengan probabilitas yang lebih tinggi; alasan bisa menjadi, bahwa bagian-bagian yang berbeda dari setiap neuron ada sebenarnya mengambil informasi yang sama dan pada dasarnya berlebihan. Ini dapat berarti bahwa Anda sebenarnya dapat menggunakan jaringan yang lebih kecil atau bahwa jaringan Anda berpotensi mempelajari lebih banyak fitur yang membedakan untuk mencegah overfitting. Ini hanyalah asumsi.

Juga, seperti yang telah dinyatakan dalam komentar di bawah, tambahkan unit bias. Dengan membiarkannya, Anda secara paksa membatasi jaringan Anda ke solusi yang mungkin tidak valid.

sisi matahari
sumber
5
Tidak memiliki bias sama sekali bisa menjadi ide yang sangat buruk - ini benar-benar seperti mencoba menggambar garis melalui titik awan (sangat berdimensi tinggi), tetapi dipaksa untuk melewati nilai 0; ini mungkin berhasil, dan akan memberi Anda beberapa solusi, tetapi kemungkinan itu adalah solusi yang buruk atau salah.
sisi matahari
1
Saya tidak bisa memberi tahu Anda banyak dari histogram dengan sedih. (Memperbarui jawaban saya.)
sisi matahari
1
Mungkin harus berlatih lebih lama sekarang. Terutama mengingat hasil pertama Anda, layer4/Qpredsepertinya ini bisa menjadi jauh lebih baik. Adapun bobotnya tetap sama ... Menurutku itu mencurigakan, tapi aku tidak bisa memahaminya sekarang. Bisa jadi memang distribusinya benar, tapi mengingat tidak ada perubahan sama sekali, saya sulit percaya.
sisi matahari
1
@ Sunside adakah metode untuk memprioritaskan pembaruan bobot jaringan daripada bias? Karena bias serta lapisan terakhir tampaknya menyedot semua kesalahan. Saya mengalami masalah serupa di mana hanya bias yang diperbarui, dan histogram bobot relatif tidak berubah.
mamafoku
2
Tidak memiliki bias tidak masalah jika menggunakan norma batch sebelum aktivasi
Tosha