Welche Verlustfunktion für Klassifizierungsaufgaben mit mehreren Klassen und mehreren Markierungen in neuronalen Netzen?

64

Ich trainiere ein neuronales Netzwerk, um eine Menge von Objekten in n-Klassen zu klassifizieren. Jedes Objekt kann gleichzeitig mehreren Klassen angehören (Multi-Class, Multi-Label).

Ich habe gelesen, dass bei Problemen mit mehreren Klassen generell empfohlen wird, anstelle von mse Softmax und kategoriale Kreuzentropie als Verlustfunktion zu verwenden, und ich verstehe mehr oder weniger, warum.

Für mein Multi-Label-Problem wäre es natürlich nicht sinnvoll, Softmax zu verwenden, da jede Klassenwahrscheinlichkeit unabhängig von der anderen sein sollte. Meine letzte Ebene sind also nur Sigmoid-Einheiten, die ihre Eingaben für jede Klasse in einen Wahrscheinlichkeitsbereich von 0..1 drücken.

Jetzt bin ich mir nicht sicher, welche Verlustfunktion ich dafür verwenden soll. Wenn ich die Definition der kategorialen Crossentropie betrachte, glaube ich, dass sie für dieses Problem nicht gut geeignet ist, da sie nur die Ausgabe von Neuronen berücksichtigt, die 1 sein sollten, und die anderen ignoriert.

Binäre Kreuzentropie hört sich so an, als würde sie besser passen, aber ich sehe, dass sie nur für Binärklassifizierungsprobleme mit einem einzelnen Ausgangsneuron erwähnt wird.

Ich benutze Python und Keras zum Training, falls es darauf ankommt.

aKzenT
quelle
1
Ich glaube , softmax ist „S - förmige Einheiten , die ihre Eingaben in einen Wahrscheinlichkeitsbereich 0..1 für jede Klasse quetschen“.
Hong Ooi
Sie können softmax als Verlustfunktion verwenden und dann Wahrscheinlichkeiten verwenden, um Ihre Daten mehrfach zu kennzeichnen.
Balboa

Antworten:

30

Wenn Sie Keras verwenden, setzen Sie einfach Sigmoids auf Ihre Ausgabeebene und binary_crossentropy auf Ihre Kostenfunktion.

Wenn Sie Tensorflow verwenden, können Sie sigmoid_cross_entropy_with_logits verwenden . In meinem Fall konvergierte diese direkte Verlustfunktion jedoch nicht. So endete ich mit expliziten Sigmoid-Kreuzentropieverlust . In diesem Beispiel können Sie Ihre eigenen Einstellungen vornehmen(yln(sigmoid(logits))+(1y)ln(1sigmoid(logits)))

Sigmoid gibt im Gegensatz zu Softmax keine Wahrscheinlichkeitsverteilung um als Ausgabe an, sondern unabhängige Wahrscheinlichkeiten.nclasses

Wenn einer Zeile im Durchschnitt weniger Bezeichnungen zugewiesen werden, können Sie softmax_cross_entropy_with_logits verwenden, da bei diesem Verlust die Wahrscheinlichkeiten der Klassen nicht so hoch sein müssen, während sich die Klassen gegenseitig ausschließen. Erforderlich ist lediglich, dass jede Etikettenreihe eine gültige Wahrscheinlichkeitsverteilung ist. Ist dies nicht der Fall, ist die Berechnung des Verlaufs falsch.

Alok Nayak
quelle
Lieber Alok, können Sie dem OP erklären, wie es mit dieser Funktion umgehen würde und warum sie sinnvoll ist? Wie Sie in der Tour sehen werden , werden auf der Website keine Antworten nur auf Links empfohlen.
Antoine Vernet
Eine nette kurze Erklärung kann in Keras Github gesehen werden: github.com/fchollet/keras/issues/741
Dror Hilman
1
Es wird nicht empfohlen, eine eigene Kostenfunktion zu schreiben, wenn Sie die Kreuzentropie verwenden. Sie kann numerischen Stabilitätsproblemen unterliegen. Eine Diskussion finden Sie unter github.com/tensorflow/tensorflow/issues/2462 .
kbrose
Eine Sache ist Multilabel, eine andere Sache ist Multilabel Multiclass. Sigmoid drückt Ihre Ausgabe zwischen 0 und 1, aber das OP hat mehrere Klassen, also sollten die Ausgaben zB 0 - 10 sein. Also sollten die Ausgaben so aussehen: [0,5,2,3,1] <--- das ist nicht was für Sigmoid tut.
Mimoralea
Soll ich tf.round (logits) vor der Verwendung in der Kostenfunktion verwenden oder kann ich direkt logits von der verborgenen Schicht zu tf.nn.sigmoid verwenden ....?
Mönch
9

UPDATE (18.04.18): Die alte Antwort hat sich bei meinem Modell immer noch als nützlich erwiesen. Der Trick besteht darin, die Partitionsfunktion und die Verteilung separat zu modellieren und so die Leistung von softmax zu nutzen.

ymyim=δimF(yi,xi)=logP(yi|xi)yim=ZP(ym) um zwei eigenschaften zu erreichen:

  1. mP(ym)=1
  2. Partitionsfunktion: schätzt die Anzahl der EtikettenZ

Dann geht es darum, die beiden getrennt zu modellieren. Die Verteilungsfunktion wird am besten mit einer Softmax- Ebene modelliert , und die Partitionsfunktion kann mit einer linearen Einheit modelliert werden (in der Praxis habe ich sie auf gekürzt . Eine ausgefeiltere Modellierung wie die Poisson-Einheit würde wahrscheinlich besser funktionieren). Dann können Sie auswählen, ob verteilte Verluste angewendet werden sollen (KL bei Verteilung und MSE bei Partition), oder Sie können den folgenden Verlust für ihr Produkt versuchen.max(0.01,output)

In der Praxis macht auch die Wahl des Optimierers einen großen Unterschied. Meine Erfahrung mit dem Faktorisierungsansatz ist, dass er unter Adadelta am besten funktioniert (Adagrad hat bei mir nicht funktioniert, RMSprop noch nicht ausprobiert, Leistungen von SGD sind parameterabhängig).

Nebenbemerkung zu Sigmoid : Ich habe auf jeden Fall versucht, Sigmoid + Crossentropie und es hat nicht geklappt. Das Modell neigte dazu, nur das vorherzusagen , und konnte die Variation der Verteilungsfunktion nicht erfassen. (aka, es ist irgendwie sehr nützlich für die Modellierung der Partition und es kann mathematische Gründe dahinter geben)Z

UPDATE : (Zufälliger Gedanke) Es scheint, dass die Verwendung des Dirichlet-Prozesses die Einbeziehung einiger früherer Etiketten auf die Anzahl der Etiketten ermöglichen würde.

UPDATE : Experimentell ist die modifizierte KL-Divergenz immer noch dazu geneigt, eine Ausgabe mit mehreren Klassen anstelle einer Ausgabe mit mehreren Etiketten zu liefern.


(Alte Antwort)

Meine Erfahrung mit Sigmoid-Cross-Entropie war nicht sehr angenehm. Im Moment benutze ich eine modifizierte KL-Divergenz. Es nimmt die Form an

P(x)Q(x)

LOss(P,Q.)=X|P(X)-Q.(X)||LogP(X)Q.(X)|=X|(P(X)-Q.(X))LogP(X)Q.(X)|
Wobei die Ziel-Pseudoverteilung und die vorhergesagte Pseudoverteilung ist (aber die Funktion ist tatsächlich symmetrisch, so dass es eigentlich keine Rolle spielt)P(X)Q.(X)

Sie werden Pseudoverteilungen genannt, weil sie nicht normalisiert werden. Sie können also wenn Sie 2 Bezeichnungen für eine bestimmte Stichprobe haben.XP(X)=2

Keras Impelmentation

def abs_KL_div(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), None)
    y_pred = K.clip(y_pred, K.epsilon(), None)
    return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)
sollte sehen
quelle
auf meinem bestimmten Datensatz adamwar viel besser alsrmsprop
Shadi
Wenn Sie einen solchen Verlust für das Training nutzen, wie geht das in der Testphase? Verwenden Sie auch Softmax für die Vorhersage, aber wie wählen Sie den Schwellenwert aus, um Mehrfachbeschriftungsklassen zu bestimmen?
karl_TUM
1

Ich habe noch keine Keras benutzt. Sie können caffe beispielsweise SigmoidCrossEntropyLossLayerfür Probleme mit mehreren Etiketten verwenden.

Mintaka
quelle
1
Möchtest du erklären, warum das ein guter Ansatz ist?
Firebug
0

Eigentlich kann man im Tensorsflow noch die Funktion sigmoid_cross_entropy_meanals Verlustberechnung im Multi-Label verwenden, das bin ich mir sehr sicher

ein einzigartiger Affe
quelle
Geben Sie uns einen Link zur Dokumentation
Ivelin
0

Ich bin ein Neuling hier, aber ich werde versuchen, es mit dieser Frage zu versuchen. Ich habe das Gleiche wie Sie gesucht und schließlich ein sehr gutes Keras-Tutorial für mehrere Klassen gefunden: http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/ .

Der Autor dieses Tutorial kategorische Kreuzentropie Verlustfunktion, und es gibt anderen Thread, den Ihnen Lösung finden @ kann helfen hier .

Willy Satrio Nugroho
quelle
3
Es ist nicht nur Multi-Class, sondern auch Multi-Labels.
Mönch