Kosten von mehr als 1, gibt es einen Fehler?
-
16-10-2019 - |
Frage
Ich berechnet die Kosten auf folgende Weise:
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y, y_)
cost = tf.reduce_mean(cross_entropy);
Bei den ersten Kosten bekomme ich 0,693147, was bei einer binären Klassifizierung zu erwarten ist, wenn Parameter/Gewichte auf 0 initialisiert werden.
Ich verwende One_hot -Labels.
Nach Abschluss einer Trainingspoche finde ich jedoch einen stochastischen Gradientenabstieg von mehr als 1.
Soll das zu erwarten?
Lösung
Das folgende Stück Code tut im Wesentlichen was TFs softmax_cross_entropy_with_logits
Funktionen tun (Kreuzung auf Softmaxed y_
und y
):
import scipy as sp
import numpy as np
def softmax(x):
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum(axis=0)
def crossentropy(true, pred):
epsilon = 1e-15
pred = sp.maximum(epsilon, pred)
pred = sp.minimum(1-epsilon, pred)
ll = -sum(
true * sp.log(pred) + \
sp.subtract(1,true) * \
sp.log(sp.subtract(1, pred))
) / len(true)
return ll
==
true = [1., 0.]
pred = [5.0, 0.5]
true = softmax(true)
pred = softmax(pred)
print true
print pred
print crossentropy(true, pred)
==
[ 0.73105858 0.26894142]
[ 0.98901306 0.01098694]
1.22128414101
Wie Sie sehen können, gibt es keinen Grund, warum die Kreuzung bei der Binärklassifizierung nicht> 1 sein kann und es nicht schwer ist, ein solches Beispiel zu finden.
** Die obige Kreuzung wird wie in berechnet https://www.kaggle.com/wiki/logarithmicloss, Softmax wie in https://en.wikipedia.org/wiki/softmax_function
UPD: Es gibt eine großartige Erklärung dafür, was es bedeutet, wenn Logloss> 1 bei SO: https://stackoverflow.com/a/35015188/1166478