본문 바로가기
AI/Notes

Backpropagation

by Fresh Red 2024. 12. 17.
728x90
반응형

▤ 목차

    반응형

    The Purpose of Backpropagation

    인공 신경망을 학습시키기 위한 알고리즘 중 하나

     

    신경망을 학습시키는 목표 중 하나는 도출된 예측값과 실제 값의 차이(오차)를 줄이기 위함이다

     

    그렇기에 역전파를 사용해 오차를 모든 가중치에 전달하여 갱신을 하며 궁극적으로 오차를 줄이는 기법이다

    1. 노드가 가지고 있는 가중치(weight)나 편향(bias) 같은 변수들을 어떻게 갱신(update) 하나?
    2. 노드의 변수들을 어떻게 개별적으로 얼마큼 업데이트 하나?

    Chain rule(연쇄 법칙)을 이용해 위 두 가지 질문들을 해결할 수 있다

    728x90

    Chain Rule (연쇄법칙)

    💡 Chain rule (연쇄법칙)

     

    함수 $f, g$가 있을 때

     

    $f$와 $g$가 모두 미분 가능하고

     

    $F=f(g(x))=f \circ g$로 정의된 합성 함수이면 $F$는 미분 가능하다.

     

    이때 $F'(x)=f'(g(x))⋅g'(x)$이다.

     

    $t=g(x)$라고 한다면,

     

    ${dy \over dx} = {dt \over dx}{dy \over dt}$가 성립한다.

     

    쉽게 말해 오차(label value - predicted value)부터 원하는 위치까지 한 번에 계산하기 위해 사용되는 기법이라고 생각하면 된다

     

    미분이 가능하다 = 기울기를 구한다 = 변화량을 구한다

     

    즉 x가 변화했을 때 함수 g의 변화량, 함수 f의 변화량, 그리고 최종 값 F의 기여하는 함수 f와 g의 기여도를 찾는 것

     

    변수가 두 개라면 $z=f(x, y)$에서 $x=h(s, t), \,\,y=g(s, t)$일 때

     

    $f(x, y),\, g(s, t),\, h(s, t)$가 모두 미분 가능하면 편미분을 사용한다

     

    💡 편미분: 미분을 구할 하나의 변수만 변수로 두고 다른 변수는 상수로 취급하여 없애는 방법

     

    $$ {\partial z \over \partial s} = {\partial z \over \partial x}{\partial x \over \partial s}+{\partial z \over \partial y}{\partial y \over \partial s} $$

    $$ {\partial z \over \partial t} = {\partial z \over \partial x}{\partial x \over \partial t}+{\partial z \over \partial y}{\partial y \over \partial t} $$

    Forward Propagation (순전파)

    예측값을 도출하기 위해 변수와 가중치를 연산하는 것

     

    데이터와 가중치를 연산하여 예측값을 도출하는 방법이라고 이해하면 된다

    1. 연결된 데이터 $x$와 가중치 $w$를 연산 후 더한 값이 $z$
    2. $z$를 활성화 함수 $a$로 연산
    3. $a$와 $w$를 연산 후 더한 값이 $z$
    4. $z$를 활성화 함수 $a$로 연산
      1. 최종층이면 연산 후 나온 값이 최종 예측값
        1. 그리고 실제값 $y$와 최종 예측값을 뺀 값이 오차다
      2. 아니라면 step 3과 4를 반복

    Forward Propagation Example

    $x, w, y$는 임의의 수를 정해 적어주었다

     

    $z$와 $a$는 계산한 값을 표한다

     

    직관적으로 표현하기 위해 activation function ($a$)는 sigmoid함수, cost function ($L$)은 mean squared error (MSE) 함수를 사용했다

    위 예시는 forward-propagation(순전파)을 한 예시를 보여준다

    $$ z_{10}={x1 \brack x2} \times [w^0_{10} \, w^0_{20}] \\ z_{11} = {x1 \brack x2} \times [w^0_{11} \, w^0_{21}] $$

    첫 번째 hidden layer의 연산 법은 아래와 같다

     

    이를 풀어서 작성하면 아래와 같다

     

    $$ z_{10} = x_1w^0_{10} + x_2w^0_{11} = (0.5 \times0.2)+(0.3\times0.9) = 0.1+0.27=0.37 \\ z_{11} = x_1w^0_{11} + x_2w^0_{21} = (0.5 \times0.7)+(0.3\times0.4) = 0.35+0.12=0.47 $$

     

    구한 $z_{10}$과 $z_{11}$의 값들을 activation function인 sigmoid를 사용해 $a_{10}$과 $a_{11}$을 구해주며 sigmoid 수식은 다음과 같다

     

    $$ \sigma = {1 \over 1+e^{-x}} $$

    $$ a_{10} = sigmoid(z_{10})=0.59 \\ a_{11} = sigmoid(z_{11})=0.62 $$

    이렇게 연산을 해서 구한 값들이 위 예제 그림에 보이는 값들이다

    Backpropagation Example (Up to hidden layer)

    순전파로 값들을 다 도출했으니 이제 역전파로 오차에 대한 변화량을 찾을 차례이다

     

    먼저 cost function은 MSE를 사용하기로 결정했으며 수식은 아래와 같다

     

    $$ MSE = {1\over n}\sum(y_i - \hat y_i)^2 $$

     

    $y_i$는 정답, $\hat y_i$는 인공 신경망이 도출해 낸 예측값이다

     

    MSE와 가중치 업데이트 수식을 이용해 가중치의 변화량을 찾을 수 있다

     

    가중치 업데이트 수식은 다음과 같다

    $$ w^+ = w - \eta * {\partial L \over \partial w} $$

    $\eta$ 는 한 번에 얼마나 학습할지를 표현하고 ${\partial L\over \partial w}$는 어느 방향으로 학습할지를 표현한다

    위 예제 그림 중 역전파를 이용해 $w^1_{10}$을 계산해 보자

    Chain rule을 이용한다면 수식은 아래와 같다

    $$ {\partial L\over \partial w^1_{10}} = {\partial L \over \partial a_{20}}{\partial a_{20} \over \partial z_{20}}{\partial z_{20} \over \partial w^1_{10}} $$

    먼저 $\partial L \over \partial a_{20}$를 풀어보자. $L$의 수식은 다음과 같다

    $$ L = {1\over 2}((y_1-\hat y_1)^2+(y_2-\hat y_2)^2) \\ L = {1\over 2}(y_1-\hat y_1)^2+{1\over 2}(y_2-\hat y_2)^2 $$

    여기서 $\hat y_1$과 $\hat y_2$는 $a_{20}$과 $a_{21}$을 뜻하며 $w^1_{10}$만 업데이트해보려고 하기에 편미분을 통해 $a_{21}$은 상수 취급하여 무시하고 합성함수의 편미분을 이용해 풀면 된다

    $$ {\partial L \over \partial a_{20}} = (y_1-a_{20})\times-1 = (0.3-0.66)\times -1 = 0.36 $$

    계산결과인 0.36이 뜻하는 바는 $a_{20}$이 오차인 $L$에 0.36만큼 기여했다는 것을 의미한다

     

    그럼 ${\partial a_{20} \over \partial z_{20}}$을 계산해 보자. 먼저 알아야 할 건 sigmoid의 미분이다

    $$ {\partial a_{20} \over \partial z_{20}} = sigmoid(z_{20}) \times(1-sigmoid(z_{20})) $$

    $$ {\partial a_{20} \over \partial z_{20}} = a_{20}\times(1-a_{20}) = 0.66 \times (1-0.66) = 0.66\times 0.34 = 0.22 $$

    다음은 ${\partial z_{20} \over \partial w^1_{10}}$을 계산해보자. 위와 마찬가지로 편미분을 사용하기에 도출되는 값은 $a_{10}$이 된다

    $$ z_{20} = a_{10}w^1_{10} + a_{11}w^1_{20} $$

    $$ {\partial z_{20} \over \partial w^1_{10}} = a_{10} = 0.59 $$

    그럼 처음에 구하려고 했던 ${\partial L\over \partial w^1_{10}}$의 값은 다음과 같다

    $$ {\partial L\over \partial w^1_{10}} = 0.36\times 0.22 \times 0.59 = 0.05 $$

    $w^1_{10}$이 기여한 값은 0.05가 되고 가중치 업데이트 수식을 이용해 가중치를 갱신할 수 있다

    $$ w^{1+}{10} = w^1{10} - (\eta \times {\partial L \over \partial w^1_{10}}) = 0.6 - (0.1 \times 0.05) = 0.595 $$

    학습률은 사람이 정해줄 수 있는 하이퍼파라미터이며 일반적으로 0.1 이하를 정하기에 임의로 0.1로 정했다

     

    이렇게 해서 가중치 $w^1_{10}$은 0.6에서 0.595라는 값을 얻게 되었고 다른 가중치들도 위와 같은 과정을 거쳐 업데이트가 가능하다

    Backpropagation Example (Up to first hidden layer)

    그럼 1번째 은닉층 계산에 사용되는 가중치 $w^0_{10}$을 업데이트 해보자

    오차 $L$에 기여한 정도는 아래와 같이 나타낼 수 있다

    $$ {\partial L \over \partial w^0_{10}} = ({\partial L_1 \over \partial a_{10}}+{\partial L_2 \over \partial a_{10}}){\partial a_{10} \over \partial z_{10}}{\partial z_{10} \over \partial w^0_{10}} $$

    그럼 ${\partial L_1 \over \partial a_{10}}$부터 구해보자

    $$ \begin {align} L_1 &= {1\over 2}(y_1 - \hat y_1)^2 \\ {\partial L_1 \over \partial a_{20}} &= (y_1-\hat y_1)\times -1 \\ {\partial a_{20} \over \partial z_{20}} &= a_{20}\times (1-a_{20})\\ {\partial z_{20} \over \partial a_{10}} &= w^1_{10} \end {align} $$

    $$ \begin{align} {\partial L_1 \over \partial a_{10}} &= {\partial L_1 \over \partial a_{20}}{\partial a_{20} \over \partial z_{20}}{\partial z_{20} \over \partial a_{10}} \\ &= -(y_1-a_{20})\times \sigma(z_{20})\times(1-\sigma(z_{20})\times w^1_{10} \\ &= -(0.3-0.66)\times0.66\times(1-0.66)\times0.6 \\ &= 0.0484704 \end{align} $$

    다음 ${\partial L_2 \over \partial a_{10}}$을 구해보자

    $$ \begin{align} {\partial L_2 \over \partial a_{10}} &= {\partial L_2 \over \partial a_{21}}{\partial a_{21} \over \partial z_{21}}{\partial z_{21} \over \partial a_{10}} \\ &= -(y_2-a_{21})\times a_{21}\times(1-a_{21})\times w^1_{11} \\ &= -(0.7-0.65)\times0.65\times(1-0.65)\times0.8 \\ &= -0.0091 \end{align} $$

    그럼 이제 ${\partial L \over \partial w^0_{10}}$을 구해보자

    $$ \begin{align} {\partial L \over \partial w^0_{10}} &= ({\partial L_1 \over \partial a_{10}}+{\partial L_2 \over \partial a_{10}}){\partial a_{10} \over \partial z_{10}}{\partial z_{10} \over \partial w^0_{10}} \\ &= 0.05\times -0.01 \times 0.59 \times (1-0.59) \times 0.5 \\ &= -0.000060475 \end{align} $$

    이를 토대로 가중치를 업데이트해보자

    $$ w^{0+}{10} = w^0{10} - (\eta \times {\partial L \over \partial w^0_{10}}) = 0.2 - (0.1 \times -0.000060475) = 0.2000060475 $$

    그럼 가중치가 미미하게 변화하는 것을 볼 수가 있다

     

    모든 가중치에 backpropagation을 진행한 것을 1 epoch 진행했다고 하며 epoch이 진행될수록 가중치가 갱신되며 오차가 줄어든다

     

    이렇게 우리가 딥러닝 모델을 학습시킬 때 오차가 줄어드는 것을 볼 수가 있는데 실제로 backpropagation의 계산과정을 학습시키는 동안 보지는 않지만 이러한 과정이 들어간다는 것을 알고 있으면 좋다

    728x90
    반응형

    'AI > Notes' 카테고리의 다른 글

    RFM (Recency, Frequency, Monetary)  (0) 2025.01.24

    home top bottom
    }