Chapter 03. 신경망(3)

Junho_Mun·2025년 6월 25일

3.5 출력층 설계하기

머신러닝 문제는 분류(classfication)회귀(regression) 문제로 나뉜다.

  • 분류 : 주어진 데이터가 어느 클래스에 속하느냐 하는 문제이다.
  • 회귀 : 입력 데이터에서 수치를 예측하는 문제

이처럼 문제의 종류에 따라 신경망의 출력층에서 사용하는 활성화 함수를 다르게 설계해야한다.

3.5.1 항등 함수와 소프트 맥스 함수 구현하기

항등 함수(identity function)는 입력을 그대로 출력하는 함수이다.
입력된 xx가 있다면 xx를 그대로 출력하는 f(x)=xf(x)=x의 형태이다.

한편, 분류에서 사용하는 소프트맥스 함수(softmax function) 의 식은 다음과 같은데, 소프트맥스 함수는 다중 클래스 분류에서 각 클래스에 속할 확률을 출력하는데 유용하다.

yk=exp(ak)i=1nexp(ai)y_k = \frac{\exp(a_{k})}{\sum_{i = 1}^{n} \exp(a_{i})}

소프트맥스 함수의 분자는 입력신호 aka_k의 지수 함수, 분모는 모든 입력 신호의 지수 함수의 합으로 구성된다.

def softmax(x):
    exp_x = np.exp(x)
    sum_exp_x = np.sum(exp_x)
    y = exp_x / sum_exp_x
    return y

다음과 같이 구현을 하면 오버플로가 발생하기 쉽다. 그렇기때문에 다른 수식을 사용해서 구현을 해보도록 하자.

yk=exp(ak)i=1nexp(ai)=Cexp(ak)Ci=1nexp(ai)=exp(ak+logC)i=1nexp(ai+logC)=exp(ak+C)i=1nexp(ai+C)y_k = \frac{\exp(a_{k})}{\sum_{i = 1}^{n} \exp(a_{i})} = \frac{C\exp(a_{k})}{C\sum_{i = 1}^{n} \exp(a_{i})} \\ = \frac{\exp(a_{k} + \log C)}{\sum_{i = 1}^{n} \exp(a_{i} + \log C)} \\ = \frac{\exp(a_{k} + C')}{\sum_{i = 1}^{n} \exp(a_{i} + C')}

분모와 분자에CC라는 임의의 정수를 곱하고, 이를 지수 함수 exp()\exp()안으로 옮겨 logC\log C로 만든 후, 이를 CC'으로 바꾸어주었다.

def softmax(x):
    c = np.max(x) # 오버플로를 방지하기 위해 최댓값을 선택한다.
    exp_x = np.exp(x - c) 
    sum_exp_x = np.sum(exp_x)
    y = exp_x / sum_exp_x
    return y

소프트맥스 함수의 출력은 0에서 1.0 사이의 실수이다. 또, 소프트맥스 함수 출력의 총 합은 1이다.

출력 총합이 1이 된다는 것으로 "확률"로 해석 가능하다.

신경망을 이용한 분류에서는 일반적으로 가장 큰 출력을 내는 뉴런에 해당하는 클래스로만 인식한다.
그리고 소프트맥스 함수를 적용해도 출력이 가장 큰 뉴런의 위치는 달라지지 않는다.
결과적으로, 신경망을 분류할 때에는 출력층의 소프트맥스 함수를 생략해도 된다. 현업에서도 지수 함수 계산에 드는 자원 낭비를 줄이고자 출력층의 소프트맥스 함수는 생략하는 것이 일반적이다.

3.5.4 출력층의 뉴런 수 정하기

출력층의 뉴런 수는 풀려는 문제에 맞게 적절하게 정해야한다. 분류에서는 분류하고자 하는 클래스의 수로 설정하는 것이 일반적이다.
예를 들어, 0~9등급으로 분류를 하겠다고 하면 출력층의 뉴런 수는 10개가 되는것이 일반적이다는 말이다.

이처럼 출력층의 설계는 머신러닝의 문제의 종류를 이해하고 그에 맞는 활성화 함수와 뉴런 수를 선택하는 것이 중요하다.

profile
Bioinformatics and Data science

0개의 댓글