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.
Respuestas:
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(y⋅ln(sigmoid(logits))+(1−y)⋅ln(1−sigmoid(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.
fuente
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:y m yim=δim F(yi,xi)=−logP(yi|xi) yim=Z⋅P(ym)
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
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
fuente
adam
fue mucho mejor quermsprop
No he usado keras todavía. Tomando caffe, por ejemplo, puede usarlo
SigmoidCrossEntropyLossLayer
para problemas de etiquetas múltiples.fuente
En realidad, en el flujo de tensión todavía puede usar la
sigmoid_cross_entropy_mean
función de cálculo de pérdida en varias etiquetas, lo confirmofuente
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í .
fuente