In der Tat, im zweiten Fall geht die Rückpropagation nicht durch das Sigmoid. Es ist wirklich eine schlechte Sache, Daten innerhalb der Verlustfunktion zu ändern.
Der Grund, warum dies eine schlechte Sache zu tun ist, ist, weil Sie dann einen Fehler auf der Ausgabe zurückpropagieren werden, die nicht der wirkliche Fehler ist, den das Netzwerk macht.
mich mit einem einfachen Fall erklären: Sie Etiketten in einer binären Form haben sagen ein Tensor [0, 0, 1, 0]
Wenn Ihr sigmoid innerhalb Ihrer benutzerdefinierten Verlustfunktion ist, können Sie Ausgänge haben, dass die S-förmige in Ihrem Verlust wie diese [-100, 0, 20, 100],
aussehen verwandeln dies in etwas, das ungefähr wie tihs aussieht: [0, 0.5, 1, 1]
Der Fehler, der rückpropagiert wird, ist dann [0, -0.5, 0, -1]
. Die Backpropagation wird nicht berücksichtigen das Sigmoid und Sie werden diesen Fehler direkt auf den Ausgang anwenden. Sie können sehen, dass die Größe des Fehlers nicht die Größenordnung des Ausgabefehlers widerspiegelt: Der letzte Wert ist 100 und sollte im negativen Bereich liegen, aber das Modell wird einen kleinen Fehler von -1 auf dieser Ebene zurückwerfen.
Zusammenfassend muss der Sigmoid im Netz sein, so dass das Backpropagation es berücksichtigt, wenn der Fehler backpropagating.
Konnten Sie uns einen Code zur Verfügung stellen, den Sie verwenden - das ist wirklich wirklich interessant. –