티스토리 뷰
목차
이전 글에 이어서 출력층에 대해서 작성합니다.
출력층 설계
신경망은 분류와 회귀 모두 이용가능 하며, 회귀는 항등함수, 분류는 소프트맥스를 사용(Sigmoid도 사용됨)
참고) 회귀의 기원
19세기 후반 영국의 우생학자 프랜시스 골턴 경은 사람과 완두콩 등을 대상으로 그 크기를 측정함. 관찰 결과 크기가 큰 부모의 자식은 부모보다 작고 작은 부모의 자식은 부모보다 큰, 즉 평균으로 회귀(regression)하는 경향이 있음을 았았다. 그 사이에는 선형관계가 있어 부모의 크기로부터 자식의 크기를 예측할 수 있고, 그 예측 결과값이 연속적인 수치였다.
항등함수 / 소프트맥스 구현
항등함수는 입력을 그대로 출력하고, 소프트맥스 함수는 다음과 같다.
$$ y_k = \frac{\exp{(a_k)}}{\sum_{i=1}^{n}\exp{(a_i)}} $$
코드는 다음과 같다.
import numpy as np
def Softmax(x):
exp_sum = np.sum(np.exp(x))
return np.exp(x) / exp_sum
x = np.array([0.1, 0.6, 5])
print(Softmax(x))
# [0.00730255 0.01203987 0.98065759]
소프트맥스 함수 구현 시 주의사항
소프트맥스는 exponential 함수를 계산하므로 컴퓨터 계산 시 오버플로문제가 발생할 수 있다. 값이 커져서 컴퓨터에서 inf로 인식하는 경우 나눗셈을 하게되면 굉장히 불안정(결과의 신뢰도가 떨어진다.)하다.
이를 개선하기위해 함수 형태를 바꿔보면 다음과 같다.
$$ 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 + \log C)}{\sum_{i=1}^n\exp(a_i + \log C)} = \frac{\exp (a_k + C')}{\sum_{i=1}^n\exp(a_i + C')}$$
위의 식은 지수에 어떤 상수를 똑같이 더해줘도 결과는 같다는 것을 알 수 있다. 이때, 오버플로를 막기위해 입력 값 중 가장 큰 값을 이용해 빼준다.
Ex)
import numpy as np
def Softmax(x):
exp_sum = np.sum(np.exp(x))
return np.exp(x) / exp_sum
x = np.array([0.1, 0.6, 5])
print(Softmax(x))
#### 오버플로 발생
x = np.array([7000, 7020, 6990])
print(Softmax(x))
max_x = np.max(x)
print(Softmax(x - max_x))
# [ nan nan nan ]
# [2.06115362e-09 9.99999998e-01 9.35762295e-14]
최댓값을 빼주면 오버플로를 어느정도 막아줄 수 있다. 이를 바탕으로 다시 구현하면 다음과 같다.
### 최댓값을 빼주는 것을 적용한 softmax
def Softmax(x):
max_x = np.max(x)
new_x = np.exp(x - max_x)
exp_sum = np.sum(new_x)
return new_x / exp_sum
print(Softmax(x))
소프트맥스 특징
일반적으로 마지막 출력층에서 나오는 값들은 regression의 경우 feature가 하나이므로 상관없으나 classification의 경우 구하고자하는 class의 개수만큼의 feature를 출력해주기 때문에 그 중 가장 큰값을 선택하는 것이 일반적이다. 우리는 이를 확률값으로 나타내고 선택하고자 할 때 값의 비율로 할 경우 음수값이 출력값일 때 이를 확률값으로 사용할 수 없으며 전체 합이 0이 되는 경우가 생겨 계산 자체가 안되는 문제가 발생한다. 이를 해결하기위해 활용하는 함수가 소프트맥스이다.
Softmax 출력의 총합은 1이되며, exp 함수로 구성되어 있어 무조건 양수이므로 확률로 해석할 수 있다. 지수함수는 단조증가함수 이므로 각 원소의 대소관계는 변하지 않는다. 신경망에서의 분류는 일반적으로 가장 큰 출력을 내는 뉴런에 해당하는 클래스로만 인식한다. 소프트맥스를 적용해도 뉴런의 위치는 변하지 않기때문에 현업(추론단계)에서는 지수함수 계산의 자원 낭비를 줄이기 위해 생략하는 것이 일반적이다. 학습단계에서는 출력층으로 소프트맥스를 사용한다.
'AI' 카테고리의 다른 글
[논문 구현] VGGNet 간단하게 구현해보기!! (0) | 2022.07.26 |
---|---|
[논문 구현] Vision Transformer (ViT)를 간단하게 구현해보기!! (0) | 2022.07.25 |
[딥러닝 Basic] 신경망 (Neural Network) 간단하게 알아보기1 (0) | 2022.07.25 |
[딥러닝 Basic] XOR 문제로 간단하게 살펴보는 퍼셉트론 (0) | 2022.07.25 |
[논문 리뷰] DenseNet 간단리뷰 (0) | 2022.07.24 |