[pytorch] softmax(소프트맥스)에 temperature scaling 사용코드 구현



안녕하세요. 이번에는 softmax(소프트맥스)에 temperature scaling을 적용하는 것의 의미를 알려드리고 적용해보겠습니다.그리고 temperature scaling을 위한 softmax 함수를 구현해서 공유하겠습니다. softmax에 대해서는 이미 아신다는 것을 가정하고 설명을 드리겠습니다. 몰라도 이해는 가능할 것이에요. 그러면 temperature scaling을 이용한 softmax에 대해 알아보고 구현해 보도록 하겠습니다.

[pytorch] softmax(소프트맥스)에 temperature scaling 사용코드 구현

이번글에서 다루게 될 내용은 아래와 같습니다. 차분히 알아보도록 하죠.

목차

softmax(소프트 맥스)란?

softmax에서 temperature란?

temperature 고려한 softmax 코드구현

temperature에 따른 softmax 값 변화

softmax(소프트 맥스)란?

먼저 소프트 맥스에 대해 알아보겠습니다. softmax 는 함수이죠. d dimension을 갖는 벡터 $\mathbf{x}=(x_1,…,x_d)$이 있다고 합시다. $\mathbf{x}$에 대해 softmax를 취하면 입력과 차원이 같은 d dimension 벡터가 나오고 각차원마다의 값은 아래와 같습니다.

$$ softmax(\mathbf{x})_i = \frac{ \exp( x_i)}{\sum_{j=1}^d exp(x_j)}$$

분류모델의 경우 $softmax(\mathbf{x})_i$를 i번째 클래스에 속할 확률로 해석하죠. $softmax(\mathbf{x})_i$이 가장 큰  i를 찾는 식으로 분류모델을 학습하지요.

softmax에서 temperature란?

그런데 말입니다. softmax는 각 i에 속할 확률을 구하는 것인데요. 결국엔 $softmax(\mathbf{x})$가 분포를 의미하는 것인데요. 경우에 따라서 하나의 인덱스에 집중된 날카로운 분포를 사용해야 되는 경우가 있고, 날카로움이 덜하고 평평한 느낌의 분포를 사용하는 것이 좋을 때가 있습니다. softmax로부터 나오는 확률분포의 날카롭고 평평한 정도를 조절하기 위해서 temperature를 사용합니다. temperature T(hyper parameter)를 이용한 softmax의 i번째 값은 아래와 같습니다.

$$ softmax_T(\mathbf{x})_i = \frac{ \exp( x_i/T)}{\sum_{j=1}^d exp(x_j/T)}$$

softmax 입력에 $\mathbf{x}$대신 $\mathbf{x}/T$를 집어넣은 것이라고 볼 수 있습니다. T가 작을수록 날카로운 분포를 갖게 되고 T가 클수록 softmax로 나온 분포가 평평해집니다. 그것은 있다가 확인해 볼게요.

temperature 고려한 softmax 코드구현

temperature를 고려한 softmax 코드구현해 보았습니다. 파이토치로 쉽게 구현가능합니다.

import torch
import torch.nn as nn

class Softmax_temperature(nn.Module):
def __init__(self, dim=None, temperature = 0.001):
super(Softmax_temperature, self).__init__()
self.dim = dim
self.T = temperature
self.softmax = nn.Softmax(dim=self.dim)

def forward(self, x):
output = self.softmax(x / self.T)
return output

위와 같이 softmax 입력에 x대신 온도를 나눠서 x/self.T를 넣어주는 구조로 temperature를 고려한 softmax코드를 구현하였습니다. 이제 이것은 사용하면 되겠지요!

temperature softmax 사용법

softmax_with_T = Softmax_temperature(temperature=0.01)
tensor =torch.randn(4, 5)
softmax_with_T(tensor)


####출력값######
# tensor([[1.6327e-29, 1.0000e+00, 1.8991e-35, 0.0000e+00, 0.0000e+00],
# [1.2240e-23, 0.0000e+00, 4.8337e-21, 1.1284e-03, 9.9887e-01],
# [1.4232e-21, 2.6795e-07, 1.0000e+00, 0.0000e+00, 0.0000e+00],
# [1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]])

사용방법은 너무나도 쉽습니다. 위와 같이 정의한 네트워크를 인스턴스화하고 입력으로 텐서를 넣어주면 끝입니다.

temperature에 따른 softmax 값 변화

앞서 설명드렸다시피 temperature T에 의해 분포의 날카로움이 달라진다고 하였는데요. 과연 그런지 확인해 보겠습니다. temperature T 를 0.01에서 10까지 바꿔보면서 값을 재보았습니다. 그랬더니 온도 T가 작을 때는 0쪽에 몰려 있었지만 T가 커질수록 균일해지는 것을 확인할 수 있어요.

T의 변화에 따른 softmax의 값 변화
T의 변화에 따른 softmax의 값 변화

Leave a Comment