Posteriormente a consultar con especialistas en esta materia, programadores de diversas ramas y maestros hemos dado con la solución a la cuestión y la compartimos en este post.
Solución:
En su ejemplo, está tratando la salida [0, 0, 0, 1]
como las probabilidades requeridas por la definición matemática de entropía cruzada. Pero PyTorch los trata como salidas, que no necesitan sumar 1
y deben convertirse primero en probabilidades para las que utiliza la función softmax.
Entonces H(p, q)
se convierte en:
H(p, softmax(output))
Traducir la salida [0, 0, 0, 1]
en probabilidades:
softmax([0, 0, 0, 1]) = [0.1749, 0.1749, 0.1749, 0.4754]
De dónde:
-log(0.4754) = 0.7437
Su comprensión es correcta pero pytorch no calcula entropía cruzada de ese modo. Pytorch utiliza la siguiente fórmula.
loss(x, class) = -log(exp(x[class]) / (sum_j exp(x[j])))
= -x[class] + log(sum_j exp(x[j]))
Dado que, en su escenario, x = [0, 0, 0, 1]
y class = 3
si evalúa la expresión anterior, obtendría:
loss(x, class) = -1 + log(exp(0) + exp(0) + exp(0) + exp(1))
= 0.7437
Pytorch considera el logaritmo natural.
Me gustaría agregar una nota importante, ya que esto a menudo genera confusión.
Softmax no es una función de pérdida, ni es realmente una función de activación. Tiene una tarea muy específica: se utiliza para la clasificación de clases múltiples para normalizar los puntajes de las clases dadas. Al hacerlo, obtenemos probabilidades para cada clase que suman 1.
Softmax se combina con Cross-Entropy-Loss para calcular la pérdida de un modelo.
Desafortunadamente, debido a que esta combinación es tan común, a menudo se abrevia. Algunos están usando el término Softmax-pérdidamientras que PyTorch lo llama solo Pérdida de entropía cruzada.
Reseñas y puntuaciones
Recuerda compartir esta división si te fue útil.