TensorBoard (ağırlık) histogramlarını anlama


120

TensorBoard'da skaler değerleri görmek ve anlamak gerçekten çok kolay. Bununla birlikte, histogram grafiklerinin nasıl anlaşılacağı açık değildir.

Örneğin, ağ ağırlıklarımın histogramlarıdır.

görüntü açıklamasını buraya girin

(Güneş yanığı sayesinde bir hatayı düzelttikten sonra) görüntü açıklamasını buraya girin Bunları yorumlamanın en iyi yolu nedir? Katman 1 ağırlıkları çoğunlukla düz görünür, bu ne anlama geliyor?

Ağ yapım kodunu buraya ekledim.

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
Son katmanda aktivasyonları hiç kullanmadığınızı fark ettim. Muhtemelen demek istedin tf.nn.softmax(tf.matmul(layer3_act, W4)).
sunside

@sunside Teşekkürler. Görünüşe göre histogram da hata ayıklama için çok kullanışlı. Resimleri güncelledim.
Sung Kim

1
@SungKim Uygulamanızı referans olarak kullanıyorum ama önyargıyı nasıl eklersiniz? Bunun gibi? B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())ve layer1_bias = tf.add(layer1, B1)vetf.summary.histogram("bias", layer1_bias)
Gert Kommer

1
@SungKim hala günlük dizininiz varsa, onu Aughie Panolarına yükleyebilir misiniz ? Histogramları interaktif bir gösterge panosunda görmek harika olurdu
Agost Biro

@SungKim, kodunuzu input_sizeçalıştırıp sonucu görebilmemiz için tanımlayarak düzeltir miydiniztensorboard
Mario

Yanıtlar:


131

Görünüşe göre ağ, birden üçe kadar katmanlarda hiçbir şey öğrenmemiş. Son katman değişiyor, bu da degradelerde bir sorun olabileceği anlamına geliyor (manuel olarak kurcalıyorsanız), yalnızca ağırlıklarını veya son katmanı optimize ederek öğrenmeyi son katmanla sınırlandırıyorsunuz. ' tüm hatayı yiyor. Sadece önyargılar öğrenilmiş de olabilir. Ağ yine de bir şeyler öğreniyor gibi görünüyor, ancak potansiyelini tam olarak kullanmıyor olabilir. Burada daha fazla bağlama ihtiyaç duyulacaktır, ancak öğrenme oranıyla oynamak (örneğin daha küçük olanı kullanmak) denemeye değer olabilir.

Genel olarak, histogramlar, bir değerin birbirine göre gerçekleşme sayısını görüntüler. Olası değerler aralığında ise Basitçe, konuşma 0..9ve miktarın artış görüyor 10değerine 010 girişler değerini varsayalım ki bu araçlar 0; tersine, histogram 1tüm değerleri için bir plato gösteriyorsa 0..9, bu 10 giriş için her olası değerin tam olarak bir kez 0..9oluştuğu anlamına gelir . Tüm histogram değerlerini toplam toplamlarına göre normalleştirdiğinizde olasılık dağılımlarını görselleştirmek için histogramları da kullanabilirsiniz; bunu yaparsanız, sezgisel olarak belirli bir değerin (x ekseninde) görünme olasılığını elde edersiniz (diğer girdilere kıyasla).

Şimdi layer1/weights, plato şu anlama gelir:

  • ağırlıkların çoğu -0.15 ile 0.15 arasındadır.
  • bir ağırlığın bu değerlerden herhangi birine sahip olması (çoğunlukla) eşit derecede olasıdır, yani (neredeyse) tekdüze olarak dağıtılmışlardır

Başka türlü ifade edilirse, ağırlık ile hemen hemen aynı sayıda değerleri vardır -0.15, 0.0, 0.15arasında ve her. Biraz daha küçük veya daha yüksek değerlere sahip bazı ağırlıklar vardır. Kısacası, bu basitçe, ağırlıkların sıfır ortalama ve değer aralığı ile tekdüze bir dağılım kullanılarak başlatılmış gibi görünüyor -0.15..0.15... ver veya al. Gerçekten tek tip başlatma kullanıyorsanız, ağ henüz eğitilmediğinde bu normaldir.

Buna karşılık, layer1/activationsçan eğrisi (gauss) benzeri bir şekil oluşturur: Değerler, bu durumda belirli bir değer etrafında ortalanır 0, ancak bundan daha büyük veya daha küçük de olabilir (simetrik olduğu için eşit derecede büyük olasılıkla). Çoğu değerleri yakın ortalama etrafında görünür 0, ancak değerler gelen dizi yapmak -0.8için 0.8. layer1/activationsBir toplu işteki tüm katman çıktılarının dağıtım olarak alındığını varsayıyorum . Değerlerin zamanla değiştiğini görebilirsiniz.

4. katman histogramı bana özel bir şey söylemiyor. Şekil itibaren, sadece bazı ağırlık etrafında değer verdiğini gösteriyor -0.1, 0.05ve 0.25daha yüksek bir olasılıkla cereyan olma eğilimindedir; Bir nedeni olabilir her nöronun farklı bölümler var aslında aynı bilgiyi almak ve temelde gereksiz olduğunu, ol. Bu, gerçekte daha küçük bir ağ kullanabileceğiniz veya aşırı uyumu önlemek için ağınızın daha ayırt edici özellikler öğrenme potansiyeline sahip olduğu anlamına gelebilir. Bunlar sadece varsayımlar.

Ayrıca, aşağıdaki yorumlarda belirtildiği gibi, önyargı birimleri ekleyin. Bunları dışarıda bırakarak, ağınızı muhtemelen geçersiz bir çözüme zorla sınırlamış olursunuz.


5
Hiç bir önyargıya sahip olmamak çok kötü bir fikir olabilir - bu gerçekten bir nokta bulutu (ver yüksek boyutlu) üzerinden bir çizgi çizmeye çalışmak gibi, ama 0 değerini geçmeye zorlanmak; işe yarayabilir ve size bir çözüm sunabilir, ancak kötü ya da basitçe yanlış olma ihtimali vardır.
sunside

1
Histogramdan ne yazık ki size pek bir şey söyleyemem. (Cevabım yine de güncellendi.)
sunside

1
Muhtemelen şimdi biraz daha uzun antrenman yapmalı. Özellikle ilk sonuçlarınız göz önüne alındığında, layer4/Qpredçok daha iyi olabilir gibi görünüyor. Ağırlıkların aynı kalmasına gelince ... Bunu balık gibi buluyorum, ama şu anda bir anlam veremiyorum. Gerçekten doğru dağılım olabilir, ancak hiçbir değişiklik olmadığı göz önüne alındığında, buna inanmakta zorlanıyorum.
sunside

1
@sunside, önyargılar yerine ağ ağırlıklarını güncellemeye öncelik vermenin herhangi bir yöntemi var mı? Önyargılar ve son katman tüm hatayı emiyor gibi görünüyor. Sadece önyargıların güncellendiği ve ağırlık histogramının nispeten değişmeden kaldığı benzer bir sorun yaşıyorum.
mamafoku

2
Etkinleştirmeden önce toplu norm kullanıyorsanız önyargıya sahip olmamak sorun değil
Tosha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.