본문 바로가기
머신러닝

[딥러닝] 뉴럴 네트워크 Part. 4 - 역전파 (backpropagation)

by Gom Guard 2018. 3. 24.


이전 까지의 내용 

  • 이전 글에서는 MLP 가 수많은 parameter 들을 학습하기 위해 어떤 것들이 (Activation Function, Learning Rate, Cost Function, 학습 식) 필요한지에 대해서 알아보았습니다. 이번 글에서는 이 개념들을 통해 실제로 학습하는 과정인 역전파 알고리즘에 대해 살펴보겠습니다.

  • 전체 내용은 SlideShare 에서 한번에 보실 수 있으며 youtube 로도 볼 수 있습니다.



역전파 알고리즘 

  • 이전 글에서 자유투 연습 동영상과 MLP 의 학습이 비슷하다고 말한 적이 있습니다. 자유투를 던지는 과정은 순전파 과정 (Feed Forward) 라고 할 수 있고 던진 공이 어느 지점에 도착했는지를 확인하고 던질 위치를 수정하는 과정을 역전파 과정 (Backpropagation) 이라고 할 수 있을 것 같습니다.

  • 간단한 문제들 같은 경우 역전파 알고리즘을 사용하지 않고 Normal Equation 이나 Cost Function 의 해를 바로 구하는 방식으로 풀어낼 수 있지만 복잡하고 어려운 문제들은 역전파 알고리즘을 사용하는 것이 더 효율적입니다.



예제 : 순전파 


  • 쉬운 설명을 위해 예제 신경망을 구성해보았습니다. Input 값은 1개이고 Output 값은 2개, Hidden Layer 수는 2개인 작은 신경망입니다. 각 노드의 Activation Function 은 Sigmoid Function 을 사용했으며 Bias 는 제외하였습니다.

  • 초록색 값들은 처음 주어진 값들이고 파란색 값들은 초기값을 바탕으로 계산한 값입니다. 처음 x_1 의 값은 0.5 이고 w_10 은 0.15 이기 때문에 둘을 곱한 0.075가 계산값으로 나온 것을 알 수 있습니다.

  • 결과적으로 계산한 y_1 값은 0.609 이지만 실제값은 0.3 이어야 하고 계산한 y_2 값은 0.644 이지만 실제 y_2 값은 0.9 인 것을 알 수 있습니다. y_1 쪽은 줄이는 방향으로 개선해야하고 y_2 쪽은 증가하는 방향으로 parameter 들을 변경해야 한다는 것을 알 수 있습니다.



  • Error 측정방식은 MSE 방식을 사용했고, 학습 전 전체 Error 는 0.087 인 것을 알 수 있습니다.



예제 : 역전파 01 

  • 역전파 알고리즘을 적용할 때 신경망의 weight 들은 두 분류로 구분할 수 있습니다. Output 으로부터 첫 번째 층에 위치한 weight 들과 그 외의 weight 들. 먼저 Output 으로부터 첫 번째 층에 위치한 weight 들의 역전파 부터 살펴보겠습니다.



  • 먼저 w_10^(1) 부터 학습시켜 보겠습니다.  w_10^(1) 가 전체 Error 에 미치는 영향을 식으로 풀어보면 다음과 같습니다. 순서대로 총 3개의 편미분 식으로 나타낼 수 있고 저것들만 계산하면 학습 식에 넣어서 얼마나 변경해야 할 지 구할 수 있습니다.



  • 첫 번째 a_20 이 전체 Error 에 미치는 영향을 살펴보면 다음과 같습니다. target_y1 은 실제 y_1 값인 0.3 을 의미하고 a_20 은 우리가 이미 갖고 있는 0.609 값을 의미합니다.




  • a_20 은 z_20 을 Sigmoid Function 에 넣어서 나온 결과물 입니다. Sigmoid Function 의 미분 식은 다음과 같고 우리가 이미 알고 있는 z_20 값인 0.207 을 대입하면 쉽게 구할 수 있습니다.




  • z_20 을 우리가 처음에 목표한 w_10^(1) 로 미분하면 a_10 이 나온 다는 것을 알 수 있고 a_10 값은 0.518 입니다. 이 세 식의 값을 조합하면 w_10^(1) 이 얼마나 E_tot 에 영향을 미치는 지 계산할 수 있습니다.



  • 계산 결과 w_10^(1) 가 E_tot 에 미치는 영향은 0.0381 이라는 것을 알 수 있습니다. 이 값을 학습식에 넣으면 우리가 원하는 학습된 w_10^(1) 값을 구할 수 있습니다. 

  • 일반적으로 Learning Rate 의 값은 0.1 이나 더 작은 값으로 초기화 합니다만 이번 예제에서는 0.5 를 사용하였습니다.





예제 : 역전파 02 

  • 역전파 02 과정에서 식에는 문제가 없으나 세부 수치에서 오타가 있음을 발견하였습니다. 읽으시는 과정에서 세부 숫자에 연연하지 마시고 흐름따라 읽어주시면 감사하겠습니다. 빠른 시간내로 오타 수정하겠습니다. 오타 있음을 알려주신 "궁금합니다" 님 감사합니다.

  • 이번엔 Output Layer 로 부터 첫 번째 층에 위치하지 않은 weight 들의 역전파 알고리즘을 살펴보겠습니다. 이 두 종류가 다른 이유는 첫 번째 층에 위치한 weight 들은 하나의 Output 값에만 영향을 미치지만 그 외의 것들은 더 많은 Output 값에 영향을 미치기 때문입니다. 그림으로 살펴보겠습니다.


  • 이 전체 Error 에 미치는 영향에 관한 식과 전체 Error 가 어떻게 구성되는지를 나타낸 식입니다. 이전 단계에서 학습값을 구했던 것처럼 동일한 과정으로 진행하면 됩니다.


  • 먼저 E_1 에 대해 미치는 영향부터 계산해보면 0.0294 가 나오는 것을 알 수 있습니다.


  • 마찬가지로 E_2 에 미치는 영향을 살펴보면 -0.0328 이라는 것을 알 수 있습니다. 마지막으로 E_1 과 E_2 에 미치는 영향을 종합해서 E_tot 에 w_10^(0) 이 미치는 영향을 계산해보면 다음과 같습니다.



  • w_10^(0) 은 E_tot 에 -0.00042 만큼 영향을 미친다는 것을 알 수 있고 이를 통해 w_10^(0) 을 학습시켜 보면 다음과 같습니다.


  • 학습률을 0.5 로 지정하고 계산하면 새로운 w_10^(0) 의 값은 0.1502 라는 것을 알 수 있습니다. 이제 다른 모든 weight 들을 학습시켜서 얼마나 Error 가 줄어들었는지 살펴보겠습니다.


학습 전 신경망 - y_1 : 0.609, y_2 : 0.633


학습 후 신경망 - y_1 : 0.581, y_2 : 0.638


  • 1회 학습하고 난 뒤 전체 오차는 0.087 에서 0.069 로 0.017 만큼 감소한 것을 알 수 있습니다. 
  • 과정을 따라오셨다면 아시겠지만 학습을 순전파 방향이 아닌 역방향으로 하는 이유는 뒤에서 계산한 편미분 값들이 앞쪽으로 진행되면서 다시 사용되기 때문입니다. 


2차원 선형 회귀 역전파


3차원 선형 회귀 역전파


  • 위 2 개의 이미지는 진행한 역전파 예제와 관련없습니다만, 학습이 반복되면 어떻게 되는지 나타내는 그림 입니다.
  • 학습이 반복될 수록 전체 오차 loss 가 줄고 data 에 적합한 모델을 찾아나가는 것을 알 수 있습니다. 


Deep Learning 

  • 이제 학습과정이 어떻게 되는지 제대로 알았으니 더 어렵고 더 복잡한 문제를 풀 수 있을 것 같습니다. 수가 많아져봤자 같은 알고리즘으로 동일하게 계산하면 되니까요.


  • 하지만 더 깊고 더 넓은 망을 학습시키는 과정에서 Output 값과 멀어질 수록 학습이 잘 안되는 현상들이 발생합니다. 이 현상을 Vanishing Gradient 라고 부르는데, 이 현상 때문에 다시 인공신경망 연구에는 침체기가 도래 합니다.



  • 다음 글에선 이 Vanishing Gradient 현상을 어떻게 극복하는지에 대해 살펴보겠습니다.






부족한 블로그에 방문해 주셔서 감사합니다.

잘못된 부분이나 질문이 있으시면 

댓글로 말씀해주세요.


금방 확인하고 피드백 드리겠습니다.


좋은 하루 되세요. ^^



댓글20

  • rocketpunch 2018.03.26 19:10

    좋은 글 잘 보고갑니다. 이미지들이 깔끔하네요.
    답글

  • 딥러닝 초보자 2018.04.15 15:32

    안녕하세요.

    역전파에 관해서 질문 한가지 올립니다.

    보통 인터넷에 나와있는 역전파 도출 식을 보면 한개의 데이터 샘플을 가지고 포워드 백을 반복하면서 최적화된 가중치를 찾아가는 것 같은데

    실제 딥러닝을 학습 시킬때는 여러 샘플을 가진 상태에서 학습을 시킬 텐데 이런 경우에는 어떻게 하는지 궁금합니다.

    각각의 데이터 샘플은 출력이 다를 테니 이에 대한 손실함수 값도 달라질테니 이에 따른 가중치 찾아가는 값 (delta)도 다를거라고 생각이되는데요

    예를 들어 400개의 샘플을 가지고 학습을 시키면
    400 개를 모두 포워드 시키고 이에 따른 손실 값들을 평균? 같은 것을 내서 한꺼번에 구하는건지

    아니면 샘플 하나당 반복을 여러번 하는 건지

    감이 안와서요

    혹시 도움 주실수 있으면 감사합니다.
    답변 혹은 참고 문헌 추천 해주셨으면 좋겠습니다.
    답글

    • Gom Guard 2018.04.15 18:53 신고

      안녕하세요. ^^
      역전파 식을 살펴보면 gradient 부분이 있는데요. gradient 의 핵심은 어떤 w 가 총 에러에 얼마나 영향을 미치는가 라고 할 수 있습니다.

      질문하신 부분 중에 [ 역전파 도출 식을 보면 한개의 데이터 샘플을 가지고 포워드 백을 반복하면서 ] 라고 기술하신 부분이 있는데 이 부분이 맞는 말이라고 보기가 어려운 것 같습니다. 왜냐하면 본 포스팅에서 사용한 cost function 은 mse 방식인데, mse 같은 경우는 여러 개의 데이터의 오차를 한번에 구해서 손실값을 평균내는 오차 함수입니다.

      질문이 참 좋은데, 질문자님께서 하신 생각은 batch 라는 개념과 비슷합니다. 차후 옵티마이저를 공부하면서 많은 데이터를 어떻게 나누어서 학습시키는 것이 효율적인지를 배워나가시면 지금의 궁금증이 풀리실 것 같습니다.

      질문자께서 생각하신 400개의 샘플을 가지고 모두 포워드 시키고 손실값들을 평균내는 것이 기본 경사하강법이고 샘플 하나당 반복을 여러번 하는 방법이 확률 경사하강법 이라고 불리는 방법입니다.

      부족한 글 읽어주셔서 감사하고 도움을 드릴 수 있는게 있다면 또 요청해주세요. 감사합니다. ^^

  • 궁금합니다 2018.05.16 14:12

    안녕하세요 .
    블로그 글을 보면 역전파에 대한 이해를 많이 하게 되었습니다.
    특히, 실제 숫자값으로 예시를 만들어서 보여주는 더더욱 이해가 잘 되었습니다.

    숫자값으로 값을 계산해 보다 보니 본 블로그의 역전파 02 부분의 'E_2 에 미치는 영향'에서 y2예측값(=a21)이 0.633에서 0.621로 변경되었습니다.

    이 부분이 단순 오타인지, 아니면 역전파 계산할 때 a21 값이 다시 계산되는지 확인 부탁합니다.

    아무쪼록 좋은 글 올려주셔서 감사합니다. 학습하는데 아주 많은 도움이 되고 있습니다.
    감사합니다.
    답글

    • Gom Guard 2018.05.16 14:26 신고

      궁금합니다 님 안녕하세요.
      글 좋게 봐주셔서 감사합니다. ^^

      0.633 이 맞는 값인데 제가 만드는 과정에서 오타를 낸 것 같습니다.

      세심한 것까지 봐주셔서 감사하고 찾아주셔서 감사합니다. ^^

      좋은하루되세요~~

  • 잘 읽고 갑니다. 2018.09.07 11:55

    좋은 글 감사합니다
    이해하는데 큰 도움이 되었습니다
    답글

  • Cree 2018.12.03 18:40

    제가 찾아본 것 중에 직접 계산 과정을 설명해주는 유일한 글이네요. 덕분에 이해를 잘 할 수 있었습니다. 정말 감사합니다.

    다만 중간 수식에 오타가 있는 것 같습니다.
    Z_20 = W_10(1)*a_10 + W_20(1) * a_20 으로 되어 있는데 맨 끝에 a_20이 아니고 a_11 아닐까요?
    Z_20 = W_10(1)*a_10 + W_20(1) * a_11 아닐까요? 어차피 뒤에 항은 W_10으로 미분하면 사라져서 결과에 영향을 주지는 않지만요.
    답글

    • Gom Guard 2019.04.17 00:57 신고

      Cree 님 답변이 늦었네요.. ^^..

      말씀해주신게 맞습니다. 제가 오타를...

      금방 수정하도록 하겠습니다.

      감사합니다. ^^.

  • ㄱㅎㅅ 2019.04.16 20:58

    Cree님과 생각이 같은데 오타 맞죠?
    답글

  • 도레미 2019.05.31 13:56

    감사합니다. 덕분에 이해가 잘 되었습니다.

    중간에 E_tot = 1/2((target_y1 - a_20)^2 + (target_y2 - a21)^2)

    이부분이에 뒷부분이 a21이 아니라 a20으로 되야하는게 아닐런지요..?

    제가 틀린걸수도 있습니다. 확인좀 부탁드릴께요
    답글

    • adf 2019.11.06 16:30

      sigma를 풀어쓴건데 a_20은 y1과, a_21은 y2와 오차를 계산하는 것이 맞습니다.

  • 질문자 2019.09.25 08:56

    안녕하세요. 좀 기본적인 질문이라 부끄럽긴 하지만 너무 이해가 안 되서 여쭤봅니다 ^^;; 예제 : 역전파 01에서 첫번째로 계산할 때 (target_{y1} - a_{20}) * -1 + 0 이 수식에서 -1은 어떻게 나오는건가요?
    답글

  • Ajou집교 2019.10.05 16:53

    역전파를 계산하는 식에서 a20값과 sigmoid(z20) 0.609로 값이 같고, a21값과 sigmoid(z21) 0.633으로 값이 같다고 나와있네요. 직접 계산해보았더니 전체 계산결과(0.0294, -0.0328)에는 오류가 없으나 sigmoid값 표기에 오타가 난 거 같습니다. 혹시 직접계산하시는분들이 헷갈릴 수도 있을 거 같아서 시간되시면 한번 수정부탁드립니다.
    답글

  • 딥러닝재미 2019.11.29 00:55

    정말 이해하기 쉽게 올려주셔서 공부하는데 도움이 많이 되었습니다.
    가중치 하나를 예로 들어서 설명하셨는데 , 실제로는 하나의 가중차에 대해서 갱신하는 것이 아니라 모든 가중치에 대해서 갱신하는 것인거죠?
    답글

    • Gom Guard 2019.12.01 08:59 신고

      딥러닝재미님 안녕하세요. ^^

      말씀하신대로 전 노드에 대해저 가중치를 학습시킨다고 생각하시면 될 것 같습니다.

      댓글 달아주셔서 감사합니다~

  • 오호힛 2020.03.11 16:50 신고

    수치로 작성해주셔서 이해하기 좋았습니다.
    답글

  • Lee 2020.04.15 11:57

    Backprop 관련 여러 포스팅들을 살펴봤는데, 이 포스팅이 제일 깔끔하고 설명이 잘 되어져있네요. 좋은글 감사합니다.
    답글

  • snowfieldKoo 2020.06.05 23:46 신고

    기본적인 걸로 질문하는거...같아서..ㅠㅠ 부끄럽지만 하나 여쭙겠습니다. E_total 구하는 부분까지 이해를 하였습니다. ㅠㅠ 그런데 E_1을 구한다음 a_20으로 미분할 때 왜 -2(target_y1-a_20)이 아닌 -(target_y1-a_20)인가요 ㅠㅠ E_1를 구할 때 또한 MSE를 사용하면, (target_y1-a_20)^2이 돼서 미분을 하게 되면 -2(target_y1-a_20) 이거라 생각했었습니다 ㅠㅠ
    답글