M.L code(p.92)
softmax function
분모의 지수함수들을 더한 값들과 분자의 특정 지수함수의 값으로 나타내는 함수이며 그 합이 1인 확률함수적인 성질을 가져서 신경망의 답을 구현해낼때 많이 사용하는 함수다.
|
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np def softmax(a): exp_a = np.exp(a) sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y a = np.array([[0.3, 2.9, 4.0]]) y = softmax(a) print(y) |

하지만 지수함수이므로 큰 값들을 다루게되면 값이 매우 커져 컴퓨터가 읽을 수 없는 문제가 발생한다.
|
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np def softmax(a): exp_a = np.exp(a) sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y a = np.array([[1010, 1000, 990]]) y = softmax(a) print(y) |
nan 값을 출력
해결방안 : 분모 분자에 같은 수를 곱해도 같다는 성질을 이용하여 입력받은 배열의 가장 큰 값을 각 배열원소에 빼서 그 값을 softmax 입력 값으로 이용한다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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([0.3, 2.9, 4.0]) y = softmax(a) print(y) print(np.sum(y)) |

데이터 y[0] = 0.018 y[1] = 0.245 y[2] = 0.736 으로 각 데이터를 합하면 1인 확률함수적인 성질을 가지고 있어 y[0]은 1.8% y[1]은 24.5% y[2]은 73% 의 비중을 가지고 있다 판단할 수 있다.