Story of CowHacker

딥러닝 2.6 신경망 본문

공부/딥러닝

딥러닝 2.6 신경망

Cow_Hacker 2020. 8. 5. 22:19
728x90

이번 글에서는 먼저 앞 글에서 언급한 소프트맥스 함수의 취약점을 보안한 식을 알아볼 것이다.

 

소프트맥스 함수에서 지수함수 ( 분자 ) 는 쉽게 아주 큰 값을 낸다. 예를 들어 e^10 은 20,000이넘고, e^100 은 0이 40개가 넘는 큰 값이 된다 이런 큰 값끼리 나눗셈을 하면 결과 수치가 불안정 해진다. 즉, 오버플로 문제가 생긴다.

 

이제 한번 앞에서 언급한 소프트맥스 함수를 개선 해본다.

 

 

 

 

 

 

개선전 소프트맥스 함수

 

그림1

일단 개선 전 소프트맥스 함수식을 본다.

 

 

 

 

 

소프트맥스 함수 개선 과정

 

 

 

 

 

그림2

첫 번째 과정에서는 C라는 임의의 정수를 분자, 분모 양쪽에 곱했다.

두 번째 과정에서는 C를 지수 함수인 exp() 안으로 옮겨 logC로 만든다.

세 번째 과정에서는 logC를 C` 라는 새로운 기호로 치환한다.

 

결과 : 소프트맥스의 지수 함수를 계산할 때 어떤 정수를 더하거나 빼도 결과는 바뀌지 않는다는 것이다. 

 

※ 여기서 C`에 어떤 값을 대입해도 상관은 없는데, 오버플로를 막을 목적으로는 입력 신호 중 최댓값을 이용하는 것이 일반적이다.

 

 

 

 

C` 에  최댓값을 주지 않았을때 코드

 

import numpy as num

 

a = num.array ( [ 1010, 1000, 990 ] )

 

print ( num.exp ( a ) / num.sum ( num.exp ( a ) ) ) 

 

출력결과를 보면 [nan nan nan] 으로 나올것이다. ( nan은 not a number 의 약자다. )

 

 

 

 

 

C`에 최댓값을 줬을때 코드

 

import numpy as num

 

a = num.array ( [ 1010, 1000, 990 ] )

 

c = num.max ( a )

 

print ( num.exp ( a - c ) / num.sum ( num.exp ( a - c ) ) )

 

이제는 결과값이 잘 나오는걸 볼수있다.

 

 

이제 위 코드를 함수로 짜본다.

 

 

 

개선한 소프트맥스 함수 코드

 

import numpy as num

 

a = num.array ( [ 1010, 1000, 990 ] )

 

exp_a = num.exp ( a ) # 지수 함수다.

 

sum_exp_a = num.sum ( exp_a ) # 지수 함수의 합이다.

 

def softmax ( a ):

    c = num.max ( a )

    exp_a - num.exp ( a - c )

    sum_exp_a = num.sum ( exp_a )

    y = exp_a / sum_exp_a

 

    return y

 

 

 

 

다음으로는 소프트맥스 함수의 특징에 대해 알아본다.

 

 

import numpy as num

 

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

 

exp_a = num.exp ( a ) # 지수 함수다.

 

sum_exp_a = num.sum ( exp_a ) # 지수 함수의 합이다.

 

def softmax ( a ):

    c = num.max ( a )

    exp_a - num.exp ( a - c )

    sum_exp_a = num.sum ( exp_a )

    y = exp_a / sum_exp_a

 

    return y

 

y = softmax ( a )

 

print ( y )

 

print ( num.sum ( y ) )

 

첫번 째 print 값은 [0.01821127 0.24519181 0.73659691] 이다.
두번 째 print 값은 1.0 이다.

 

소프트맥스 함수의 출력은 0에서 1.0 사이의 실수다. ( 근거 : 첫번 째 print )

또, 소프트맥스 함수 출력의 총합은 1 이다. ( 근거 : 두번 째 print )

 

y [ 0 ] 은 0.018 => 1.8%, y [ 1 ] 은 0.245 => 24.5%, y [ 2 ] 는 0.737 => 73.7% 로 해석할수 있다.

즉, 소프트 맥스 함수를 이용함으로써 문제를 확률적으로 대응할수 있다.

 

 

 

 

여기까지 소프트맥스 함수의 끝을 알아보았다.

다음글에는 사람이 적은 손글씨 숫자를 인식하는 딥러닝에 대해 알아보겠다.

728x90

'공부 > 딥러닝' 카테고리의 다른 글

딥러닝 2.8 신경망  (0) 2020.08.08
딥러닝 2.7 신경망  (0) 2020.08.06
딥러닝 2.5 신경망  (0) 2020.08.04
딥러닝 2.4 신경망  (0) 2020.08.03
딥러닝 2.3 신경망  (0) 2020.08.03
Comments