2016-12-14 8 views
1

Umwelt Infogenerieren NaN wenn Gradient Berechnung

Betriebssystem: Red Hat Enterprise Linux Server Version 6.6

Tensorflow Version: 0.10.0rc0

Die installierte Version des CUDA und cuDNN: /usr/local/cuda/lib64/libcudart.so.7.5.23

Ich führe ein Modell mit temporaler Aufmerksamkeitsstrategie (https://arxiv.org/abs/1608.02927). Ich verwende tf.nn.seq2seq.sequence_loss_by_example(), um den Verlust zu berechnen, und benutze den adam-Gradienten (lr: 0,001), um den Verlust zu minimieren. Der Verlust ist nicht NaN, aber Gradienten von einigen Gewichten wurden zu NaN-Werten. Wenn ich die Vanilla-Aufmerksamkeitsstrategie verwende, wird dieses NaN-Problem nicht auftreten.

Ich drucke sogar alle Hyperparameter aus, ihre Werte sind echte Werte, bis ihre Gradienten zu NaN werden.

Hoffe jemand kann mir helfen, dieses Problem zu beheben. Danke im Voraus.

Partial-Code

attn_vec = tf.reduce_sum(attention_states * y, [2]) # initial attention weights 
if step > 0: 
    history = tf.pack(acc_sum) 
    max_hist = tf.reduce_max(attn_vec, 1, keep_dims=True) 
    cur_scores = tf.exp(attn_vec - max_hist)/tf.reduce_sum(tf.exp((history-max_hist)), 0) # reweight attention weights 
else: 
    cur_scores = tf.exp(attn_vec - tf.reduce_max(attn_vec, 1, keep_dims=True)) 
    m = cur_scores/tf.reduce_sum(cur_scores, 1, keep_dims=True) 
    acc_sum.append(attn_vec) 
+1

Wie initialisieren Sie die Gewichte? Wenn Sie etwas Code zur Verfügung stellen könnten, wäre es hilfreich – martianwars

+0

Vielleicht eine noch kleinere Lernrate? –

+0

Ich benutzte Xavier Initialisierer, und kleinere Lernrate hat nicht geholfen. – Zodiac

Antwort

0

Ich habe keine sofortige Antwort, aber diese Frage SO hat eine gute Zusammenfassung, wie diese Art von Problemen zu debuggen: Debugging nans in the backward pass

+0

Danke. Aber ich drucke alle Hyperparameter und ihre Gradienten aus, und habe gefunden, dass NaN im Aufmerksamkeitsteil stattgefunden hat. Ich konnte immer noch nicht herausfinden, warum NaN erzeugt wurde. Außerdem habe ich clip_by_value verwendet, wobei max 1.0 und min -1.0 ist, aber nicht geholfen hat. – Zodiac

Verwandte Themen