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
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öst N
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
Diese Verlustfunktionen sollten für eine sich gegenseitig ausschließende multinomiale Klassifizierung verwendet werden, dh eine aus N
Klassen auswählen . Gilt auch wenn N = 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
Familie tf.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üngliche softmax_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
Wie softmax
oben üblich, sollten diese Verlustfunktionen für eine sich gegenseitig ausschließende multinomiale Klassifizierung verwendet werden, dh eine aus N
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 das logits
Argument weiterhin Protokolle pro Klasse enthalten muss, sodass mindestens [batch_size, classes]
Speicherplatz benötigt wird.
Wie oben hat die tf.losses
Version ein weights
Argument, mit dem die Batch-Gewichte festgelegt werden können.
Abgetastete Softmax-Funktionsfamilie
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, 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.
tf.losses.log_loss
, eigentlich ist es nur für binäre Crossentropie. Auch github.com/tensorflow/tensorflow/issues/2462