본문 바로가기

공부 기록/딥러닝의 수학

[딥러닝의 수학] 4. Cost, Gradient Descent

728x90

2023.07.31 - [수학 공부 기록] - [딥러닝의 수학] 3. DNN, Forward Pass

 

[딥러닝의 수학] 3. DNN, Forward Pass

2023.07.30 - [수학 공부 기록] - [딥러닝의 수학] 2. Perceptron, MLP [딥러닝의 수학] 2. Perceptron, MLP 2023.07.28 - [수학 공부 기록] - [딥러닝의 수학] 1. Introduction [딥러닝의 수학] 1. Introduction 딥러닝 시리즈의

lighter.tistory.com

 

딥러닝 시리즈의 네 번째 글입니다. 이 글은 고려대학교 수학과 오승상 교수님의 딥러닝 강좌를 참고자료로 하여 쓰임을 밝힙니다. 또한, 이 글의 목적은 이 강좌를 듣고 저의 개인적인 복습용으로 요약하여 작성하는 것임을 밝힙니다. 자세한 내용을 알고 싶으시다면 아래 링크를 참고해 주세요.

 

https://youtube.com/playlist?list=PLvbUC2Zh5oJvByu9KL82bswYT2IKf0K1M

 

오승상 딥러닝 Deep Learning

고려대학교 오승상 교수의 Deep Learning 강의 입니다. (자료) https://sites.google.com/view/seungsangoh

www.youtube.com


이 글에서 다루고자 하는 것은 Cost의 개념과 이를 계산하는 방법 중 하나로 잘 알려진 Gradient Descent(경사 하강법)입니다.

 


이전 시간에서 배운 것을 상기시켜보면, 우리의 목적은 parameter $\theta$를 업데이트함으로써 성능을 향상하는 것이라고 했습니다.

 

업데이트를 하는 과정은 Backpropagation이라고 했으며, 이 과정에서 필요한 것은 $\mathbf{y}$, 즉, Label, 혹은 Target(정답)과 $\mathbf{\hat{y}}$(Prediction)를 서로 비교하여 그 오차가 줄어들게 만들고 싶다고 했습니다.

 

다음과 같이 DNN이 주어져 있다고 합시다.

 

그리고 parameter $\theta = \{ W^1, b^1, ... , W^L, b^L \}$이 있다고 합시다.

 

우리는 Label(Target)과 Prediction이 서로 어떤지 비교하여 $\theta$를 업데이트하고자 합니다.

 

즉, $\mathbf{y}$와 $\mathbf{\hat{y}}$를 서로 비교하는 것입니다.

 

이 그림의 경우는 Classification문제 이므로, 마지막에 Softmax function을 이용하여 Probability의 형태로 $\mathbf{y}$가 나왔음을 알 수 있습니다.

 

마찬가지로, 우리는 Target이 답안이 되는 데이터만 $1$로 정하고 나머지는 $0$으로 정하는 one-hot coding의 형태로 표현돼있음을 알 수 있습니다.

 

이 또한 모두 다 더하면 확률처럼 $0$이 나옵니다.

 

이 Parameter $\theta$에 대하여 이 데이터(저 손글씨 $2$)를 입력받을 때, 얼마큼의 오차가 나는지 알고 싶습니다.

 

오차를 정의하는 방법에는 Cross Entropy도 있지만, 주로 MSE(Mean Error Square)를 사용합니다.

 

두 벡터의 MSE는 아래 식과 같습니다.

 

$$\sum_{i} (y_i - \hat{y_i} )^2$$

 

위의 그림에서의 경우라면, MSE의 값은 $(0.09 - 0)^2 + (0.71 - 1)^2 + ... + (0.03 - 0)^2$의 값을 가질 것입니다.

 

얼마나 오차가 나는지를 Cost Value라고 부르고, 주로 $L(\theta )$처럼 $\theta$에 대한 함수 형태로 표현합니다.

 


당연히, 위에서 이야기 한 $L(\theta )$는 같은 Parameter $\theta$를 적용했다고 해도, 데이터의 값마다 다를 것입니다.

 

그림과 같이 $4$개의 데이터가 주어져 있다면, 같은 Parameter를 적용했더라도 그 오차는 당연히 다릅니다.

 

그래서, 우리는 학습해야 하는 "모든" 주어진 데이터들에 대하여 이 Parameter가 얼마나 좋은지 안 좋은 지를 판단할 때, 이 오차들을 모두 더한 값($C (\theta )$)을 사용합니다.

 

이를 Total Cost라고 하며, 이는 $C (\theta ) = \sum_{all \ data} L (\theta ) =$ $\theta$가 얼마나 안 좋은지에 대한 척도라고 생각하면 됩니다.

 

즉, 우리의 목표는 결국 이 Total Cost를 최소화시키는 방향으로 $\theta$를 업데이트하는 것이라고 보면 됩니다.

 


그러면 어떻게 업데이트를 하느냐에 대한 방법이 Gradient Descent(경사 하강법)입니다.

 

이는 함수의 Minimum값을 찾기 위한 "반복적인" 알고리즘입니다.

 

그전에 먼저 Gradient Vector의 의미를 다시 되짚어봅시다.

 

 

그림과 같이 이차 함수가 주어져 있다고 해봅시다.

 

그러면 우리는 이 이차함수의 최솟값을 찾기 위해서는 어디 쪽으로 향해야 할까요.

 

$\mathrm{d}f/ \mathrm{d}x$의 "반대" 방향으로 가야 최솟값을 향할 수 있다는 것을 직관적으로 알 수 있습니다.

 

마찬가지로, 다차원 공간에서는 Gradient를 사용하는데, 이 Gradient의 "반대" 방향으로 가야 Minimum을 향한다는 것을 직관적으로 알 수 있을 것입니다.

 

 

Gradient vector $\triangledown f(p)$는 다음과 같이 각 Element별로의 정의가 되고, 이는 가장 빠르게 증가하는 곳의 방향과 그 증감률을 알려줍니다.

 


이제 예시를 들어, 다음과 같이 $\theta = \{ w_1, w_2 \}$로 구성된 네트워크의 Cost Function을 그려봤다고 생각해 봅시다.

 

여기서는 등고선으로 표시되어 있습니다.

 

그림에서 확인할 수 있듯이, 맨 처음에 잡은 parameter $\theta ^0$에 대한 Gradient vector의 방향을 보면 급격하게 감소하는 방향이어서 등고선에 수직 하게 그려짐을 알 수 있습니다.

 

우리가 원하는 것은 $\theta ^{*}$로 가는 것입니다.

 

학습의 목표는 $\theta ^0$에서 최솟값인 지점인 $\theta ^{*}$로 가는 것입니다.

 

그러려면 파란색 방향(감소하는 방향)을 따라 점을 움직이면 됩니다. 그 움직인 곳에서 다시 Gradient vector를 구해 점을 움직이고, 이 과정을 반복하면 최솟값을 구할 수 있습니다.

 

$\theta ^t$를 $t$번 반복했을 때의 Parameter값이라고 한다면, 그때의 Gradient vector는 $\triangledown _{\theta} C (\theta ^{t} )$로 표기됩니다.

 

따라서, 그 반대방향으로 가면 되므로, $- \triangledown _{\theta} C (\theta ^{t} )$만큼 점을 움직이면 됩니다.

 

그래서 $\theta _{t+1} = \theta _{t} - \triangledown _{\theta} C (\theta ^{t} )$과 같은 기본적인 점화식을 생각할 수 있습니다.

 

이 점화식을 계속해서 컴퓨터로 돌리면 됩니다.

 


여기서 효율적인 학습을 진행하려면 어떻게 해야 할까요?

 

여러 방법이 있겠지만, 두 가지 방법을 말하고자 합니다.

 

첫 번째로, 지금 보면 우리는 Gradient vector를 계산할 때 Total Cost, 즉, 모든 데이터의 합을 고려하여 계산했습니다.

 

그러면 시간이 너무 오래 걸리니, 대략 데이터가 $10000$개정도 있다면 랜덤 하게 $100$개를 선택하여 Gradient vector를 계산해 점을 이동시킵니다.

 

다음엔 다른 $100$개를 선택하여 Gradient vector를 계산해 점을 이동시킵니다.

 

당연히, 그렇게 계산한 Gradient vector $\triangledown _{\theta} C (\theta ^{t} )$들은 일부만 대변합니다.

 

두 번째로는 반복 횟수를 줄이는 것입니다.

 

현재는 Gradient vector의 크기만큼 움직였으나, 그 크기를 잘 조정하여 반복횟수를 줄이도록 합니다.

 

그 크기를 조정하려면 당연히 Gradient vector에 상수가 붙겠죠.

 

그 상수를 Learning rate($\eta$)라고 부르고, 이를 작게 설정하면 작게 설정할수록 크기가 작아져서 자잘하게 점이 이동하고, 크게 설정하면 크게 크게 움직여서 지나치기 쉽습니다.

 

이를 적절히 설정하면 반복횟수를 줄일 수 있습니다.

 

Learning rate를 고려한 점화식은 다음과 같습니다.

 

$$\theta _{t+1} = \theta _{t} - \eta \triangledown _{\theta} C (\theta ^{t} )$$