출력함수와 그 구현

기계학습은 크게 분류(classification)와 회귀(regression)로 나뉘어진다. 

그리고 각각의 경우 보통 출력함수(출력에 사용되는 함수)는 항등함수와 softmax함수이다. 

항등함수는 입력값을 그대로 출력하는 함수를 의미한다. 

softmax함수는 말 그대로 부드러운 함수인데 기본적인 식은 다음과 같다.


어려워보이지만 생각보다 간단하다. 가장 먼저 n은 출력 층 뉴런의 수이고 y가 출력을  a가 입력 신호를 표현한다. 즉 해석하자면 전체의 입력 신호의 e승의 합분의 우리가 구하고자 하는 k번째의 입력 신호를 분자로 한다는 것이다. 이는 항등함수와는 다르게 입력값의 전체에 영향을 받는다고 할 수 있다. 

소프드맥스 함수의 특징중 한가지는 출력값들의 합이 '1'이라는 것이다. 따라서 우리는 이것을 확률로 해석 할 수 있고 이런 특징 때문에 회귀에 사용되는 것이다. 

소프트맥스 함수를 구현하면 다음과 같다.
import numpy as np

def softmax(x):
expo = np.exp(x)
down = np.sum(expo)
return expo / down


t = np.array([0.123, 1.2, 0.1])
y = softmax(t)
print(y)
이 코드를 실행하게 되면 각각 약 0.2, 0.6, 0.2가 나온다. 입력 값이 10배라고 출력 값이 10배가 되지 않는 점과 모든 값이 합쳐지면 1이 된다는 점이 보인다. 

허나 이 소프트맥스 함수는 지수함수이므로 오버플로 문제를 종종 발생시킬 수 있다.
따라서 이를 보완하기 위해 위의 수식을 조금 변형하겠다.


임의의 C를 위,아래에 곱한 후 정리하면 다음과 같은 식이 나온다. 식을 약간 변형한 것일 뿐 값은 동일하다. 즉 우리는 이 식을 통해 c'에 입력 신호 중 최대값을 대입해 오버플로를 막을 수 있다.  



댓글

이 블로그의 인기 게시물

다양한 계층 구현을 통한 오차역전파법 구현하기(2)

퍼셉트론(Perceptron)

[논문리뷰] 3. CNN에 대하여