Skip to content

[Machine Learning] NLLLoss 函式介紹與程式實作

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。


References


Read More

Leave a Reply