webentwicklung-frage-antwort-db.com.de

Wie funktioniert der Verlust der binären Kreuzentropie bei Autoencodern?

Ich habe einen Vanilla-Autoencoder geschrieben, der nur die Ebene Dense verwendet. Unten ist mein Code:

iLayer = Input ((784,))
layer1 = Dense(128, activation='relu' ) (iLayer)
layer2 = Dense(64, activation='relu') (layer1)
layer3 = Dense(28, activation ='relu') (layer2)
layer4 = Dense(64, activation='relu') (layer3)
layer5 = Dense(128, activation='relu' ) (layer4)
layer6 = Dense(784, activation='softmax' ) (layer5)
model = Model (iLayer, layer6)
model.compile(loss='binary_crossentropy', optimizer='adam')

(trainX, trainY), (testX, testY) =  mnist.load_data()
print ("shape of the trainX", trainX.shape)
trainX = trainX.reshape(trainX.shape[0], trainX.shape[1]* trainX.shape[2])
print ("shape of the trainX", trainX.shape)
model.fit (trainX, trainX, epochs=5, batch_size=100)

Fragen:

1) softmax liefert die Wahrscheinlichkeitsverteilung. Verstanden. Das heißt, ich hätte einen Vektor von 784 Werten mit einer Wahrscheinlichkeit zwischen 0 und 1. Zum Beispiel [0.02, 0.03 ..... bis 784 Elemente] ergibt die Summierung aller 784 Elemente 1.

2) Ich verstehe nicht, wie die binäre Crossentropie mit diesen Werten funktioniert. Binäre Kreuzentropie gilt für zwei Ausgabewerte, richtig?

9
Whoami

Im Kontext von Autoencodern ist die Eingabe und Ausgabe des Modells gleich. Wenn die Eingabewerte im Bereich [0,1] liegen, kann sigmoid als Aktivierungsfunktion der letzten Ebene verwendet werden. Andernfalls müssen Sie eine geeignete Aktivierungsfunktion für die letzte Ebene verwenden (z. B. linear, die die Standardfunktion ist).

Bei der Verlustfunktion wird wieder auf die Werte der Eingabedaten zurückgegriffen. Wenn die Eingabedaten sind nur zwischen Nullen und Einsen (und nicht die Werte zwischen ihnen), dann ist binary_crossentropy als Verlustfunktion akzeptabel. Andernfalls müssen Sie andere Verlustfunktionen wie 'mse' (D. H. Mittlerer quadratischer Fehler) oder 'mae' (D. H. Mittlerer absoluter Fehler) verwenden. Beachten Sie, dass Sie bei Eingabewerten im Bereich [0,1]binary_crossentropy Verwenden können, wie es normalerweise verwendet wird (z. B. Keras Autoencoder-Tutorial und dieses Dokument) ). Erwarten Sie jedoch nicht, dass der Verlustwert Null wird, da binary_crossentropy Keine Null zurückgibt, wenn sowohl Vorhersage als auch Bezeichnung nicht Null oder Eins sind (egal, ob sie gleich sind oder nicht). Hier ist ein Video von Hugo Larochelle , in dem er die in Autoencodern verwendeten Verlustfunktionen erklärt (der Teil über die Verwendung von binary_crossentropy Mit Eingaben im Bereich [0,1] beginnt um 5: )

Konkret verwenden Sie in Ihrem Beispiel den MNIST-Datensatz. Die Werte von MNIST sind also standardmäßig ganze Zahlen im Bereich [0, 255]. Normalerweise müssen Sie sie zuerst normalisieren:

trainX = trainX.astype('float32')
trainX /= 255.

Jetzt wären die Werte im Bereich [0,1]. Daher kann sigmoid als Aktivierungsfunktion und entweder binary_crossentropy Oder mse als Verlustfunktion verwendet werden.


Warum kann binary_crossentropy Verwendet werden, auch wenn die wahren Bezeichnungswerte (d. H. Grundwahrheit) im Bereich [0,1] liegen?

Beachten Sie, dass wir versuchen, die Verlustfunktion im Training zu minimieren. Wenn also die Verlustfunktion, die wir verwendet haben, ihren Minimalwert erreicht (der nicht unbedingt gleich Null sein muss), wenn die Vorhersage gleich dem wahren Etikett ist, dann ist dies eine akzeptable Wahl. Lassen Sie uns überprüfen, ob dies bei der Binray-Cross-Entropie der Fall ist, die wie folgt definiert ist:

bce_loss = -y*log(p) - (1-y)*log(1-p)

dabei ist y die wahre Bezeichnung und p der vorhergesagte Wert. Betrachten wir y als fest und sehen, welcher Wert von p diese Funktion minimiert: Wir müssen die Ableitung in Bezug auf p nehmen (ich habe die log ist die natürliche Logarithmusfunktion zur Vereinfachung der Berechnungen):

bce_loss_derivative = -y*(1/p) - (1-y)*(-1/(1-p)) = 0 =>
                      -y/p + (1-y)/(1-p) = 0 =>
                      -y*(1-p) + (1-y)*p = 0 =>
                      -y + y*p + p - y*p = 0 =>
                       p - y = 0 => y = p

Wie Sie sehen können, hat die binäre Kreuzentropie den minimalen Wert, wenn y=p, D. H. Wenn die wahre Bezeichnung der vorhergesagten Bezeichnung entspricht und genau das ist, wonach wir suchen.

13
today