혼자 아닌 혼자가 되고 싶은 나의 인생
파이썬을 이용한 뉴럴 네트워크 실전 - 항등 함수와 소프트 맥스 함수 (순전파) 본문
신경망은 분류(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
-----------------------------------------------------------------------------------------
'컴퓨터 사이언스 > 신경망 기초' 카테고리의 다른 글
파이썬을 이용한 뉴럴 네트워크 실전 - 코딩 (0) | 2022.01.06 |
---|---|
인공신경망(ANN, Artificial neural network) 훈련을 위한 MATLAB nntool 사용법 (0) | 2022.01.06 |
파이썬을 이용한 뉴럴 네트워크 실전 - 손실함수 (0) | 2022.01.06 |
파이썬을 이용한 뉴럴 네트워크 실전 - 경사하강법 (역전파) (0) | 2022.01.06 |
뉴럴 네트워크(Neural Network)란? - 학습률, 가중치 업데이트 최종식 (0) | 2022.01.06 |