목차
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
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을 통해 구할 수 있습니다.
각각의 변수에 대한 기울기(편미분값)을 구하기 위해서 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를 구할 수 있게 됩니다.
슬라이드를 보시고 직접 손으로 쓰면서 이해하시면 보다 잘 이해할 수 있을것으로 생각합니다.
📌 이것만 기억해주세요! 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였습니다!
Reference
- cs231n Lecture 4 - Backpropagation and Neural Network
- Lecture Slides
'Deep Learning > 모두를 위한 cs231n' 카테고리의 다른 글
[모두를 위한 cs231n] Lecture 8 - Part1. Deep Learning 을 위한 CPU와 GPU (3) | 2020.05.08 |
---|---|
[모두를 위한 cs231n] Lecture 8 - Part4. PyTorch Framework (0) | 2020.05.07 |
[모두를 위한 cs231n] Lecture 1. Introduction. 앞으로 이런 것들을 배울거에요😄 (0) | 2020.04.30 |
모두를 위한 cs231n (feat. 모두의 딥러닝 & cs231n) (15) | 2020.04.30 |
[모두를 위한 cs231n] Lecture 6. Activation Functions - ReLU함수의 모든 것 (0) | 2020.04.21 |
댓글