web-dev-qa-db-fra.com

Entropie croisée dans PyTorch

Je suis un peu dérouté par la perte d'entropie croisée dans PyTorch.

Considérant cet exemple:

import torch
import torch.nn as nn
from torch.autograd import Variable

output = Variable(torch.FloatTensor([0,0,0,1])).view(1, -1)
target = Variable(torch.LongTensor([3]))

criterion = nn.CrossEntropyLoss()
loss = criterion(output, target)
print(loss)

Je m'attendrais à ce que la perte soit de 0. Mais je reçois:

Variable containing:
 0.7437
[torch.FloatTensor of size 1]

Pour autant que je sache, l'entropie croisée peut être calculée comme suit:

 enter image description here

Mais ne devrait pas être le résultat alors 1 * log (1) = 0?

J'ai essayé différentes entrées, telles que l'encodage one-hot, mais cela ne fonctionne pas du tout. Il semble donc que la forme de l'entrée de la fonction de perte est correcte.

Je serais vraiment reconnaissant si quelqu'un pouvait m'aider et me dire où est mon erreur.

Merci d'avance!

8
blue-phoenox

Dans votre exemple, vous traitez la sortie [0,0,0,1] comme une probabilité, comme l'exige la définition mathématique de l'entropie croisée. Mais PyTorch les traite comme des sorties, qu’il n’est pas nécessaire d’ajouter à 1, mais qu’il faut d’abord convertir en probabilités pour lesquelles il utilise la fonction softmax.

Donc H (p, q) devient H (p, softmax (sortie)). Conversion de la sortie [0,0,0,1] en probabilités: Softmax [0,0,0,1] = [0,1749,0.1749,0.1749,0.4754]

21
Old Dog

Votre compréhension est correcte mais pytorch ne calcule pas entropie croisée de cette façon. Pytorch utilise la formule suivante.

loss(x, class) = -log(exp(x[class]) / (\sum_j exp(x[j])))
               = -x[class] + log(\sum_j exp(x[j]))

Puisque, dans votre scénario, x = [0, 0, 0, 1] et class = 3, si vous évaluez l'expression ci-dessus, vous obtiendrez:

loss(x, class) = -1 + log(exp(0) + exp(0) + exp(0) + exp(1))
               = 0.7437

Pytorch considère le logarithme naturel.

12
Wasi Ahmad

Je voudrais ajouter une note importante, car cela conduit souvent à la confusion.

Softmax n'est pas une fonction de perte , ni une fonction d'activation. Sa tâche est très spécifique: il est utilisé pour la classification multi-classes afin de normaliser les scores des classes données. Ce faisant, nous obtenons pour chaque classe des probabilités dont le total est égal à 1 .

Softmax est combiné à Cross-Entropy-Loss pour calculer la perte d'un modèle.

Malheureusement, cette combinaison étant si courante, elle est souvent abrégée. Certains utilisent le terme Softmax-Loss , alors que PyTorch l'appelle uniquement Cross-Entropy-Loss .

1
oezguensi