본문 바로가기
딥러닝

05. 딥러닝 신경망 구현의 기초 - 출력층, 항등함수, 소프트맥스함수, 분류, 회귀

by Go! Jake 2021. 5. 13.

 

이전 글: 04. 딥러닝 신경망(Neural Network)의 모든 것

 

  해당 포스팅은 '밑바닥부터 시작하는 딥러닝'과 기타 인터넷 자료를 요약한 자료입니다.

출력층 설계하기

데이터 마이닝과 머신 러닝에서는 크게 회귀 문제와 분류 문제를 다룬다. 신경망은 이 둘 모두에 사용될 수 있으며, 둘 중 어떤 문제인지에 따라, 출력층에서 사용하는 함수가 달라진다. 일반적으로 회귀에서 출력층은 항등 함수를, 분류에서 출력층은 소프트맥스 함수를 사용한다. 이에 대해 알아보도록 하자.

 

함수로 들어가기 전에, 함수의 목적을 알 필요가 있다. 따라서 분류와 회귀에 대해 간단히 비교하면 아래와 같다.

 

1. 분류와 회귀

분류 예측 모델링 - 소프트맥스 함수

분류는 데이터를, 특정 카테고리 또는 값(discrete output)으로 매핑하는 함수 또는 모델을 찾는/근사하는 작업이다.

분류에서는, 파라미터에 따라 서로 다른 레이블로 분류되어 각 데이터에 대한 레이블을 예측한다. (여기서 라벨은 정확한 출력 값.. 소위 '답' 등으로 이해하면 이해가 쉽다.)

 

분류 모델은 데이터가 각 카테고리에 속할 수 있는 가능성을 예측하며, 가장 높은 가능성을 가진 라벨이 선택된다.

예를 들어 "A"라는 카테고리에 속할 확률이 0.9이고, "B"라는 카테고리에 속할 확률이 0.1이라면 "A"를 선택한다.

회귀 예측 모델링 - 항등 함수

회귀는 데이터 입력을 토대로 연속적인 출력값(continuous output)을 매핑하는 모델을 찾는/근사하는 작업이다. 연속적인 출력 값은 정수 또는 소수 등의 실수 값으로 예측한다. 예를 들어 날씨 데이터를 기반으로 날씨 정보(기온, 강수량 등)를 예측하는 것이다.

다만, 회귀는 데이터 간 인과관계를 증명하는 것이 아닌, 인과관계를 가정하고 이를 모델로 구현하는 것으로 볼 수 있다.

 

 

아래는 분류와 회귀를 나타내는 그래프이다.

출처: https://www.javatpoint.com/regression-vs-classification-in-machine-learning

항등 함수(identity function), 소프트맥스 함수(softmax function)

항등 함수(identity function)의 정의

회귀에서 사용되는 항등 함수는 입력을 그대로 출력한다. 회귀에서의 출력층은 현재까지 계산된 값을 그대로 출력할 필요가 있기 때문에 항등 함수를 사용하여 현재까지 계산된 값을 그대로 출력한다. 주로 연속형 변수에 대한 예측값을 출력하는 회귀 문제에서, 출력층의 활성화 함수로 항등 함수가 쓰인다.

 

항등 함수, 출처: https://www.programmersought.com/article/90697359286/

소프트맥스 함수(softmax function)

소프트맥스 함수(softmax function)의 정의 및 목적

소프트맥스 함수는 정규화된 자연상수 함수로 알려져 있다. 이 때 정규화는, 데이터를 특정 범위로 변환하는 것이다. (e.g. 0.0~1.0)

소프트맥스 함수는 다차원에 대한 로지스틱 함수의 일반화된 함수이다. 신경망 출력층에서의 마지막 함수로 사용되고 신경망의 출력 값인, 카테고리에 속할 예상 확률을, 정규화한다. 

소프트맥스 함수의 식은 아래와 같다. 잘 보면, 우리가 쉽게 생각하는 확률을 계산할 때 사용하는 식과 같다. 다만 자연 상수에 대한 함수인 것만 차이가 있다. 다만 해당 함수는 자연상수를 지수로 하는 함수를 사용하기 때문에, 입력이 커질수록 극대화되는 특징이 있다.

이 때 exp(x)는 $e^{x}$를 의미하는 지수 함수이며, n은 출력층의 뉴런 수, $y_k$는 그중 k번째 출력임을 뜻한다. 따라서, 아래 식 3.10과 같이 소프트맥스 함수의 분자는 입력 신호 $a_k$의 지수 함수, 분모는 모든 입력 신호의 지수 함수의 합으로 구성된다.

[식 3.10]

소프트맥스 함수는 아래 그림과 같이 모든 입력 신호로부터 화살표를 받는다. 이는 식 3.10의 분모에서 보듯, 출력층의 각각 뉴런이 모든 입력 신호에서 영향을 받기 때문이다. 즉, 최소한 분모를 위해서 모든 입력 신호로부터 화살표를 받아야 한다.

소프트맥스 함수, 출처: https://www.programmersought.com/article/90697359286/

일반화하여 표현하면 아래와 같다.

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

 

아래 예시는, array [0.3, 2.9, 4.0]을 소프트맥스 함수로 정규화하여 출력 값을 얻는 예시이다.

>>> import numpy as np
>>> a=1
>>> a
1
>>> import numpy as np
>>> a = np.array([0.3, 2.9, 4.0])
>>>    
>>> exp_a=np.exp(a) #지수 함수   
>>> print(exp_a)
[ 1.34985881 18.17414537 54.59815003]
>>>
>>> sum_exp_a=np.sum(exp_a) #지수 함수의 합
>>> print(sum_exp_a)
74.1221542101633
>>>
>>> y = exp_a / sum_exp_a
>>> print(y)
[0.01821127 0.24519181 0.73659691]

 

 

소프트맥스 함수(softmax function)의 특징

softmax() 함수의  예시로 array [0.3, 2.9, 4.0]을 소프트맥스 함수로 정규화하고 각 합을 구하면 아래와 같다.

출력의 총합은 1이고, 각 값은 0과 1.0 사이 실수입니다. 따라서, 이는 확률로 이해할 수 있습니다.

>>> 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

위 예제에서 index 0번부터 1.8%, 24.52%, 73.66% 해석할 수 있고 이에 따라 1번이 가장 높은 확률이므로, 결과로 1번 클래스로 결론 내릴 수 있다.

 

여기에 지수함수적 특징을 더해 단조증가(감소하지 않고 계속 증가) 하기 때문에, 각 원소별 대소 관계는 바뀌지 않는다. 결과적으로는 신경망으로 분류를 수행할 때는 소프트맥스 함수를 생략해도 된다. 현업에서도 이는 일반적인 것이라고 한다. 한편, 신경망을 학습시킬 때는 출력층에서 소프트맥스 함수를 사용한다.

 

소프트맥스 함수(softmax function) 구현 시 주의점

컴퓨터로 계산할 때 소프트맥스 함수는 오버플로우 문제가 발생하는 결함이 있다. 소프트맥스 함수는 지수함수가 굉장히 큰 결괏값을 만들기 때문에, 큰 값끼리 나눗셈을 하는 경우 수치가 불안정 해 진다.

[식 3.11]

따라서 위와 같이 상수를 곱하면 지수 함수계산 범위를 낮출 수 있으므로 오버플로우 문제를 해결할 수 있다.

 

>>> a = np.array([1010,1000,990])
>>> np.exp(a)/np.sum(np.exp(a))
<stdin>:1: RuntimeWarning: overflow encountered in exp
<stdin>:1: RuntimeWarning: invalid value encountered in true_divide
array([nan, nan, nan])
>>> c= np.max(a)
>>> a-c
array([  0, -10, -20])
>>> np.exp(a-c)/np.sum(np.exp(a-c))
array([9.99954600e-01, 4.53978686e-05, 2.06106005e-09])

위 코드는 array 내에 최댓값으로 각 요소를 빼 주었고, 이를 소프트맥스 함수 처리한 것이다. 식을 통해 지수 계산에서 덧셈 또는 뺄셈은 동일한 값을 표출하기 때문에 출력 값 정규화에 문제가 없다.

 

출력층의 뉴런 수 정하기

출력층의 뉴런 수는 풀려는 문제에 맞게 적절히 설정되어야 하며, 분류에서는 분류하고 싶은 클래스 수를 설정하는 것이 일반적이다. 예를 들어, 0부터 9 중 하나로 분류하는 문제라면 아래와 사진에서 가장 우측의 출력층과 같이, 0부터 9개의 출력 값이 있어야 한다. 이때 10개의 출력 값 중 7번 출력 값 (0번부터 시작하므로 숫자로는 6)의 출력 값이 가장 크다면 이 신경망이 6에 대한 입력을 받아 6을 판단한 것이다. 아래 손글씨 숫자 판별은 다음 글인 MNIST에서 다룬다.

 

출처: https://ml4a.github.io/ml4a/looking_inside_neural_nets/

 

Reference

Softmax function - Wikipedia

Softmax function - Wikipedia

Difference Between Classification and Regression in Machine Learning

Difference Between Classification and Regression in Machine Learning (machinelearningmastery.com)

 

다음 글:06. 딥러닝 신경망 구현 기초 MNIST - 신경망 구성, 정확도 평가, 배치 처리

 

댓글