Funciones de pérdida de clasificación: intuición y aplicaciones |  de Ryan D’Cunha |  junio de 2024

Una forma más sencilla de comprender las derivaciones de funciones de pérdida para clasificación y cuándo y cómo aplicarlas en PyTorch

Fuente: GPT4o Generado

Ya sea que sea nuevo en la exploración de redes neuronales o un profesional experimentado, esta debería ser una lectura beneficiosa para obtener más intuición sobre las funciones de pérdida. Como alguien que prueba muchas funciones de pérdida diferentes durante el entrenamiento del modelo, me tropezaba con pequeños detalles entre las funciones. Pasé horas investigando una representación intuitiva de las funciones de pérdida a partir de libros de texto, artículos de investigación y videos. Quería compartir no solo la derivaciones eso me ayudó a comprender los conceptos, pero los errores comunes y los casos de uso para clasificación en PyTorch.

Antes de comenzar, debemos definir algunos términos básicos que usaré.

  • Conjunto de datos de entrenamiento: {xᵢ,yᵢ}
  • Función de pérdida: l[φ]
  • Salida de predicción del modelo F[xᵢ, φ] con parametros φ
  • La probabilidad condicional: Pr(y|x)
  • Distribución paramétrica: Pr(y|ω) con ω que representan parámetros de red para su distribución y

Primero volvamos a lo básico. Un pensamiento común es que las redes neuronales calculan una salida escalar del modelo. F[xᵢ, φ]. Sin embargo, la mayoría de las redes neuronales hoy en día están entrenadas para predecir parámetros de una distribución. y. (a diferencia de predecir el valor de y).

En realidad, una red generará una distribución de probabilidad condicional. Pr(y|x) sobre posibles resultados y. En otras palabras, cada punto de datos de entrada generará una distribución de probabilidad para cada salida. La red desea conocer los parámetros de la distribución de probabilidad y luego utilizar los parámetros y la distribución para predecir la salida.

La definición tradicional de función de pérdida es una función que compara los resultados previstos y previstos. Pero acabamos de decir que una salida bruta de la red es una distribución en lugar de una salida escalar, entonces, ¿cómo es posible?

Pensando en esto desde la vista que acabamos de definir, una función de pérdida empuja a cada yᵢ tener una mayor probabilidad en la distribución Pr(yᵢ|xᵢ). La parte clave para recordar es que nuestra distribución se utiliza para predecir el resultado real en función de los parámetros del resultado de nuestro modelo. En lugar de utilizar nuestra entrada xᵢ para la distribucion, podemos pensar en una distribución paramétrica Pr(y|ω) dónde ω representa parámetros de distribución de probabilidad. Todavía estamos considerando la entrada, pero habrá una diferente. ωᵢ = f[xᵢ, φ] para cada xᵢ.

Nota: Para aclarar un concepto confuso, φ representa los parámetros del modelo y ω representa los parámetros de distribución de probabilidad

GRAMOVolviendo a la definición tradicional de función de pérdida, necesitamos obtener un resultado que podamos usar del modelo. De nuestra distribución de probabilidad, parece lógico tomar φ que produce la mayor probabilidad para cada xᵢ. Por lo tanto, necesitamos el conjunto φ que produce la mayor probabilidad en todos los puntos de entrenamiento I (todas las derivaciones están adaptadas de Understanding Deep Learning) [1]):

Maximizar los parámetros de las distribuciones de probabilidad del modelo de salida [1]

Multiplicamos las probabilidades generadas de cada distribución para encontrar φ que produce la probabilidad máxima (llamada máxima probabilidad). Para ello, debemos suponer que los datos son independientes y se distribuyen de forma idéntica. Pero ahora nos encontramos con un problema: ¿qué pasa si las probabilidades son muy pequeñas? El resultado de nuestra multiplicación se acercará a 0 (similar a un problema de gradiente evanescente). Además, es posible que nuestro programa no pueda procesar números tan pequeños.

Para solucionar este problema, incorporamos un logarítmico. ¡función! Utilizando las propiedades de los registros, podemos sumar nuestras probabilidades en lugar de multiplicarlas. Sabemos que el logaritmo es una función que aumenta monótonamente, por lo que el registro conserva y escala nuestra salida original.

Usar logaritmos para sumar probabilidades [1]

Lo último que necesitamos para obtener nuestra tradicional probabilidad logarítmica negativa es minimizar la salida. Actualmente estamos maximizando el resultado, así que simplemente multiplica por un negativo y toma el argumento mínimo (piensa en algunos ejemplos gráficos para convencerte de esto):

Logística de verosimilitud negativa [1]

Simplemente visualizando el resultado del modelo como una distribución de probabilidad, intentando maximizar φ eso crea la probabilidad máxima, y ​​aplicando un registro, ¡hemos obtenido una pérdida de probabilidad logarítmica negativa! Esto se puede aplicar a muchas tareas eligiendo una distribución de probabilidad lógica. A continuación se muestran ejemplos de clasificación comunes.

Si se pregunta cómo se genera una salida escalar a partir del modelo durante inferenciaes solo el máximo de la distribución:

Generar un resultado a partir de la inferencia [1]

Nota: Esto es sólo una derivación de la probabilidad logarítmica negativa. En la práctica, lo más probable es que también haya regularización en la función de pérdida.

Hasta este punto, derivamos una probabilidad logarítmica negativa. Es importante saberlo, pero se puede encontrar en la mayoría de los libros de texto o recursos en línea. Ahora, apliquemos esto a la clasificación para comprender su aplicación.

Nota al margen: Si está interesado en ver esto aplicado a la regresión, Comprender el aprendizaje profundo [1] tiene excelentes ejemplos con regresión univariada y una distribución gaussiana para derivar el error cuadrático medio

Clasificación binaria

El objetivo de la clasificación binaria es asignar una entrada X a una de las dos etiquetas de clase y ∈ {0, 1}. Usaremos la distribución de Bernoulli como nuestra distribución de probabilidad de elección.

Representación matemática de la distribución de Bernoulli. Imagen por autor

Esta es solo una forma elegante de decir la probabilidad de que la salida sea verdadera, pero la ecuación es necesaria para derivar nuestra función de pérdida. necesitamos el modelo F[x, φ] a la salida pag para generar la probabilidad de salida prevista. Sin embargo, antes de que podamos ingresar pag en Bernoulli, necesitamos que esté entre 0 y 1 (por lo que es una probabilidad). La función elegida para esto es una sigmoidea: σ(z)

Fuente: https://en.wikipedia.org/wiki/Sigmoid_function

Un sigmoide comprimirá la salida. pag entre 0 y 1. Por lo tanto, nuestra entrada a Bernoulli será pag = σ(F[x, φ]). Esto hace que nuestra distribución de probabilidad sea:

Nueva Distribución de Probabilidad con Sigmoide y Bernoulli. Imagen por autor

Volviendo a la similitud logarítmica negativa, obtenemos lo siguiente:

Entropía cruzada binaria. Imagen por autor

¿Parecer familiar? ¡Esta es la función de pérdida de entropía cruzada binaria (BCE)! La principal intuición al respecto es comprender por qué se utiliza un sigmoide. Tenemos una salida escalar y es necesario escalarla entre 0 y 1. Hay otras funciones capaces de hacer esto, pero la sigmoide es la más utilizada.

BCE en PyTorch

Al implementar BCE en PyTorch, hay algunos trucos a tener en cuenta. Hay dos funciones BCE diferentes en PyTorch: BCEPérdida() y BCEWithLogitsLoss(). Un error común (que he cometido) es intercambiar incorrectamente los casos de uso.

BCELoss(): Esta función de antorcha genera la pérdida CON LA SIGMOIDE APLICADA. La salida será una probabilidad.

BCEWithLogitsLoss(): La función de antorcha genera logits que son los salidas brutas del modelo. NO HAY SIGMOIDE APLICADO. Al usar esto, necesitará aplicar un antorcha.sigmoide() a la salida.

Esto es especialmente importante para Transfer Learning como modelo, incluso si sabe que el modelo está entrenado con BCE, asegúrese de usar el correcto. De lo contrario, aplica accidentalmente un sigmoide después de BCELoss(), lo que hace que la red no aprenda…

Una vez calculada una probabilidad utilizando cualquiera de las funciones, es necesario interpretarla durante la inferencia. La probabilidad es la predicción del modelo de la probabilidad de que sea verdadera (etiqueta de clase de 1). Se necesita establecer un umbral para determinar la probabilidad de corte de una etiqueta verdadera. p = 0,5 se usa comúnmente, pero es importante probar y optimizar diferentes probabilidades de umbral. Una buena idea es trazar un histograma de probabilidades de producción para ver la confianza de las producciones antes de decidir un umbral.

Clasificación multiclase

El objetivo de la clasificación multiclase es asignar una entrada X a uno de k > 2 etiquetas de clase y ∈ {1, 2,…, k}. Usaremos la distribución categórica como nuestra distribución de probabilidad de elección.

Distribución categórica. Imagen del autor

Esto es simplemente asignar una probabilidad para cada clase para un resultado determinado y todas las probabilidades deben sumar 1. Necesitamos el modelo F[x, φ] a la salida pag para generar la probabilidad de salida prevista. La cuestión de la suma surge como en la clasificación binaria. Antes de que podamos ingresar pag En Bernoulli, necesitamos que sea una probabilidad entre 0 y 1. Un sigmoide ya no funcionará ya que escalará la puntuación de cada clase a una probabilidad, pero no hay garantía de que todas las probabilidades sumen 1. Esto puede no ser evidente de inmediato. , pero se muestra un ejemplo:

Sigmoide no genera distribución de probabilidad en la clasificación multiclase. Imagen por autor

Necesitamos una función que pueda garantizar ambas restricciones. Para ello se elige un softmax. Un softmax es una extensión de un sigmoide, pero garantizará que todas las probabilidades sumen 1.

Función Softmax. Imagen por autor

Esto significa que la distribución de probabilidad es un softmax aplicado a la salida del modelo. La probabilidad de calcular una etiqueta. k: pr(y = k|x) = Sₖ(F[x, φ]).

Para derivar la función de pérdida para la clasificación multiclase, podemos conectar el softmax y la salida del modelo a la pérdida de probabilidad logarítmica negativa:

Entropía cruzada multiclase. Imagen del autor

Ésta es la derivación de la entropía cruzada multiclase. Es importante recordar que el único término que contribuye a la función de pérdida es la probabilidad de la clase verdadera. Si ha visto la entropía cruzada, está más familiarizado con una función con un pag(x) y q(x). Esto es idéntico a la ecuación de pérdida de entropía cruzada que se muestra donde pag(x) = 1 para la clase verdadera y 0 para todas las demás clases. q(x) es el softmax de la salida del modelo. La otra derivación de la entropía cruzada proviene del uso de KL Divergencia, y se puede alcanzar la misma función de pérdida tratando un término como una función delta de Dirac donde existen resultados verdaderos y el otro término como el resultado del modelo con softmax. Es importante señalar que ambas rutas conducen a la misma función de pérdida.

Entropía cruzada en PyTorch

A diferencia de la entropía cruzada binaria, solo hay una función de pérdida para la entropía cruzada en PyTorch. nn.CrossEntropyLoss devuelve la salida del modelo con el softmax ya aplicado. La inferencia se puede realizar tomando la salida del modelo softmax de mayor probabilidad (tomando la probabilidad más alta como se esperaría).

Estos fueron dos ejemplos de clasificación bien estudiados. Para una tarea más compleja, puede llevar algún tiempo decidir sobre una función de pérdida y una distribución de probabilidad. Hay muchos gráficos que relacionan las distribuciones de probabilidad con las tareas previstas, pero siempre hay espacio para explorar.

Para determinadas tareas, puede resultar útil combinar funciones de pérdida. Un caso de uso común para esto es en una tarea de clasificación donde puede ser útil combinar una [binary] Pérdida de entropía cruzada con una pérdida de coeficiente de Dice modificado. La mayoría de las veces, las funciones de pérdida se sumarán y escalarán mediante algún hiperparámetro para controlar la contribución de cada función individual a la pérdida.