[PyTorch] nn.Softmax()

olxtar·2022년 3월 28일
0

SOFTMAX

CLASS torch.nn.Softmax(dim=None)

Applies the Softmax function to an n-dimensional input Tensor rescaling them so that the elements of the n-dimensional output Tensor lie in the range [0,1] and sum to 1.

n차원 Input Tensor에 대해 Softmax function을 적용시킨다.
Output Tensor는 Input Tensor와 같은 shape에 모든 값들은 0~1사이 값이며, (dim에 따라) sum 값이 1이 된다.

참고 : Softmax-PyTorch Documentation



Softmax(xi)=exinexnSoftmax(x_i)=\frac{e^{x_i}}{\sum_n e^{x_n}}

xx : input = input score
nn : input의 개수 Index = input score의 개수




왜 이런짓을 하느냐?
우리는 Activation Function을 통해서 Line Equation을 통해 생성된 Score 값을 어떤 확률 로 변환시키고 싶어하였다. (보통 사용되었던 Activation Function은 바로 Sigmoid fucntion! in binary classification)

우리가 계산하고자 하는 Output Classification의 개수 즉, Class의 개수가 여러개 일때 사용하는 것이 바로 Softmax function으로 어떤 Score값 (아무값이나 나올 수 있잖아!)에 대해서 각 Class일 확률을 뽑아낼 수 있다.

Socre 한개에 대해서 Class1일 확률, Class2일 확률, \dots ClassN일 확률이 나온다치면 모두 다 값이 0~1이어야하고 모두 다 더했을 때 당연히 1이 나와야한다.
ex) 고양이일 확률 70%, 강아지일 확률 20%, 코끼리일 확률 10%, 모두 다 더하면 100%

그런데 Score값은 앞서 말했듯이 음수도 나올 수 있으므로...

  1. ee를 씌워서 모두 양수 positive(+)로 만든다.
  2. e\sum e로 나눠주어서 비율로 만들어준다.

Natural Exponential Function의 특징
1. 모든 input xx에 대해서 output yypositive(+)
2. 도함수가 같음 즉, y=y=exy=y^\prime=e^x (미분이 편함~)
2-1. 따라서 input xx가 0일때 output y=1y=1,     y=1\;\;y^\prime=1
2-2. 따라서 input xx가 1일때 output y=ey=e,     y=e\;\;y^\prime=e

참고 : Natural Exponential Function




Code

import torch
from torch import nn

a = torch.tensor( [1,2,4,3,5,5], dtype=torch.float32)
a = a.view(3,2)
print(a)
print(a.shape)

tensor([[1., 2.],
        [4., 3.],
        [5., 5.]])
torch.Size([3, 2])

먼저 Row별로 합했을 때 1이 되는 (3,2) size의 Tensor를 생성하자.






softmax = nn.Softmax(dim=0)
softmax_a = softmax(a)
print(softmax_a)

tensor([[0.0132, 0.0420],
        [0.2654, 0.1142],
        [0.7214, 0.8438]])

그 다음 nn.Softmax() function을 생성해서 a input tensor를 넣어주자.
dim=0이라는 뜻은... Row라는 뜻이고, Row들을 기준으로 Softmax 계산을 해주겠다는 말이다. 이게 좀 헷갈리는데 Row들끼리의~, 행들끼리의~, Row들만의~ 뭐 이런식으로 기억해주자!






softmax_a.sum(dim=0)               # Row들 끼리의 합을 구해줘
  
tensor([1., 1.])

Row들 끼리의 Softmax연산을 했으므로 Row들 끼리의 합이 1임을 볼 수 있다.

profile
예술과 기술

0개의 댓글