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.
ymyich bin= δich binF( yich, xich) = - logP( yich| Xich)yich bin= Z⋅ P( ym) um zwei eigenschaften zu erreichen:
- ∑mP( ym) = 1
- 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.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)
L o s s ( P, Q )= ∑X| P( x ) - Q ( x ) | ⋅ |∣∣LogP( x )Q ( x )∣∣∣= ∑X∣∣∣( S.( 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)