Beschleunigung Mathematische Berechnungen in Java
Habe ich ein neuronales Netz in Java geschrieben, verwendet eine sigmoid transfer function wie folgt definiert:
private static double sigmoid(double x)
{
return 1 / (1 + Math.exp(-x));
}
genannt wird viele mal während der Ausbildung und Berechnung über das Netzwerk. Gibt es eine Möglichkeit dieses zu beschleunigen? Es ist nicht, dass es langsam ist, es ist nur, dass es viel benutzt wird, so dass eine kleine Optimierung wäre hier eine große Gesamtverstärkung.
- Sind die Werte von x immer wiederholt, oder ist es wahrscheinlicher, dass Sie immer anders sein wird jedes mal, wenn die Methode aufgerufen wird?
- Auch, wie genau ist das Ergebnis werden müssen?
- hängt von der gewünschten Genauigkeit, aber Sie sind alle floating-point-zahlen, so ziemlich einzigartig
- gute Frage, aber ich vermute, ich muss mindestens 4 und wahrscheinlich 6dps. Das Problem ist, dass es schwer ist, stellen die notwendigen Genauigkeit in der realen Welt Probleme, wo es keine "richtige" Antwort.
- Also, die Regeln die Möglichkeit der Zwischenspeicherung der Ergebnisse, so dass ich leider nicht sehen können, ein weiterer Weg, um dies zu verbessern.
- Ist die Reichweite des double-Werte beschränkt, oder Sie sind alle über?
- Sind Sie auf der Suche nach diesem? sharpneat.sourceforge.net/integer_network.html
- Ich habe einmal versucht
memoize
-ing der sigmoid-Funktion in Perl, die im Grunde genommen die gleiche Sache, wie die Generierung einer lookup-Tabelle. Die Ausbildung Zeit nicht verbessern. Diese Beobachtung Sekunden DaveJohnston Vorschlag. - Ein neuronales Netz! Ich will immer wissen, wie es zu schreiben. Doch die Dokumentation im internet ist sehr lang und ich will nicht, es zu Lesen. Ist es möglich, die Sie mir (und andere interessante Menschen) den code in ein Archiv? Das wäre genial! Ich wäre sehr dankbar.
- Haben Sie profiliert das Programm, zu wissen, dass die Verbesserung dies wird erheblich verbessern die Gesamtleistung?
- Die Beschleunigung dieser Berechnung ist eigentlich ein gemeinsames Thema unter NN eggheads, also ich finde, wie Stereotyp StackOverflowish, die Antwort ist, dass es als äußerst humorvoll 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für neuronale Netze, müssen Sie nicht den genauen Wert der sigmoid-Funktion. So kann man vorberechnen 100 Werte und die Wiederverwendung der Wert, der am nächsten ist, um Ihre Eingabe, oder sogar besser (als Kommentar angegeben) eine interpolation aus den Nachbar-Werte.
Wie Sie dies tun können, ist in diesem beschrieben Artikel (link geklaut von der Antwort von s-lott).
Dies ist die sigmoid-Funktion:
Wie Sie sehen können, werden nur Werte von -10 < x < 10 interessant sind auf alle. Und, wie einem anderen Kommentar angegeben, ist die Funktion symmetrisch ist. Sie müssen nur die zu speichern die Hälfte der Werte überhaupt.
Edit: tut mir Leid, dass ich gezeigt habe, die falsche Graphik. Ich habe korrigiert es.
Wenn Sie eine Menge von Knoten, wobei der Wert von x ist außerhalb des -10..+10 box, können Sie einfach weglassen, berechnen diese Werte auf alle, z.B., wie so ..
Natürlich, dies Rechenaufwand der bedingten überprüft für JEDE Berechnung, es ist also nur sinnvoll, wenn Sie viel gesättigte Knoten.
Andere Sache, erwähnenswert ist, wenn Sie mit RÜCKFÜHRUNG, und Sie haben, um mit der Steigung der Funktion, es ist besser, um zu berechnen, es in Stücke, anstatt 'wie geschrieben'.
Ich kann mich nicht daran erinnern, dass die Steigung im moment, aber hier ist, was ich bin sprechen über die Verwendung einer bipolaren Sigma als Beispiel. Anstatt compute diese Weise
trifft die exp() zweimal auf, die Sie Zwischenspeichern können, die aufwendige Berechnungen in temporäre Variablen, wie so
Gibt es viele Orte, um diese Art der Sache zu verwenden, die in BP-Netze.
Es ist eine ziemlich glatte Funktion, also eine lookup und interpolation Schema ist wahrscheinlich mehr als ausreichend.
Wenn ich plot der Funktion über einen Bereich von
-10 <= x <= 10
bekomme ich fünf platzieren Genauigkeit bei den extremen. Ist das gut genug für Ihre Anwendung?Vom mathematischen Standpunkt aus, sehe ich keine Möglichkeit, es zu optimieren.