본문 바로가기

딥러닝/신경망 기초

소프트맥스(Softmax)

소프트맥스(Softmax) 함수?


: 주로 분류(Classification)문제에서 사용되는 함수


Softmax함수



# example
a = np.array([0.3, 2.9, 4.0])
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)

y = exp_a / sum_exp_a
print(y) # 출력 : [0.01821127 0.24519181 0.73659691]


# softmax 구현
def softmax(a):
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y



Problem : Overflow


: 값이 너무 커져서, 표현할 수 있는 범위를 초과해버려 nan값이 출력될 위험 존재

# example : overflow
a = np.array([1010, 1000, 990])
print(np.exp(a) / np.sum(np.exp(a))) # 출력 : [nan nan nan]


Solution : 입력신호의 최대값을 활용


: 입력신호(input)의 최대값을 빼준다.

# example : solution
c = np.max(a) # 최대값 추출
print(np.exp(a-c) / np.sum(np.exp(a-c))) 
# 출력 : [9.99954600e-01 4.53978686e-05 2.06106005e-09]


# overflow 반영 softmax
def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a-c)
    sum_exp_a = np.sum(exp_a)
    return exp_a / sum_exp_a


특징

  • Softmax 출력값을 확률로 해석할 수 있다.
  • 그래서 문제를 확률적/통계적으로 대응할 수 있다.
  • 그러나 exp(x)가 단조증가함수이기 때문에 입력값의 대소관계는 변하지 않는다
  • 단조증가함수 : $a \le b$ 이면, $f(a) \le f(b)$