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
-
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 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
-
tf.nn.softmax_cross_entropy_with_logits
(DEPRECADO EN 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 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
-
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
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)