일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- PostgreSQL
- Apache2
- 신경망 학습
- 순전파
- 백준
- sgd
- 소프트맥스 함수
- CTF
- PICO CTF
- C언어
- 딥러닝
- 파이썬
- PHP
- 아파치
- AdaGrad
- 우분투
- FastAPI
- Python Challenge
- flag
- 기울기
- 역전파
- 리뷰
- 신경망
- 오차역전파법
- 코딩
- 책
- picoCTF
- Python
- HTML
- 설치
- Today
- Total
Story of CowHacker
딥러닝 2.6 신경망 본문
이번 글에서는 먼저 앞 글에서 언급한 소프트맥스 함수의 취약점을 보안한 식을 알아볼 것이다.
소프트맥스 함수에서 지수함수 ( 분자 ) 는 쉽게 아주 큰 값을 낸다. 예를 들어 e^10 은 20,000이넘고, e^100 은 0이 40개가 넘는 큰 값이 된다 이런 큰 값끼리 나눗셈을 하면 결과 수치가 불안정 해진다. 즉, 오버플로 문제가 생긴다.
이제 한번 앞에서 언급한 소프트맥스 함수를 개선 해본다.
개선전 소프트맥스 함수
일단 개선 전 소프트맥스 함수식을 본다.
소프트맥스 함수 개선 과정
첫 번째 과정에서는 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% 로 해석할수 있다.
즉, 소프트 맥스 함수를 이용함으로써 문제를 확률적으로 대응할수 있다.
여기까지 소프트맥스 함수의 끝을 알아보았다.
다음글에는 사람이 적은 손글씨 숫자를 인식하는 딥러닝에 대해 알아보겠다.
'공부 > 딥러닝' 카테고리의 다른 글
딥러닝 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 |