손실함수(Loss Function)
신경망 학습에서는 현재의 상태를 ‘하나의 지표’로 표현합니다.
그리고 그 지표를 가장 좋게 만들어주는 가중치 매개변수의 값을 탐색하는 것이 목표입니다.
(최적의 매개변수 값을 탐색)
신경망 학습에서 사용하는 지표를 손실 함수(loss function)라고 합니다.
이 손실함수는 임의의 함수를 사용할 수도 있지만 일반적으로는 오차제곱합과 교차 엔트로피 오차를 사용합니다.
손실 함수는 신경망 성능의 ‘나쁨’을 나타내는 지표
- 현재의 신경망이 훈련 데이터를 얼마나 잘 처리하지 ‘못’하느냐를 나타냄
- 손실 함수에 마이너스만 곱하면 ‘얼마나 좋으냐’라는 지표로 변신
- 나쁨을 최소로 하는 것과 좋음을 최대로 하는 것은 결국 같은 것이니까 본질적으로 같음
훈련 데이터에 대한 손실 함수의 값을 구하고, 그 값을 최대한 줄여주는(최소화하는) 매개변수 값을 탐색합니다.
오차 제곱합 (Sum of squares for error, SSE)
가장 많이 쓰이는 손실 함수입니다.
$$E=\frac{1}{2}\sum_{k}(y_{k}-t_{k})^2$$
- yk : 신경망의 출력 (신경망이 추정한 값) (소프트맥스 함수의 출력 → 해당 인덱스일 확률)
- tk : 정답 레이블 (정답에 해당하는 인덱스의 원소만 1이고 나머지 0 → 원-핫 인코딩)
- k : 데이터의 차원 수
딥러닝의 SSE는 원래 알고 있는 SSE와 다르게 '2'로 나눠준 걸 볼 수 있습니다.
이는 델타 규칙(Delta Rule) 때문인데, 경사 하강법의 과정에서 발생할 수 있는 오류를 최소화시키기 위함입니다.
오차가 더 작으면 실제값과 추정 값이 비슷하다고 볼 수 있음으로 정답에 더 가깝다고 판단합니다.
def sum_squares_error(y, t):
return 0.5 * np.sum*((y-t)**2)
교차 엔트로피 오차
교차 엔트로피 오차도 손실 함수로서 자주 이용됩니다.
$$E=-\sum_{k}t_{k}log(y_{k})$$
- yk : 신경망의 출력 (신경망이 추정한 값) (소프트맥스 함수의 출력 → 해당 인덱스일 확률)
- tk : 정답 레이블 (정답에 해당하는 인덱스의 원소만 1이고 나머지 0 → 원-핫 인코딩)
- k : 데이터의 차원 수
n개의 데이터에서의 각각을 구한 후 평균을 따지게 되면 다음과 같은 수식을 따릅니다.
$$E=-\frac{1}{n}\sum_{i}^{n}\sum_{k}t_{ik}log(y_{ik})$$
- n : 데이터의 갯수
실질적으로는 정답일 때의 추정의 자연로그를 계산하는 식입니다. (tk=1 일 때 yk의 자연로그)
즉, 교차 엔트로피 오차는 정답일 때의 출력이 전체 값을 정하게 됩니다.
- 자연로그의 그래프를 보면 x=1 이면 y=0이고, x가 0에 가까워질수록 y의 값은 점점 작아짐
- 교차 엔트로피 오차는 정답에 해당하는 출력이 커질수록 0에 다가가다가, 그 출력이 1일 때 0이 됨
- 반대로 정답일 때의 출력이 작아질수록 오차는 커짐
오차 제곱합과 동일하게 오차가 더 작으면 실제값과 추정 값이 비슷하다고 볼 수 있음으로 정답에 더 가깝다고 판단합니다.
def cross_entropy_error(y, t):
delta = 1e-7
return -np.sum(t * np.log(y + delta))
- np.log()에 0을 입력하면 -inf 나와 아주 작은 값 delta 더해줌
왜 손실 함수를 설정하는가?
우리의 궁극적인 목적은 높은 ‘정확도’를 끌어내는 매개변수 값을 찾는 것입니다.
그렇다면 왜 ‘정확도’라는 지표를 놔두고 ‘손실 함수의 값’이라는 우회적인 방법을 택하는 이유는 뭘까요?
이 의문은 신경망 학습에서의 ‘미분’의 역할에 주목하면 해결됩니다.
신경망 학습에서는 최적의 매개변수 (가중치와 편향)를 탐색할 때 손실 함수의 가능한 한 작게 하는 매개변수 값을 찾습니다.
이때 매개변수의 미분(정확히는 기울기)를 계산하고, 그 미분 값을 단서로 매개변수의 값을 서서히 갱신하는 과정을 반복합니다.
어떤 가상의 신경망의 어느 한 가중치 매개변수에 주목한다 했을 때 , 그 가중치 매개변수의 손실 함수의 미분이란 ‘가중치 매개변수의 값을 아주 조금 변화시켰을 때, 손실 함수가 어떻게 변하나’라는 의미입니다.
만약 이 미분 값이 음수면 그 가중치 매개변수를 양의 방향으로 변화시켜 손실 함수의 값을 줄일 수 있습니다.
반대로, 미분 값이 양수면 가중치 매개변수를 음의 방향으로 변화시켜 손실 함수의 값을 줄일 수 있습니다.
그러나 미분 값이 0이면 가중치 매개변수를 어느 쪽으로 움직여도 손실 함수의 값은 줄어들지 않습니다.
그래서 가중치 매개변수의 갱신은 거기서 멈추게 됩니다.
정확도를 지표로 삼아서는 안되는 이유는 미분 값이 대부분의 장소에서 0이 되어 매개변수를 갱신할 수 없기 때문입니다.
정확도는 매개변수의 미소한 변화에는 거의 반응을 보이지 않고, 반응이 있더라도 그 값이 불연속적으로 갑자기 변화합니다.
(예시 32% → 33%)
그러므로 신경망의 최적의 매개변수를 찾기 위해서는 손실함수를 사용합니다.
Reference
본 글은 '밑바닥부터 시작하는 딥러닝'을 참고하여 작성하였습니다.
'Data Science > Deep Learning' 카테고리의 다른 글
[DL] 오차역전파법(Backpropagation) (2) | 2022.03.08 |
---|---|
[DL] 신경망 학습 (0) | 2022.03.04 |
[DL] 신경망(Neural network) (0) | 2022.02.25 |
[DL] 신경망 활성화 함수 - 시그모이드(sigmoid), ReLU, 계단함수 (0) | 2022.02.25 |
[DL] 퍼셉트론(Perceptron) (0) | 2022.02.24 |
댓글