Lec 08: Perceptron & BackPropagation
Deep_Learning study Lec08
Boostcourse의 ‘파이토치로 시작하는 딥러닝 기초’를 통한 공부와 정리 Post
Goal of Study
- 퍼셉트론(Perceptron) 에 대해 알아본다.
Keyword
- 퍼셉트론(Perceptron)
- 선형분류기(Linear Classifier)
- AND, OR, XOR 게이트
- 다중 퍼셉트론(Multi Layer Perceptron)
- 오차역전파(Backpropagation)
1. 강의 요약
Neuron
먼저 인공신경망이 무엇인지 알아보자.
우리가 생명시간에 한번쯤은 배워봤을 내용인 뇌의 뉴런이라는 것의 동작 방식을 본떠 만든 모델이다.
뉴런의 동작 방식은 단순하다.
뉴런에 들어온 입력 신호가 threshold를 넘어서면 활성화되어 다음 뉴런으로 전달하는 방식이다.
이를 본따 만든 모델을 인공 신경망이라고 한다.
Perceptron
인공 신경망중 하나인 Perceptron에 대해 알아보자.
Perceptron은 어떠한 입력 X가 들어왔을 때 이 X들의 Weight,
즉, 가중치를 곱하고 이에 bias를 더하여 output을 만들게 된다.
이 ouuput은 Activation function이라는 것을 거쳐 최종적인 output이 나오게 되는 것이고,
우리가 앞서 다루었던 Sigmoid 함수 같은 것이 이에 해당한다.
초창기의 Perceptron은 Linear classifier를 위한 모델이었다.
실제 개발 당시에, AND와 OR 문제를 해결하기 위해서 만들어졌다.
AND, OR But XOR?
특별한 것 없이 우리가 아는 AND와 OR Gate이다.
AND와 OR같은 경우는 Linear하게 분류가 가능하다.
하지만, XOR 같은 경우
다음과 같은 데이터를 AND, OR과 달리 Linear하게 분류가능한가?
선형적인 형태로는 가능하지 않다. 이 때문에 개발당시 인공신경망이 암흑기에 빠졌다고 한다.
그래서 XOR을 구분할 때, Linear한 Classifier인 Perceptron은 불가능하다.
이를 확인하기 위해 Perceptron 즉, 1개의 layer를 가지는 구조를 통해 코드로 구현하여
학습시켜보겠다.
예제 코드)
linear한 layer를 사용하였고, activation function으로는 sigmoid 함수를 사용하였다.
그리고 bianry classification에 관한 문제이므로 cost function은 Cross entropy를 사용한것을 확인할 수 있다.
optimizer는 이전에도 사용해왔던 일반적인 SGD를 사용하였고, 결과를 확인하면(10000번 학습)
200번째 step부터는 loss가 줄어들지 않는 것을 확인할 수 있으며(제대로 학습이 되지 않음)
학습이 끝난 후 각 결과를 확인했을때, Perceptron이 0.5만 출력해, 결과와 맞지 않는 것을 확인할 수 있다.
(실제 답은 0, 1, 1, 0 )
8-2 Multi Layer Perceptron
그래서, XOR의 분류 문제는 단층을 가지는 Perceptron으로는 해결할 수 없는 문제이다.
이 문제를 해결하기 위해서는 여러 개의 층을 갖는 Multilayer Perceptron을 통해 해결해야한다.
하지만, 과거에 이를 학습시킬 방법이 없어 암흑기에 도달했었다.
이를 Backpropagation(오차역전파)이라는 알고리즘을 통해 해결한다.
우리가 다루었던 Gradient Descent, 즉 경사하강법을 통해 기울기가 최소인 W를 찾는 과정을 했었다.
이것이 Cost를 최소화하는 과정이었다.
이를 위해서는 미분계수를 알아야하고, 미분을 해야하는데
이것이 NN(Neural network)에 적용된다면 많은 노드들이 output에 끼치는 영향,
즉, 미분값을 알아야 각각의 Weight를 조절할 수 있는데 이를 모두 계산하기에는 계산양이 너무 많다.
==>(요약) 우리의 목적은 Input을 바꾸는 것이 아닌 Output값에 영향을 주는 변수 중 Weight를 수정하는 것이고, 이전에도 다루었듯이 Weight를 Update하는 과정에서 W에 대해 편미분했던 과정을 기억하면 쉽게 이해할 수 있을 것이다.
Weight를 업데이트하는 과정이 이해가 안되면 이 포스팅을 참고하세요
Backpropagation
Output단에서 우리의 target 값과 모델이 계산한 실제 값을 비교하면 Loss(cost)가 나온다.
이를 뒤에서부터 Input방향으로 가는 것이 Backpropagation이다.
우리가 다루었던 입력으로 부터 Weight를 곱하고.. 하는 과정은 Multi layer에서 계산양이 너무 많음으로 이를 해결하기 위함이라는 것을 상기하고 가자.
- 그렇다면 출력단부터 입력으로 향한다는 것이 무엇을 의미하며, 어떻게 하는 것일까?
내가 뽑고자 하는 target값과 실제 모델이 계산한 output이 얼마나 차이가 나는지 구한 후
그 오차값을 다시 뒤로 전파해가며 각 노드가 가지고 있는 변수들을 업데이트하는 알고리즘이다.
- 의문점 1. 이를 위해서는 먼저 Input으로부터 정성적인 계산을 먼저해야하는 것이 아닌가?
그래서 이를 위해 Forward Propagation 즉, 초기화한 weight와 input값을 가지고 우리가 이전에 해왔던 계산을 하여,
Error, 차이를 구해주고 이를 다시 역으로 진행해가며 각 노드들의 Weight를 적절하게 바꾸는 것이 핵심이다.
단층이었다면, Cost를 Cost Function을 통해 편미분하고 Assign하여 1개의 Weight만을 업데이트 하면되지만,
다층일때는, 이 Error를 Chain rule을 사용해 Weight가 Error에 미치는지를 구해 Weight를 업데이트한다.
Chain rule자체를 설명하지는 않겠다.
이 과정에서의 Chain rule의 핵심은 인접한 node사이에 변화량의 관계를 구할 수 있다는 점이다.
Forward Propagation을 통해 구해낸 값들이다, 여기서 이제 Weight를 Back Propagation이라는 것을 이용해 어떻게 업데이트 하는지 살펴보면,
$\frac {\partial E}{\partial w^1} = \frac {\partial E}{\partial a_20} \frac {\partial a_20}{\partial z_20} \frac {\partial z_20}{\partial w^1}$
E에 w1이 미치는 영향을 다음과 같이 인접한 노드들의 편미분(연쇄법칙)을 통해 구할 수 있다.
이렇게 연쇄 법칙을 이용해 인접한 노드들의 값을 알면 Weight를 알 수 있고, 이를 똑같이 이제 Learning rate에 곱하고 W를 업데이트 해주면 된다.
위처럼, 최종적으로 우리가 구한 E를 W에 대해 미분한 결과에 lr을 곱하고 다시 W에 assign하는 과정에 있다는 것을 기억할 수 있을 것이다.
층이 많더라도 다음과 같은 과정을 계속 반복하면 input방향까지의 정보들을 알 수 있게 되어, 변수들을 조절할 수 있다.
일단 연쇄 법칙과 BackPropagation에 대해 개념을 설명하기 위해 아주 간단하게 설명했고, 실제 미분과정이나 계산은 담지 않았다.
개념에 대한 보강이나 실제 미분 과정에 대한 식을 보면 코딩하거나 코드를 볼 때 더 이해하기 쉬울 것이다.
딥러닝 입문 자료_Pytorch에 저 자세한 과정이 담겨있다.
이와 참고자료를 살펴보면 이해할 수 있을 것이다.
또한, Backpropagation을 실제로 Pytorch로 다룬 코드를 GitHub에 올려두었다.
📣
본 포스팅의 학습 환경 : Anaconda
, CPU
, Pytorch
, Jupyter Notebook
포스팅에서 오류나 궁금한 점은 Comments를 작성해주시면, 많은 도움이 됩니다.💡
Leave a comment