본문 바로가기
IT/[Everyday]Coding

딥러닝_Neural Network_backpropagation

by Jang HyunWoong 2014. 12. 19.

neural network에서 에러를 줄이기 위해 지속적으로 weight와 bias를 학습한다. 

이 전 글에서 weight를 optimizing 하는 방법으로 backpropagation 을 사용한다고 했다. 

backpropagation을 하기 전에 weight와 bias를 어떻게 조절하는지 알아보겠다. 

그 방법으로 gradient descent algorithm을 사용한다고 한다. 

여기서 gradient descent algorithm은 자세히 다루지 않겠다. 


inputs이 들어오고 weight와 bias 연산을 거쳐서 ouput이 나오게 된다. 

우리는 알고있는 Desired 값과 Guessed 값을 비교해서 에러를 찾는다.

*Desired 값: 이미 우리가 알고 있는 값 (나와야 하는 값)

*Guessed 값: NN를 통해 나온 값 (만약 두 값의 차가 0이면 정확하게 예측한 것이다. )

 

목표는 에러값을 줄이는 것이다.  

이런 것을 수학적으로 말하면 수학 함수의 최적화 또는 에너지 최소화 문제 라고 한다.

낭비되는 값(?) 이런식의 느낌으로 cost function 을 optimization하는 것이다. 

 

그렇다면 NN에서 우리의 함수가 얼마나 목표에 잘 적합한지 Cost function을 정의해보면

 

C(w%2C%5Cquad%20b)%5Cquad%20%3D%5Cquad%201%2F2n%5Csum%20_%7B%20x%20%7D%5E%7B%20%20%7D%7B%20%7C%7Cy(x)-a%7C%5Ccombi%20%5E%7B%202%20%7D%7B%20%7C%20%7D%20%7D%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20(0)%20 

 이라고 할 수 있다. 

 

w - NN에 관여하는 모든 weights

b - layers의 biases

n - 전체 inputs 의 수

a - x의 input이 들어왔을 때, 우리가 원하는 목표 output

y(x) - output

 

식에서 ||v|| 의 사용은 벡터의 길이로 보기 위해서 사용한다.  

 

아래에 벡터의 사이즈나 길이를 구하는 방법이다. 

Norm || x || = sqrt(x*x) ... 놈 (유클리디안 거리) 구하기
놈(norm)은 벡터공간에서 벡터의 길이나 사이즈, 벡터의 크기를 구할 때 사용한다. Rn에 유클리드 노름을 정의한 것을 n차원 유클리드 공간이라 ...
blog.naver.com
본문으로 이동

함수 C를 quadratic cost function 이라고 할텐데 

우리가 알고 있는 유효성을 측정하는 mean squared error (MSE)를 통해, 예측의 정확도를 측정하는 것이다. 

 

C(w, b)는 음수가 나올 수 없고, 점점 작아진다. C(w, b)가 0에 가까운 값으로 간다. 그렇게되면 y(x) 는 우리가 Desired한 a값과 같아지게 되는 것이다. 

 

그렇게 때문에 좋은 트레이닝 알고리즘이 되기 위해서는 C(w, b)가 0에 가까워야 한다. 

그리서 우리의 목표는 cost function C(w, b)를 최소화 시키는 것이다. 

최적의 weight와 bias값을 찾아 C함수를 가장 작게 만들어야 한다. 이때 gradient descent 알고리즘을 사용해서 할 수 있다. 

 

간단하게 gradient descent 알고리즘을 살펴보면 미분을 사용해서 local minimum을 찾아내는 것이다. 

예를 들어 C(v)함수가 있다고 하겠다. 다양한 변수를 가지고 있고 v = v1, v2, ... (w1, w2, ..) 등으로 나타낸다고 가정하겠다.

두 변수 v1, v2의 최소가 되는 C(v)함수를 계산해보면

 

C의 그라디언트는 %5Cnabla%20C%5Cquad%20%3D%5Cquad%20(%5Cfrac%20%7B%20%5Cpartial%20C%20%7D%7B%20%5Cpartial%20v1%20%7D%2C%5Cquad%20%5Cfrac%20%7B%20%5Cpartial%20C%20%7D%7B%20%5Cpartial%20v2%20%7D%2C%5Cquad%20...)%20 가 된다. 

 

 각 변수에 일차 편미분한 값으로 구성되어 있는데 이것은 벡터의 크기정도를 나타낸다. 

 

그림으로 보면 위와 같은 그래프에서 가장 아래 있는 local minimum 장소를 찾아 가는 것이다. 

 

위 그림에서 보라색 점처럼 점진적으로 최소가 되는 곳을 찾아가는 방법을 식으로 보면

먼저

%5CDelta%20C%5Capprox%20%5Cnabla%20C%5Ccdot%20%5CDelta%20v%5Cquad%20(1)%2C%5Cquad%20%5Cquad%20%5CDelta%20v%5Cquad%20%3D%5Cquad%20-%5Ceta%20%5Cnabla%20C%5Cquad%20(2)%20 

(1) C의 변화크기는 미분함수와 v값들의 변화를 곱한 것과 거의 비슷하다고 할 수 있다. 

%5CDelta%20C%5Cquad%20%5Capprox%20%5Cquad%20%5Cfrac%20%7B%20%5Cpartial%20C%20%7D%7B%20%5Cpartial%20v1%20%7D%5Cquad%20%2B%5Cquad%20%5Cfrac%20%7B%20%5Cpartial%20C%20%7D%7B%20%5Cpartial%20v2%20%7D%20  라고 할 수 있기 때문이다.  

 

(2)%5Ceta%20%20는 learning rate로 작은 값이다.  알고리즘의 수렴 속도를 조절하는 파라미너라고 할 수 있다.  양수 값인데 gradient descent search 의 step size를 나타낸다. 

음수인 이유는 우리는 v값(vectors)을 decreases(감소)한 방향으로 옮기고 싶기 때문이다. 

정리하면

%5CDelta%20v%5Cquad%20%3D%5Cquad%20-%5Ceta%20%5Cfrac%20%7B%20%5Cpartial%20C%20%7D%7B%20%5Cpartial%20v%20%7D%5Cquad%20(2.1)%2C%5Cquad%20%5Cquad%20%5C%5C%20%5Cfrac%20%7B%20%5Cpartial%20C%20%7D%7B%20%5Cpartial%20v%20%7D%3D%5Cquad%20c%5Cfrac%20%7B%201%20%7D%7B%202%20%7D%5Csum%20_%7B%20d%20%7D%5E%7B%20%20%7D%7B%20(y(%5Ccombi%20_%7B%20d%20%7D%7B%20w%20%7D)-a%5Ccombi%20%5E%7B%202%20%7D%7B%20)%20%7D%20%7D%5C%5C%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%3D%5Cquad%20%5Cfrac%20%7B%201%20%7D%7B%202%20%7D%5Csum%20_%7B%20d%20%7D%5E%7B%20%20%7D%7B%20%5Cfrac%20%7B%20%5Cpartial%20%20%7D%7B%20%5Cpartial%20w%20%7D(y(c)-a%5Ccombi%20%5E%7B%202%20%7D%7B%20)%20%7D%20%7D%5C%5C%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%3D%5Cquad%20%5Cfrac%20%7B%201%20%7D%7B%202%20%7D%5Csum%20_%7B%20d%20%7D%5E%7B%20%20%7D%7B%202(y(%5Ccombi%20_%7B%20d%20%7D%7B%20w%20%7D)-a)%5Cfrac%20%7B%20%5Cpartial%20%20%7D%7B%20%5Cpartial%20w%20%7D(y(w)-%5Coverrightarrow%20%7B%20w%20%7D%5Ccdot%20%5Coverrightarrow%20%7B%20x%20%7D)%20%7D%5C%5C%20%5Cfrac%20%7B%20%5Cpartial%20C%20%7D%7B%20%5Cpartial%20v%20%7D%3D%5Cquad%20%5Csum%20_%7B%20d%20%7D%5E%7B%20%20%7D%7B%20(y(%5Ccombi%20_%7B%20d%20%7D%7B%20w%20%7D)-a)(-%20%7D%5Ccombi%20_%7B%20d%20%7D%7B%20x%20%7D)%5Cquad%20%5C%5C%20%5CDelta%20v%5Cquad%20%3D%5Cquad%20%5Ceta%20%5Csum%20_%7B%20d%20%7D%5E%7B%20%20%7D%7B%20(y(%5Ccombi%20_%7B%20d%20%7D%7B%20w%20%7D)-a)(%20%7D%5Ccombi%20_%7B%20d%20%7D%7B%20x%20%7D)%5Cquad%20%5Cquad%20(2.2)%5Cquad%20%5Cquad%20%5C%5C%20%5CDelta%20w%5Cquad%20%3D%5Cquad%20%5Ceta%20%5Csum%20_%7B%20d%20%7D%5E%7B%20%20%7D%7B%20(%5Ccombi%20_%7B%20d%20%7D%7B%20t%20%7D-%5Ccombi%20_%7B%20d%20%7D%7B%20o%20%7D)(%20%7D%5Ccombi%20_%7B%20d%20%7D%7B%20x%20%7D)%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20%5Cquad%20(2.3)%5Cquad%20%20 

 

(2.1)에 (0)의 식을 넣어 계산하면 (2.2)가 나온다. 

v를 w으로 바꾸면 (2.3)이 되는 것을 알 수 있다. 

곧 최적의 weight와 bias값을 찾아 C함수를 가장 작게 만드는 것은 

기존 weight에 계산된 weight값을 더해 이것을 반복하는 것이다. 

 

계산된 weight는 (2.3)으로 나타낼 수 있는데

t - 타겟 Desired output

o - 퍼셉트론으로 나온 Guessed output

t에서 o를 뺀 값에 learning rate와 input을 곱한 값이다. 

 

이 알고리즘으로 single local minimum을 찾을 수 잇다. 

만약 learning rate가 크면 gradient descent search는 overstepping 될 수 있기 때문에 점자적으로 작은 value로 한다고 한다. 

 

 

반응형