혼자 아닌 혼자가 되고 싶은 나의 인생

파이썬을 이용한 뉴럴 네트워크 실전 - 항등 함수와 소프트 맥스 함수 (순전파) 본문

컴퓨터 사이언스/신경망 기초

파이썬을 이용한 뉴럴 네트워크 실전 - 항등 함수와 소프트 맥스 함수 (순전파)

KanzesT 2022. 1. 6. 18:38

​신경망은 분류(classification) 회귀(regression)에 모두 이용할 수 있다. 기계학습에는 분류와 회귀가 있다

분류; 데이터가 어느 클래스에 속하는 지를 나누는 문제 이다. ex) 사진속의 동물 파악, 글자 파악

회귀: 입력 데이터에서 수치를 예측하는 문제.

​분류 문제에서는 일반적으로 소프트 맥스를 사용하며, 회귀 문제에서는 일반적으로 항등함수를 사용한다.

 

 

▶항등함수

 

항등함수는 입력을 그대로 출력하는 함수이다. 즉, 입력과 출력이 같으며, 항등함수에 의한 변환은 화살표로 아래와 같이 표현할 수 있다.

(입력데이터에 따른 데이터의 수치를 예상하는 회귀는 반드시 항등함수를 사용해야 한다.)

 

▶소프트맥스 함수

소프트 맥스 함수는 자연로그가 밑인 지수함수로 나타내어진다.

좌측의 식처럼 분모는 모든 입력신호의 지수함수 합으로 나타내어 진다.

또한 우측의 식 처럼 출력 뉴런이 이전의 모든 입력 신호로 부터 영향을 받게 된다.

(데이터가 어떠한 클래스에 속하는지 분류하는 기계학습의 경우에는 소프트맥스 함수를 사용한다.

-> 지수함수의 특성상 큰값은 더 크게, 작은 값은 더 작게 만들어 분류에 용이하게 해준다.)

 

 

 

------------------------------------------------------------------------------------------

# 1.2, 3.5, 3.2 라는 세개의 인풋값을 소프트 맥스 함수를 적용 시킨 결과를 보여주는 code

 

​import numpy as np # 넘파이를 불러온다

 

a =np.array ([1.2,3.5,3.2])
exp_a=np.exp(a)  # 행렬의 모든 항에 exp를 취하는 함수

print(exp_a)  # =[ 3.32011692 33.11545196 24.5325302 ]

 

sum_exp_a =np.sum(exp_a) # 행렬의 모든 항을 더하는 함수
y= exp_a/sum_exp_a 

print(y) # =[0.05445663 0.54316032 0.40238306]

 

y_sum=np.sum(y)

print(y_sum) # =1.0

 

------------------------------------------------------------------------------------------

 

하지만 위 코드에서 a라는 행렬의 값을 각각 1000,2000,3000으로 바꾼 이후에 소프트 맥스 함수를 적용시킨다면,

 [inf inf inf] 또는 [nan nan nan]이 출력되는 것을 알 수 있다. 이는 지수함수가 아주 큰 값을 가지기 때문이다.

 

이를 대비하기 위해서는 분자와 분모에 C라는 임의의 정수를 곱하여 수식을 개선하는 방법이 있다.

지수함수이기에, 곱해진 c값은 logC의 형태로 지수함수 안으로 들어갈 수 있으며, 상수 logC'는 C라는 상수로 대체할 수 있으며

최종 수식은 다음과 같이 된다.

 

 

C값은 어떠한 값을 사용할 수 있으나 입력 신호중 최대값을 주로 사용한다.

또한 지수함수는 단조 증가 함수이기 때문에 소프트맥스 함수를 적용해도 각 원소의 대소관계는 변하지 않게 된다.

 

------------------------------------------------------------------------------------------

import numpy as np

 

a =np.array ([1.2,3.5,3.2])
c =np.max (a)
exp_a=np.exp(a-c) # 추가한 항


print(exp_a)

sum_exp_a =np.sum(exp_a)
y= exp_a/sum_exp_a

 

print(y) # =[0.05445663 0.54316032 0.40238306] 즉, 기존의 코드와 같은 결과치를 보인다.

y_sum=np.sum(y)

print(y_sum)

------------------------------------------------------------------------------------------

 

이를 함수로 정의하면 다음과 같다.

 

------------------------------------------------------------------------------------------

import numpy as np

 

def softmax(a):
    c = np.max(a)
    y = np.exp(a-c)/np.sum(np.exp(a-c))
   
    return y

 

y=softmax([1.2,3.5,3.2])
print(y) # =[0.05445663 0.54316032 0.40238306

-----------------------------------------------------------------------------------------

Comments