Numercially stabil softmax
Gibt es eine numerisch stabile Verfahren zur Berechnung softmax-Funktion unten?
Ich bin immer Werte, wird Nan in Neuronalen Netzwerk-code.
np.exp(x)/np.sum(np.exp(y))
- Die Antworten hier zeigen, die bessere Möglichkeit zur Berechnung der softmax: stackoverflow.com/questions/34968722/softmax-function-python
- Die akzeptierten Antworten in diesem link ist eigentlich schlechter Rat. Abhishek, das, was der OP tut, obwohl Sie zuerst nicht scheinen zu verstehen, warum das richtige zu tun. Es gibt keine numerisch schwierige Schritte in die softmax außer überlauf. So verschieben alle Eingänge auf der linken Seite, während mathematisch gleichwertig, entfällt die Möglichkeit der überlauf, also ist numerisch eine Verbesserung.
- Ja, obwohl der Autor, die akzeptierten Antworten erkennt in den Kommentaren, dass man die maximale nicht vorstellen, ein "notwendiger Begriff" ist aber tatsächlich verbessert die numerische Stabilität (vielleicht, die Antwort sollte bearbeitet werden,...). In jedem Fall, die Frage nach der numerischen Stabilität gerichtet ist, in einigen der anderen Antworten gibt. @AbhishekBhatia: glaubst du, der link beantwortet deine Frage zufriedenstellend, oder würde eine neue Antwort hier von Vorteil sein?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem softmax exp(x)/sum(exp(x)) ist eigentlich numerisch brav. Es hat nur positive Begriffe, also brauchen wir keine sorgen über den Verlust von Bedeutung, und der Nenner ist mindestens so groß wie der Nenner, so das Ergebnis wird garantiert liegen zwischen 0 und 1.
Der einzige Unfall, der passieren könnte, ist über - oder unter-Strömung in der Exponentialfunktionen. Überlauf einer Einzel-oder Unterlauf der alle Elemente der x machen die Ausgabe mehr oder weniger nutzlos.
Aber es ist leicht zu hüten, dass durch die Verwendung der Identität softmax(x) = softmax(x + c) gilt für jeden beliebigen Skalar c: Subtraktion max(x) von x hinterlässt einen Vektor, in dem nur nicht-positive Eingaben, auszuschließen überlauf und mindestens ein element null ist auszuschließen, verschwindende Nenner (Unterlauf in einige, aber nicht alle Einträge harmlos ist).
Fußnote: theoretisch, katastrophale Unfälle in der Summe sind möglich, aber Sie müssten eine lächerlich Anzahl der Begriffe. Zum Beispiel, auch mit 16-bit-floats können nur lösen, 3 Nachkommastellen---im Vergleich zu 15 Dezimalstellen eine "normale" 64-bit-float - ---wir bräuchten zwischen 2^1431 (~6 x 10^431) und 2^1432 zu bekommen, eine Summe, die um den Faktor zwei.
Softmax-Funktion ist anfällig auf zwei Aspekte: die überlauf und Unterlauf
Überlauf: Es tritt auf, wenn sehr große zahlen sind angenähert als
infinity
Unterlauf: Es tritt auf, wenn sehr kleine zahlen (nahe null in der Nummer der Linie) sind angenähert (d.h. gerundet) als
zero
Zur Bekämpfung dieser Probleme, wenn dabei die softmax-Berechnung, eine gemeinsame trick ist die Verlagerung der input-Vektor von Abzug der maximale element von allen Elementen. Für die input-Vektor
x
definierenz
so dass:Nehmen und dann die softmax die neue (stabile) Vektor
z
Beispiel:
Für mehr details, siehe Kapitel Numerische Berechnung in deep learning Buch.
Danke Paul Panzer ist Erklärung, aber ich Frage mich, warum müssen wir subtrahieren max(x). Daher fand ich genauere Informationen und hoffe, es wird hilfreich sein, um die Menschen, die die gleichen Frage wie ich.
Finden Sie im Abschnitt "Was ist mit max Subtraktion?", in dem folgenden link ist der Artikel.
https://nolanbconaway.github.io/blog/2017/softmax-numpy
Es ist nichts falsch mit der Berechnung der softmax-Funktion, wie es ist, in deinem Falle. Das problem scheint zu kommen aus explodierenden gradient oder diese Art von Problemen mit Ihrem training Methoden. Konzentrieren Sie sich auf die Fragen mit entweder "clipping-Werte" oder "die Wahl der richtigen anfängliche Verteilung der GEWICHTE".
softmax(800)
mit ihm.