26번째 줄: |
26번째 줄: |
| return np.maximum(0, x) | | return np.maximum(0, x) |
| </syntaxhighlight> | | </syntaxhighlight> |
| + | |
| + | == 소프트맥스 함수 == |
| + | softmax function. 출력층에서 사용하는 활성화함수 중 문류 문제에 주로 쓰이는 함수이다. <math>y_k = \frac{\exp(a_k)}{\sum_{i=1}^n\exp(a_i)}</math>형태로, 분모가 모든 신호의 지수함수합으로 이루어져 해당 분류의 확률을 나타낼 수 있다. |
| + | |
| + | 지수함수의 연산낭비를 줄이기 위해 생략하기도 한다.(학습시킬 땐 많이 사용한다.) |
| + | |
| + | === 구현 === |
| + | <syntaxhighlight lang="python"> |
| + | def softmax_function(x): # 일반적으로 넘파이 배열을 받는다. |
| + | c = np.max(x) # 오버플로우에 대한 대책. |
| + | exp_x = np.exp(x-c) # 최댓값을 뺀 후에 지수값을 계산한다. |
| + | sum_exp_x = np.sum(exp_x) # 지수값을 모두 더한 값.(스칼라) |
| + | y = exp_x / sum_exp_x # 배열을 스칼라로 나누어 새로운 배열 생성. |
| + | return y |
| + | </syntaxhighlight>exp는 지수함수이기 때문에 조금만 숫자가 커져도 숫자가 너무 커져서 컴퓨터가 다루는 수의 한계를 넘어버리고 만다.(이를 오버플로우라 한다.) 때문에 <math>y_k = \frac{\exp(a_k)}{\sum_{i=1}^n\exp(a_i)}= \frac{C\exp(a_k)}{C\sum_{i=1}^n\exp(a_i)}= \frac{\exp(a_k-c)}{\sum_{i=1}^n\exp(a_i-c)}</math>의 관계에 있음을 이용하여 전체에서 가장 큰 값을 빼주고 실행한다. 보통 최종 값의 정류를 위한 함수로, 연산 자체엔 영향을 미치지 않는다. |
| [[분류:딥러닝 이론]] | | [[분류:딥러닝 이론]] |