머신러닝, 딥러닝 ML, DL/이론

[Deep Learning] 3. 출력층의 소프트맥스 함수(Softmax), 항등 함수

킹남지 2021. 7. 25. 01:41
반응형

출력층 설계

신경망의 출력층(Output Layer)에서 사용하는 활성화 함수는 현재 해결해야하는 문제가 무엇인지에 따라 달라집니다.

 

문제는 크게 분류(classification)회귀(regression)으로 나뉩니다. 분류는 데이터가 어느 범주, 클래스에 속하는지를 맞춰야하는 문제(ex : 10대 or 20대 or 30대 이상)고, 회귀는 수치를 예측해야하는 문제(ex : 182.1cm)입니다.

 

항등 함수

항등 함수(identity function)은 입력 신호를 그대로 출력합니다.

항등 함수

소프트맥스 함수

분류에서 사용하는 소프트맥스 함수(softmax function)의 식을 한번 보겠습니다.

$y_k = \frac{e^{a_k}}{\sum_{i=1}^{n}e^{a_i}}$

 

$e^{x}$ 는 지수 함수, $n$은 출력층의 노드 수, $y_k$는 그 중 $k$번째 출력입니다.

소프트맥스 함수를 나타낸 그림

소프트맥스 함수의 출력은 0~1 사이의 실수이고, 소프트맥스 함수 출력의 총합은 1입니다.

이런 소프트맥스 함수의 출력은 '확률'로 해석할 수 있습니다.

 

예를 들어, 숫자를 적은 이미지를 보고, 0~9까지 숫자를 분류하는 문제가 있다고 합시다.

그렇다면 $n$ = 10이고, $y_1$ 부터 $y_{10}$이 있습니다.

 

$y_1$의 값은 숫자가 0일 거라고 예측하는 확률로 생각할 수 있고, 값이 0.18 이라면

입력을 통해 신경망은 이 이미지에 쓰인 숫자가 1일 확률이 18%라고 예측하고 있는 것입니다.

 

만약 $y_10$이 0.7로 가장 큰 값을 출력한다면, 10번째 클래스 즉 9가 정답일 것이라고 예측하고 있다는 뜻입니다.

 

소프트맥스 함수 구현 시 주의점

소프트맥스 함수는 지수 함수를 사용하기 때문에, 오버플로 문제에 주의해야합니다.

예를 들어, $e^1000$의 값은 파이썬에서 inf가 됩니다.

 

따라서 아래와 같이 수식을 개선할 수 있습니다.

수식을 보면 소프트맥스의 지수 함수를 계산할 때 어떤 정수를 더하거나 빼도 결과는 같음을 알 수 있습니다.

오버플로를 막을 목적으로, 최댓값을 빼주는 게 일반적인 구현입니다.

 

구현 예시입니다.

# 개선한 softmax 함수를 구현
def softmax(a):
    c = np.max(a) # 최댓값을 빼주자
    exp_a = np.exp(a-c) 
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y

 

그리고 소프트맥스 함수를 적용해도 각 원소의 대소 관계는 변하지 않습니다.

$y=e^x$가 단조 증가 함수(monotonically increasing function)이기 때문입니다.

 

수학적인 부분이 이해가 안된다면 아래 예시를 보시기 바랍니다.

입력 신호 $a_1, a_2, a_3$ 중 $a_3$의 값이 가장 크다면 $y_3$가 가장 큰 것을 쉽게 확인할 수 있습니다.

 

결과적으로 신경망으로 단순히 분류할 때는 즉, 결과만 낼 때는 굳이 출력층의 소프트맥스 함수를 사용하지 않아도 됩니다. 지수 함수 계산에 드는 자원 낭비를 줄이기 위해 출력층의 소프트맥스 함수를 생략할 수 있습니다.

 

하지만, 신경망을 학습시킬 때는 출력층에서 소프트맥스 함수를 사용합니다.

 

출력층의 노드 수

출력층의 노드 수는 적절하게 정해야 합니다.

값을 하나만 내는 회귀 문제라면 노드 수를 하나만 내도 상관이 없습니다.

 

분류에서는 일반적으로 분류하고 싶은 클래스 수로 설정합니다.

위 예시는 차례대로 apple, bear, candy, dog, egg 5개의 클래스를 분류하고 있습니다.

만약 $y_2$의 출력 값이 가장 크다면 신경망은 bear라고 판단함을 의미합니다.

 

하지만 클래스 수가 두 개뿐이라면 즉, 이진 분류(Binary Classification) 문제의 경우 노드 수는 1로 설정합니다.

예측한 확률 값에 따라 일정 임곗값(ex : 0.5)을 넘으면 O 아니면 X 처럼 분류하면 되기 떄문입니다.

 

출력층을 간단하게 알아봤습니다.

감사합니다^^

 

[참고자료]

[1] 밑바닥부터 시작하는 딥러닝1 (사이토 고키)

반응형