Klassifizierungsprobleme wie die logistische Regression oder die multinomiale logistische Regression optimieren einen Kreuzentropieverlust . Normalerweise folgt die Cross-Entropy-Schicht der Softmax-Schicht , die die Wahrscheinlichkeitsverteilung erzeugt.
Im Tensorflow gibt es mindestens ein Dutzend verschiedener Cross-Entropy-Loss-Funktionen :
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
Welche funktionieren nur für die binäre Klassifikation und welche eignen sich für Mehrklassenprobleme? Wann sollten Sie sigmoid
anstelle von softmax
verwenden? Wie unterscheiden sich sparse
Funktionen von anderen und warum ist es nur softmax
?
Verwandte (mathematisch orientierte) Diskussion: entropieübergreifender Dschungel .
Im funktionalen Sinne ist Sigmoid ist ein Teilfall der Softmax-Funktion , wenn die Anzahl der Klassen gleich 2 ist. Beide führen die gleiche Operation aus: Wandeln Sie die Protokolle (siehe unten) in Wahrscheinlichkeiten um.
Bei der einfachen binären Klassifizierung gibt es keinen großen Unterschied zwischen den beiden. Bei der multinomialen Klassifizierung ermöglicht sigmoid jedoch die Verarbeitung nicht exklusiver Bezeichnungen (auch bekannt als multi-labels), während softmax exklusive Bezeichnungen verarbeitet Klassen (siehe unten).
Ein logit (auch Score genannt) ist ein roher nicht skalierter Wert, 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.
Tensorflow-Namen sind etwas seltsam: Alle unten aufgeführten Funktionen akzeptieren Protokolle, keine Wahrscheinlichkeiten und wenden die Transformation selbst an (was einfach effizienter ist).
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
(DEPRECATED)Wie bereits erwähnt, dient die Verlustfunktion sigmoid
zur 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öst N
Binärklassifikationen sofort.
Die Bezeichnungen müssen One-Hot-codiert sein oder können Soft-Class-Wahrscheinlichkeiten enthalten.
tf.losses.sigmoid_cross_entropy
Ermöglicht außerdem das Festlegen der in-batch-Gewichte, d. H. Einige Beispiele sind wichtiger als andere. Mit tf.nn.weighted_cross_entropy_with_logits
Können Sie Klassengewichte (denken Sie daran, dass die Klassifizierung binär ist) festlegen, d. H. Positive Fehler größer als negative Fehler machen. Dies ist nützlich, wenn die Trainingsdaten nicht ausgeglichen sind.
tf.nn.softmax_cross_entropy_with_logits
(DEPRECATED IN 1.5)tf.nn.softmax_cross_entropy_with_logits_v2
tf.losses.softmax_cross_entropy
tf.contrib.losses.softmax_cross_entropy
(DEPRECATED)Diese Verlustfunktionen sollten für eine sich gegenseitig ausschließende Multinomialklassifizierung verwendet werden, d. H. Eine aus N
Klassen auswählen. Gilt auch für N = 2
.
Die Bezeichnungen müssen one-hot-codiert sein oder können weiche Klassenwahrscheinlichkeiten enthalten: Ein bestimmtes Beispiel kann zur Klasse A mit einer Wahrscheinlichkeit von 50% und zur Klasse B mit einer Wahrscheinlichkeit von 50% gehören. Man beachte, dass es streng genommen nicht bedeutet, dass es zu beiden Klassen gehört, aber man kann die Wahrscheinlichkeiten auf diese Weise interpretieren.
Genau wie in der sigmoid
- Familie ermöglicht tf.losses.softmax_cross_entropy
Das Festlegen der Gewichte im Stapel, d. H., 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 v2
Version wurde eingeführt und das Original softmax_cross_entropy_with_logits
Verlust wurde veraltet. Der einzige Unterschied zwischen ihnen besteht darin, dass in einer neueren Version die Rückübertragung sowohl in Logs als auch in Labels erfolgt ( hier ist eine Diskussion warum dies nützlich sein kann).
tf.nn.sparse_softmax_cross_entropy_with_logits
tf.losses.sparse_softmax_cross_entropy
tf.contrib.losses.sparse_softmax_cross_entropy
(DEPRECATED)Wie gewöhnliche softmax
oben sollten diese Verlustfunktionen für eine sich gegenseitig ausschließende Multinomialklassifizierung verwendet werden, d. H. Eine aus N
Klassen auswählen. Der Unterschied liegt in der Beschriftungscodierung: Die Klassen werden als Ganzzahlen (Klassenindex) und nicht als One-Hot-Vektoren angegeben. Offensichtlich erlaubt dies keine weichen Klassen, aber es kann etwas Speicher sparen, wenn es Tausende oder Millionen von Klassen gibt. Beachten Sie jedoch, dass das Argument logits
weiterhin Protokolle für jede Klasse enthalten muss, sodass es mindestens [batch_size, classes]
Speicher belegt.
Wie oben hat auch die Version tf.losses
Ein Argument weights
, mit dem die Gewichtungen im Stapel festgelegt werden können.
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
und biases
geben eine separate, vollständig verbundene Ebene an, mit der die Protokolle für eine ausgewählte Stichprobe berechnet werden.
Wie oben sind labels
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 spärlich oder ein heißer Verlust) zu verwenden, um eine tatsächliche Verteilung zu erhalten.
Ein anderer alternativer Verlust ist tf.nn.nce_loss
, Der rauschkontrastive Schätzung ausführt (wenn Sie interessiert sind, lesen Sie dies sehr ausführliche Diskussion ). Ich habe diese Funktion in die Softmax-Familie aufgenommen, da NCE die Annäherung an Softmax im Grenzbereich garantiert.
jedoch für Version 1.5, softmax_cross_entropy_with_logits_v2
muss stattdessen verwendet werden, während sein Argument mit dem argument key=...
wie folgt>
softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,\
logits = my_prediction, dim=-1, name=None)