Wie wählt man den Kreuzentropieverlust in TensorFlow?

83

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 sigmoidanstelle von verwenden softmax? Wie unterscheiden sich sparseFunktionen von anderen und warum nur softmax?

Verwandte (mathematisch orientierte) Diskussion: Was sind die Unterschiede zwischen all diesen Entropieverlusten in Keras und TensorFlow? .

Maxime
quelle
1
Wir haben auch tf.losses.log_loss, eigentlich ist es nur für binäre Crossentropie. Auch github.com/tensorflow/tensorflow/issues/2462
mrgloom

Antworten:

138

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 sigmoidVerlustfunktion 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_logitslö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_entropyDarüber hinaus können die Batch-Gewichte festgelegt werden , dh einige Beispiele sind wichtiger als andere. tf.nn.weighted_cross_entropy_with_logitsErmö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 NKlassen 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 sigmoidFamilie tf.losses.softmax_cross_entropydas 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 v2Version eingeführt und der ursprüngliche softmax_cross_entropy_with_logitsVerlust 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 softmaxoben üblich, sollten diese Verlustfunktionen für eine sich gegenseitig ausschließende multinomiale Klassifizierung verwendet werden, dh eine aus NKlassen 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 logitsArgument weiterhin Protokolle pro Klasse enthalten muss, sodass mindestens [batch_size, classes]Speicherplatz benötigt wird.

Wie oben hat die tf.lossesVersion ein weightsArgument, 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 weightsund biasesgeben eine separate, vollständig verbundene Ebene an, die zum Berechnen der Protokolle für ein ausgewähltes Beispiel verwendet wird.

Wie oben, labelssind 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_lossdie 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.

Maxime
quelle
Darf ich um eine Klarstellung bezüglich der Sigmoid-Kreuzentropie (sigCE) bitten? Wenn es für Nbinäre Klassifizierungsaufgaben auf einmal löst , ist N = prod(output.shape)z shape = [batch, examples, channels]; N = (batch * examples * channels). Wenn Sie tf.losses"logits" (Ausgabe des Netzwerks) erwarten, sollte ich auch die Wahrscheinlichkeiten für eine einfache Verwendung zurückgeben? Könnten
SumNeuron
5

Für Version 1.5 softmax_cross_entropy_with_logits_v2muss jedoch stattdessen verwendet werden, während beispielsweise das Argument mit dem verwendet argument key=...wird

softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,
                                    logits=my_prediction, dim=-1, name=None)
Shivid
quelle