PyTorch – Lösung zur Modellierung des Trainingsverlust-NaN-Problems (Loss).

Willkommen, um meinem CSDN zu folgen: https://spike.blog.csdn.net/Diese
Artikeladresse: https://spike.blog.csdn.net/article/details/133378367

Wenn während des Modelltrainings das NaN-Problem auftritt, wirkt es sich ernsthaft auf den Backpropagation-Prozess des Verlusts aus. Daher müssen für die Verarbeitung einige kleine Werte hinzugefügt werden, um eine Beeinträchtigung der Trainingsergebnisse des Modells zu vermeiden.

Beispielsweise führt der Kreuzentropieverlust sigmoid_cross_entropy, einschließlich der Logarithmusfunktion (Log), zu einem Überlauf, wenn die Eingabe bei der Berechnung des Log-Werts 0 ist. Daher muss eine Mindestwertbeschränkung (z. B. 1e-8) hinzugefügt werden, um einen Überlauf zu vermeiden .

Kreuzentropieformel:

L ( y , y ^ ) = − 1 N ∑ i = 1 N [ yi log ⁡ ( y ^ i ) + ( 1 − yi ) log ⁡ ( 1 − y ^ i ) ] L(y, \hat{y} ) = -\frac{1}{N} \sum_{i=1}^N [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) ]L ( y ,j^)=N1ich = 1N[ jichlo g (j^ich)+( 1jich)lo g ( 1j^ich)]

Log-Kurve:

Protokoll

Im Augenblick:

# 额外增加 eps,可以避免数值溢出
def sigmoid_cross_entropy(logits, labels, eps=1e-8):
    logits = logits.float()
    log_p = torch.log(torch.sigmoid(logits)+eps)
    log_not_p = torch.log(torch.sigmoid(-logits)+eps)
    loss = -labels * log_p - (1 - labels) * log_not_p
    return loss

Die Sigmoid-Kreuzentropie ist eine häufig verwendete Verlustfunktion, mit der der Unterschied zwischen den Vorhersageergebnissen des Modells und den tatsächlichen Bezeichnungen bei binären Klassifizierungsproblemen gemessen wird. Ihre Funktion besteht darin, die Parameter des Modells zu optimieren, damit das Modell besser an die Daten angepasst werden kann Verbessern Sie die Genauigkeit der Klassifizierung. Genauigkeit.

Beispiel: So beheben Sie den Verlust, der durch die Verwendung von Torch.log() verursacht wird.

おすすめ

転載: blog.csdn.net/u012515223/article/details/133378367