728x90
반응형

항등 함수

  • 일반적으로 회귀에 사용
  • 입력을 그대로 출력한다. - 입력과 출력이 항상 같다는 뜻

 

** 신경망은 분류와 회귀 모두에 이용할 수 있다.

 

 

[그림1] 항등 함수 출처 : https://m.blog.naver.com/PostView.nhn?blogId=cjswo9207&logNo=221059314707&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

 

소프트맥스 함수

  • 일반적으로 분류에 사용
  • 소프트맥스의 출력은 모든 입력 신호로부터 화살표를 받는다.
  • 출력층의 각 뉴런이 모든 입력 신호에서 영향을 받기 때문이다.

 

 

[그림2] 소프트맥스 함수 출처 : https://www.crocus.co.kr/1519

 

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

 

소프트맥스 함수의 분자는 입력 신호 ak의 지수 함수, 분모는 모든 입력 신호의 지수 함수의 합으로 구성된다.

 

* 지수함수

  • 지수 함수란 거듭제곱의 지수를 변수로 하고, 정의역을 실수 전체로 정의하는 초월함수이다. 로그 함수의 역함수이다.

 

소프트맥스 결과 출력해보기

# 소프트맥스 함수 구현
import numpy as np

a = np.array([0.3, 2.9, 4.0])

exp_a = np.exp(a) # 지수 함수
print("지수 함수 : " , exp_a)

sum_exp_a = np.sum(exp_a) # 지수 함수의 합
print("지수 함수의 합 : ",sum_exp_a)

y = exp_a /sum_exp_a
print("결과 : ", y)

[그림2] 소프트맥스 결과

함수

# 소프트맥스 함수 
def softmax(a):
    exp_a = np_exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    
    return y

 

주의 *

컴퓨터로 계산할 때는 오버플로 문제 때문에 결함이 있다.

지수 함수는 쉽게 아주 큰 값을 내뱉기 때문이다.

e^10은 20,000이 넘고 e^100은 0이 40개가 넘고 e^1000은 무한대를 뜻하는 inf가 돌아온다.

이렇게 큰 값끼리 나눗셈을 하면 결과 수치가 '불안정' 해진다.

 

[그림4] 소프트맥스 함수 구현

 

 

오버플로 대책 구현 코드

import numpy as np

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

a = np.array([1100,990, 970])
y = softmax(a)

print(y)
print(np.sum(y))

[그림5] 소프트맥스 오버플로대책 구현 결과

 

소프트맥스 함수를 적용해도 각 원소의 대소 관계는 변하지 않는다.

지수 함수  = exp(x)가 단조 증가 함수이기 때문이다.

 

 

 

출처 : 밑바닥부터 시작하는 딥러닝

https://www.hanbit.co.kr/store/books/look.php?p_code=B8475831198

 

밑바닥부터 시작하는 딥러닝

직접 구현하고 움직여보며 익히는 가장 쉬운 딥러닝 입문서

www.hanbit.co.kr

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기