2016-06-01 7 views
0

Ich habe eine kleine Frage.Große Anzahl der Verarbeitung in einem neuronalen Netzwerk

Was wäre der beste Weg, um ein neuronales Netz mit großen Zahlen (> 1) zu trainieren, zum Beispiel:

input[][] {{10,100,1000}}; 
desiredOutput {{5000}}; 

(nicht wirklich hinter diesem Sinne, nur zum Beispiel)

Da normalen Neuronen können nur -1 zu 1 ausgeben, das Netz kann 5000 nicht ausgeben. Wäre es sinnvoll, es am Anfang zu teilen und am Ende wieder zu multiplizieren?

input[][] {{10,100,1000}}; --> {{0.001,0.01,0.1}}; (divide by 10'000) 
desiredOutput {{0.5}}; --> {{5000}}; (multiply by 10'000) 

Gibt es einen besseren oder üblicheren Weg?

+0

Ich würde die Nummer nicht teilen, weil Berechnungen mit 'float' Zahlen langsamer sind als mit' int'. –

+0

@KevinWallis können Sie nur doubles anyways eingeben und ich habe genug Zeit: P –

+0

wenn Sie einen besser lesbaren Algorithmus als die Normalisierung aller Zahlen wollen, würde Sinn machen. sonst würde ich mit den "großen Zahlen" leben –

Antwort

0

Wenn die Zahlen positiv sind und sich um mehrere Größenordnungen unterscheiden, wie in Ihrem Beispiel, ist wahrscheinlich eine logarithmische Skalierung sinnvoll. Andernfalls wird die Ausgabeberechnung, die von dem neuronalen Netzwerk durchgeführt wird, durch die großen Eingaben dominiert, während die Modifikation kleinerer Zahlen wenig Wirkung haben wird.

Dies ist wahrscheinlich nicht das, was Sie wollen, denn für die meisten Anwendungen sind relative Änderungen wichtig. Wenn Sie eine Eingabe von 1 auf 2 (100%) ändern, erwarten Sie wahrscheinlich einen größeren Effekt auf die Ausgabe als bei einer Änderung von 1000 auf 1001 (0,1%), obwohl die absoluten Unterschiede gleich sind.

Dies kann durch logarithmische Skalierung vermieden werden.

Beispiel: Um den Bereich von 1 bis 10.000 auf einen Bereich von 0 bis 1 umwandeln, können Sie diese Formel verwenden:

transformedInput = (Math.log10(input) - 1.0)/4.0 

Um die Ausgabe wieder auf den ursprünglichen Bereich zu verwandeln, Verwendung Potenzierung:

0

Es klingt wie Sie das Netzwerk für die Regression verwenden möchten. In diesem Fall ist es sinnvoll, eine lineare Aktivierungsfunktion für Ihre Ausgabeschicht zu verwenden. Der Grund dafür ist, dass sigmoidale Funktionen keine Werte außerhalb ihres spezifizierten Bereichs ausgeben können, wie Sie erwähnen. Es wird wahrscheinlich auch helfen, Ihre Eingaben zu zentrieren und zu normalisieren.

0

Was Sie fragen, heißt normalization und ja, Daten sollten auf den Bereich [0; 1] oder [-1; 1] bevor Sie es in Ihr Netzwerk eingeben.

Die Ergebnisse, die Sie aus dem Netzwerk erhalten, werden ebenfalls auf den gleichen Bereich skaliert. Dies bedeutet jedoch nicht, dass dieselben Koeffizienten für die Ausgabewerte verwendet werden sollten, die zur Normalisierung der Eingabewerte verwendet werden.

Ausgangswerte können eine sehr unterschiedliche Bedeutung haben als die Eingänge, und im Allgemeinen gibt es keinen Grund, sie auf die gleiche Weise wie Eingänge zu skalieren. Siehe auch Why do we have to normalize the input for an artificial neural network?