¿Qué función de pérdida para tareas de clasificación multi-clase y multi-etiqueta en redes neuronales?

64

Estoy entrenando una red neuronal para clasificar un conjunto de objetos en n-clases. Cada objeto puede pertenecer a múltiples clases al mismo tiempo (multi-clase, multi-etiqueta).

Leí que para problemas de varias clases generalmente se recomienda usar softmax y entropía cruzada categórica como la función de pérdida en lugar de mse y entiendo más o menos por qué.

Para mi problema de etiqueta múltiple, no tendría sentido usar softmax, por supuesto, ya que la probabilidad de cada clase debería ser independiente de la otra. Entonces, mi capa final es solo unidades sigmoideas que aplastan sus entradas en un rango de probabilidad 0..1 para cada clase.

Ahora no estoy seguro de qué función de pérdida debo usar para esto. Mirando la definición de crossentropía categórica, creo que no se aplicaría bien a este problema, ya que solo tendrá en cuenta la salida de las neuronas que deberían ser 1 e ignora a las demás.

Parece que la entropía cruzada binaria encajaría mejor, pero solo veo que se menciona alguna vez para problemas de clasificación binaria con una sola neurona de salida.

Estoy usando python y keras para entrenar en caso de que sea importante.

aKzenT
fuente
1
Creo que softmax es "unidades sigmoideas que aplastan sus entradas en un rango de probabilidad 0..1 para cada clase".
Hong Ooi
Puede usar softmax como su función de pérdida y luego usar las probabilidades para clasificar sus datos en varias etiquetas.
balboa

Respuestas:

30

Si está utilizando keras, simplemente coloque sigmoides en su capa de salida y binary_crossentropy en su función de costo.

Si está utilizando tensorflow, puede usar sigmoid_cross_entropy_with_logits . Pero para mi caso, esta función de pérdida directa no era convergente. Así que terminé usando la pérdida de entropía cruzada sigmoidea explícita . Puedes hacer tu propio like en este ejemplo(yln(sigmoid(logits))+(1y)ln(1sigmoid(logits)))

Sigmoide, a diferencia de softmax, no da distribución de probabilidad alrededor de como salida, sino probabilidades independientes.nclasses

Si, en promedio, a cualquier fila se le asignan menos etiquetas, puede usar softmax_cross_entropy_with_logits porque con esta pérdida, mientras que las clases son mutuamente excluyentes, no es necesario que sean sus probabilidades. Todo lo que se requiere es que cada fila de etiquetas sea una distribución de probabilidad válida. Si no lo son, el cálculo del gradiente será incorrecto.

Alok Nayak
fuente
Estimado Alok, ¿puede explicarle al OP cómo utilizarían esta función y por qué tiene sentido? Como verá en el recorrido , no se recomiendan las respuestas de solo enlace en el sitio.
Antoine Vernet
Se puede ver una breve explicación en keras github: github.com/fchollet/keras/issues/741
Dror Hilman
1
No se recomienda escribir su propia función de costos cuando se utiliza la entropía cruzada; puede estar sujeta a problemas de estabilidad numérica. Consulte github.com/tensorflow/tensorflow/issues/2462 para una discusión.
kbrose
Una cosa es multilabel, otra cosa es multilabel multiclase. Sigmoid aplasta su salida entre 0 y 1, pero el OP tiene varias clases, por lo que las salidas deben ser, por ejemplo, 0-10. Por lo tanto, las salidas deben verse: [0,5,2,3,1] <--- esto no es lo que sigmoid hace.
mimoralea
¿Debo usar tf.round (logits) antes de usar la función de costo o puedo usar directamente logits desde la capa oculta a tf.nn.sigmoid ....?
Monje
9

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=ZP(ym)

  1. Función de distribución:mP(ym)=1
  2. 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)
debería ver
fuente
en mi conjunto de datos en particular, adamfue mucho mejor quermsprop
shadi
Si usa esa pérdida para el entrenamiento, ¿cómo hacerlo en la fase de prueba? También use softmax para la predicción, pero ¿cómo seleccionar el umbral para determinar las clases de etiquetas múltiples?
karl_TUM
1

No he usado keras todavía. Tomando caffe, por ejemplo, puede usarlo SigmoidCrossEntropyLossLayerpara problemas de etiquetas múltiples.

mintaka
fuente
1
¿Te importaría explicar por qué es un buen enfoque?
Firebug
0

En realidad, en el flujo de tensión todavía puede usar la sigmoid_cross_entropy_meanfunción de cálculo de pérdida en varias etiquetas, lo confirmo

un mono unico
fuente
Danos un enlace a la documentación
Ivelin
0

Soy un novato aquí, pero intentaré intentarlo con esta pregunta. Estaba buscando lo mismo que usted, y finalmente encontré un muy buen tutorial de clasificación multiclase de Keras @ http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/ .

El autor de ese tutorial utiliza la función categórica de pérdida de entropía cruzada, y hay otro hilo que puede ayudarlo a encontrar la solución @ aquí .

Willy satrio nugroho
fuente
3
No solo es de múltiples clases, también es de múltiples etiquetas.
Monje