wake-up-neo.com

Kreuz Entropie in PyTorch

Ich bin etwas verwirrt über den Entropieverlust in PyTorch.

Betrachten Sie dieses Beispiel:

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)

Ich würde erwarten, dass der Verlust 0 ist. Aber ich bekomme:

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

Soweit ich weiß, kann die Kreuzentropie folgendermaßen berechnet werden:

 enter image description here

Aber sollte das Ergebnis nicht 1 * log (1) = 0 sein?

Ich habe verschiedene Eingaben wie One-Hot-Kodierungen ausprobiert, aber das funktioniert überhaupt nicht, daher scheint die Eingabeform der Verlustfunktion in Ordnung zu sein.

Ich wäre wirklich dankbar, wenn mir jemand helfen könnte und mir sagen würde, wo mein Fehler liegt.

Danke im Voraus!

8
blue-phoenox

In Ihrem Beispiel behandeln Sie die Ausgabe [0,0,0,1] als Wahrscheinlichkeiten, wie sie die mathematische Definition der Kreuzentropie erfordert. PyTorch behandelt sie jedoch als Ausgaben, die nicht zu 1 summiert werden müssen und zuerst in Wahrscheinlichkeiten umgewandelt werden müssen, für die die Softmax-Funktion verwendet wird.

So wird H (p, q) zu H (p, softmax (Ausgabe)). Übersetzen der Ausgabe [0,0,0,1] in Wahrscheinlichkeiten: Softmax [0,0,0,1] = [0,1749,0.1749,0.1749,0.4754] Wherece -log (0,4754) = 0,7437 

21
Old Dog

Ihr Verständnis ist richtig, aber pytorch berechnet cross Entropy nicht auf diese Weise. Pytorch verwendet die folgende Formel.

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

Da in Ihrem Szenario x = [0, 0, 0, 1] und class = 3, wenn Sie den obigen Ausdruck auswerten, erhalten Sie Folgendes:

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

Pytorch betrachtet den natürlichen Logarithmus.

12
Wasi Ahmad

Ich möchte einen wichtigen Hinweis hinzufügen, da dies oft zu Verwirrung führt.

Softmax ist keine Verlustfunktion und auch keine Aktivierungsfunktion. Es hat eine sehr spezifische Aufgabe: Es wird für die Klassifizierung in mehreren Klassen verwendet, um die Bewertungen für die angegebenen Klassen zu normalisieren. Dadurch erhalten wir Wahrscheinlichkeiten für jede Klasse, die sich zu 1 summieren.

Softmax wird mit Cross-Entropy-Loss kombiniert, um den Verlust eines Modells zu berechnen.

Da diese Kombination so häufig ist, wird sie oft abgekürzt. Einige verwenden den Begriff Softmax-Loss, während PyTorch nur Cross-Entropy-Loss nennt.

1
oezguensi