Wie wählt man den Entropieverlust im Tensorstrom?

14

Klassifikationsprobleme, wie logistische Regression oder multinomial logistische Regression, optimieren einen cross-entropy Verlust. Normalerweise folgt die Kreuz-Entropie-Schicht der softmax -Schicht, was Wahrscheinlichkeitsverteilung erzeugt.

Im Tensorflow gibt es mindestens ein dutzend verschiedener Funktionen für den Verlust von Cross-Entropie :

  • 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 sind für Mehrklassenprobleme geeignet? Wann sollten Sie sigmoid anstelle von softmax verwenden? Wie unterscheiden sich sparse von anderen und warum nur softmax ?

Verwandte (eher mathematisch orientierte) Diskussion: Cross-Entropie-Dschungel .

    
Maxim 31.10.2017, 11:59
quelle

1 Antwort

33

Vorläufige Fakten

Sigmoide Funktionen Familie

Wie bereits erwähnt, dient sigmoid loss für die binäre Klassifizierung. Aber Tensorflow-Funktionen sind allgemeiner und erlauben es zu tun Multi-Label-Klassifizierung, wenn die Klassen unabhängig sind. Mit anderen Worten, tf.nn.sigmoid_cross_entropy_with_logits löst N binäre Klassifikationen auf einmal.

Die Labels müssen ein-hot-codiert sein oder weiche Klassenwahrscheinlichkeiten enthalten.

tf.losses.sigmoid_cross_entropy erlaubt zusätzlich die Einstellung in Batch-Gewichten , d. h., einige Beispiele sind wichtiger als andere. Mit tf.nn.weighted_cross_entropy_with_logits können Klassengewichte festgelegt werden (Denken Sie daran, die Klassifizierung ist binär), d. h. machen Sie positive Fehler größer als negative Fehler. Dies ist nützlich, wenn die Trainingsdaten nicht ausgewogen sind.

Softmax-Funktionen Familie

Diese Verlustfunktionen sollten für die sich gegenseitig ausschließende multinomiale Klassifizierung verwendet werden. Wählen Sie einen von N -Klassen aus. Gilt auch für N = 2 .

Die Labels müssen ein-hot-codiert sein oder weiche Klassenwahrscheinlichkeiten enthalten: Ein bestimmtes Beispiel kann zu Klasse A mit 50% Wahrscheinlichkeit und Klasse B gehören mit 50% Wahrscheinlichkeit. Beachten Sie, dass dies streng genommen nicht bedeutet es gehört zu beiden Klassen, aber man kann die Wahrscheinlichkeiten auf diese Weise interpretieren.

Genau wie in sigmoid family, tf.losses.softmax_cross_entropy erlaubt um die in-batch-Gewichte festzulegen, d. h. einige Beispiele wichtiger als andere zu machen. Soweit ich weiß, gibt es ab Tensorflow 1.3 keine eingebaute Möglichkeit, Klassengewichte festzulegen.

[UPD] In Tensorflow 1.5, v2 version wurde eingeführt und Der ursprüngliche softmax_cross_entropy_with_logits Verlust wurde veraltet. Der einzige Unterschied zwischen ihnen besteht darin, dass in einer neueren Version Backpropagation sowohl in Logits als auch in Labels auftritt ( hier ist eine Diskussion , warum?) Dies kann nützlich sein.)

Sparse Funktionen Familie

Wie oben in softmax üblich, sollten diese Verlustfunktionen für multinomiale, sich gegenseitig ausschließende Klassifizierung, d. h. Auswahl eines von N -Klassen. Der Unterschied liegt in der Codierung von Labels: Die Klassen werden als Ganzzahlen angegeben (Klassenindex), keine One-Hot-Vektoren. Natürlich 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 noch Logits für jede Klasse enthalten muss. Daher verbraucht es mindestens [batch_size, classes] Speicher.

Wie oben, tf.losses version hat ein Argument weights , das erlaubt um die In-Batch-Gewichte zu setzen.

Gesampelte Softmax-Funktionen Familie

Diese Funktionen bieten eine weitere Alternative für den Umgang mit einer großen Anzahl von Klassen. Anstatt eine exakte Wahrscheinlichkeitsverteilung zu berechnen und zu vergleichen, werden sie berechnet eine Verlustschätzung aus einer Stichprobe.

Die Argumente weights und biases geben eine separate, vollständig verbundene Ebene an wird verwendet, um die Logits für ein ausgewähltes Sample zu berechnen.

Wie oben ist labels nicht ein-hot-codiert, sondern hat die Form [batch_size, num_true] .

Sampled Funktionen sind nur für das Training geeignet. In der Testzeit wird es empfohlen Verwende einen Standardverlust softmax (entweder sparse oder one-hot), um eine tatsächliche Verteilung zu erhalten.

Ein anderer alternativer Verlust ist tf.nn.nce_loss , der Rausch-Kontrast-Schätzung durchführt (wenn Sie interessiert sind, sehen Sie dies sehr detaillierte Diskussion ). Ich habe diese Funktion in die softmax-Familie aufgenommen, weil NCE eine Annäherung an softmax im Limit garantiert.

    
Maxim 31.10.2017, 11:59
quelle