Loss Function
- 손실 함수 = Loss Function 신경망 성능의 '나쁨'을 나타내는 지표. 즉, 현재의 신경망이 훈련 데이터를 얼마나 잘 처리하지 못하는지를 나타냄.
- 평균 제곱 오차 = MSE(Mean Squared Error) $$ E = \frac{1}{n}\sum_{k=1}^n (y_k-t_k)^2 \qquad y_k\text{ : 신경망의 출력, } t_k\text{ : 정답 레이블, } n\text{ : 데이터의 차원 수} $$
- 특징 수치예측에 많이 사용됨.
- 파이썬 구현
이러한 '나쁨'을 최소로 하는 것은 사실상 '좋음'을 최대로 하는 것과 같으므로, 신경망 학습에서는 손실 함수값이 작아지는 방향으로 학습하게 됨.
신경망 학습에서는 최적의 매개변수(가중치, 편향)을 탐색할 때 손실함수의 값을 가능한 한 작게 하는 매개변수 값을 찾음.
찾을 때는 매개변수의 미분(=기울기)을 계산하고, 이 계산값을 단서로 새로 매개변수 값을 갱신해나감. 자세히 말하면 '가중치 매개변수에 대한 손실 함수의 미분=가중치 매개변수의 값을 아주 조금 변화시켰을 때, 손실 함수의 변하는 정도'임. 따라서 이 값이
음수 : 가중치 매개변수를 양의 방향으로 변화(=값 증가)시켜 손실 함수의 값을 줄임.
양수 : 가중치 매개변수를 음의 방향으로 변화(=값 감소)시켜 손실 함수의 값을 줄임.
굳이 손실 함수를 쓰는 이유는, 정확도를 지표로 하면 매개변수의 미분이 대부분의 장소에서 0이 되기 때문임.
정확도라는 것은 전체 중 얼마나 정확히 인식했냐이므로, 예를 들어 100장이 전체일 때는 32%, 33%와 같은 값만 같게 됨.
따라서 32%상황에서 매개변수를 조금 변화시켜도 32.0234%같이 안 되고 여전히 32%이거나(이 경우 미분이 0), 33%같이 큰 값으로(=불연속적으로) 값이 변화하므로 최적의 매개변수 값을 찾기에 적합하지 않음.
딥러닝에 자주쓰이는 손실함수에는 다음과 같은 함수들이 있음.
def mean_squared_error(y, t):
return ((y-t)**2).mean(axis=None)
# 정답이 '5'인 경우
t = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
# '5'가 제일 높다고 추정함
y = [0.1, 0.05, 0.05, 0.0, 0.05, 0.6, 0.05, 0.0, 0.1, 0.0]
mean_squared_error(np.array(y), np.array(t))
0.019750000000000007
# '7'이 제일 높다고 추정함
y = [0.1, 0.05, 0.05, 0.0, 0.05, 0.0, 0.05, 0.6, 0.1, 0.0]
mean_squared_error(np.array(y), np.array(t))
0.13899999999999998
# 값이 작게 나온 것이 정답에 더 가깝다고 판단 가능.
- 특징 정답 레이블이 원-핫 인코딩이므로, CEE의 값은 정답일 때의 추정값($t_k$가 1일 때의 $y_k$)의 자연로그를 계산한 값과 같음.
- 파이썬 구현
즉, 정답일 때의 출력이 전체 값을 정함.
def cross_entropy_error(y, t):
if y.ndim == 1:
t = t.reshape(1, t.size)
y = y.reshape(1, y.size)
# 훈련 데이터가 원-핫 벡터라면 정답 레이블의 인덱스로 반환
if t.size == y.size:
t = t.argmax(axis=1)
batch_size = y.shape[0]
# 정답 레이블이 원-핫 인코딩이 아니라 숫자 레이블로 주어졌을 때의 경우 고려한 구현
return -np.sum(np.log(y[np.arange(batch_size), t])) / batch_size
댓글
댓글 쓰기