본문 바로가기
  • 책상 밖 세상을 경험할 수 있는 Playground를 제공하고, 수동적 학습에서 창조의 삶으로의 전환을 위한 새로운 라이프 스타일을 제시합니다.
Miscellaneous

[2025-1] 윤선우 - 밑바닥부터 시작하는 딥러닝 리뷰, (CH 3.5) 출력층 설계하기

by seasun25 2025. 3. 5.

신경망은 회귀와 분류에 사용된다.

이때 회귀(regression)란 입력 데이터에서 (연속적인) 수치를 예측하는 문제, 분류(classification)란 데이터가 어느 클래스에 속하느냐를 구별하는 문제를 일컫는다.

회귀에는 항등 함수를, 분류에는 소프트맥스 함수를 사용한다.

 

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

회귀에서 사용하는 항등함수는 입력을 그대로 출력한다. 그래서 출력층에 항등함수를 사용하면 입력 신호가 그대로 출력된다. 신경망 그림은 다음과 같이 표현된다:

분류에서 사용하는 소프트맥스 함수의 식은 다음과 같이 표현된다:

(이때 exp(x)는 e^x를, n은 출력층의 뉴런 수를, yk는 그중 k번째 출력임을 뜻한다.)

소프트맥스의 출력은 모든 입력 신호로부터 화살표를 받는데, 이는 식의 분모에서도 확인할 수 있다. 소프트맥스 함수는 다음과 같이 그림으로 표현될 수 있다:

 

소프트맥수 함수를 코드로 구현하면 다음과 같다.

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

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

위 코드는 소프트맥스 식은 잘 표현하지만, 컴퓨터로 계산할 시 오버플로 문제가 발생한다. 다시 말해 지수 함수의 특성상 아주 큰 값을 출력하게 되는데, 이는 컴퓨터가 표현할 수 있는 범위를 벗어나서 결과 수치가 불안정해진다는 것이다.

 

이를 개선하기 위해 다음과 같이 수식을 개선해본다:

 

1. C라는 임의의 정수를 분자와 분모 각각에 곱한다.

2. C를 exp() 안으로 옮겨 logC로 만든다.

3. logC를 C'라는 새로운 기호로 바꾼다.

 

이때 C'에 어떤 값을 대입해도 상관없지만, 오버플로를 방지하기 위해서는 보통 입력 신호 중 최댓값을 이용한다.

이를 코드로 구현하면 다음과 같다:

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

3. 소프트맥스 함수의 특징

소프트맥스 함수를 사용하면 신경망의 출력은 다음과 같이 계산된다:

>>> a = np.array([0.3, 2.9, 4.0])
>>> y = softmax(a)
>>> print(y)
[0.01821127 0.24519181 0.73659691]
>>> np.sum(y)
1.0

 

소프트맥스 함수의 출력은 0에서 1.0 사이의 실수이며, 그 출력의 총합은 1이다. 그 덕분에 소프트맥스의 출력을 '확률'로 해석할 수 있다.

가장 높은 출력값이 나오는 원소가 가장 높은 확률로 정답 클래스가 된다고 해석할 수 있는 것이다. 가령 2번째 원소의 출력값이 가장 높게 나오면, 답은 2번째 클래스라고 할 수 있다.

 

이때 소프트맥스 함수는 단조 함수로, ab일 때 f(a)≤f(b)가 성립한다. 따라서 소프트맥스 함수를 적용해도 가장 큰 뉴런의 위치는 변하지 않는다. 결과적으로 소프트맥스 함수를 생략해도 결과가 달라지지는 않으며, 현업에서도 실제로는 자원 낭비를 줄이고자 소프트맥스 함수를 생략한다.

4. 출력층의 뉴런 수 정하기

출력층의 뉴런 수는 풀려는 문제에 맞게 정해야 한다. 분류에서는 분류하고 싶은 클래스 수로 설정한다. 예를 들어 이미지를 숫자 0부터 9 중의 숫자 하나로 분류하려고 한다면 출력층의 뉴런을 10개로 설정하고, 가장 높은 출력값이 나온 뉴런으로 분류하게 된다.

 

5. 퀴즈

퀴즈1:

다음 중 소프트맥스 함수에 대해 가장 옳지 않은 것은?

1. 소프트맥스의 출력값은 확률값으로 해석된다.

2. 소프트맥스의 출력은 모든 입력값을 받으며, 이는 수식의 분모에서 나타난다.

3. 현업에서는 소프트맥수 함수 사용을 지양한다.

4. 오버플로를 방지하기 위해서는 입력값 중 최댓값의 로그값을 수식의 분모와 분자에 각각 곱해준다.

 

퀴즈2:

음료수가 커피, 차, 프라페 중에 하나인지 분류하는 신경망의 출력층 설계에 대해 가장 옳은 것은?

1. 항등함수를 사용한다.

2. 출력값은 늘 확률값으로 계산된다.

3. 출력층의 뉴런 수가 3개다.

4. 출력값은 "커피", "차", "프라페" 중에 하나이다.