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.
(Setelah memperbaiki bug berkat sunside) 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)
tensorflow
histogram
tensorboard
Sung Kim
sumber
sumber
tf.nn.softmax(tf.matmul(layer3_act, W4))
.B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())
danlayer1_bias = tf.add(layer1, B1)
dantf.summary.histogram("bias", layer1_bias)
input_size
sehingga kami dapat menjalankannya dan melihat hasilnya ditensorboard
Jawaban:
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..9
dan Anda melihat lonjakan jumlah10
pada nilai0
, ini berarti 10 input mengasumsikan nilai0
; Sebaliknya, jika histogram menunjukkan dataran tinggi1
untuk semua nilai0..9
, berarti untuk 10 input, setiap nilai yang mungkin0..9
terjadi 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:Kata berbeda, hampir jumlah yang sama berat memiliki nilai-nilai
-0.15
,0.0
,0.15
dan 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/activations
membentuk kurva seperti lonceng (gaussian): Nilai dipusatkan di sekitar nilai tertentu, dalam kasus ini0
, tetapi mungkin juga lebih besar atau lebih kecil dari itu (kemungkinan besar sama, karena simetris). Sebagian besar nilai tampak dekat di sekitar mean0
, tetapi nilainya berkisar dari-0.8
hingga0.8
. Saya berasumsi bahwalayer1/activations
diambil 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.05
dan0.25
cenderung 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.
sumber
layer4/Qpred
sepertinya 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.