es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La entropía cruzada produce resultados diferentes para vectores con distribuciones idénticas.

Estoy entrenando una red neuronal para distinguir entre tres clases. Naturalmente, opté por la función de pérdida CrossEntropyLoss de PyTorch. Durante la experimentación, me di cuenta de que la pérdida era significativamente mayor cuando se colocaba una capa de Softmax al final del modelo. Así que decidí experimentar más:

import torch
from torch import nn

pred1 = torch.Tensor([[0.1, 0.2, 0.7]])
pred2 = torch.Tensor([[1, 2, 7]])
pred_3 = torch.Tensor([[2, 4, 14]])
true = torch.Tensor([2]).long()

loss = nn.CrossEntropyLoss()

print(loss(pred1, true))
print(loss(pred2, true))
print(loss(pred_3, true))

El resultado de este código es el siguiente:

0.7679
0.0092
5.1497e-05

También probé qué sucede cuando se multiplica la entrada por una constante.

Imagen de pérdidas para diferentes multiplicadores

Varias fuentes (1, 2) afirmaron que la función de pérdida ya incluye una capa de softmax, pero si ese fuera el caso, esperaría que todos los ejemplos anteriores devolvieran la misma pérdida, lo cual claramente no es el caso.

Esto plantea la siguiente pregunta: si las salidas más grandes conducen a una pérdida menor, ¿no optimizaría la red para generar valores más grandes, sesgando así las curvas de pérdida? Si es así, parece que una capa de Softmax solucionaría esto. Pero dado que esto resulta en una pérdida globalmente mayor, ¿cuán útil sería realmente la pérdida resultante?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Explicación sobre CrossEntropyLoss y Softmax en PyTorch

    La función CrossEntropyLoss en PyTorch incluye una función LogSoftmax en su cálculo, la cual aplica la transformación Log a la función Softmax. La función Softmax aplica la función exponencial a la salida de la red neuronal para normalizar los valores en una distribución de probabilidad. La transformación Log evita la inestabilidad numérica y facilita el cálculo de los gradientes durante la retropropagación.

    Durante la experimentación, se observó que al agregar una capa Softmax después de la última capa de la red neuronal, se obtuvo una pérdida más alta. Esto puede deberse a que la función CrossEntropyLoss ya incluye la transformación LogSoftmax, por lo que agregar otra capa Softmax distorsionaría aún más las probabilidades predichas. En otras palabras, agregar una capa Softmax provocaría una doble normalización.

    El resultado del código proporcionado muestra que cuanto más segura es la predicción, menor será la pérdida. Esto es esperado porque CrossEntropyLoss compara la distribución de probabilidad predicha con la clase real codificada en one-hot utilizando la pérdida de log-verosimilitud negativa.

    Agregar una capa Softmax después de la última capa de la red neuronal podría hacer que la red se optimice para producir valores más grandes, pero no necesariamente ayudaría a mejorar la precisión del modelo. También podría llevar a un estancamiento en la pérdida si los valores de salida se vuelven demasiado grandes o demasiado pequeños, ya que la función Softmax se satura cuando los valores de salida son extremos. Es mejor utilizar CrossEntropyLoss sin capas Softmax adicionales para evitar la doble normalización y permitir que el modelo aprenda los valores de salida más óptimos por sí mismo.

Comments are closed.