소프트맥스를 들어가기 전 항등 함수 먼저 살펴보겠다.
항등함수는 우리가 고등학교 시절 항등원을 배웠듯 입력을 그대로 출력하는 함수이다. 그래서 항등함수를 사용하면 입력 신호가 출력 신호가 되어서 그대로 출력된다.
소프트맥스 함수란?
소프트맥스 함수는 분류 문제를 풀 때 이용된다. 소프트맥스 함수를 쓰면 각각의 점수를 클래스별 확률로 바꾸어 각각 점수가 총 합쳐서 1이 되게 한다.
자연상수e는 exp()로 파이썬에서 구현할 수 있다. 여기서 보면 k는 출력층의 뉴런 수이고 i는 i 번째 출력을 뜻한다. 이렇게 보면 소프트맥스 함수에 대해서 이해가 잘 가지 않지만 코드를 보면서 이해해보자.
# 임의의 1X3 배열을 만들어준다. 입력값이다.
a = np.array([0.2, 3.3, 3.0])
# 지수 함수를 만들어준다.
exp_a = np.exp(a)
print('exp_a : ', exp_a)
#지수 함수 1X3의 값을 각각 더해준다.
sum_exp_a = np.sum(exp_a)
print('sum_exp_a : ', sum_exp_a)
# 각각의 지수함수에서 다 더해준 총 합을 나눈다. 그러면 확률계산이 된다. (총 합이 1)
y = exp_a / sum_exp_a
print('y :', y)
# 결과
exp_a : [ 1.22140276 27.11263892 20.08553692]
sum_exp_a : 48.41957860200572
y : [0.02522539 0.55995198 0.41482263]
소프트맥스 함수를 컴퓨터로 계산할 때 오버플로우 문제가 있는데 지수함수의 e위의 수가 크면 커질수록 엄청난 값이 되어 돌아온다. e의 1000승만 되어도 어마어마한 값이 되는데 이런 값까지 합쳐서 나눠버리면 값의 의미가 없어진다. 그래서 제일 큰 수를 각각의 항에다가 빼준다음 계산하는 방법도 있다.
# 임의의 1X3 배열을 만들어준다. 입력값이다.
a = np.array([2000, 2050, 1700])
# 지수 함수를 만들어준다.
exp_a = np.exp(a)
print('exp_a : ', exp_a)
# exp_a : [inf inf inf] << 결과가 나온다.
# 제일 큰 값을 뽑아서 각각의 항에다가 빼준다.
max = np.max(a)
print('a - max', a - max)
# 밑은 똑같다.
exp_a = np.exp(a - max)
sum_exp_a = np.sum(exp_a)
print('sum_exp_a : ', sum_exp_a)
# 각각의 지수함수에서 다 더해준 총 합을 나눈다. 그러면 확률계산이 된다. (총 합이 1)
y = exp_a / sum_exp_a
print('y :', y)
간단하게 이해하면 소프트맥스 함수를 쓰면 확률로 해석할 수 있다. 분류 문제에서 자주 쓰이는 함수이다.
'머신러닝 > 딥러닝' 카테고리의 다른 글
CNN의 오토인코더(Autoencoders) (0) | 2021.04.21 |
---|---|
이미지 분할(Image Segmentation), 이미지 증강(Image Augmentation), 객체인식(Object Recognition) (0) | 2021.04.20 |
spaCy를 이용한 자연어처리(1) (0) | 2021.04.12 |
딥러닝 독학 3) 신경망 학습 (0) | 2021.04.06 |
딥러닝 독학 1)퍼셉트론에서부터 신경망 (0) | 2021.04.06 |