Ich implementiere Sprachmodell-Training auf Penn Treebank.
Ich addiere Verlust für jeden Zeitschritt und berechne dann Perplexität.
Das gibt mir eine unsensible hohe Ratlosigkeit von Hunderten von Milliarden, auch nach einer gewissen Zeit des Trainings.
Der Verlust selbst sinkt, aber höchstens bis auf etwa 20. (Ich brauche eine einstellige Zahl für Verlust, um vernünftige Ratlosigkeit zu bekommen).
Das lässt mich fragen, ob meine Perplexitätsberechnung fehlgeleitet ist.
Sollte es auf dem Verlust für jeden Zeitschritt basieren und dann Mittelung statt sie alle aufaddieren?
Meine Stapelgröße ist 20, num_steps ist 35.
%Vor%Es scheint, dass Sie die Exponentialfunktion der Summe der Kreuz-Entropie-Verluste berechnen. Perplexität, durch, ist definiert als zwei zur Macht der Entropie.
Perplexität (M) = 2 ^ Entropie (M)
Perplexität (M) = 2 ^ (- 1 / n) (log2 (P (w1, w2, ..., wn)))
wobei log2 = log base 2
Also ja, es sollte auf den Verlust für jeden Zeitschritt basieren, anstatt entweder die Summe oder den Mittelwert zu nehmen. Wenn du die Summe nimmst, wie du jetzt bist, wird sich dein Cross-Entropie-Verlust dramatisch aufblähen, also wird die Erhöhung von 2 auf die Potenz dieses Wertes sehr groß sein.
Weitere Details finden Sie hier
Um die Lernperplexität zu berechnen, muss der Verlust wie in hier beschrieben potenziert werden.
Tensorflow berechnet den Cross-Entropie-Verlust unter Verwendung des natürlichen Logarithmus, daher verwenden wir tf.exp, um iterativ den Trainingsverlust für jeden Zeitschritt wie tf.exp (akkumulative_iteration_costs / acumulative_num_steps_iters) zu berechnen.
Überprüfen Sie das Tensorflow-PTB-Wort lstm-Beispiel
Tags und Links lstm rnn penn-treebank