- 학습 : 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득
- 지표 : 신경망이 학습할 수 있도록 해줌 (손실 함수)
신경망은 데이터를 보고 학습할 수 있다. 여기서 학습한다는 의미는 가중치 매개변수의 값을 데이터를 보고 자동으로 결정한다는 것이다. 데이터에서 답을 찾고 데이터에서 패턴을 발견하기 때문에 꼭 데이터가 있어야 한다. 신경망 학습에서 사용하는 지표는 손실 함수이다.
- 평균 제곱 오차
E=12∑k(yk−tk)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]
y1 = [0.1,0.05,0.6,0.0,0.05,0.1,0.0,0.1,0.0,0.0]
y2 = [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(y1), np.array(t)))
print(mean_squared_error(np.array(y2), np.array(t)))
#0.09750000000000003
#0.5975
이 때에 t는 실제 정답 (2가 정답이라는 뜻)이고 y는 신경망이 추측한 값이다. 전체 합쳐서 1이 되는 소프트맥수 함수를 사용한 것이다. 이 둘의 값을 빼고 제곱하여 1/2을 곱해준다. 확률에 따라서 다른 값이 나오는 것을 알 수 있다. 추측 결과가 낮을수록(신뢰도가 낮을수록) 손실 함수의 출력이 작다.
- 교차 엔트로피 오차
E=−∑ktklogyk
정답일 때의 추정의 자연 로그를 계산하는 식이다. 결과적으로 정답일 때의 출력이 전체값을 정하게 되는 것이다. 정답에 가까울수록(값이 커질수록) 0에 가까워지고 정답에 멀어질수록 오차가 생긴다.
import numpy as np
def cross_entropy_error(y, t):
delta = 1e-7
return -np.sum(t*np.log(y+delta))
t = [0,0,1,0,0,0,0,0,0,0]
y1 = [0.1,0.05,0.6,0.0,0.05,0.1,0.0,0.1,0.0,0.0]
y2 = [0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.6,0.0,0.0]
print(cross_entropy_error(np.array(y1), np.array(t)))
print(cross_entropy_error(np.array(y2), np.array(t)))
#0.510825457099338
#2.302584092994546
delta를 더한 이유는 무한대에 가지 않기 위해서이다. 정답에 가까울수록 결과가 더 작아지는 것을 확인할 수 있다.
기계학습은 훈련 데이터를 사용해 학습한다. 훈련 데이터에 대한 손실 함수의 값을 구하고, 그 값을 최대한 줄여주는 매개변수를 찾아낸다. 훈련 데이터가 100개 있으면 100개의 손실 함수 값들의 합을 지표로 삼는 것이다. 교차 엔트로피 오차의 수식은 다음과 같다.
E=−1N∑n∑ktnklogynk
하지만 훈련 데이터를 전부 돌리는 것은 현실적이지 않다. 그렇기 때문에 데이터의 일부를 추려 전체의 근사이로 이용한다. 이 것을 미니배치라고 한다. 현제 데이터는 6만장이 있는데 이 중에서 100개를 무작위로 뽑아 100장만을 학습하여 지표를 구할 수 있다.
def get_data():
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
return x_test, t_test
def get_minibatch(num):
x, t = get_data()
train_size = x.shape[0]
batch_size = num
batch_mask = np.random.choice(train_size, batch_size)
x_batch = x[batch_mask]
t_batch = t[batch_mask]
return x_batch,t_batch
이렇게 하면 원하는 개수만큼의 미니 배치를 뽑을 수 있다. 이 데이터를 어떻게 교차 엔드로피 오차를 구현할 수 있을까?
def cross_entropy_error(y, t):
if y.ndim == 1:
t = t.reshape(1, t_size)
y = y.reshape(1, y_size)
batch_size = y.shape[0]
return -np.sum(t*np.log(y)) / batch_size
y.ndim 은 배열이 1차원 일때를 말하고 있다. reshape해서 다시 원래의 크기로 바꿔주어야 한다. 이후 batch_size 만큼 나눠주어(미니 배치의 개수) 정규화를 해주는 것이다. 신경망을 학습할 때 정확도를 지표로 삼아서는 안된다. 이유는 매개변수의 미분이 대부분의 장소에서 0이 되기 때문에 더이상 사용할 수 없어지기 때문이다.
'Python > DeepLearning' 카테고리의 다른 글
퍼셉트론에서 신경망으로(7) (0) | 2019.04.23 |
---|---|
퍼셉트론에서 신경망으로(6) (0) | 2019.04.23 |
퍼셉트론에서 신경망으로(4) (1) | 2019.04.22 |
퍼셉트론에서 신경망으로(3) (0) | 2019.04.22 |
퍼셉트론에서 신경망으로(2) (0) | 2019.04.22 |