Gradient descent

* 모든 코드는 제 깃허브 (cdjs1432/DeepLearningBasic: Deep Learning from scratch)에서 확인할 수 있습니다.

import numpy as np
import ComputeGrad
data = np.array([[1, 2, 3], [4, 6, 8]])  # y=2x+2 --> w=2, b=2
train_x = data[0]
train_y = data[1]

w = 1
b = 1

learning_rate = 0.1

epoch = 10000
w, b = ComputeGrad.GradientDescent(train_x, train_y, b, w, learning_rate, epoch)
print(w)
print(b)

 

 

 

 

일단 가장 먼저 할 것은, 간단한 Linear Regression 및 Gradient Descent의 구현입니다.

어차피 설명할 부분이 적으니, 코드로 바로 들어가도록 하겠습니다.

 

 

data = np.array([[1, 2, 3], [4, 6, 8]])  # y=2x+2 --> w=2, b=2
train_x = data[0]
train_y = data[1]

w = 1
b = 1

learning_rate = 0.1
epoch = 10000

우선 처음 시작은 이렇게 간단한 데이터로 하겠습니다.

이정도로 간단한 데이터라면 분명 Gradient Descent를 통해 w=2, b=2라는 정답을 찾아낼 수 있을 겁니다.

위 코드를 통해 train_x에는 [1, 2, 3]이, train_y에는 [4, 6, 8]이 들어가게 됩니다.

또, w값과 b값은 초기 값을 1로 설정하고, learning rate와 epoch까지 설정했습니다.

 

 

 

def GradientDescent(x, y, b, w, learning_rate=0.01, epoch=10000):
    if type(w) != np.ndarray:
        w = float(w)
        w = np.reshape(w, (1, 1))
    if x.size == x.shape[0]:
        x = x.reshape(x.shape[0], 1)
    if y.size == y.shape[0]:
        y = y.reshape(y.shape[0], 1)
    for epochs in range(epoch):
        pred = x.dot(w) + b  # y = w1x1 + w2x2 + ... + wmxm + b
        """
        err = 1/m * ((Wx1 + b - y1)^2 + (Wx2 + b - y2)^2 + ... + (Wxm + b - ym)^2)
        to minimize err --> differentiate w and b
        dw = 2/m * ((Wx1 + b - y1) * x1 + (Wx2 + b - y2) * x2 + ... + (Wxm + b - ym) * xm) 
        db = 2/m * ((Wx1 + b - y1) * 1 + (Wx2 + b - y2) * 1 + ... + (Wxm + b - ym))  
        """
        dw = ((pred - y) * x).mean(0)
        db = (pred - y).mean()
        dw = dw.reshape(dw.shape[0], 1)
        w -= dw * learning_rate
        b -= db * learning_rate


        if epochs % 1000 == 0:
            err = np.mean(np.square(pred - y))  # err = 1/m * (w1x1 + w2x2 + ... + wmxm + b - y)^2
            print("error : ", err)
    return w, b

다음은 Gradient Descent 부분 코드입니다.

 

    if type(w) != np.ndarray:
        w = float(w)
        w = np.reshape(w, (1, 1))
    if x.size == x.shape[0]:
        x = x.reshape(x.shape[0], 1)
    if y.size == y.shape[0]:
        y = y.reshape(y.shape[0], 1)

원래 Multi Variable Linear Regression을 먼저 만들 생각이었기에, w와 x의 값을 행렬곱에 적합한 형태로 바꾸어 주어야 합니다.

 

    for epochs in range(epoch):
        pred = x.dot(w) + b  # y = w1x1 + w2x2 + ... + wmxm + b
        """
        err = 1/m * ((Wx1 + b - y1)^2 + (Wx2 + b - y2)^2 + ... + (Wxm + b - ym)^2)
        to minimize err --> differentiate w and b
        dw = 2/m * ((Wx1 + b - y1) * x1 + (Wx2 + b - y2) * x2 + ... + (Wxm + b - ym) * xm) 
        db = 2/m * ((Wx1 + b - y1) * 1 + (Wx2 + b - y2) * 1 + ... + (Wxm + b - ym))  
        """
        dw = ((pred - y) * x).mean(0)
        db = (pred - y).mean()
        dw = dw.reshape(dw.shape[0], 1)
        w -= dw * learning_rate
        b -= db * learning_rate


        if epochs % 1000 == 0:
            err = np.mean(np.square(pred - y))  # err = 1/m * (w1x1 + w2x2 + ... + wmxm + b - y)^2
            print("error : ", err)
    return w, b

 

다음은 훈련 과정입니다.

 

우선, Linear Regression에서의 예측값을 pred, loss값을 err로 설정해 두었습니다.

 

계산 과정은 주석으로 달아놨지만, 조금 더 자세히 써보도록 하겠습니다.

 

 

우선 err값은 1/m * ((Wx1 + b - y1)^2 + (Wx2 + b - y2)^2 + ... + (Wxm + b - ym)^2)으로 설정해 두었습니다.

하지만 지금은 multi variable gradient descent가 아니므로, w와 x는 값을 각 한개씩을 가지게 됩니다.

따라서 err값은 $ err = 1/m * (wx + b - y)^2 $ 로 설정이 됩니다.

 

이제 이 err 값을 w와 b에 대하여 미분해 보면,

$$ \frac{\partial{err}}{{\partial{w}}} = 2/m * (wx + b - y) * x$$

$$ \frac{\partial{err}}{{\partial{b}}} = 2/m * (wx + b - y)$$

가 됩니다.

 

따라서, 이를 코드로 구현하면, 

        dw = ((pred - y) * x).mean(0)

        db = (pred - y).mean()

가 됩니다.

(2를 곱하지 않은 이유는, 딱히 중요한 이유가 있는게 아니라 코드에 2 곱하는 코드 있으면 더러워 보여서 그런겁니다.)

 

 

 

 

그리고, 아까 위에서 잠깐 언급했듯, 위 코드는 Multi Variable일때도 작동합니다.

import numpy as np
import ComputeGrad
train_x = np.random.uniform(-5, 5, (100, 10))
ans_w = np.random.uniform(-5, 5, (10, 1))
ans_b = 3
train_y = train_x.dot(ans_w) + ans_b
w = np.random.uniform(-5, 5, (10, 1))
b = np.random.uniform(-5, 5, (1, 1))

w, b = ComputeGrad.GradientDescent(train_x, train_y, 3, w)

print(ans_w)
print(w)

print(ans_b)
print(b)

 

위의 코드가 바로 그 Multi Variable일 경우의 코드입니다.

 

train_x와 ans_w, ans_b를 각각 만들어 주어 ans_w * train_x + b의 값으로 y를 만들어 주었고,

w와 b의 초기값을 랜덤으로 설정해 두며 Gradient Descent를 작동시켰습니다.

 

마지막의 결과값을 보면 ans_w와 w, ans_b와 b가 서로 비슷해져 있는 모습을 볼 수 있습니다.

 

 

부록편에서는 지금까지의 강의를 하면서 개념 자체를 이해하는데 큰 필요성을 느끼지 못해 설명하지 않았던 수학적인 부분에 대해 설명합니다.

참고로 그렇게 수학적으로 깊게 파고들지는 않고, 간단히 개념을 이해할 정도로만 설명합니다.

 

 

1. 극한에 관하여

 

미분에 대해 알기 위해선 극한에 대해서 알아야 합니다.

그런데 사실 극한은 매우 간단합니다.

특정한 함수 f(x)가 L에 한없이 가까워 지는 것을 f(x)가 L에 수렴한다고 하고, 

이 때 L을 함수 f(x)의 x=a에서의 극한값이라고 합니다.

이 때, 이것을 기호로 lim x->a f(x) = L 으로 표현합니다.

주의하셔야 할 점은 x=a에서의 극한값이 x=a일 때의 값을 의미하진 않습니다.

x가 a에 수렴한다는 것은 x=a라는 것이 아니라, x의 값이 a에 최대한 근접했다는 뜻입니다.

함수의 극한

위의 그래프를 보도록 합니다.

x가 a의 왼쪽 부분에서 시작해서 a에 한없이 가까워 진다고 해봅시다.

그럼 x가 a에 서서히 가까워질수록, f(x)의 값도 8로 가까워지게 됩니다.

마찬가지로 x가 a의 오른쪽 부분에서 시작해서 a에 한없이 가까워 진다고 해도,

x가 a에 서서히 가까워질수록 f(x)의 값도 8로 가까워집니다.

이 때 함수 f(x)에서 x=a에서의 극한값은 8이 됩니다.

 

 

2. 미분과 Gradient Descent

 

2-1. 평균 변화율이란?

 

함수에서 평균 변화율은 다음과 같이 정의합니다.

함수 y=f(x)에서 x의 값이 a에서 b까지 변할 때, 평균 변화율은

(f(x)의 변화량) / (x의 변화량) = (f(b) - f(a))/ (b-a) = (f(a) + x의 변화량) - f(a) / x의 변화량

으로 정의됩니다.

그리고, f(x)의 변화량과 x의 변화량은 기호로 각각 Δf(x), Δx라는 기호로도 나타낼 수 있는데, 그렇게 위 식을 쓰면

Δf(x) / Δx  =  (f(b) - f(a))/ (b-a)  =  (f(a) + Δx) - f(a) / Δx

라고도 쓸 수 있습니다.

 

막 어렵게 써놨지만, 간단히 말해서 함수 f(x)에서 a에서 b까지의 기울기를 의미합니다.

 

간단한 exercise로 y=x^2그래프에서 x의 값이 1에서 2까지 변할 때 평균 변화율을 생각해 보면,

Δf(x) = 2^2 - 1^2 = 4 - 1 = 3

Δx = 2 - 1 = 1

즉, 평균 변화율 Δf(x) / Δx = 3/1 = 3 이 됩니다.

그리고, 이는 (1,f(1))과 (2,f(2))를 잇는 직선의 기울기가 됩니다.

 

평균 변화율

위 그래프에서 x가 x에서 x+h로 변할 때의 평균 변화율은 저 보라색 직선입니다.

공식으로 이해하지 말고, 그냥 간단히 직관으로 이해합시다.

 

 

2-2. 순간 변화율이란?

 

순간 변화율이란, 평균 변화율에서 x의 변화량이 0에 수렴할 때의 값을 의미합니다.

lim(b-a -> 0) (f(b) - f(a)) / (b-a) = lim (Δx->0 Δf(x) / Δx = lim(Δx -> 0)  (Δ(x) + Δf(x)) / Δ(x) 

순간 변화율

위의 그래프를 보며 이해해봅시다.

위의 그래프에서 왼쪽의 파란 점을 x, 오른쪽의 파란 점을 x+Δx라고 해봅시다.

이 때, Δx의 값을 대략 한 10에서 0으로 쭉 쭉 줄여보면,

Δx (x의 변화량)의 값도 0으로 쭉쭉 줄어들게 됩니다.

 

그리고, Δx를 계속해서 줄이면 x가 x에서 Δx까지 변할 때의 평균 변화율도 계속해서 변화합니다.

그러다가, Δx를 0에 수렴하게 줄이게 되면 저 두 점이 거의 만나게 될 것입니다.

(실제로 만나는 것은 아닙니다!! 극한값으로 가는것 뿐입니당)

 

이때 나오는 순간 변화율의 값을 미분계수라고 합니다.

그리고, 이 미분계수를 찾는 과정을 바로 미분이라고 합니다.

 

그런데 저 그래프를 잘 봐주시기 바랍니다.

순간 변화율은 Δx가 0으로 수렴할 때의 평균 변화율이라고 했으므로,

Δx가 0으로 수렴할 때, 파란 직선은 그래프의 접선으로 바뀌게 됩니다!

 

 

3. Gradient Descent

이를 토대로 Gradient descent를 이해해 봅시다.

Gradient Descent

Gradient Descent에서 우리가 하고 싶었던 것은 무엇인가 하면, 어떤 함수 f(x)가 최소가 되는 x를 찾는 것이었습니다!

위의 경우에는 x축에 w, y축에 J(w)로 적혀 있으므로 이를 따라 J(w)가 최소가 되는 w의 값을 찾아봅시다.

 

만약 처음 w값이 위의 그래프처럼 오른쪽 위쯤에 있다고 해봅시다.

그러면 그 W값을 미분하면, 위처럼 양수의 미분계수가 나오게 됩니다.

그런데 잘 생각해 봅시다.

미분계수가 양수라면, 즉 접선의 기울기가 왼쪽 아래와 오른쪽 위를 향하고 있다면 어떤 부분의 함숫값이 더 작을까요?

접선이 왼쪽 아래와 오른쪽 위를 향하고 있으므로, 당연히 아래를 향하는 왼쪽 부분의 함숫값이 더 작을 것입니다.

그리고 Gradient Descent의 목표는 J(w)가 최소가 되는 w의 값을 찾는 것이므로,

w를 함숫값이 더 작은 왼쪽 부분으로 넘겨 주어야 합니다.

즉, w값을 줄여야 한다는 것이죠.

즉, 어떤 함수에서 w값에 대한 미분계수가 양수라면, w의 값을 줄여주어야 합니다!

 

 

그렇다면 반대로 처음 w값이 왼쪽에 있었다면 어땠을까요?

그럼 x=w에서의 미분계수는 음수가 되었을 것입니다.

그리고 이 때는 접선의 기울기가 왼쪽 위와 오른쪽 아래를 향하고 있으므로,

함숫값은 왼쪽보다 오른쪽이 더 낮을 것입니다.

그리고 우리의 목적은 함숫값 J(w)를 최소로 하는 w의 값을 찾는 것이므로,

w를 함숫값이 더 작은 오른쪽 부분으로 넘겨 주어야 합니다.

즉, w의 값을 더 늘려야 하는 것이죠.

즉, 어떤 함수에서 w값에 대한 미분계수가 음수라면, w의 값을 늘려주어야 합니다!

 

그리고! 위에서 정리한 두개의 사실들을 하나로 합치자면,

"w의 값을 미분계수의 부호의 반대쪽으로 옮겨야 한다"입니다!

즉, 미분계수가 양수라면 w 줄여야하고, 미분계수가 음수라면 w를 늘려야한다는 것이죠!

 

Gradient Descent의 Formal definition

그러니, Gradient Descent에서 나오는 공식인

W := W - α * ∂/W cost(W)에서 α를 뺀 부분만큼은 이해가 되셨을 것 같습니다. (∂/W cost(W)는 cost(W)를 W에 대해 미분한다는 뜻입니다.)

양수를 빼면 줄어들고, 음수를 빼면 늘어나기 때문에, 저 미분계수에다가 α를 곱한 값을 w에서 빼주면 된다는 것입니다!

그런데, 왜 α를 곱해줘야 할까요?

 

α를 곱하는 이유

미분계수에다가 α를 곱하지 않으면 w의 값을 한 번에 너무 멀리 보내버리게 되기 때문입니다.

그러면 위의 그림에서 왼쪽의 그래프마냥, J(w)값이 줄어들기는 커녕 늘어나는 방향으로 w가 바뀔 수도 있습니다.

그리고 마냥 미분계수만큼만 빼버리면 웬만하면 저런 식으로 w값이 날라가게 되므로,

α값을 곱해주어 너무 멀리 가는 것을 방지해 주는 것입니다.

(그러니까 일반적으로 α는 1보다는 작고 0보다는 큰 값이겠지요. 참고로, α는 learning rate라고 불립니다.)

 

이러한 이유에서, Gradient Descent를 반복하면, 즉!

W := W - α * ∂/W * cost(W)를 반복하면, 결국 w의 값이 J(w)가 최소가 되는 값으로 수렴하게 된다는 것을 알 수 있습니다!

 

 

이렇게 미분의 기본적 개념과 함께 Gradient Descent가 무엇인지 알아보았습니다.

혹시 이해가 덜 되었거나 더 알고싶은 점이 있다면 댓글로 물어보세요!!

Lecture 3 - cost를 최소화하는 법 (Gradient Descent)

안녕하세요.

이번 시간엔 머신 러닝의 꽃이라고 할 수 있는 Gradient Descent에 대해 알아봅시다.

 

가설과 비용

저번 시간에 배웠던 내용을 잠시만 복습하고 들어가 봅시다.

 

우선, Linear Regression의 가설 함수는 H(x) = Wx + b 였고,

Cost function은 각각의 H(x) 값에서 y값(정답)을 빼준 후,

그 값들을 죄다 제곱해서 평균을 내주는 것이었습니다.

기억이 나지 않는다면, 이전 포스팅 (https://cding.tistory.com/12)에서 다시 한번 복습하고 와주세요!

간단하게 만들자! b를 조져버리자!

그런데, 일단은 이해를 쉽게 하도록 하기 위해서 H(x)를 그냥 Wx라고 해봅시다.

(b를 빼준 것뿐, 일차함수라는 큰 틀은 변화하지 않았습니다.)

 

그러면, Cost function도 조금은 바뀌어서...

H(x)에서 y값을 빼주던 것을, Wx에서 y값을 빼주는 것으로 바꾸어도 상관없겠죠?

(H(x) = Wx 이므로)

cost(W)의 값은?

그럼 이 상태에서 cost(W)의 값을 구해보도록 합시다.

X, Y가 왼쪽 표와 같이 주어진다면, 각각 W=1, W=0, W=2 일 때의 Cost값은 무엇일까요?

 

W=1일 경우,

X=1, Y=1에서 (W*x - y)^2 = (1 * 1 - 1)^2 = 0

X=2, Y=2에서 (W*x - y)^2 = (1 * 2 - 2)^2 = 0

X=3, Y=3에서 (W*x - y)^2 = (1 * 3 - 3)^2 = 0

이 세 가지 경우의 수를 모두 더하면 0+0+0 = 0, 평균으로 나눠도 0

즉, Cost(1) = 0입니다.

cost가 0이므로, W=1일 때 완벽하게 데이터에 들어맞는다는 뜻이죠.

 

W=0일 경우에는?

X=1, Y=1에서 (W*x - y)^2 = (2 * 1 - 1)^2 = 1

X=2, Y=2에서 (W*x - y)^2 = (2 * 2 - 2)^2 = 4

X=3, Y=3에서 (W*x - y)^2 = (2 * 3 - 3)^2 = 9

이 세 가지 경우의 수를 모두 더하면 1 + 4 + 9 = 14, 평균으로 나누면 14/3 = 4.66666...

즉, Cost(0) = 4.67입니다.

 

W=2 일 경우에는 어떨지, 직접 한번 해 보시길 바랍니다.

참고로, 답은 W=0일 때와 동일하게 4.67이 됩니다.

밥그릇 모양처럼 생긴 cost(W) 함수...

이렇듯, W값에 따라 cost(W)의 값은 변하게 됩니다.

W=1일 때 cost의 값은 0으로 최소가 되고,

W=2, W=0일 때 cost의 값은 약 4.67이 되는 식이죠.

 

이때, 이런 식으로 cost(W)에서 W의 값에 값들을 많이 집어넣게 되면 위의 그래프처럼 함수가 그려집니다.

(x축을 W로, y축을 Cost(W) 값으로 집어넣은 그래프입니다.)

위에서는 W=-3부터 W=5까지만 집어넣었지만, 다른 값들을 넣어도 여전히 이차함수의 그래프가 그려지게 되겠죠.

 

그런데, 어떻게 cost(W)의 값이 최소가 되는 W의 값을 구할 수 있을까요?

드디어 등장! Gradient Descent!

그래서 등장한 방법이 바로 Gradient Descent 알고리즘입니다.

(Gradient경사, Descent하강이므로 한국어로는 경사 하강법이라고 불립니다.)

위와 같은 상황에서 최소의 W값을 찾아주기 위한 알고리즘인데요,

굉장히 다양한 최소화 문제(특정 값을 최소화해주어야 할 때) 자주 사용되는 기법입니다.

Gradient Descent가 그래서 어떻게 작동하는데 그려?

일단은, Gradient Descent의 작동 방식에 대해 간단하게 먼저 알아봅시다.

우선, W를 랜덤 한 값으로 정해줍니다. (무엇으로 정해도 큰 상관은 없습니다.)

 

그런 후, 그 W의 값을 cost(W)의 값을 최소화시킬 수 있는 방향으로 바꿔줍니다. (보통 W값을 업데이트해준다고 표현합니다.)

그리고, 이 짓거리를 cost(W)가 최소가 될 때까지 반복합니다.

(저 위의 예시의 경우, W=1이 될 때까지 반복될 것입니다.)

 

그럼 여기서 당연히 의문이 하나 드실 것입니다.

"그래서 cost(W)의 값을 최소화시킬 수 있는 방향을 어떻게 아는데??"

 

출처 : 구글 이미지 검색

자, 위의 사진에서 W의 값을 작은 공이라고 생각해 봅시다.

그러면, 공은 어느 방향으로 굴러가나요?

위의 경우, 경사가 왼쪽 아래로 져 있으므로 공은 왼쪽으로 굴러가게 될 것입니다.

그러면, 이 공은 어디까지 굴러갈까요?

cost(W) (위 이미지에선 J(w)라고 적혀있음)의 값이 가장 작아지는,

다시 말해서 가장 높이가 아래에 있는 곳까지 굴러갈 것입니다.

 

Gradient Descent는 이러한 원리와 동일하다고 봐도 됩니다.

W값이 처음 주어졌을 때, 우선 그 W값에 대한 경사를 먼저 구합니다.

그 후, 그 경사가 진 방향으로 W값을 바꿔줍니다.

경사가 왼쪽 방향으로 져 있다면, W값을 빼주고...

경사가 오른쪽 방향으로 져 있다면, W값을 더해주는 식으로 말이죠.

 

그렇게 한다면, 저 함수에서 가장 작은 cost(W)의 값을 가지는 W의 값을 구할 수 있게 됩니다.

Gradient Descent는 이렇게 단순한 생각을 갖고 만들어진 알고리즘입니다.

 

그런데, 그 각각의 W값에 대한 경사는 어떻게 구하냐고요?

그 경사를 구하기 위해서, 우리는 저 함수를 W값에 대하여 미분해 줄 것입니다.

(미분이 뭔지 잘 모르신다면, 간단하게 그냥 함수의 기울기를 구하는 방법 정도로 이해하시면 됩니다.)

일단 계산하기 쉽게 만들어주자!

지금부터의 내용은, 기본적으로 미분을 알고 있어야 이해가 가능합니다!

미분을 모르신다면, 그냥 저 아래로 쭉 내리시면 되겠습니다.

 

우선, f(x)^2를 미분하면 2 * f(x) * f'(x)가 됩니다.

그런데, 그 값에 그냥 m분의 1만 곱해버리면 상수 2가 남아버리니 계산하기 귀찮아지므로...

m분의 1 대신 2m분의 1을 곱하는 것으로 식을 바꾸겠습니다.

수학... 구와아악

f(x)^2를 미분하면, 2 * f(x) * f'(x)가 된다는 사실을 이용하면,

(Wx - y)^2를 미분하면

2 * (Wx - y) * x 가 됩니다.

 

그리고 시그마 앞에선 2가 앞으로 넘어갈 수 있으므로,

2를 앞으로 넘기면 시그마 앞의 값은 1/2m * 2 = 1/m이 됩니다.

 

결국, W값은 W값에서 (Wx - y) * x의 평균을 낸 값을 뺀 값으로 업데이트해 줍니다. (위의 식 참고)

참고로, 위의 알파 값은 Learning Rate라는 것으로, 이에 대한 자세한 내용은 다른  시간에 알아봅시다.

 

Q. 왜 W값에서 "(Wx - y) * x의 평균을 낸 값"을 더하지 않고 빼는 것인가요?

A. 경사가 왼쪽을 향하고 있을 때, 그때의 미분 값은 양수인 가요, 음수인가요?

예, 경사가 왼쪽으로 져 있다면, 그 미분 값 (경사의 기울기 값)은 양수가 됩니다.

그런데 경사가 왼쪽으로 져 있으면, W값을 왼쪽으로 옮겨야겠죠? (즉, W값을 감소시켜야겠죠?)

그러므로, W값에서 양수를 빼주어야 W값이 감소하기 때문에, 저 값을 더하지 않고 빼는 것입니다.

 

반대로 경사가 오른쪽으로 져 있을 때에는 미분 값(기울기 값)이 음수가 되는데,

W값을 증가시켜 주어야 하므로,

음수를 빼주어서 W값을 증가시키는 것입니다.

응~~ 미분 컴퓨터한테 시켜 그냥~~

그런데, 저 미분을 죄다 하고 있을 시간은 사람에게 없습니다.

그런 일 따위는 컴퓨터에게 시킬 수 있습니다.

즉, 미분 사실 몰라도 공식만 대충 집어넣으면 된다는 거죠,

(게다가 텐서 플로우를 비롯한 대부분의 머신러닝 툴에서는 Gradient Descent는 모두 지원합니다.)

윽;; 무슨 함수가 이래?

그런데 만약 함수가 이따구로 생겼다면 어떻게 될까요?

어느 점에서 시작하느냐에 따라 경사가 진 곳이 죄다 다르므로, 향하는 방향이 죄다 다르게 됩니다.

결국, W값이 우리가 원하는 "함수 전체에서의 최솟값"으로 가는 것이 아니라,

"일정 구간만에서의 최솟값"으로 가게 됩니다.

이를 각각, "Global Minima"와 "Local Minima"라고 부릅니다.

 

아무튼, 저렇게 생긴 함수에선 그냥 W값이 Local Minima에 처박힐 가능성이 매우 높기에, Gradient Descent의 성능이 매우 떨어집니다.

편-안한 트램펄린 모양의 함수, Convex function

그러므로, 우리는 Cost function 저렇게 이상하게 생긴 함수로 두면 안되고,

아름다운 밥그릇 모양 (중간이 패인 트램펄린 모양?)으로 생긴 함수를 사용하여야 합니다.

그러면, 결국 Local minima가 한 개뿐이므로 Local MinimaGlobal Minima와 같은 것이 됩니다.

이런 식으로, Local minimaGlobal minima가 동일한 아름다운 함수를 우리는 Convex function이라고 부릅니다.

 

그러므로, 우리는 Convex functionCost function으로 사용하여야 합니다.

다음 이 시간에는...

 

다음 시간에는, Multi-variable Linear Regression(다변수 선형 회귀)에 대해 배워보겠습니다.

(왜 로지스틱이라고 적혀있는지는 잘 모르겠습니다;; 분명 다음엔 Linear regression인데;)

그럼 안녕!

+ Recent posts