본문 바로가기

머신러닝/딥러닝

딥러닝 독학 2) 소프트맥스 함수

소프트맥스를 들어가기 전 항등 함수 먼저 살펴보겠다.

항등함수는 우리가 고등학교 시절 항등원을 배웠듯 입력을 그대로 출력하는 함수이다. 그래서 항등함수를 사용하면 입력 신호가 출력 신호가 되어서 그대로 출력된다.

 

소프트맥스 함수란?

소프트맥스 함수는 분류 문제를 풀 때 이용된다. 소프트맥스 함수를 쓰면 각각의 점수를 클래스별 확률로 바꾸어 각각 점수가 총 합쳐서 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)

 

간단하게 이해하면 소프트맥스 함수를 쓰면 확률로 해석할 수 있다. 분류 문제에서 자주 쓰이는 함수이다.