본문 바로가기

BLOG/머신러닝

[머신러닝] 파이썬으로 softmax(소프트맥스) 함수 구현하기

word_encoded = tokenizer.texts_to_sequences(sentences)
print(word_encoded)

softmax(소프트맥스) 함수란 인풋값을 넣으면, 그 값들을 모두 0과 1 사이의 값으로 정규화를 해주는 함수를 말하는데요,

아래와 같은 연산을 가집니다.

 

 

이러한 softmax 함수는 확률처럼 모든 아웃풋 값을 더했을 때 1이 총합이라는 특징을 갖는 함수입니다.

따라서 시그모이드 함수의 경우 인풋이 하나일 때 사용되지만, 소프트맥스는 인풋이 여러 개일 때도 사용할 수 있는 함수입니다. 따라서 softmax 함수는 멀티 클래스 분류모델을 만들고자 할 때 이용하는 것이 좋습니다.

 

한편, 파이썬에서 특정 라이브러리에선 소프트맥스를 구현하는 함수를 제공하는데요, 이를 사용하지 않고 softmax 함수를 구현하는 코드를 작성해보겠습니다.

 

 

먼저, 전체 코드를 보도록 하겠습니다.

 

import numpy as np

def softmax(a) :
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y=exp_a / sum_exp_a
    
    return y

 

먼저 연산을 하기 위한 numpy 라이브러리를 import 해준 다음, softmax() 라는 이름의 함수를 만들어주었습니다.

그리고 그 안에 소프트맥스를 구현하는 연산을 하는 코드를 입력해주었습니다.

 

위 코드에서 np.exp(a)는 분자를 구하는 코드, np.sum(exp_a)는 분모를 구하는 코드입니다.

그리고 연산을 한 뒤 결과값을 반환하도록 해주었습니다.

 

이렇게 softmax 함수를 만들어주면 되는데요, 임의의 값을 넣어 정규화를 해보도록 하겠습니다.

 

a = np.array([1, 2, 3, 4, 5])
print(softmax(a))
print(sum(softmax(a)))


#output :
[0.01165623 0.03168492 0.08612854 0.23412166 0.63640865]
1.0

 

임의의 값 [1, 2, 3, 4, 5]를 array 형태로 만든 뒤 softmax 함수에 넣어본 결과, 0과 1 사이의 값이 출력되었고, 이를 합해보니 1이 되는 것을 확인할 수 있답니다.