신경망 학습에서는 현재의 상태를 “ 하나의 지표 “로 표현한다. 그리고 그 지표를 가장 좋게 만들어주는 가중치 매개변수의 값을 탐색하는 것이다.
신경망 학습에서 사용하는 지표는 “ 손실 함수 ( Loss function ) “ 라고 한다. 이 손실 함수는 임의의 함수를 사용할 수도 있지만, 일반적으로는
평균 제곱 오차와 교차 엔트로피 오차를 사용한다.
NOTE_
손실 함수는 신경망 성능의 ‘나쁨’을 나타내는 지표로, 현재의 신경망이 훈련 데이터를 얼마나 잘 처리하지 ‘못’히는를 나타낸다. ‘성능 나쁨’을 지표로 한다니 무언각 부자연스럽지만,
손실 함수에 마이너스만 곱하면 ‘얼마나 나쁘지 않나?‘, 즉 ‘ 얼마나 좋으냐’라는 지표로 바뀌게 된다. 성능의 ‘나쁨’과 성능의 ‘좋음’ 중 어느 쪽을 지표로 삼아도 본질적으로 수행하는 일은 같다.
평균 제곱 오차( Mean Squared Error, MSE )
가장 많이 쓰이는 손실 함수이다.
여기서 Y는 신경망의 출력 ( 신경망이 추정한 값), T는 정답 레이블, K는 데이터의 차원 수를 나타낸다.
예를 들어
Y = [ 0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0 ]
T = [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ]
일때, 원소의 각 인덱스부터 순서대로 숫자 ‘ 0 ‘, ‘ 1 ‘, ‘ 2 ‘ ….. ‘ 9 ‘ 라고 하자.
이때 y는 신경망의 출력 ( 소프트맥스 함수, 활성화함수의 종류 ) 이다.
이 예에서 숫자가 0일 확률은 0.1
숫자가 1일 확률은 0.05
숫자가 2일 확률은 0.6 …이라고 할 수 있다.
이때 T는 정답 레이블이므로, t의 인덱스가 3, 즉 숫자가 2일때가 정답임을 알 수 있다.
T는 원 핫 인코딩 방식으로 표현한 종류 중 하나이다.
이 때 평균 제곱 오차는, 위의 식과 같이 “ 각 원소의 출력 ( 추정 값 ) 과 정답 레이블( 정답 값 ) 의 차 == y - t 를 제곱 한 후 , 그 총합을 구한다. “
그러면 이 평균 제곱 오차를 파이썬으로 구현해보자.
cf) 아나콘다에서 vs-code 사용, python3를 사용한다.
import numpy as np
def mean_squared_error(y, t):
return 0.5 * np.sum((y-t)**2)
t = [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
# 예시 1 : '2'일 확률이 가장 높다고 추정함 ( 0.6 )
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
print(mean_squared_error(np.array(y), np.array(t)))
# 예시 2 : '7'일 확률이 가장 높다고 추정함 ( 0.6 )
y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
print(mean_squared_error(np.array(y), np.array(t)))
0.09750000000000003
0.5975
첫 번째의 예는 정답이 ‘2’이고, 신경망의 출력도 ‘2’에서 가장 높은 경우 이다.
한편 두번째의 예는 정답은 똑같이 ‘2’이지만, 신경망의 출력은 ‘7’에서 가장 높다.
이 실험의 결과로 첫 번째 예이 손실 함수 쪽 출력이 작으며, 정답 레이블과의 오차도 작은 것을 알 수 있다.
즉, 평균 제곱 오차를 기준으로는 첫 번째 추정 결과가 ( 오차가 더 작으므로 ) 정답에 더 가까울 것으로 판단할 수 있다.
NOTE_
왜 제곱을 하는가 ? 예를 들어 1번째 인덱스의 값이 -5, 2번째 인덱스의 값이 5 라고 하면, 총 합은 0이 된다. 이러한 이유로 음수를 방지하기 위해 제곱을 한다.
또한 평균을 기준으로 떨어진 정도를 누적시키기에 간단한 계산으로 오차를 측정할 수 있다.
'머신러닝, 딥러닝' 카테고리의 다른 글
미니 배치 학습 (0) | 2020.01.20 |
---|---|
교차 엔트로피 오차 ( Cross Entropy Error, CEE ) (0) | 2020.01.20 |
tensorflow CNN (합성곱) 에서의 conv2d (0) | 2020.01.20 |
신경망 학습 (0) | 2020.01.19 |
머신러닝과 딥러닝 (0) | 2020.01.19 |