ML/AI/SW Developer

Negative log likelihood Loss with pytorch

1. NLL loss란?

  • Softmax의 출력에 $-log$ 를 적용해서 만드는 loss
  • 의미?
    • 일반적으로 softmax를 취했을 때, 해당 클래스일 logit값이 높을 수록 더 큰 값을 가진다. 아래 보이는 예시와 같이 logit 값이 1.4 일 때, softmax를 취한 값이 -0.6453이고, 0.5일때 -1.1724인 것을 확인 할 수 있다.

      여기에 $-log(v)$ 를 취한 것이 NLL loss 이다. 아래 결과에서 볼수 있듯이 원하는 타겟인 0(torch.zeros로 타겟을 주었기 때문에)번 인덱스에 있는 값에 -를 취한 값이 로스가 되는 것을 볼 수 있다.

      즉, logit값이 높으면 softmax값이 커지고, 그러면 nll loss 값이 작아진다. 이말은 nll loss를 최소화 하면 logit값을 높일 수 있다는 말이 된다!
      결과 적으로 nll loss를 최소화하는 것으로 분류 문제의 loss로 사용할 수 있다!

2. pytorch에서 활용하기!

  • pytorch NLL loss는 아래와 같이 두개의 방법으로 호출이 가능하다. 두개의 차이는 무엇일까?
    • functional의 경우 이름 그대로 함수이다.
    • NLL loss는 클래스이다.
    • 즉, 아래 사용법과 같이 클래스는 인스턴스화를 시키고 사용할 수 있지만 함수의 경우 이러한 과정이 필요가 없다.
import torch.nn.functional as F
import torch.nn as nn

tensors = torch.tensor([[1.4, 0.1, 0.2, 0.3],
                        [0.5, 0.1, 0.2, 0.3]])
targets = torch.zeros(2).long()

print(F.log_softmax(tensors))
print(nn.LogSoftmax(tensors))

print(F.nll_loss(tensors, targets))
print(nn.NLLLoss()(tensors, targets))

3. 유사도 높이기