오차역전파
수치미분을 이용한 딥러닝은 속도가 매우 느리기 때문에 Mnist와 같은 대규모 데이터를 처리하기에 부적합하다.
미분의 연쇄 법칙(Chain Rule)을 응용하여 편미분을 하지 않고 가중치와 바이어스의 변화율을 간단한 곱셈 형태로 나타낼 수 있는 방법이 있다. (공식 유도 방법은 이 영상을 참고)
이 방법을 역전오차파 방법이라고 하며 딥러닝의 성능을 비약적으로 향상시킨다. 역전파인 이유는 순전파(Propagation)인 피드 포워드(Feed Foward) 과정과 반대 방향으로 수행되기 때문이다.
오차역전파 일반 공식
출력층 손실값
$$
loss_{out} = (A_{out}-T)\cdot A_{out}\cdot (1-A_{out})
$$
은닉층 손실값
$$
loss_{h} = (loss_{h+1} \cdot (W_{h+1})^{T})\cdot A_{h} \cdot (1-A_h)
$$
학습 방법
$$
W_i = W_i - \alpha \cdot (A_{i-1})^T \cdot loss_i
$$
$$
b_i = b_i - \alpha \cdot loss_i
$$
역전오차파가 반영된 딥러닝 코드
인공 신경망 클래스
1 | import numpy as np |
노드의 개수를 자유롭게 설정할 수 있도록 설계하였다.
학습 코드
1 | epochs = 5 |
입력층 노드 784개
은닉층 노드 100, 30개
출력층 노드 10개 (분류)
로 설정하고 5 epoch * 20000 SET 학습을 진행하였다.
1 | mnist.shape = (20000, 785) |
학습하는데 약 1분 13초의 시간이 소요되었다.
정확도 테스트
1 | test_data = np.loadtxt('/content/sample_data/mnist_test.csv', delimiter=',', dtype=np.float32) |
1 | test_data.shape = (10000, 785) |
약 95%의 정확도가 나왔다.