- 학습 : 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득
- 지표 : 신경망이 학습할 수 있도록 해줌 (손실 함수)
신경망은 데이터를 보고 학습할 수 있다. 여기서 학습한다는 의미는 가중치 매개변수의 값을 데이터를 보고 자동으로 결정한다는 것이다. 데이터에서 답을 찾고 데이터에서 패턴을 발견하기 때문에 꼭 데이터가 있어야 한다. 신경망 학습에서 사용하는 지표는 손실 함수이다.
- 평균 제곱 오차
$$E=\frac{1}{2}\sum_{k}^{} (y_k-t_k)^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=-\sum_{k}^{}t_klogy_k$$
정답일 때의 추정의 자연 로그를 계산하는 식이다. 결과적으로 정답일 때의 출력이 전체값을 정하게 되는 것이다. 정답에 가까울수록(값이 커질수록) 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=-\frac{1}{N}\sum_{n}^{}\sum_{k}{}t_{nk}logy_{nk}$$
하지만 훈련 데이터를 전부 돌리는 것은 현실적이지 않다. 그렇기 때문에 데이터의 일부를 추려 전체의 근사이로 이용한다. 이 것을 미니배치라고 한다. 현제 데이터는 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 |