Comprensione degli istogrammi TensorBoard (peso)


120

È davvero semplice vedere e comprendere i valori scalari in TensorBoard. Tuttavia, non è chiaro come interpretare i grafici degli istogrammi.

Ad esempio, sono gli istogrammi dei miei pesi di rete.

inserisci qui la descrizione dell'immagine

(Dopo aver corretto un bug grazie a sunside) inserisci qui la descrizione dell'immagine Qual è il modo migliore per interpretarli? I pesi dello strato 1 sembrano per lo più piatti, cosa significa?

Ho aggiunto qui il codice di costruzione della rete.

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
Ho appena notato che non stai utilizzando affatto le attivazioni sull'ultimo livello. Probabilmente intendevi tf.nn.softmax(tf.matmul(layer3_act, W4)).
sunside

@sunside Thanks. Si scopre che l'istogramma è molto utile anche per il debug. Ho aggiornato le foto.
Sung Kim

1
@SungKim Sto usando la tua implementazione come riferimento, ma come aggiungi il bias? Come questo? B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())ed layer1_bias = tf.add(layer1, B1)etf.summary.histogram("bias", layer1_bias)
Gert Kommer

1
@SungKim se hai ancora la directory dei log, potresti caricarla su Aughie Boards ? Sarebbe fantastico vedere gli istogrammi in una dashboard interattiva
Agost Biro

@SungKim vorresti correggere il tuo codice definendolo in input_sizemodo che possiamo eseguirlo e vedere il risultato intensorboard
Mario

Risposte:


131

Sembra che la rete non abbia imparato nulla negli strati da uno a tre. L'ultimo livello cambia, quindi ciò significa che potrebbe esserci qualcosa di sbagliato nei gradienti (se li stai manomettendo manualmente), stai limitando l'apprendimento all'ultimo livello ottimizzando solo i suoi pesi o l'ultimo livello davvero ' divora 'ogni errore. Potrebbe anche essere che si imparino solo i pregiudizi. La rete sembra però imparare qualcosa, ma potrebbe non sfruttare appieno il suo potenziale. Sarebbe necessario più contesto qui, ma potrebbe valere la pena provare a giocare con il tasso di apprendimento (ad es. Usarne uno più piccolo).

In generale, gli istogrammi visualizzano il numero di occorrenze di un valore rispetto agli altri valori. In parole semplici, se i valori possibili sono in un intervallo di 0..9e vedi un picco di importo 10sul valore 0, significa che 10 input assumono il valore 0; al contrario, se l'istogramma mostra un plateau di 1per tutti i valori di 0..9, significa che per 10 input, ogni valore possibile si 0..9verifica esattamente una volta. È inoltre possibile utilizzare gli istogrammi per visualizzare le distribuzioni di probabilità quando si normalizzano tutti i valori degli istogrammi in base alla loro somma totale; se lo fai, otterrai intuitivamente la probabilità con cui apparirà un certo valore (sull'asse x) (rispetto ad altri input).

Ora layer1/weights, l'altopiano significa che:

  • la maggior parte dei pesi è compresa tra -0,15 e 0,15
  • è (per lo più) altrettanto probabile che un peso abbia uno qualsiasi di questi valori, ovvero che siano (quasi) distribuiti uniformemente

Detto diversamente, quasi lo stesso numero di pesi hanno i valori -0.15, 0.0, 0.15e tutto il resto. Alcuni pesi hanno valori leggermente più piccoli o più alti. Quindi, in breve, sembra semplicemente che i pesi siano stati inizializzati utilizzando una distribuzione uniforme con media zero e intervallo di valori -0.15..0.15... dare o avere. Se si utilizza effettivamente l'inizializzazione uniforme, questo è tipico quando la rete non è stata ancora addestrata.

In confronto, layer1/activationsforma una curva a campana (gaussiana): i valori sono centrati attorno a un valore specifico, in questo caso 0, ma possono anche essere maggiori o minori di quello (altrettanto probabile, poiché è simmetrico). La maggior parte dei valori appare vicina alla media di 0, ma i valori variano da -0.8a 0.8. Presumo che layer1/activationssia preso come distribuzione su tutti gli output dei livelli in un batch. Puoi vedere che i valori cambiano nel tempo.

L'istogramma del livello 4 non mi dice nulla di specifico. Dalla forma, è solo mostrando che alcuni valori di peso intorno -0.1, 0.05e 0.25tendono ad essere verifica con una maggiore probabilità; una ragione potrebbe essere che parti diverse di ciascun neurone raccolgono effettivamente le stesse informazioni e sono fondamentalmente ridondanti. Ciò può significare che potresti effettivamente utilizzare una rete più piccola o che la tua rete ha il potenziale per apprendere più caratteristiche distintive al fine di prevenire l'overfitting. Queste sono solo supposizioni però.

Inoltre, come già affermato nei commenti di seguito, aggiungi unità di bias. Lasciandoli fuori, stai forzatamente vincolando la tua rete a una soluzione possibilmente non valida.


5
Non avendo un bias a tutti può essere una molto cattiva idea - è come veramente cercando di tracciare una linea attraverso una nuvola (ver-alto dimensionale) di punti, ma essere costretti a passare attraverso il valore 0; potrebbe funzionare e ti darà qualche soluzione, ma è probabile che sia cattiva o semplicemente sbagliata.
sunside

1
Purtroppo non posso dirti molto dall'istogramma. (Tuttavia, ho aggiornato la mia risposta.)
sunside

1
Probabilmente dovrebbe allenarsi un po 'più a lungo ora. Soprattutto visti i primi risultati, layer4/Qpredsembra che potrebbe migliorare molto. Per quanto riguarda i pesi che rimangono gli stessi ... lo trovo di pesce, ma in questo momento non riesco a capirlo. Potrebbe essere che sia davvero la distribuzione corretta, ma dato che non c'è alcun cambiamento, lo trovo difficile da credere.
sunside

1
@sunside esiste un metodo per dare la priorità all'aggiornamento dei pesi di rete rispetto ai pregiudizi? Poiché i pregiudizi e l'ultimo strato sembrano risucchiare tutti gli errori. Sto riscontrando un problema simile in cui vengono aggiornati solo i bias e l'istogramma del peso rimane relativamente invariato.
mamafoku

2
Non avere un pregiudizio va bene se si utilizza la norma batch prima dell'attivazione
Tosha
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.