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.
Antworten:
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( y⋅ ln( Sigmoid ( logs ) ) + ( 1 - y) ⋅ ln( 1 - sigmoid ( Logits ) ) )
Sigmoid gibt im Gegensatz zu Softmax keine Wahrscheinlichkeitsverteilung um als Ausgabe an, sondern unabhängige Wahrscheinlichkeiten.nc l a s s e s
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.
quelle
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.
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.m a x ( 0,01 , o u t p u t )
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)
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
quelle
adam
war viel besser alsrmsprop
Ich habe noch keine Keras benutzt. Sie können caffe beispielsweise
SigmoidCrossEntropyLossLayer
für Probleme mit mehreren Etiketten verwenden.quelle
Eigentlich kann man im Tensorsflow noch die Funktion
sigmoid_cross_entropy_mean
als Verlustberechnung im Multi-Label verwenden, das bin ich mir sehr sicherquelle
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 .
quelle