본문 바로가기
Deep Learning/모두를 위한 cs231n

[모두를 위한 cs231n] - Lecture4. Backpropagation and Neural Network. 오차역전파에 대해서 알아보자😃

by Steve-Lee 2020. 4. 30.

목차

 

Lecture4-Backprop and NN

마지막으로 Backprop을 정리하는 글이 되었으면 합니다. 하나부터 열까지 꼼꼼하게 정리해 보도록 하겠습니다🧐

안녕하세요 Steve-Lee입니다. 오늘은 네 번째 강의 Backpropagation과 Neural Network에 대해 배워보도록 하겠습니다.

TLDR; 바로 시작하겠습니다!

 

모두를 위한 cs231n

더보기

모두를 위한 cs231n 😀

👉🏻 시작합니다! 🎈

모두를 위한 cs231n (feat. 모두의 딥러닝 & cs231n)


👉🏻 Neural Network 기초 📗
* Backpropagation
Lecture4. Backpropagation and Neural Network. 오차역전파에 대해서 알아보자😃


👉🏻 Training Neural Network Part I 📑

- Activation Function 파헤치기

Lecture 6. Activation Functions에 대해 알아보자 
Lecture 6. Activation Functions - ReLU함수의 모든 것

 

- Data Preprocessing

Lecture 6. Training Neural Network - Data Preprocessing

 

- Weight Initialization 

Lecture 6. Weight Initialization

 

- Batch Normalization
Lecture 6. Batch Normalization

 

👉🏻 Deep Learning CPU와 GPU ⚙️

Lecture 8 - Part1. Deep Learning 을 위한 CPU와 GPU


👉🏻 Deep Learning Framework ☕️
Lecture 8 - Part2. Deep Learning Framework

👉🏻 TensorFlow Fraemwork 🧱
Lecture 8 - Part3. TensorFlow Framework


👉🏻 
PyTorch Framework 🔥

Lecture 8 - Part3. PyTorch Framework

 

👉🏻 Generative Model

Lecture 13 - Part2. VAE(Variational AutoEncoder)

 

모두를 위한 cs231n (feat. 모두의 딥러닝 & cs231n)

cs231n 시작합니다! 안녕하세요. Steve-Lee입니다. 작년 2학기 빅데이터 연합동아리 활동을 하면서 동기, 후배들과 함께 공부했었던 cs231n을 다시 시작하려고 합니다. 제가 공부하면서 느꼈던 점들과 중요하다고..

deepinsight.tistory.com

Backpropagation

오차 역전파란 무엇인가?

역전파가 대체 뭔데?🤔

딥러닝 → 오차역전파?!

딥러닝을 한 번쯤 공부해 보셨다면 오차 역전파에 대해서 한 번쯤은 들어보셨을 것이라고 생각합니다.

오차 역전파(Backpropagation)란 무엇일까요??

 

  • 오차 역전파란?
recursive application of the chain rule along a computational graph to compute the gradients of all inputs/parameters/intermediates

 

해석하면 모든 input값, parameter, 중간체들의 기울기를 계산하기 위해 computational graph에 chain rule을 재귀적으로 적용하는 방법이 바로 bachpropagation입니다.

  • 오차 역전파를 사용하는 이유는 무엇일까요?

  • 어떤 장점이 있을까요?

지금부터 예제를 통해 그 의미를 하나씩 짚어보도록 하겠습니다.

-referenced by. cs231n

 

 

1. a simple example

간단한 예제를 통해 알아보도록 하겠습니다

함수 f(x, y, z)가 있다고 가정합니다.

f(x, y, z) = (x + y) z

이때 backpropagation은 어떻게 구할 수 있을까요?

우리가 원하는 기울기는 x에 대한 f의 기울기, y에 대한 f의 기울기, z에 대한 f의 기울기입니다. Chain-rule을 이용하여 각각의 gradient를 구해보도록 합니다. Chain-rule을 이용하여 각각의 변수에 대한 gradient를 구하는 방법으로는 Upstream Gradient에 Local gradient를 곱해서 구하는 방법이 있습니다. 아래 슬라이드에서 간단한 예제를 통해 직관적으로 이해해 보겠습니다.

 

Backpropagation Chain-Rule

x와 y를 입력으로 받아 z를 출력하는 함수 x가 있다고 가정해봅니다.

f = (x + y) z로 정의할 수 있습니다.

이 때, x에 대한 L의 기울기, y에 대한 L의 기울기를 Chain-rule을 통해 구할 수 있습니다.

그림과 같이 x, y를 입력으로 받아 z를 출력하는 함수가 있다고 가정합니다.

각각의 변수에 대한 기울기(편미분값)을 구하기 위해서 Chain-rule을 사용한다고 했습니다.

정리하면

  • Upstream Gradient(아래 슬라이드의 gradients)
  • local gradient

이 두 gradient를 곱해서 우리가 원하는 x와 y의 L에 대한 gradient를 구할 수 있습니다.

이 방법이 Chain-rule을 이용한 오차역전파(Backpropagation)입니다.

예를 들어 아래 슬라이드에서 x에 대한 L의 기울기 dL/dx를 구해보겠습니다. dL/dx를 한 번에 구할 수 없기 때문에 위에서부터 타고 흘러들어온 gradients(dL/dz)에 local gradient(dL/dx)를 곱해 dL/dx gradient를 구할 수 있게 됩니다.

슬라이드를 보시고 직접 손으로 쓰면서 이해하시면 보다 잘 이해할 수 있을것으로 생각합니다.

 

chain-rule을 통해 gradient를 구할 수 있습니다

 

📌 이것만 기억해주세요! Upstream gradient에 local gradient를 곱해 gradient를 구할 수 있게 되는 것입니다!😃

 

그렇다면 좀 더 복잡한 computational graph가 주어졌을 때 우리는 어떻게 계산할 수 있을까요??🤨

아래 슬라이드를 보시면 +, - 게이트 뿐만 아니라 exp(exponential: 지수함수), 1/x등의 계산그래프가 추가된 것을 보실 수 있습니다. 원리는 같습니다. Upstream gradient에 local gradient만 곱해주시면 구할 수 있습니다!

 

파란색 게이트 안의 값들을 하나씩 구하는 방법도 있지만 이 게이트들을 합쳐보니 Sigmoid 게이트가 되는군요! 

Sigmoid 함수의 미분값을 우리가 알고있다면 Upstream gradient에 Sigmoid의 미분값(여기서는 이 값이 local gradient가 되겠죠?)를 곱해 값을 구해주시면 됩니다.

 

Gradients for vectorized code

그렇다면 이제 vector가 주어졌을 때 어떻게 할 수 있을까요??

모든 흐름은 같지만 gradient는 Jacobian Matrix가 될 것입니다.

여기서 잠깐 Jacobian Matrix에 대해 짚고 넘어가 보도록 하겠습니다

  • Jacobian Matrix란

    선형대수에 등장하는 Jacobian Matrix에 대해 알아보겠습니다.

    개념에 대해 정리를 잘해주신 EnGeniUS님의 블로그 포스팅을 참고했습니다.

  • 가정

    • 하나의 함수가 n개의 변수(Variable)를 가지고 있습니다
    • 이런 함수가 m개 있다는 가정입니다

이 함수들의 편미분들을 모조리 구하려면 어떻게 해야 할까요?

위의 가정(Assumption)에서와 같이 편미분을 할 변수들이 많고, 그 변수들로 이루어져 있는 함수가 많을 때, 단순히 곱해서 더하는 폼으로 만들어 놓을 수 있는 것이 바로 Jacobian Matrix입니다.

좀 더 알아볼까요?

식(1)을 모두 편미분 하려면 아래의 식(2)의 J와 같은 벡터로 표현해야 합니다.

Jacobian Matrix를 통해 변수가 n개인 m개의 함수에 대해 편미분 값을 모두 구할 수 있게 되는 것입니다. Jacobian Matrix에 대해 더 알고 싶다면 여기를 참고해주세요.

편미분에 대한 강의는 이곳을 참고하세요

이제부터 입력값으로 들어오는 값은 Vector값입니다.

질문입니다. Jacobian Matrix의 size는 어떻게 될까요? 아래 슬라이들에서 확인하실 수 있습니다.

 

Jacobian Matrix의 사이즈는 (Input size) x (input size). 즉 4096x4096이 됩니다.

문제는 minibatch학습을 하게 되면 사이즈가 폭발적으로 증가한다는 점이 있습니다.

 

다음으로 선형 함수 결과값에 L2 정규화를 적용하는 예를 들어보겠습니다.

 

원리는 같습니다. 위에서 연습한 예제들과 다른점은 값이 vector라는 점이겠네요. Chain-rule을 통해 backpropagation을 수행해 주시면 됩니다.

 

다만 주의할 점은 gradient의 사이즈는 항상 variable의 사이즈와 같아야 한다는 점입니다. 이게 무슨말이냐고요??

아래 슬라이드의 변수 W에서 볼 수 있듯이 W의 사이즈는 (2, 2)입니다. 

기존에 배운것처럼 gradient를 계산하게 된다면 upstram gradient(2,1)에 local gradient(df/dw = x, size=(2, 1))이기 때문에 연산이 되지 않습니다. 이 때 중요한 것이 gradient의 사이즈를 변수 W의 사이즈에 맞춰주는 것입니다. 우리가 구하는 Jacobian Matrix는 결국 변수 하나하나에 대한 전체 함수의 gradient이기 때문에 변수의 사이즈와 같아야 합니다. 즉 변수의 사이즈와 gradient의 사이즈는 같아야만 합니다.

 

아래 슬라이드를 보고 한 번 따라오시길 바랍니다.

W의 사이즈와 dL/dw의 사이즈를 맞춰주기위해 upstream gradient에 xT값을 곱해줬습니다. x에 transpose 변형을 주어 (2,)에서 (1,2)로 shape을 변환해주었습니다. 그러면 이제 계산이 가능해집니다!

 

dL/dw = 2q.xT ==> (2,) dot (1,2) ==> (2, 2)

이렇게 사이즈가 같아지게 되는 것입니다! 항상 주의해주세요🤩

Neural Network

이번 시간에는 본격적으로 Neural Network를 배우기에 앞서 2-layer, 3-layer의 기본에 대해서 간단히 짚고 넘어갔습니다. 보다 자세한 내용은 다음 강의(Lecture 5)를 통해 배워보실 수 있습니다.

Neuron and Neural Network

Neuron에서 concept을 가져온 Neural Network를 Neuron과 비교해보는 시간.

비록 완전히 같은 원리로 작동하지는 않지만 상당히 흥미로운 부분이 아닌가 생각합니다.

 

포스팅이 길어졌습니다. 부족한 내용들도 많은 것 같고요...하하😅(하나하나 보충해가면서 채워나가겠습니다)

오늘의 포스팅을 정리하면 가장 중요한 오차역전파(Backpropagation)에 대해 배웠습니다. Chain-rule을 적용해서 gradient를 구하는 방법과 Jacobian Matrix에 대한 개념을 꼭 숙지하시길 바랍니다. 이상 Steve-Lee였습니다!

 

 

모두를 위한 cs231n (feat. 모두의 딥러닝 & cs231n)

cs231n 시작합니다! 안녕하세요. Steve-Lee입니다. 작년 2학기 빅데이터 연합동아리 활동을 하면서 동기, 후배들과 함께 공부했었던 cs231n을 다시 시작하려고 합니다. 제가 공부하면서 느꼈던 점들과 중요하다고..

deepinsight.tistory.com


Reference

댓글