관리 메뉴

HeeJ's

[05] 항등 함수와 소프트맥스 함수 본문

<Machine Learning>

[05] 항등 함수와 소프트맥스 함수

meow00 2020. 10. 7. 02:41

머신러닝 문제는 분류와 회귀 두 가지로 나뉘는데,

일반적으로 분류에서는 소프트맥스 함수를, 회귀에는 항등 함수를 이용한다.

분류 ; 어느 클래스에 속하느냐 분류하는 문제
회귀 ; 입력 데이터에서 (연속적인) 수치를 예측하는 문제

 

항등 함수

 identity function

입력과 출력이 항상 같다.

x = y

 

소프트맥스 함수

softmax function

exp(x)는 e^x를 뜻하는 지수 함수이다. (e는 자연 상수)

n은 출력층의 뉴런 수

y_k는 그 중 k번째 출력

 

위의 식에서 볼 수 있듯이, 소프틈낵스 함수의 분자는 입력 신호 a_k의 지수 함수, 분모는 모든 입력 신호의 지수 함수의 합으로 구성된다.

 

이 소프트맥스 함수를 파이썬으로 구현해보면

더보기
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

이렇게 나타낼 수 있다.

 

하지만 위의 코드는 오버플로를 일으킬 수 있다는 문제를 갖고있다.

소프트맥스 함수는 지수 함수를 사용하는데, 지수 함수는 크게는 inf까지 출력하기 때문에,

무한한 데이터를 다룰 수 없는 컴퓨터에는 오버플로가 일어나게 된다.

그리고 이런 큰 값끼리 나눗셈을 하게 되면 결과의 수치가 불안정해진다.

 

위의 오버플로 문제점을 개선한 식이다.

위의 식이 뜻하는 것은 소프트맥스의 지수 함수를 계산할 때 어떤 정수를 더하거나 빼도 결과는 바뀌지 않는다는 것이다.

여기서 C에서 어느 값을 대입해도 상관이 없지만 오버플로를 막는 목적으로 주로 입력 신호 중 최댓값을 이용한다.

 

이를 바탕으로 소프트맥스 함수를 다시 구현하면 이렇게 나타낼 수 있다.

더보기
import numpy as np

def softmax(a):
    c = np.max(a) #추가된 부분
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y

이를 출력해보면 0과 1.0 사이의 실수들로 값이 나오는데,

이 출력 값의 총합은 1이다. (이는 소프트맥스 함수의 중요한 성질이다.)

출력 값의 총합이 1이라는 것은 이 출력 값을 '확률'로 해석할 수 있다는 것을 나타내게 된다.

 

주의할 점으로는 소프트맥스 함수를 적용해도 각 원소의 대소 관계는 변하지 않는다.

지수 함수 y = exp(x)가 단조 증가 함수이기 때문이다.

신경망을 이용한 분류는 일반적으로 가장 큰 출력을 내는 뉴런에 해당하는 클래스로만 인식한다.

또, 소프트맥스 함수를 적용해도 출력이 가장 큰 뉴런의 위치는 달라지지 않는다.

결과적으로, 신경망으로 분류할 때는 출력층의 소프트맥스 함수를 생략해도 문제가 없다.

 

 

출처 - 밑바닥부터 시작하는 딥러닝

'<Machine Learning>' 카테고리의 다른 글

[07] 신경망 학습 (2)  (0) 2020.11.14
[06] 신경망 학습 (1)  (0) 2020.11.04
[04] 신경망(2)  (0) 2020.10.07
[03] 신경망(1)  (0) 2020.09.30
[02] 퍼셉트론  (0) 2020.09.25