소프트맥스(softmax) 함수는 k차원 벡터의 입력값들을 0과 1 사이의 값으로 변환하여, k개의 다른 클래스 각각에 대한 확률 추정치를 제공한다. 이때, 변환된 출력값들의 합은 1이 됩니다. k차원 벡터에서 i번째 요소를 x_i로 표시할 경우, 소프트맥스 함수를 사용하여 i번째 클래스가 정답일 확률을 계산할 수 있다.
PyTorch에서 소프트맥스 함수를 사용하고자 한다면, torch.nn.functional 모듈을 불러올 수 있으며, 사용법은 다음과 같다.
torch.nn.functional.softmax(input, dim=None, _stacklevel=3, dtype=None)
사용예시
import torch.nn.functional as torchfn
import torch
dataset = torch.randn(4)
print(dataset)
print(torchfn.softmax(dataset, dim=0))
print(torchfn.softmax(dataset, dim=0).sum())
로그 소프트맥스(LogSoftmax)는 소프트맥스 함수에 로그를 적용한 변형으로, 소프트맥스의 활용을 개선하기 위해 도입되었다. 소프트맥스 함수를 사용할 때 발생할 수 있는 기울기 소실(Vanishing Gradients) 문제에 대응하기 위해 사용된다. 딥러닝 학습 과정에서 이러한 문제를 완화하는 데 도움을 주며, 로그 소프트맥스를 활용하면 곱셈과 나눗셈 연산을 덧셈과 뺄셈으로 변환할 수 있다. 이는 로그-합-지수(log-sum-exp) 트릭으로 알려져 있으며, 계산을 수행할 때 수치적으로 더 안정적인 결과를 얻을 수 있는 이점을 제공한다.
PyTorch에서 로그 소프트맥스 함수를 사용하려면 torch.nn.functional 모듈을 사용하며, 함수의 사용 방법은 다음과 같다.
torch.nn.LogSoftmax(dim=None)
사용예시
dataset = torch.randn(4)
print(dataset)
print(torchfn.softmax(dataset, dim=0)) # softmax
print(torchfn.log_softmax(dataset, dim=0)) # log_softmax
print(torch.exp(torchfn.log_softmax(dataset, dim=0))) # 로그 소프트맥스에 exp()를 하면, 소프트맥스와 같음. 이는 로그와 지수 함수가 서로의 역함수이기 때문
출력을 처리할때 마지막에 log_softmax를 쓰면 nn.NLLLoss를 이용하여 처리하여야한다.
크로스 엔트로피 손실(Cross Entropy Loss)은 LogSoftmax+NLLLoss 두 단계를 내부적으로 결합한 것과 같기 때문이다.