Data Science/Neural Network

Partial Derivative(편미분) and Chain Rule(체인룰) in Neural Network

준나이 2018. 5. 27. 20:49

이 포스트는 기본적으로 NN(Neural network)에 대한 기본적인 이해가 있는 대상을 위해 작성되었습니다.

또한, 제목에 표시한 것처럼 NN에서의 편미분과 체인룰에 대한 내용이며 Gradient Descent(경사감소법)를 직접적으로 다루지는 않습니다.


Partial Derivative = 편미분 (Partial Derivative = Gradient = A Partial Derivate of a Specific Error)

Chain Rule = 체인룰 / 합성곱



[편미분 : Partial Derivative]


y값에 영향을 미치는 변수(variable/x값)가 많을 때, 변수 하나가 미치는 영향을 구하기 위해 사용 


why to use in NN? : 


NN에서는 Gradient Descent(경사감소법)를 이용하여 weight를 최적화 시키는 작업을 진행한다. 최적화를 시킬때 기준은 Error이 사용되는데, Error가 클 수록 weight 값은 많이 조정될 것이고, 작으면 약간만 조정하면 될 것이다. 


여기서 Error란 output layer를 통해 최종적으로 산출하는 prediction 값과 actual(y/label) 값의 차이다. 하지만 output layer에서 출력되는 prediction 값 또한 output layer에 위치한 weight들에 의해서만 결정 된것이 아니라 이전 weights 모두가 영향을 끼친 결과이다. 여기서 어떤 weight는 Error를 발생시키는데 크게 이바지를 했을 것이고, 어떤 weight는 아닐 것이다. 


즉, 여기서 Error값에 영향을 미치는 weight 많지만 그 영향도는 모두 다르기에, 각각의 weight가 미치는 영향을 구하기 위해 사용한다.


편미분과 미분(전미분/Full Derivative)의 차이 : 우리가 흔히 알고 있는 미분이란 전미분을 의미하며, 미분이 좀 더 큰 범주이고, 편미분과 전미분이 여기에 포함된다. 예를 들어 설명하면,  집 값(y값)영향을 미치는 변수(variable/x값)가 집의 크기, 집의 위치 등 있을 때, 오직 집의 크기가 집 값에 끼치는 영향을 조사하기 위해선 편미분(Partial Derivative)  필요하고, 이들의 변수 모두의 변화가 집 값에 끼치는 영향을 조사하기 위해선 전미분(Full Derivative) 필요하다.




[체인룰 : Chain Rule]


정의 : Partial Derivative의 식을 구성하는 함수다른 함수의 내부에 존재할 때 이를 구하기 위해 사용 (즉, 두 함수의 차이를 보이기 위해 사용)

why to use in NN? : 


한 weigh error를 찾기 위해선 편미분이 계산되어야 하는데, 이 편미분을 계산하기 위해선 체인룰이 다수 사용된다.


예를 들어 한 output layer 다음에 위치한 weight error를 구해야 하는 경우, 편미분을 구해야 한다.  Total Error의 식으로부터 그 Weight의 Error를 유도하고 output layer 이전에 위치한 weight error를 구해야 하는 경우 그 전에 구했던 식으로 부터 도출한다.


(Fig1) 편미분 기본 수식


Fig1 처럼 z에 대한 x의 편미분을 구하고 싶은데, 직접적으로 미분이 불가능 할 때 y를 이용하여 구한다.




[NN X 편미분/합성곱]


NN : output = input(fixed) * weights 

global minumum에 도달하기 위해 NN내 에 존재하는 weights는 반드시 학습(조정)되어야한다.


어떻게 정확한 weights의 조합시켜 global minumum에 도달할 것인가?

최선의 option은 Gradient Descent (경사감소법)이다

Gradient Descent는 편미분을 이용해야한다.

각각의 weight의 편미분을 하기 위해선 체인룰을 이용해야한다.




[그림과 함께 자세히 알아보기]


아래 수식과 그림 모두 The Math of Neural Networks by Michael Taylor and Mark Koning에서 발췌했음



(Fig2) 3개의 층으로 이루어진 NN


Goal : input layer 1개, hidden layer 1개, output layer 1개로 이루어진, NN이 존재한다고 할 때,W5가 Total Error에 끼친 영향을 구해보자. (Total Error에 대한 W5의 편미분을 구한다는 말과 동일)


Total Error(y)에 직접적으로 영향을 끼치는 변수(x)C1이 있다.

C1(y)에 직접적으로 영향을 끼치는 변수(x)bw3, w5, w6이 있다.

여기서 직접적으로 라고 굳이 말한 이유는 위에서도 언급했듯이, Total Error는 결국 모든 가중치의 영향을 받기 때문이다. 


(Fig3) 편미분 기본 수식



우리가 편미분을 해야 될 기본적인 컨셉을 Fig3에 나와있는 체인룰의 기본 수식을 보고 다시 생각해보자.

우리의 상황으로 볼 때 여기서 z는 total error가 되고, y는 C1, x는 w5가 된다.

x를 이용하여 z에 대한 편미분을 구하기 위해, 체인룰을 이용하여 우리는 중간에 위치한 C1을 매개변수(y)로 이용하게 되는 것이다.


(Fig4) 편미분 기본 수식에 값을 대입한 형태

(z = total error, y = C1, x = w5)


fig4는 위에 언급한 x, y, z를 체인룰 기본 수식에 대입하여 나타낸 수식이다.



(Fig5) 2번의 연산으로 이루어진 C1 node


하지만 Fig5에 있는 노드를 자세히 뜯어다 보면 C1은 2번의 연산으로 이루어진다는 것을 알 수 있다.


Znetc (좌측) : C1이전에 위치한 layer의 노드들과 C1은 weights로 연결되는데, 이전 노드와 각각의 weight의 곱을 더한 것과 같다. 이러한 연산을 하는 계층을 affine 계층이라고 하고, (활성화 함수를 씌우기 전 상태의) net 값이라고도 한다.


Z output (우측) :  대표적인 활성화 함수 중 하나인 sigmoid 함수이다. Znetc의 값에 sigmoid 함수를 취한 값이다.


(#TODO 활성화 함수의 역할에 대해선 다른 포스트에서 더 깊게 다룰 예정이다.)



위 두 연산을 기준으로 체인룰이 이뤄지는 단계를 좀 더 세부적으로 나눠 보면 다음과 같다.


(Fig6) 2번의 연산으로 이루어진 C1 node


W5가 E(Total Error)에 미치는 영향 구하기 전에 Z값(Z output)가 미치는 영향을 구한다.

이로서 E에 대한 Z의 편미분을 구한 것이다.



하지만 우리는 또다른 문제를 발견 할 수 있다.

Z(Z output)에 대한 W(weight5)의 편미분을 구하는데 그 사이에 Znetc(affine layer의 결과)가 존재한다는 점이다.


(Fig7) 편미분 기본 수식에 값을 대입한 형태

(z = Z(output), y = Znet, x = w5)


이를 해결 하기 위해선, 위의 체인룰 기본 수식을 기반으로 Z output을 z값으로 잡고, Znetc를 y값으로 잡고, weight5를 x값으로 잡아서 체인룰을 이용해주면 된다. 이를 수식으로 표현 하면 Fig 7과 같다.


그리고 위의 수식을 대입해주면 최종적으로 E에 대한 W5의 편미분 값을 얻게된다.



(Fig7) 편미분을 구하기 위해 2번의 체인룰이 적용된 형태

최종 결과는 위의 fig 7과 같다.

정리해보면 E에 대한 W5의 편미분을 구하기 위해 총 2번의 체인룰이 실행됐다. 론적으로 위의 수식에서 Z와 netc를 약분해보면 결국 E에 대한 W5의 편미분과 동일하다는 것을 알 수 있다.




[Conclusion]


편미분, 체인룰의 개념과 NN에서 쓰이는 이유에 대해서 알아보았다.

NN에서 편미분과 체인룰이 이루어지는 과정을 그림을 통해 자세히 순차적으로 알아보았다.




[Reference]


The Math of Neural Networks by Michael Taylor and Mark Koning




'Data Science > Neural Network' 카테고리의 다른 글

RNN 계열 신경망 모델  (0) 2021.04.19
TensorFlow Seq2seq Library (contrib)  (0) 2018.12.11
Neural Machine Translation (seq2seq) Tutorial  (0) 2018.12.08
ReLU를 사용하는 이유  (0) 2018.05.24