github에서 mnist 소스코드 다운로드, 코드에 mnist.py import하고 load_mnist하면 데이터가 load된다.
img로 보여주는 작업은 함수를 하나 더 선언해야함
# coding: utf-8
import sys, os
sys.path.append(os.pardir)
from mnist import load_mnist
from PIL import Image
def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()
(x_train, t_train) , (x_test, t_test) = load_mnist(flatten=True, normalize=False)
신경망에서는 활성화 함수로 시그모이드 함수와 ReLU와 같은 매끄럽게 변화하는 함수를 사용 ( 퍼셉트론에서는 갑자기 변화하는 계단함수를 사용)
넘파이의 다차원 배열을 잘 사용하면 신경망을 효율적으로 구현할 수 있다. → 앞장에서의 matrix multiplication 구조
기계학습 문제는 크게 회귀와 분류로 나눌 수 있음
회귀는 y 값이 수치값, 분류는 y 값이 분류값. 즉 회귀는 그냥 y 값 그 자체를 예측, 분류는 y값을 토대로 어떤 함수를 통해서 분류함. 이 함수가 소프
트맥스 함수. 즉, 회귀문제에서 출력층의 활성화 함수는 항등함수이고, 분류에서 출력층의 활성화함수는 소프트맥스 함수이다.
정답레이블과 입력 데이터가 있다고 할 때, 입력데이터가 신경망들을 통과해 최종 출력값에 다다른 예측값과 정답레이블을 비교한 식을 함수로 나타낸 것.
SSE -> 오차제곱합

CSE -> 교차엔트로피 오차


경사 하강법은 손실함수 값을 최소화 하기위한 절차라고 보면된다. 위의 그림은 마지막 hidden layer와 출력층을 그림으로 나타낸 것. 경사하강법을 이용한 학습절차는
1. 입력층에서 순전파를 진행함 (f(f(.....f(WX+B))..)를 계속 반복 이때 f(x)는 활성화 함수로 sigmoid나 relu함수 등등을 의미한다.)
2. 이렇게 순전파를 통해 전달되면 마지막 출력층엔 활성화함수로 sigmoid나 relu 대신 SOFTMAX 함수를 적용해 예측값을 구한다.
3. 이 예측값과 정답 레이블을 이용해 손실함수의 값을 구한다.
4. 손실함수를 W에대해 미분한 값을 구한다.
5. 미분값이 구해지면 learning rate * 미분값을 각 가중치에 빼준다. (가중치 갱신과정)
6. 위 과정을 여러번 반복시켜 학습을 진행한다.
기계학습에서 사용하는 데이터셋은 훈련 데이터와 시험 데이터로 나눠 사용한다.
훈련 데이터로 학습한 모델의 범용 능력을 시험 데이터로 평가한다.
신경망 학습은 손실함수를 지표로, 손실 함수의 값이 작아지는 방향으로 가중치 매개변수를 갱신한다.
가중치 매개변수를 갱신할 때는 가중치 매개변수의 기울기를 이용하고 기울어진 방향으로 가중치의 값을 갱신하는 작없을 반복한다.
이때 수치 미분을 이용해 가중치 매개변수의 기울기를 구할 수 있다.
수치 미분을 사용할 경우에 간단하지만, 시간이 오래걸린다. 따라서 다음장에서는 오차 역전파를 이용해 기울기를 고속으로 구현해 본다.