2016-04-03 5 views
1

Ich trainiere ein einfaches Feed-Forward-Modell mit 3 oder 4 versteckten Layern und Dropouts zwischen jeder Kombination (versteckte Ebene + Nichtlinearität). Manchmal beginnt das Modell nach einigen Epochen (etwa 10-11) mit der Ausgabe von Infs und NaNs als Fehler der NLL und die Genauigkeit fällt auf 0,0%. Dieses Problem tritt nicht auf, wenn ich keine Dropouts verwende. Ist das ein bekanntes Problem mit Aussteigern in Theano? Die Art, wie ich Aussetzer implementieren ist:Warum wirft Theano NaNs, wenn ich Dropouts verwende?

def drop(self, input): 
    mask = self.theano_rng.binomial(n=1, p=self.p, size=input.shape, dtype=theano.config.floatX) 
    return input * mask 

wo Eingang das Feature-Vektor, auf dem wir Aussetzer anwenden möchten. Ich habe auch beobachtet, dass das Auftreten von NaNs früher auftritt, wenn die Dropout-Wahrscheinlichkeit (self.p) höher ist. p = 0,5 würde bewirken, dass NaNs um die Epochen 1 oder 2 herum auftreten, aber p = 0,7 würde dazu führen, dass NaNs um die Epochen 10 oder 11 herum auftreten. Das Auftreten von NaNs tritt auch nur auf, wenn die Größe der versteckten Schichten groß ist. Zum Beispiel (800,700,700) ergibt NaNs, während (500,500,500) nicht.

Antwort

0

in meiner Erfahrung NaNs, wenn die Ausbildung ein Netzwerk in der Regel aufgrund von zwei Probleme auftreten:

  • erste mathematische Fehler, z.B. Protokoll des negativen Wertes. Dies kann passieren, wenn Sie log() in Ihrer Verlustfunktion verwenden.
  • Zweitens gibt es einen Wert, der zu groß wird, damit Python nicht verarbeiten kann.

In Ihrem Fall, von Ihrer guten Beobachtung, ich denke, es ist ein zweiter Fall. Ihr Verlustwert wird möglicherweise zu groß, um von Python verarbeitet zu werden. Versuchen Sie, kleineres Gewicht zu initialisieren, wenn Sie versuchen, Ihr Netzwerk zu erweitern. Oder verwenden Sie einfach einen anderen Ansatz, um das Gewicht zu initialisieren, wie von Glorot (2010) oder He (2015) erläutert. Ich hoffe es hilft.