이제는 사용하지 않는 공부방/Artificial intelligence

[밑바닥부터 시작하는 딥러닝] 5강 오차역전파법 핵심정리

환상상상속상 2021. 4. 30. 02:42

가중치 파라매터의 기울기를 효율적으로 계산하는 backpropagation에 대해서 알아봅시다.

 

수식보다는 계산 그래프를 통해서 설명하고자 합니다.

 

계산 그래프를 사용하면 3가지의 장점이 있습니다.

- 국소적 계산을 통해 자신과 직접 관계된 작은 범위의 계산만을 볼 수 있습니다. 마치, 자동차 공장에서 분업으로 행해지는 것과 같습니다.

- 중간 계산 결과를 확인할 수 있습니다.

- 역전파를 통해 미분을 효율적으로 계산할 수 있습니다.

 

역전파는 '국소적인 미분'을 순방향과는 반대인 오른쪽에서 왼쪽으로 전달하는데 이때, chain rule에 따라 전달됩니다.

 

 

1.역전파

 

1) 덧셈 노드의 역전파

chain rule을 생각하면서 그래프를 그려보면 덧셈 노드의 역전파는 입력 값을 그대로 흘려보냅니다.

 

2) 곱셈 노드의 역전파

chain rule을 생각하면서 그래프를 그려보면 곱셈 노드는 상류의 값에 순전파 때의 입력 신호들을 '서로 바꾼 값'을 곱해서 흘려보냅니다.

 

 

2. 단순한 계층 구현하기

 

multiply layer, add layer을 계산해보자.

 

 

3. 활성화 함수 계층 구현하기

 

-ReLu

스위치처럼 0보다 크면 신호를 보내고, 0보다 작으면 무시한다.

 

 

 

-Sigmoid

노드를 그룹화하여 sigmoid 계층의 입력 x, 출력 y에만 집중할 수 있다.

 

 

 

4. Affine / Softmax 계층 구현하기

 

-affine: 순전파에서 행해지는 행렬 곱은 기하학에서 affine trainsformation라고 불린다.

Y = np.dot(x,w) + b를 행렬을 통해서 구하는 과정을 의미한다.

 

스칼라 값이 아닌 행렬 값이 흐른다고 생각하면 된다.

일단은 shape를 맞추기 위해서 전치했다고 생각하자.

 

5. 배치용 affine 계층

 

이때는 아래 사진과 같이 순전파의 경우와 역전파의 경우가 달라진다는 것을 주의하자.

 

 

 

6. softmax-with-loss 계층

손글씨라는 input data가 들어가면 affine(linear) layer과 relu(non-linear) layer을 거치고 마지막에는 softmax func을 거쳐서 확률로 결과가 나오게 된다. 최종적으로 cross entropy를 활용하여 loss를 구해주는 neural network 구조를 가지고 있다.

 

cross entropy 계층은 y와 t를 받게 된다. 그리고 이로부터 loss를 구한다. 그리고 softmax 계층은 이로부터 y - t라는 결과를 역전파로 내놓게 된다. 이는 신경망의 예측과 실제 정답 사이의 오차를 그대로 드러내는 것이다.

 

정확도가 떨어지면 큰 loss를 전달하고 그렇지 않으면 작은 loss를 전달하게 된다. 덕분에 학습하는 정도가 커지고 작아진다.

 

 

 

7. 전체 구현

 

-전체 과정

딥러닝을 통하여 모든 함수를 표현할 수 있다. 주어진 데이터셋을 통하여 데이터셋의 패턴에 맞는 함수의 적절한 파라메터를 찾기 위해서 학습을 한다.

학습은 데이터셋을 한번에 학습하기보다는 미니배치만큼만 학습을 진행해. 그래서 예측을 하고 실제 값과 비교하여 미니배치만큼 loss를 구하고 이 loss와 파라메터의 그래프를 보고 파라메타를 업데이트하게 돼. 이때 기울기는 loss가 가장 작아지는 방향을 제시하지. 그래서 이렇게 기울기 방향으로 조금씩 갱신하는 거야.

 

여기서 잠깐 trained with SGD using backprop as a gradient computing technique!!!!!!

 

sgd는 파라메터를 업데이터하는 역할이고 이 backpropagation은 sgd에서 기울기를 구하기 위해서 사용되는 기술이다!

 

-구현

클래스= twolayernet

클래스의 인스턴스 변수= params: 파라메터의 값 , layers: affine, softmax, relu 등, lastlayer: softmaxwithloss

클래스의 메소드= init, predict, loss, accuracy, gradient(backpropagation)

 

계층을 사용함으로써 수치미분( f(x+h) 이런 공식쓰는거)이 아니라! forword와 backward의 전파만으로 동작이 이루어지는 것이다! 대박!!!

 

 

 이처럼 nn을 layer를 통해 구현한 덕분에 마치 레고 블록을 조립하듯이 효과적으로 구현할 수 있었다.

그 라벨을 argmax하는 이유는 이게 원래는 ['5','3' ... ] 이런 식으로 돼있었는데 데이터 전처리할때 원핫인코딩을 했음.

 

8. backpropagation으로 기울기 검증하기

 

수치 미분이 아닌 오차역전파를 통해서 쉽고 빠르게 기울기를 구할 수 있었다.

하지만 gradient check을 하기 위해서 수치 미분이 필요하다.

 

 

차이가 없는 것을 확인하였다!

 

9. backpropagation을 사용한 학습 구현하기

 

결과적으로 테스트셋에 대해서 96%의 정확도를 보였습니다.