Last Updated on 2021-05-25 by Clay
NLLLoss 是一個常用於多分類(Multi-classes Classification)任務的 Loss function,其意義為將 『Softmax』 過後的機率值『取 Log』並將正確答案的『機率值』加總取平均。
基本上,這種 Loss function 是越低越好,我們也可以經過實際的使用來發現,基本上機率值高的選項與我們的『標準答案』越一致,Loss 的確就會越小。
import torch import torch.nn as nn softmax = nn.LogSoftmax(dim=1) input = torch.tensor([[-0.1, 0.2, -0.3, 0.4], [0.5, -0.6, 0.7, -0.8], [-0.9, 0.1, -0.11, 0.12]]) output = softmax(input) print(output)
Output:
tensor([[-1.5722, -1.2722, -1.7722, -1.0722],
[-1.0391, -2.1391, -0.8391, -2.3391],
[-2.1627, -1.1627, -1.3727, -1.1427]])
這裡我隨機設定了我們的 input,基本上數值越高代表選擇那個參數的機率越高——我們可以從下面的 LogSoftmax 的 output 看出這樣的趨勢。
然後我們假設標準答案為 (1, 2, 3),也就是我們選擇的機率分佈為: -1.2722, -0.8391, -1.1427 這 3 者。
然後我們來計算 NLLLoss 的值,就如同我剛才所說,將其去掉負號、加總取平均即可。
print((1.2722+0.8391+1.1427)/3)
Output:
1.0846666666666667
然後我們再拿 PyTorch 裡面內建的 nn.NLLLoss() 來確認。
nll = nn.NLLLoss() target = torch.tensor([1, 2, 3]) print(nll(output, target))
Output:
tensor(1.0847)
可以看到結果是符合的。 NLLLoss 就是這麼個適合多分類的 Loss function。