Klassifizierungsprobleme wie die logistische Regression oder die multinomiale logistische Regression optimieren einen entropieübergreifenden Verlust. Normalerweise folgt die Kreuzentropieschicht der Softmax- Schicht, die eine Wahrscheinlichkeitsverteilung erzeugt.
Im Tensorflow gibt es mindestens ein Dutzend verschiedener Kreuzentropieverlustfunktionen :
tf.losses.softmax_cross_entropy
tf.losses.sparse_softmax_cross_entropy
tf.losses.sigmoid_cross_entropy
tf.contrib.losses.softmax_cross_entropy
tf.contrib.losses.sigmoid_cross_entropy
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sigmoid_cross_entropy_with_logits
- ...
Welches funktioniert nur für die binäre Klassifizierung und welches ist für Probleme mit mehreren Klassen geeignet? Wann sollten Sie sigmoid
anstelle von verwenden softmax
? Wie unterscheiden sich sparse
Funktionen von anderen und warum nur softmax
?
Verwandte (mathematisch orientierte) Diskussion: Was sind die Unterschiede zwischen all diesen Entropieverlusten in Keras und TensorFlow? .
tf.losses.log_loss
, eigentlich ist es nur für binäre Crossentropie. Auch github.com/tensorflow/tensorflow/issues/2462Antworten:
Vorläufige Fakten
Im funktionalen Sinne ist das Sigmoid ein Teilfall der Softmax-Funktion , wenn die Anzahl der Klassen gleich 2 ist. Beide führen dieselbe Operation aus: Transformieren Sie die Logs (siehe unten) in Wahrscheinlichkeiten.
Bei der einfachen binären Klassifizierung gibt es keinen großen Unterschied zwischen den beiden. Bei der multinomialen Klassifizierung ermöglicht Sigmoid jedoch den Umgang mit nicht exklusiven Labels (auch als Multi-Labels bezeichnet ), während Softmax exklusive Klassen behandelt (siehe unten).
Ein Logit (auch als Score bezeichnet) ist ein nicht skalierter Rohwert, der einer Klasse zugeordnet ist , bevor die Wahrscheinlichkeit berechnet wird. In Bezug auf die neuronale Netzwerkarchitektur bedeutet dies, dass ein Logit eine Ausgabe einer dichten (vollständig verbundenen) Schicht ist.
Die Benennung von Tensorflow ist etwas seltsam: Alle folgenden Funktionen akzeptieren Protokolle und keine Wahrscheinlichkeiten und wenden die Transformation selbst an (was einfach effizienter ist).
Sigmoid-Funktionsfamilie
tf.nn.sigmoid_cross_entropy_with_logits
tf.nn.weighted_cross_entropy_with_logits
tf.losses.sigmoid_cross_entropy
tf.contrib.losses.sigmoid_cross_entropy
(VERRINGERT)Wie bereits erwähnt, dient die
sigmoid
Verlustfunktion der binären Klassifizierung. Tensorflow-Funktionen sind jedoch allgemeiner und ermöglichen die Klassifizierung mehrerer Labels, wenn die Klassen unabhängig sind. Mit anderen Worten,tf.nn.sigmoid_cross_entropy_with_logits
löstN
binäre Klassifikationen sofort.Die Beschriftungen müssen One-Hot-codiert sein oder können Wahrscheinlichkeiten für weiche Klassen enthalten.
tf.losses.sigmoid_cross_entropy
Darüber hinaus können die Batch-Gewichte festgelegt werden , dh einige Beispiele sind wichtiger als andere.tf.nn.weighted_cross_entropy_with_logits
Ermöglicht das Festlegen von Klassengewichten (denken Sie daran, die Klassifizierung ist binär), dh machen Sie positive Fehler größer als negative Fehler. Dies ist nützlich, wenn die Trainingsdaten nicht ausgeglichen sind.Softmax-Funktionsfamilie
tf.nn.softmax_cross_entropy_with_logits
(VERRINGERT IN 1.5)tf.nn.softmax_cross_entropy_with_logits_v2
tf.losses.softmax_cross_entropy
tf.contrib.losses.softmax_cross_entropy
(VERRINGERT)Diese Verlustfunktionen sollten für eine sich gegenseitig ausschließende multinomiale Klassifizierung verwendet werden, dh eine aus
N
Klassen auswählen . Gilt auch wennN = 2
.Die Beschriftungen müssen One-Hot-codiert sein oder können weiche Klassenwahrscheinlichkeiten enthalten: Ein bestimmtes Beispiel kann mit einer Wahrscheinlichkeit von 50% zur Klasse A und mit einer Wahrscheinlichkeit von 50% zur Klasse B gehören. Beachten Sie, dass es streng genommen nicht bedeutet, dass es zu beiden Klassen gehört, aber man kann die Wahrscheinlichkeiten auf diese Weise interpretieren.
Ermöglicht genau wie in der
sigmoid
Familietf.losses.softmax_cross_entropy
das Einstellen der Batch-Gewichte , dh einige Beispiele sind wichtiger als andere. Soweit ich weiß, gibt es ab Tensorflow 1.3 keine integrierte Möglichkeit, Klassengewichte festzulegen .[UPD] In Tensorflow 1.5 wurde die
v2
Version eingeführt und der ursprünglichesoftmax_cross_entropy_with_logits
Verlust wurde verworfen . Der einzige Unterschied zwischen ihnen besteht darin, dass in einer neueren Version die Backpropagation sowohl in Protokolle als auch in Labels erfolgt ( hier ist eine Diskussion, warum dies nützlich sein kann).Familie mit spärlichen Funktionen
tf.nn.sparse_softmax_cross_entropy_with_logits
tf.losses.sparse_softmax_cross_entropy
tf.contrib.losses.sparse_softmax_cross_entropy
(VERRINGERT)Wie
softmax
oben üblich, sollten diese Verlustfunktionen für eine sich gegenseitig ausschließende multinomiale Klassifizierung verwendet werden, dh eine ausN
Klassen auswählen . Der Unterschied liegt in der Codierung der Beschriftungen: Die Klassen werden als Ganzzahlen (Klassenindex) und nicht als One-Hot-Vektoren angegeben. Dies erlaubt natürlich keine weichen Klassen, aber es kann Speicherplatz sparen, wenn es Tausende oder Millionen von Klassen gibt. Beachten Sie jedoch, dass daslogits
Argument weiterhin Protokolle pro Klasse enthalten muss, sodass mindestens[batch_size, classes]
Speicherplatz benötigt wird.Wie oben hat die
tf.losses
Version einweights
Argument, mit dem die Batch-Gewichte festgelegt werden können.Abgetastete Softmax-Funktionsfamilie
tf.nn.sampled_softmax_loss
tf.contrib.nn.rank_sampled_softmax_loss
tf.nn.nce_loss
Diese Funktionen bieten eine weitere Alternative für den Umgang mit einer großen Anzahl von Klassen. Anstatt eine genaue Wahrscheinlichkeitsverteilung zu berechnen und zu vergleichen, berechnen sie eine Verlustschätzung aus einer Zufallsstichprobe.
Die Argumente
weights
undbiases
geben eine separate, vollständig verbundene Ebene an, die zum Berechnen der Protokolle für ein ausgewähltes Beispiel verwendet wird.Wie oben,
labels
sind nicht One-Hot-codiert, sondern haben die Form[batch_size, num_true]
.Die abgetasteten Funktionen sind nur für das Training geeignet. In der Testzeit wird empfohlen, einen Standardverlust
softmax
(entweder dünn oder ein heiß) zu verwenden, um eine tatsächliche Verteilung zu erhalten.Ein weiterer alternativer Verlust ist
tf.nn.nce_loss
die Durchführung einer rauschkontrastiven Schätzung (wenn Sie interessiert sind, lesen Sie diese sehr ausführliche Diskussion ). Ich habe diese Funktion in die Softmax-Familie aufgenommen, da NCE eine Annäherung an Softmax im Limit garantiert.quelle
N
binäre Klassifizierungsaufgaben auf einmal löst , istN = prod(output.shape)
zshape = [batch, examples, channels]; N = (batch * examples * channels)
. Wenn Sietf.losses
"logits" (Ausgabe des Netzwerks) erwarten, sollte ich auch die Wahrscheinlichkeiten für eine einfache Verwendung zurückgeben? KönntenFür Version 1.5
softmax_cross_entropy_with_logits_v2
muss jedoch stattdessen verwendet werden, während beispielsweise das Argument mit dem verwendetargument key=...
wirdsoftmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y, logits=my_prediction, dim=-1, name=None)
quelle