[딥러닝(DL)]신경망(3) - 출력층 설계, 항등 함수 구현, 소프트맥스 함수 구현, 출력층의 뉴런 수 결정

Jihwan Jung·2022년 8월 26일
1

🧠딥러닝

목록 보기
5/9
post-thumbnail

💡오늘 배울 내용


신경망은 분류와 회귀 모두에 이용할 수 있습니다. 신경망의 마지막 층, 출력층을 어떤 활성화 함수로 구성할 것인지 문제에 따라 정하게 됩니다. 오늘은 항등 함수와 소프트맥스 함수를 구현해보도록 하겠습니다.

🔎출력층



출력층은 원하는 예측을 얻는 신경망의 최종 계층입니다. 출력층의 활성화 함수는 해결해야 하는 문제에 따라 다르게 설정되는데요, 예를 들면 회귀 문제에서는 항등 함수를, 이진 분류와 다중 분류에서는 각각 시그모이드, 소프트맥스 함수를 사용합니다.

참고로 분류(Classification)와 회귀(Regression) 문제는 모두 지도 학습에 해당합니다. 당연하겠지만, MLP가 지도학습으로 분류되기 때문입니다. 물론 연구가 활발하게 진행되어 딥러닝으로 비지도 학습의 문제들을 해결하려는 시도도 계속되고 있습니다.

🔎항등함수 구현


항등함수(identity function)는 입력을 그대로 출력합니다. 항등함수가 항등함수인 이유도 입력과 출력이 항상 같기때문입니다. 출력층으로 들어온 값을 활성화 함수를 거쳐 최종적으로 얻어낼때 아무런 변화도 주고 싶지 않다면 항등함수를 사용하면 됩니다.

def identity_function(x):
	return x

🔎소프트맥스 함수 구현


소프트맥스 함수는 뉴런의 출력값을 통해 class 분류를 위한 정규화를 진행합니다. 정규화가 끝나면 각 출력값들은 0에서 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.1221542102

y = exp_a / sum_exp_a
print(y)
>> [0.01821127 0.24519181 0.73659691]

작동 과정을 바탕으로 소프트맥스 함수를 정의해보았습니다.

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

🔎소프트맥스와 오버플로우


컴퓨터는 수를 크기가 유한한 데이터로 다루기 때문에, 표현할 수 있는 수의 범위가 한정되어있습니다. 그래서 소프트 맥스 함수를 구현할때 오버플로우가 발생할 수 있는 것입니다. e^1000 같은 수를 컴퓨터가 inf(무한대)로 인식하는 것 처럼요.


그래서 우리는 소프트 맥스 함수가 오버플로우가 발생하지 않도록 코드를 수정해줄 필요가 있습니다. 위의 코드를 보면 알 수 있는 것 처럼, (a1, a2, ... , an)의 소프트맥스 값은 (a1+C, a2+c, ... , an+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

🔎소프트맥스 함수의 특징


소프트맥스 함수의 출력은 0에서 1.0사이의 실수입니다. 또한 소프트맥스 함수의 출력 총합은 1임으로 우리는 소프트맥스 함수의 출력을 확률로써 해석할 수 있는 것입니다.

가령 y[0] 값이 0.018, y[1] 값이 0.245, y[2] 값이 0.737라고 한다면 두번째 원소의 확률이 제일 높으니 정답은 두번째 클래스다 라고 결론지을 수 있습니다.

물론 소프트맥스 함수를 적용한다고 해서 대소관계가 변하는 것도 아니고, 출력이 가장 큰 뉴런의 위치가 달라지는 것도 아닙니다. 단지 확률로 변환하여 보기 편하다는 이점이 있기 때문입니다. 현업에서는 지수 함수 계산에 드는 자원낭비를 줄이기 위해 출력층의 소프트맥스 함수를 생략하기도 한다고 합니다.

🔎출력층의 뉴런 수 결정


출력층의 뉴런을 몇개로 할 것인가는 풀려는 문제에 맞게 결정합니다. 예를 들면 입력 이미지를 숫자 0에서 9까지 중 하나로 분류하는 문제가 있다고 할때, 10개의 클래스가 필요함으로 출력층의 뉴런 개수는 10개가 됩니다.

다중 분류를 위해 소프트맥스 함수를 출력층의 활성화 함수로 썼다면, 출력값이 가장 높은 하나가 정답이 될것입니다. 이때 분류를 위해서는 레이블의 개수가 출력층의 뉴런 개수가 되어야 한다는 것이 자명합니다.

profile
22.10月~24.07月 공군 암호병 복무중/ 사회 과학과 딥 러닝에 관심이 있는 학부생(CS&E)입니다. 기술과 사회에 대한 이해를 바탕으로, 비즈니스 감각과 기술적 역량을 함께 갖춘 인공지능 프로그래머•데이터 과학자로 성장하고 싶습니다.

0개의 댓글