신경망은 분류와 회귀, 모두 이용할 수 있다.
이제 어떤 문제냐에 따라 사용하는 활성화 함수가 달라진다.
회귀: 항등 함수
분류: softmax
회귀: (연속적인) 수치를 예측
분류: 성별 분류, 개 고양이 분류
입력을 그대로 출력한다.
입력과 출력이 항상 같다는 의미
그래서 출력층에서 항등 함수를 사용하면 입력 신호가 그대로 출력 신호가 된다.
소프트맥스는 다중 클래스 분류 모델에서 사용된다.
각 클래스일 확률이 몇 퍼센트인지 출력한다.
a = np.array([0.3, 2.9, 4.0])
exp_a = np.exp(a)
print(exp_a) # [ 1.34985881 18.17414537 54.59815003]
sum_exp_a = np.sum(exp_a)
print(sum_exp_a) # 74.1221542101633
y = exp_a / sum_exp_a
print(y) # [0.01821127 0.24519181 0.73659691]
소프트맥스에는 오버플로우가 일어날 수 있다.
여기서 사용하는 지수 함수에서 큰 값을 출력하기 때문에 무한을 뜻하는 inf가 출력될 수 있다.
이 문제를 해결하기 위해 소프트맥스 함수를 개선했다.
파이썬 코드로 만들면 아래와 같다
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
이것을 이용하여 계산을 하면
a = np.array([0.3, 2.9, 4.0])
y = softmax(a)
print(y) # [0.01821127 0.24519181 0.73659691]
np.sum(y) # np.float64(1.0)
이렇게 각 클래스에 대한 확률이 나오고 그 확률을 모두 더하면 1이 나오게 된다.
y[0]의 확률은 0.018(1.8%) y[1]의 확률은 0.245(24.5%) y[2]의 확률은 0.737(73.7%)로 해석할 수 있다.
그리고 y[2]의 확률이 가장 높기 때문에 답은 y[2]번으로 출력하는 것이다.
소프트맥스 함수는 각 클래스의 확률을 나타낸다고 했다.
그렇기 때문에 출력층의 뉴련 개수는 클래스 수와 같아야 한다.
만약 0~9 중 하나로 분류하는 문제라면 출력층의 뉴련 개수는 10개여야 한다.