wake-up-neo.com

Wie wählt man den Cross-Entropie-Verlust im Tensorflow?

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 .

74
Maxim

Vorläufige Fakten

  • 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).

Sigmoid-Funktionsfamilie

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.

Softmax-Funktionsfamilie

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).

Spärliche funktionen familie

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.

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, 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.

119
Maxim

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)
5
Hamidreza