AI 개념정리

FeedFoward & Backpropagation

_DK_Kim 2024. 2. 23. 13:34

모델을 학습시킬 때를 생각해보자. 입력 데이터는 모델의 얕은 layer를 따라서 다양한 연산을 거쳐 깊은 layer로 도달하게되고,  loss값을 계산한다. 그리고 최적화 함수를 통해서 loss를 줄이기 위한 가중치를 업데이트하게된다.

 

오늘은 모델을 업데이트하기 위한 과정인 순방향 전파(Feed forward 혹은 Forward propagation)역전파

(Back propagation)에 대해 알아보자


1. 순방향 전파(Feed forward)

순방향 전파는Feed forawrd 혹은 Foward propagation이라고도 한다. 순방향 정파의 정의는 모델의 입력된 데이터가 얕은 layer에서 깊은 layer로 이동해가며 최종 출력값을 반환하는 모든 연산 과정이다.

 

더 직관적인 이해를 위해 아래의 그림을 참고하자. 그림은 2개의 층을 가진 간단한 신경망 구조를 나타낸다.

 

 

 

위 그림에서 출력값 $\hat{y} $를 계산하기까지의 과정은 아래와 같다. 아래의 수식에서 $\sigma$는 각 노드에서 사용되는 임의의 활성화 함수를 의미한다.

 

# Layer 1 노드들의 계산

$$ a_{1}^{1} = \sigma(w_{11}^{1}x_{1} + w_{12}^{1}x_{2}) \\
 a_{2}^{1} = \sigma(w_{21}^{1}x_{1} + w_{22}^{1}x_{2}) \\
 a_{3}^{1} = \sigma(w_{31}^{1}x_{1} + w_{32}^{1}x_{2}) \\
 a_{4}^{1} = \sigma(w_{41}^{1}x_{1} + w_{42}^{1}x_{2}) $$

# Layer 2의 노드 = 출력값의 계산

$$ \hat{y} = \sigma(w_{11}^{2}a_{1}^{1}+w_{12}^{2}a_{2}^{1} + w_{13}^{2}a_{3}^{1} + w_{14}^{2}a_{4}^{1}) $$

 

정말 간단한 구조의 신경망임에도 순방향 계산에 필요한 수식이 5개나 된다.

 

실제 우리가 사용하는 모델들은 이것보다도 훨씬 더 복잡한 구조를 가지고있다. 때문에 단순히 이렇게 수식을 하나하나 계산하는 방식이 아닌 행렬 형태를 사용하여 계산한다.

 

정리하자면, 순방향 전파는 모델에 입력된 데이터가 출력값을 반환하기까지의 모든 연산 과정이라는 것만 알아두면 된다.


2. 역전파(Back propagation)

역전파(Back propagation)은 순방향 전파와 반대로, 모델의 출력값으로부터 얻은 정보를 통해 다시 깊은 layer부터 얕은 layer까지 가중치를 업데이트하는 모든 과정을 의미한다. 이름 자체도 순방향 전파와 반대 방향으로 진행되기 때문에 

"Back propagation"이라고 명명되었다. 

 

우선 가중치를 업데이트하기 위한 아이디어부터 이해해보자. 간단하게 $y = (x-1)^2$이라는 함수를 생각해보자.

여기서 $x$가 우리가 조절 가능한 변수에 해당되는 것은 당연히 이해될 것이다.

 

미분을 배운 사람이면 이 함수가 $x=1$에서 global minimum을 갖는다는 것을 당연히 알 것이다.

그 과정을 다시 생각해보면 도함수를 통해 변수 $x$가 1일 때, 도함수가 0이 된다는 것을 알았을 것이다.

만약 우리가 저 함수가 뭔지 모르는 상태에서 초기 $x=3$으로 잡았다면, 우리가 이 함수의 최솟값을 얻기 위해서는 $x$를 3에서 1으로 2만큼 이동시켜야한다는 것이다.

 

이 간단한 예제가 바로 모델의 가중치를 업데이트 시키는 과정이다. 모델은 loss function을 통해 성능을 평가되고, 학습의 목표는 Loss를 0으로 만드는 것이다.

 

즉, Loss function의 global minimum을 만족시키도록 변수들을 조정해야한다. 여기서 우리가 조정할 수 있는 변수가 바로 "가중치(weight)"인 것이다.

 

순방향 전파에서 우리는 예측값이 가중치에 대한 식으로 표현됨을 보였고, loss function이 무슨 함수인지는 몰라도 이 가중치에 대한 식이 포함될 것임은 예측할 수 있다. 이제 우리는 loss function를 각 가중치에 대해 미분하고 함숫값이 최소가 되도록하는 가중치로 업데이트하면 된다. 

 

그런데 문제는 $w_{11}^1$과 같이 출력층에 바로 연결되지 않은 가중치의 경우 계산이 어렵다는 것이다.

이 경우에는 Chain rule을 사용하여 해결한다. 예를 들어, $w_{11}^1$을 업데이트 하는 과정을 알아보자.

 

# 계산의 편의를 위해 손실 함수를 아래와 같이  정의

$$L = \frac{1}{2}(y - \hat{y})^2 \\
z^{(1)} =w_{11}^{1}x_{1} + w_{12}^{1}x_{2} \\
z^{(2)} =w_{11}^{2}a_{1}^{1}+w_{12}^{2}a_{2}^{1} + w_{13}^{2}a_{3}^{1} + w_{14}^{2}a_{4}^{1} $$

# 도함수 구하기

$$ \frac{\partial L}{\partial \hat{y}} = (\hat{y} - y) \\
\frac{\partial \hat{y}}{\partial z^{(2)}} = \sigma'(z^{(2)}) \\
\frac{\partial z^{(2)}}{\partial a_{1}^{(1)}} = W_{11}^{(2)} \\
\frac{\partial a_{1}^{(1)}}{\partial z^{(1)}} = \sigma'(z^{(1)}) \\
\frac{\partial z^{(1)}}{\partial W_{11}^{1}} = x_1 $$

# Chain rule을 사용하여 표현

$$ \frac{\partial L}{\partial W_{11}^{1}} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z^{(2)}} \cdot \frac{\partial z^{(2)}}{\partial a_{1}^{(1)}} \cdot \frac{\partial a_{1}^{(1)}}{\partial z^{(1)}} \cdot \frac{\partial z^{(1)}}{\partial W_{11}^{1}} $$

 

위와 같이 깊은 layer에서부터 목표로 하는 가중치까지 거꾸로 계산이 진행되는 것을 확인할 수 있다.

순방향때와 마찬가지로, 더 복잡한 모델에서 이걸 손수 계산하려면 엄청난 시간과 노력이 필요할 것이다...

정말 다행이도 우리는 이걸 굳이 직접 구현할 필요없이 이미 잘 만들어진 라이브러리를 통해 사용할 수 있다 !

 

정리하자면, 역전파는 모델의 출력 결과로부터 얻은 정보를 기반으로 깊은 layer부터 얕은 layer 방향으로 가중치를

업데이트해나가는 과정이다.


오늘은 순방향 전파와 역전파에 대해 알아보았다. 모델을 만들면서 우리가 이 과정을 직접 구현하거나, 연산할 필요는 없지만 모델의 출력과 업데이트 과정이 어떤 흐름으로 이루어지는지는 꼭 알아둘 필요가 있다. 그런 점에서 각 개념의 정리된 부분을 확실히 이해해두면 좋을 것 같다.

 

728x90