netron으로 보다보면 softmax라는게 나오는데

그냥 그러려니 하고 넘어가던거에서 조금은 이론적으로 설명이 되는걸 보니 궁금해짐

[링크 : https://m.hanbit.co.kr/store/books/book_view.html?p_code=B7257101308]

 

아무튼 수식으로는 먼가 와닫지 않는데

[링크 : https://syj9700.tistory.com/38]

 

값들의 평균을 내어 합이 1이 되도록 정규화한다고 해야하나..

(1,2,8)을 (0.001, 0.002, 0.997) 로 변환한다.

(1,2,8) 에 e^n 을 하면

(e^1, e^2, e^8) 이 되고

밑은 e^1 +  e^2 + e^8 하면 되니까

(e^1 / (e^1 +  e^2 + e^8), e^2 / (e^1 +  e^2 + e^8), e^8 / (e^1 +  e^2 + e^8)) 로 계산하면

 

(2.71828182845904, 7.38905609893065, 2980.95798704173)

2.71828182845904 + 7.38905609893065 + 2980.95798704173 = 2991.06532496912

(2.71828182845904 / 2991.06532496912, 7.38905609893065 / 2991.06532496912, 2980.95798704173 / 2991.06532496912)

= (0.000908800555363033, 0.00247037603533682, 0.9966208234093)

 

이름과 달리 최댓값(max) 함수를 매끄럽거나 부드럽게 한 것이 아니라, 최댓값의 인수인 원핫 형태의 arg max 함수를 매끄럽게 한 것이다. 그 계산 방법은 입력값을 자연로그의 밑을 밑으로 한 지수 함수를 취한 뒤 그 지수함수의 합으로 나눠주는 것이다.

[링크 : https://ko.wikipedia.org/wiki/소프트맥스_함수]

 

For example, the standard softmax of (1,2,8) is approximately (0.001,0.002,0.997), which amounts to assigning almost all of the total unit weight in the result to the position of the vector's maximal element (of 8).

>>> import numpy as np
>>> a = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0]
>>> np.exp(a) / np.sum(np.exp(a)) 
array([0.02364054, 0.06426166, 0.1746813, 0.474833, 0.02364054,
       0.06426166, 0.1746813])

[링크 : https://en.wikipedia.org/wiki/Softmax_function]

 

아무튼 계산에 의한 결과가 true, false로 판별할 수 있는 값이 아닌

사람이 보기 편한 값으로 환산되기 때문에, 에측에는 softmax를 쓰지 말라는게 이해 될 것 같기도, 안 갈 것 같기도..

[링크 : https://velog.io/@francomoon7/예측에-Softmax를-사용하면-안되는-이유]

Posted by 구차니