티스토리 뷰
신경망 학습
1. 훈련 데이터와 시험 데이터
기계학습 문제는 데이터를 훈련 데이터와 시험 데이터로 나눠 학습과 실험을 수행하는 것이 일반적입니다.
우선 훈련 데이터만 사용하여 학습하면서 최적의 매개변수를 찾습니다.
왜 훈련과 테스트 데이터로 나누냐면 범용적으로 사용할 수 있는 모델이기 때문입니다.
범용 능력은 아직 보지 못한 데이터로도 문제를 올바르게 풀어내는 능력입니다.
2. 손실 함수
신경망 학습에서는 현재의 상태를 '하나의 지표'로 표현합니다. 그리고 그 지표를 가장 좋게 만들어주는 가중치 매개변수의 값을 탐색하는 것입니다.
즉, 신경망도 '하나의 지표'를 기준으로 최적의 매개변수 값을 탐색합니다.
신경망 학습에서 사용하는 지표는 손실 함수라고 합니다.
이 손실 함수는 임의의 함수를 사용할 수도 있지만 일반적으로 평균 제곱 오차와 교차 엔트로피 오차를 사용합니다.
2-1. 평균 제곱 오차
가장 많이 쓰이는 손실 함수는 평균 제곱 오차 입니다. 평균 제곱 오차 수식
수식
여기서 y_k는 신경망의 출력 (신경망이 추정한 값) t_k는 정답 레이블, k는 데이터의 차원 수를 나타냅니다.
이를테면 "3.6 손글씨 숫자 인식"예에서 y_k와 t_k는 다음과 같은 원소 10개짜리 데이터이라고 가정
정답은 t 리스트에 2번째가 1이므로 정답은 2!!
y 리스트에서 0.6 즉 제일 높은 위치를 2로 잡았을때 0.0975 가장 높은 경우일 때 평균 제곱 오차를 기준으로
오차가 더 작습니다.
하지만 y2 리스트에서 0.6 즉 제일 높은 위치를 7로 잡았을 때 정답은 2이므로 평균 제곱 오차가 크게 나오죠!
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, 0]
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0, 0.0]
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.1, 0.6, 0.0, 0.0]
print(mean_squared_error(np.array(y), np.array(t)))
#0.09750000000000003
print(mean_squared_error(np.array(y2), np.array(t)))
#0.09750000000000003
3. 미니배치 학습
기계학습 문제는 훈련 데이터를 사용해 학습합니다. 더 구체적으로 말하면 훈련 데이터에 대한 손실 함수의 값을 구하고,
그 값을 최대한 줄여주는 매개변수를 찾아냅니다. 이렇게 하려면 모든 훈련 데이터를 대상으로 손실 함수 값을 구해야 합니다.
즉, 훈련 데이터가 100개가 있으면 그로부터 계산한 100개의 손실 함수 값들의 합을 지표로 삼는 것입니다.
따라서 훈련 데이터로부터 일부만 골라 학습을 수행합니다. 이 일부를 미니배치 라고 하죠
MNIST 데이터셋을 읽어와서 미니배치 학습을 구현해 보도록 하겠습니다.
무작위로 10개만 빼낼때 np.random.choice() 함수를 써서 해보겠습니다.
아래 처럼 함수가 출력한 배열을 미니배치로 뽑아낼 데이터의 인덱스로 사용하면 될거 같습니다!
print(x_train.shape)
print(t_train.shape)
train_size = x_train.shape[0]
batch_size = 10
batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]
print(np.random.choice(60000, 10))
#(60000, 784)
#(60000,)
#[17227 3001 30258 38187 45921 51569 37917 38922 12709 41246]
왜 손실함수를 설정하는가?
이거는 내용이 너무 좋아서 책에 있는 내용을 그대로 옮겼습니다.
출처: 밑바닥 부터 시작하는 딥러닝
이쯤 되면 손실함수의 정의는 이해하셨을 겁니다. 예컨대 숫자 인식의 경우도 우리의 궁극적인 목적은 높은 '정확도'를 끌어내는 매개변수 값을 찾는 것입니다.
그렇다면 '정확도'라는 지표를 놔두고 '손실 함수의 값'이라는 우회적인 방법을 선택하는 이유는
신경망 학습에서의 미분의 역할에 주목한다면 해결됩니다.
신경망 학습에서는 최적의 매개변수(가중치와 편향)를 탐색할 때 손실 함수의 값을 가능한 한 작게 하는 매개변수 값을 찾습니다.
이때 매개변수의 미분(정확히는 기울기)을 계산하고, 그 미분 값을 단서로 매개변수의 값을 서서히 갱신하는 과정을 반복합니다.
만약 이 미분값이 음수면 그 가중치 매개변수를 양의 방향으로 변화시켜 손실 함수의 값을 줄일 수 있고 미분 값이 양수면 반대이겠지요.
하지만 미분 값이 0이면 가중치 매개변수를 어느 쪽으로 움직여도 손실 함수의 값은 달라지지 않습니다.
정확도를 지표로 삼아서는 안되는 이유는 미분 값이 대부분의 장소에서 0이 되어 매개변수를 갱신할 수 없기 때문입니다.
확실히 pytorch 하기 전에 이책을 보면서 공부해야 한다고 오늘 느낌.
약간 감이 오기 시작함 ㅎㅎ
'딥러닝' 카테고리의 다른 글
딥러닝 - 07. 경사법(경사 하강법) / 신경망 기울기 (0) | 2019.03.21 |
---|---|
딥러닝 - 05. MNIST 데이터 셋 / 추론 배치 처리 (0) | 2019.03.07 |
딥러닝 - 04. 신경망 (3) 출력층 설계 (0) | 2019.02.21 |
딥러닝 - 04. 신경망 (2) 3층 신경망 구현 (0) | 2019.02.19 |
딥러닝 - 04. 신경망 (1) 활성화, 계단, 시그모이드 함수 (0) | 2019.02.19 |
댓글