machine-learning tensorflow neural-network logistic-regression cross-entropy

machine learning - ¿Cómo elegir la pérdida de entropía cruzada en tensorflow?



machine-learning neural-network (2)

Hechos preliminares

  • En sentido funcional, el sigmoide es un caso parcial de la función softmax , cuando el número de clases es igual a 2. Ambos realizan la misma operación: transformar los logits (ver más abajo) en probabilidades.

    En la clasificación binaria simple, no hay una gran diferencia entre los dos, sin embargo, en el caso de la clasificación multinomial, sigmoid permite tratar con etiquetas no exclusivas (también conocidas como etiquetas múltiples ), mientras que softmax trata con clases exclusivas (ver más abajo).

  • Un logit (también llamado puntaje) es un valor sin escala asociado con una clase , antes de calcular la probabilidad. En términos de arquitectura de red neuronal, esto significa que un logit es una salida de una capa densa (totalmente conectada).

    El nombramiento de Tensorflow es un poco extraño: todas las funciones a continuación aceptan logits, no probabilidades , y aplican la transformación en sí (que es simplemente más eficiente).

Familia de funciones sigmoideas

Como se indicó anteriormente, la función de pérdida sigmoid es para la clasificación binaria. Pero las funciones de tensorflow son más generales y permiten hacer una clasificación de etiquetas múltiples, cuando las clases son independientes. En otras palabras, tf.nn.sigmoid_cross_entropy_with_logits resuelve N clasificaciones binarias a la vez.

Las etiquetas deben estar codificadas en caliente o pueden contener probabilidades de clase blanda.

tf.losses.sigmoid_cross_entropy además permite establecer los pesos en lote , es decir, hacer que algunos ejemplos sean más importantes que otros. tf.nn.weighted_cross_entropy_with_logits permite establecer pesos de clase (recuerde, la clasificación es binaria), es decir, hacer que los errores positivos sean más grandes que los negativos. Esto es útil cuando los datos de entrenamiento no están equilibrados.

Familia de funciones Softmax

Estas funciones de pérdida deben usarse para la clasificación multinomial mutuamente excluyente, es decir, elegir una de las N clases. También aplicable cuando N = 2 .

Las etiquetas deben estar codificadas en caliente o pueden contener probabilidades de clase blanda: un ejemplo particular puede pertenecer a la clase A con 50% de probabilidad y clase B con 50% de probabilidad. Tenga en cuenta que, estrictamente hablando, no significa que pertenece a ambas clases, pero uno puede interpretar las probabilidades de esta manera.

Al igual que en la familia sigmoid , tf.losses.softmax_cross_entropy permite establecer los pesos en lote , es decir, hacer que algunos ejemplos sean más importantes que otros. Hasta donde yo sé, a partir de tensorflow 1.3, no hay una forma integrada de establecer pesos de clase .

[UPD] En tensorflow 1.5, se introdujo la versión v2 y la pérdida original de softmax_cross_entropy_with_logits quedó en desuso. La única diferencia entre ellos es que en una versión más nueva, la propagación hacia atrás ocurre tanto en logits como en etiquetas ( aquí hay una discusión sobre por qué esto puede ser útil).

Familia de funciones dispersas

Al igual que el softmax ordinario anterior, estas funciones de pérdida deben usarse para la clasificación multinomial mutuamente excluyente, es decir, elegir una de las N clases. La diferencia está en la codificación de etiquetas: las clases se especifican como enteros (índice de clase), no como vectores de un solo hot. Obviamente, esto no permite clases suaves, pero puede ahorrar algo de memoria cuando hay miles o millones de clases. Sin embargo, tenga en cuenta que el argumento logits aún debe contener logits por cada clase, por lo tanto, consume al menos [batch_size, classes] .

Al igual que arriba, la versión tf.losses tiene un argumento de weights que permite establecer los pesos en lote.

Familia de funciones softmax muestreadas

Estas funciones proporcionan otra alternativa para tratar con una gran cantidad de clases. En lugar de calcular y comparar una distribución de probabilidad exacta, calculan una estimación de pérdida a partir de una muestra aleatoria.

Los argumentos weights y biases especifican una capa separada completamente conectada que se utiliza para calcular los logits para una muestra elegida.

Al igual que arriba, las labels no están codificadas en caliente, sino que tienen la forma [batch_size, num_true] .

Las funciones muestreadas solo son adecuadas para el entrenamiento. En el tiempo de prueba, se recomienda utilizar una pérdida de softmax estándar (ya sea escasa o de un solo calor) para obtener una distribución real.

Otra pérdida alternativa es tf.nn.nce_loss , que realiza una estimación de contraste de ruido (si está interesado, vea esta discusión muy detallada ). He incluido esta función en la familia softmax, porque NCE garantiza una aproximación a softmax en el límite.

Los problemas de clasificación, como la regresión logística o la regresión logística multinomial, optimizan una pérdida de entropía cruzada . Normalmente, la capa de entropía cruzada sigue a la capa softmax , que produce una distribución de probabilidad.

En Tensorflow, hay al menos una docena de diferentes funciones de pérdida de entropía cruzada :

  • tf.losses.softmax_cross_entropy
  • tf.losses.sparse_softmax_cross_entropy
  • tf.losses.sigmoid_cross_entropy
  • tf.contrib.losses.softmax_cross_entropy
  • tf.contrib.losses.sigmoid_cross_entropy
  • tf.nn.softmax_cross_entropy_with_logits
  • tf.nn.sigmoid_cross_entropy_with_logits
  • ...

¿Qué funciona solo para la clasificación binaria y cuáles son adecuados para problemas de varias clases? ¿Cuándo debe usar softmax lugar de softmax ? ¿En qué se diferencian las funciones sparse de otras y por qué es solo softmax ?

Discusión relacionada (más orientada a las matemáticas): selva de entropía cruzada .


sin embargo, para la versión 1.5, softmax_cross_entropy_with_logits_v2 debe usarse en su lugar, mientras usa su argumento con la argument key=... como sigue>

softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,/ logits = my_prediction, dim=-1, name=None)