ACTUALIZACIÓN (18/04/18): la vieja respuesta aún demostró ser útil en mi modelo. El truco consiste en modelar la función de partición y la distribución por separado, explotando así el poder de softmax.
Considere su vector de observación para contener etiquetas. (1 si la muestra i contiene la etiqueta m, 0 de lo contrario). Por lo tanto, el objetivo sería modelar la matriz de una manera por muestra. Por lo tanto, el modelo evalúa . Considere expandir para lograr dos propiedades:ymyim=δimF(yi,xi)=−logP(yi|xi)yim=Z⋅P(ym)
- Función de distribución:∑mP(ym)=1
- Función de partición: estima el número de etiquetasZ
Entonces se trata de modelar los dos por separado. La función de distribución se modela mejor con una capa softmax , y la función de partición se puede modelar con una unidad lineal (en la práctica, la recorté como . Un modelado más sofisticado como la unidad de Poisson probablemente funcionaría mejor). Luego puede optar por aplicar la pérdida distribuida (KL en la distribución y MSE en la partición), o puede probar la siguiente pérdida en su producto.max(0.01,output)
En la práctica, la elección del optimizador también hace una gran diferencia. Mi experiencia con el enfoque de factorización es que funciona mejor con Adadelta (Adagrad no funciona para mí, todavía no probé RMSprop, el rendimiento de SGD está sujeto a parámetros).
Comentario secundario sobre sigmoide : Ciertamente he intentado sigmoide + crossentropía y no funcionó. El modelo se inclinó a predecir la solamente y no logró capturar la variación en la función de distribución. (también conocido como, de alguna manera, es bastante útil para modelar la partición y puede haber una razón matemática detrás de ella)Z
ACTUALIZACIÓN : (Pensamiento aleatorio) ¿Parece que el uso del proceso Dirichlet permitiría la incorporación de algunos anteriores en el número de etiquetas?
ACTUALIZACIÓN : Por experimento, la divergencia KL modificada todavía está inclinada a dar salida de clase múltiple en lugar de salida de etiqueta múltiple.
(Antigua respuesta)
Mi experiencia con la entropía cruzada sigmoidea no fue muy agradable. En este momento estoy usando una divergencia KL modificada. Toma la forma
Loss(P,Q)=∑x|P(x)−Q(x)|⋅∣∣∣logP(x)Q(x)∣∣∣=∑x∣∣∣(P(x)−Q(x))⋅logP(x)Q(x)∣∣∣
Donde es la pseudo-distribución objetivo y es la pseudo-distribución predicha (pero la función es realmente simétrica, por lo que no importa)
P(x)Q(x)
Se llaman pseudodistribuciones por no estar normalizados. Por lo tanto, puede tener si tiene 2 etiquetas para una muestra en particular.∑xP(x)=2
Impulsión de 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)