아래는 softmax 함수와 relative_frequency 함수를 비교하는 python 코드다. relative_frequency 함수는 전체에 대한 상대적인 크기를 반환한다. 즉 (각 값 / 전체 값의 합)이다. 두 함수는 모두 배열의 합이 1이 된다는 공통점이 있다(전체 값이 모두 양수라는 조건이 있어야 한다).
import math
import matplotlib.pyplot as plt
arrx = range(5)
array = [2, 3, 5, 7, 11]
def softmax(array):
array = [x - max(array) for x in array]
a0 = 0
for x in array:
a0 += math.exp(x)
a1 = []
for x in array:
a1.append(math.exp(x)/a0)
return a1
def relative_frequency(array):
a0 = sum(array)
a1 = []
for x in array:
a1.append(x / a0)
return a1
a0 = softmax(array)
a1 = relative_frequency(array)
plt.bar(arrx, a1, color='b')
plt.bar(arrx, a0, color='g')
plt.show()
결과는 위와 같이 나왔다. 파란색이 relative_frequency, 초록색이 softmax다. relative_frequency는 그저 원래 배열에서 해당 값이 차지하고 있던 비율을 그대로 드러내는 반면, softmax는 가장 큰 값이 압도적으로 크게 나왔다.
array를 1000, 1001, 1002, 1003, 1004로 바꿔서 실행해보았다. relative_frequency는 모두 균등하게 나오지만, softmax는 값이 커질수록 기하급수적으로 출력도 커진다.
그리고 softmax 함수는 0과 음수도 넣을 수 있다!
relative_frequency 함수는 모든 값이 0이면 분모도 0이 되어버려서 못 쓰게 되어버린다. 그러나 softmax 함수는 모든 값이 0이어도 상관 없다. 왜냐하면 x가 지수에 있거든.
결론: softmax는 좋은 함수다.
'python > deep learning' 카테고리의 다른 글
NAND NOR (0) | 2021.08.09 |
---|---|
python 경사 하강법 (0) | 2021.08.06 |
댓글