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

Los problemas de clasificación, como la regresión logística o la regresión logística multinomial, optimizan la pérdida de entropía cruzada . Normalmente, la capa de entropía cruzada sigue la capa de softmax , que produce la 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

¿Cuáles funcionan solo para la clasificación binaria y cuáles son adecuados para problemas de clase múltiple? ¿Cuándo debe usar softmax lugar de softmax ? ¿En qué se diferencian las funciones sparse de las demás y por qué es solo softmax ?

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

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. Ambas realizan la misma operación: transforman los logits (ver a continuación) en probabilidades.

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

  • Un logit (también llamado puntaje) es un valor bruto sin escalar asociado con una clase , antes de calcular la probabilidad. En términos de architecture de neural network, esto significa que un logit es una salida de una capa densa (completamente conectada).

    La denominación de Tensorflow es un poco extraña: todas las funciones siguientes aceptan logits, no probabilidades , y aplican la transformación ellos mismos (que es simplemente más eficiente).

Familia de funciones sigmoideas

  • tf.nn.sigmoid_cross_entropy_with_logits
  • tf.nn.weighted_cross_entropy_with_logits
  • tf.losses.sigmoid_cross_entropy
  • tf.contrib.losses.sigmoid_cross_entropy (DEPRECATED)

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 multi-etiqueta, cuando las clases son independientes. En otras palabras, tf.nn.sigmoid_cross_entropy_with_logits resuelve N clasificaciones binarias a la vez.

Las tags deben estar codificadas en caliente o pueden contener probabilidades de clases suaves.

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

Funciones de la familia Softmax

  • tf.nn.softmax_cross_entropy_with_logits (DEPRECATED IN 1.5)
  • tf.nn.softmax_cross_entropy_with_logits_v2
  • tf.losses.softmax_cross_entropy
  • tf.contrib.losses.softmax_cross_entropy (DEPRECATED)

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

Las tags deben estar codificadas en caliente o pueden contener probabilidades de clase blandas: un ejemplo particular puede pertenecer a la clase A con un 50% de probabilidad y la clase B con un 50% de probabilidad. Tenga en cuenta que estrictamente hablando no significa que pertenezca 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 dentro del lote , es decir, hacer que algunos ejemplos sean más importantes que otros. Hasta donde sé, a partir de tensorflow 1.3, no hay una forma incorporada para establecer los 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ó obsoleta. La única diferencia entre ellos es que en una versión más nueva, la retropropagación ocurre tanto en los logits como en las tags ( aquí hay una discusión sobre por qué esto puede ser útil).

Familia de funciones dispersas

  • tf.nn.sparse_softmax_cross_entropy_with_logits
  • tf.losses.sparse_softmax_cross_entropy
  • tf.contrib.losses.sparse_softmax_cross_entropy (DEPRECATED)

Al igual que el softmax común anterior, estas funciones de pérdida deberían usarse para una clasificación multinomial mutuamente exclusiva, es decir, elegir una de N clases. La diferencia está en la encoding de tags: las clases se especifican como enteros (índice de clase), no como vectores calientes. 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 que consume al menos [batch_size, classes] memory.

Al igual que en el caso anterior, la versión tf.losses tiene un argumento de weights que permite establecer los pesos en lotes.

Sampled funciones de la familia softmax

  • tf.nn.sampled_softmax_loss
  • tf.contrib.nn.rank_sampled_softmax_loss
  • tf.nn.nce_loss

Estas funciones proporcionan otra alternativa para lidiar con 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 weights y biases argumentos especifican una capa separada completamente conectada que se utiliza para calcular los logits de una muestra elegida.

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

Las funciones de muestra solo son adecuadas para el entrenamiento. En el tiempo de prueba, se recomienda utilizar una pérdida de softmax estándar (escasa o una caliente) 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, consulte esta discusión muy detallada ). Incluí esta función en la familia de softmax, porque NCE garantiza la aproximación a softmax en el límite.

sin embargo, para la versión 1.5, se debe usar softmax_cross_entropy_with_logits_v2 su lugar, mientras usa su argumento con el argument key=... like following>

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