AGGIORNAMENTO (18/04/18): la vecchia risposta si è dimostrata utile sul mio modello. Il trucco è modellare la funzione di partizione e la distribuzione separatamente, sfruttando così la potenza di softmax.
Considera il tuo vettore di osservazione per contenere etichette. (1 se il campione i contiene l'etichetta m, 0 altrimenti). Quindi l'obiettivo sarebbe quello di modellare la matrice in un modo per campione. Quindi il modello valuta . espandere per ottenere due proprietà:ymyim=δimF(yi,xi)=−logP(yi|xi)yim=Z⋅P(ym)
- Funzione di distribuzione:∑mP(ym)=1
- Funzione di partizione: stima il numero di etichetteZ
Quindi si tratta di modellare i due separatamente. La funzione di distribuzione è modellata al meglio con un layer softmax e la funzione di partizione può essere modellata con un'unità lineare (in pratica l'ho ritagliata come . Una modellazione più sofisticata come l'unità Poisson probabilmente funzionerebbe meglio). Quindi puoi scegliere di applicare la perdita distribuita (KL sulla distribuzione e MSE sulla partizione) oppure puoi provare la seguente perdita sul loro prodotto.max(0.01,output)
In pratica, anche la scelta dell'ottimizzatore fa una grande differenza. La mia esperienza con l'approccio alla fattorizzazione è che funziona meglio con Adadelta (Adagrad non funziona per me, non ho ancora provato RMSprop, le prestazioni di SGD sono soggette a parametro).
Commento laterale su sigmoid : ho sicuramente provato sigmoid + crossentropy e non ha funzionato. Il modello tendeva a prevedere solo la e non riusciva a catturare la variazione nella funzione di distribuzione. (aka, è in qualche modo abbastanza utile per modellare la partizione e potrebbe esserci una ragione matematica dietro di essa)Z
AGGIORNAMENTO : (Pensiero casuale) Sembra che l'utilizzo del processo Dirichlet consentirebbe l'incorporazione di alcuni precedenti sul numero di etichette?
AGGIORNAMENTO : Per esperimento, la divergenza KL modificata è ancora incline a fornire output multi-classe anziché output multi-etichetta.
(Vecchia risposta)
La mia esperienza con l'entropia sigmoidea non è stata molto piacevole. Al momento sto usando una divergenza di KL modificata. Prende la forma
Loss(P,Q)=∑x|P(x)−Q(x)|⋅∣∣∣logP(x)Q(x)∣∣∣=∑x∣∣∣(P(x)−Q(x))⋅logP(x)Q(x)∣∣∣
Dove è la pseudo-distribuzione target e è la pseudo-distribuzione prevista (ma la funzione è in realtà simmetrica, quindi non ha importanza)
P(x)Q(x)
Sono chiamati pseudo-distribuzioni per non essere normalizzati. Quindi puoi avere se hai 2 etichette per un particolare campione.∑xP(x)=2
Impelmentazione di Keras
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)