Abordar el desequilibrio de clase: contribución de escala a la pérdida y el SGD

(Se ha agregado una actualización a esta pregunta).

Soy un estudiante graduado en la universidad de Gante, Bélgica; Mi investigación es sobre el reconocimiento de emociones con profundas redes neuronales convolucionales. Estoy usando elCafe marco para implementar las CNN.

Recientemente me he encontrado con un problema relacionado con el desequilibrio de clase. Estoy usando 9216 muestras de entrenamiento, aprox. 5% están etiquetados positivamente (1), las muestras restantes están etiquetadas negativamente (0).

Estoy usando elSigmoideCrossEntropyLoss capa para calcular la pérdida. Al entrenar, la pérdida disminuye y la precisión es extremadamente alta después de algunas épocas. Esto se debe al desequilibrio: la red simplemente siempre predice negativo (0).(La precisión y la recuperación son cero, respaldando esta afirmación)

Para resolver este problema, me gustaríaescalar la contribución a la pérdida dependiendo de la combinación predicción-verdad (castigar severamente los falsos negativos). Mi mentor / entrenador también me ha aconsejadousar un factor de escala al propagar hacia atrás a través del descenso de gradiente estocástico (sgd): el factor estaría correlacionado con el desequilibrio en el lote. Un lote que contiene solo muestras negativas no actualizaría los pesos en absoluto.

Solo he agregado una capa personalizada a Caffe: para informar otras métricas como precisión y recuperación. Mi experiencia con el código Caffe es limitada, pero tengo mucha experiencia escribiendo código C ++.

¿Alguien podría ayudarme o señalarme en la dirección correcta sobre cómo ajustar elSigmoideCrossEntropyLoss ySigmoideo capas para acomodar los siguientes cambios:

ajustar la contribución de una muestra a la pérdida total dependiendo de la combinación predicción-verdad (verdadero positivo, falso positivo, verdadero negativo, falso negativo).escale la actualización de peso realizada por el descenso de gradiente estocástico dependiendo del desequilibrio en el lote (negativos versus positivos).

¡Gracias por adelantado!

Actualizar

He incorporado elInfogainLossLayer como lo sugiereShai. También he agregado otra capa personalizada que construye la matriz infogainH basado en el desequilibrio en el lote actual.

Actualmente, la matriz está configurada de la siguiente manera:

H(i, j) = 0          if i != j
H(i, j) = 1 - f(i)   if i == j (with f(i) = the frequency of class i in the batch)

Estoy planeando experimentar con diferentes configuraciones para la matriz en el futuro.

He probado esto en un desequilibrio 10: 1. Los resultados han demostrado que la red está aprendiendo cosas útiles ahora:(resultados después de 30 épocas)

La precisión es de aprox. ~ 70% (por debajo de ~ 97%);La precisión es de aprox. ~ 20% (en lugar de 0%);El retiro es de aprox. ~ 60% (en lugar de 0%).

Estos números se alcanzaron alrededor de las 20 épocas y no cambiaron significativamente después de eso.

!! Los resultados indicados anteriormente son meramente una prueba de concepto, se obtuvieron al entrenar una red simple en un conjunto de datos desequilibrado 10: 1. !!

Respuestas a la pregunta(2)

Su respuesta a la pregunta