인공지능/모두를 위한 딥러닝 (sung kim) lec

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

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

 

 

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가 무엇인지 알아보았습니다.

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

 

Logistic (regression) classification

이번 포스팅에서는, Logistic (regression) classification에 대해 알아볼 것입니다.

(왜 중간에 (regression)이 있는지는 나중에 다룰게요!)

 

binary classification

우선 Logistic (regression) classification이 정확히 뭔지 알아보기 전에, 일단 Binary Classification이 뭐였는지 먼저 알아봅시다.

 

Binary Classification은 두개로 이루어진 값들을 분류하는 작업입니다.

가령 스팸메일 필터링을 한다고 했을 때는, 이 메일이 스팸인지 그냥 메일인지 확인해야 하겠죠?

이 때 이 메일을 스팸인지/그냥 메일인지 두 가지중 하나로 분류하는 작업을 바로 Binary Classification이라고 합니다.

 

0,1 encoding

그런데 이런 작업을 할 때, 어떤 메일이 스팸인지 / 그냥 메일인지 구분할 때 0과 1로 인코딩 작업을 거칩니다.

가령 스팸이면 1, 그냥 메일이면 0으로 두는 것이죠.

그런데 왜 이렇게 인코딩을 할까요?

 

왜 이러는지는 regression의 성질을 생각하면 조금 이해가 될 듯 합니다.

(우리가 배우는 모델은 classification 작업에 사용될 뿐이지, 엄연히 regression모델입니다!!!)

저번 시간까지 배웠던 linear regression의 결과값은 어떻게 나왔나요?

가령 성적을 예측하는 regression모델이라고 한다면, 예측한 점수를 결과값으로 내게 될 것입니다.

이렇듯, regression모델은 특정한 '값''예측'하는데 사용됩니다.

그렇기 때문에 이런 regression 모델로 분류를 진행하려면, 이런 class들을 (스팸인지 아닌지) '값'으로 설정해야 합니다.

스팸 메일은 1, 그냥 메일은 0.. 이렇게 말이죠.

그리고 그렇게 예측한 값이 1에 가깝다면 스팸메일이다! 라고 예측을 하고,

예측한 값이 0에 가깝다면 진짜 메일이다! 라고 예측을 하는 겁니다.

그냥 Linear regression을 쓰면 안되는 이유

그런데, 그럼 그냥 Linear regression 모델을 그냥 사용하면 안되는 걸까요?  안되니깐 다른 모델을 배우는거겠죠?

 

자, 위의 예시를 봅시다.

위의 그래프는 x축에 공부한 시간, y축에 pass / fail (1 / 0)이 그려진 그래프로,

공부한 시간 비례 시험에서 통과할지 실패할지 예측하는 모델을 그린 것입니다.

 

그럼 이것을 Linear regression모델로 짤 수도 있지 않을까요?

fail 과 pass를 나누는 직선 하나를 그린 뒤에,

그 직선의 y값이 0.5 이하이면 fail, 아니면 pass라고 하면 잘 작동할것 처럼 보이기도 합니다.

 

그런데, 저 오른쪽 끝부분 (아래에 50적혀있는) 의 동그라미를 봅시다. 

만약 어떤 학생이 정말 시험에서 너무 pass하고 싶어서 50시간이나 공부를 해서 pass를 받았다고 가정해 봅시다.

그러면 어떤 문제점이 발생하느냐 하면,

linear regression의 Hypothesis H(x) = WX + B 함수가 저 오른쪽의 동그라미도 감안하고 측정이 되므로,

저 동그라미가 없을때보다 직선이 조금 더 오른쪽 아래로 기울어지는 현상이 발생합니다.

그런데 이렇게 되면 원래는 pass였던 것들의 y값이 0.5 아래로 내려가버리면서 fail로 처리되는 문제가 발생하게 됩니다.

(위의 그래프에 그려진 파란 직선 두개 참고)

 

이렇듯, Binary classification (사실 classification 전체 다)를 수행하는 데 Linear Regression 모델은 적합하지 못합니다.

 

Linear Regression이 안되는 이유 - 2

Linear regression을 사용하기 애매한 이유가 또 있습니다.

Linear regression의 경우 Hypothesis 함수를 H(x) = Wx + b 로 정의합니다. 그쵸?

그런데 어차피 y값들 (class, 스팸인지 아닌지)는 0이거나 1이 된다는 것을 우리는 이미 알고 있습니다.

(0, 1 인코딩을 이미 했고, 그렇게 분류하는것이 binary classification의 목적이니까요.)

 

그런데 Linear regression의 H(x)는 1보다 엄청 큰 수를 결과값으로 뱉을 수도 있고, 0보다 엄청 작은 수를 결과값으로 뱉을 수 있습니다.

가령 H(x) = 100x 라는 hypothesis가 있다고 해봅시다.

우리의 목적은 데이터들을 0과 1 둘중 하나의 값으로 분류하는 것이 목적이므로,

1에 가까운 값은 1로 분류하고, 0에 가까운 값은 0으로 분류하게 될 것입니다.

그런데 H(x) = 100x가 되버리면 (대략적으로) x가 0.01 이상일때는 모두 1로, x가 0 이하일때는 모두 0으로 분류되게 됩니다.

이러면 어떤 문제점이 발생해 버리냐하면, x값에 너무 민감하게 반응하는 모델이 만들어지게 됩니다.

즉, 연산상으로는 매우 작은 값(0.01)만 바뀌어도 아예 분류 자체가 바뀌어버리게 되는 것입니다.

이는 아까 위에서 설명했던 문제와 겹치며 linear regression 모델을 classification을 하는 용도로 사용하기 힘들게 만듭니다.

 

Sigmoid 함수

이를 해결하기 위하여 나온 것이 바로 logistic function (sigmoid function 이라고도 한다) 입니다.

원래 linear하던 H(x) = wx + b를 0과 1 사이의 함수로 바꿔주는 함수입니다.

수식으로 나타낸다면, g(z) = 1 / (1+ e^-z) 가 됩니다.

 

이렇게 hypothesis에 sigmoid 함수를 씌워주면, 무슨 함수였던지간에 결과값이 모두 0과 1 사이로 나오는 함수를 만들어 줄 수 있습니다.

(왜 이런 값이 나오는지 수학적으로 설명하는 것은 나중에 부록 편에서 다루겠습니다.)

Logistic Hypothesis

그리고 이것을 Logistic regression의 Hypothesis로 나타낸다면 위와 같은 수식으로 나타내어 집니다.

(W T X 는 그냥 간단하게 W * X로 생각해 주시면 됩니다.

multi-variable의 경우에서도 사용할 수 있도록 만든 hypothesis인지라 저런 식이 들어갑니다.)

 

그리고 이렇게 H(x)의 값이 0과 1사이로 나오면, 사용하기에 매우 편리해 지게 됩니다.

위의 Hypothesis 함수로 regression을 한 결과값이 0.5이상인 경우엔 1로 분류하고, 0.5보다 작으면 0으로 분류하면 되는 것이죠.

(사실 아까 전에 0,1 encoding을 한 이유도 이것 때문입니다.)

 

*참고 : Logistic "Regression" 인 이유!

많은 분들이 왜 이 모델이 Regression 모델인지 헷갈려 하곤 합니다.

그러니까, Logistic regression은 사실 classification을 하는데 사용하는데, 왜 regression이라고 불리는가를 헷갈려 하는 것이죠.

 

하지만 Logistic regression모델은 결과값이 0과 1 사이로 한정되는 특성상 classification을 하는 데 사용되는 모델이긴 하지만, 결과값으로 특정한 "값"을 도출해내는 모델입니다.

가령, 성적을 예측하는 Linear regression은 점수 그 자체를 결과값으로 도출합니다. (10점, 30점, 60점 등등...)

그와 비슷하게 스팸 메일인지 아닌지를 분류하는 Logistic regression 모델은 0과 1 사이의 값 자체를 결과로 냅니다. (0, 0.2, 0.8 등등...)

그러니까, Logistic Regression은 입력값 x에 대해 0과 1로만 이루어진 y값에 최대한 가깝게 그려질 수 있는 함수를 만들어내는 모델인 것입니다.

그리고 결과값이 0.5보다 큰 (즉, 1에 가까운) 값들은 죄다 1로 분류해 버리는 것이고,

결과값이 0.5보다 작은 (즉, 0에 가까운) 값들은 죄다 0으로 분류해 버리는 것입니다.

 

그러니깐 그냥 이제부터 Logistic (regression) classification이 아니라

logistic regression모델이라고 부르겠습니다.

cost function for logistic

그런데, 이렇게 Hypothesis를 바꿔버리면 원래 쓰던 cost function은 사용하지 못합니다.

왜냐 하면, 원래 쓰던 Cost function을 여기다가도 적용해버리면 non-convex한 function이 나오게 되기 때문입니다.

(cost function이 convex function이어야 하는 이유는 2강 (https://cding.tistory.com/21) 에서 다뤘습니다!)

+ 왜 그렇게 되는지는 나중에 부록편에서 따로 더 설명하겠습니다.

 

그래서 logistic regression의 cost function은 따로 만들어 줘야 합니다.

logistic regression의 cost function은 다음과 같이 정의합니다 : 

y=1일때 c(H(x), y) = -log(H(x))

y=0일때 c(H(x), y) = -log(1 - H(x))

(단, 여기서 log는 상용로그가 아니라 자연상수 e를 밑으로 갖는 자연로그입니다.)

 

그런데 왜 cost function을 이렇게 정의했느냐를 제대로 설명하려면 엄청난 수학의 압박이 느껴지게 됩니다...

그러니 일단 지금은 직관적으로 왜 cost function을 이렇게 정의하는지만 알아봅시다.

 

 

 cost function 왜 이따구임??에 대한 직관적 설명

그냥 지금 간단하게 생각해 봅시다.

(위의 그래프들은 x축에 h(x)값, y축에 cost 값을 나타내는 그래프입니다!!)

일단 y=1인 경우, 즉 h(x) = 1인 경우엔 왜 cost function은 -log(H(x))가 될까요?

(왼쪽 그래프 참고)

h(x)값이 0에서 1으로 이동하면 cost 값은 ∞에서 0으로 점점 줄어들게 되는 것을 확인할 수 있습니다.

즉, h(x)가 정답인 1로 가면 갈수록 cost는 줄어들고, 오답인 0으로 가면 갈수록 cost가 늘어납니다.

이러면 우리가 원하는 합리적인 cost function이 완성된 것이겠죠?

 

반대로, y=0인 경우, 즉 h(x) = 0인 경우에 cost function이 -log(1-H(x)) 인 이유도 동일합니다.

h(x)값이 1에서 0으로 이동하면 cost 값은 ∞에서 0으로 점점 줄어들게 되는 것을 확인할 수 있습니다.

즉, 이번에는 h(x)가 정답인 0로 가면 갈수록 cost는 줄어들고, 오답인 1으로 가면 갈수록 cost가 늘어납니다.

 

그냥 이정도로만 이해해 주시고, 왜 cost function을 이렇게 설정했는지는 나중에 부록 편에서 다루겠습니다.

 

logistic - Cost function 최종판

그리고 위처럼 y=1일때와 y=0일때로 나누어도 좋겠지만,

직접 컴퓨터로 연산을 할 때는 간단한 수식으로 나타내는 것이 훨씬 좋겠죠?

그래서 나온 공식의 위의 파란 박스가 쳐진 수식입니다.

 

어려울것 하나 없습니다!

y=0일 때는 -y * log(H(x)) 부분이 0이 되면서 자연스럽게 -log(1 - H(x)) 라는 cost function이 나오게 되고,

y=1일 때는 (1-y) * log(1 - H(x)) 부분이 0이 되면서 자연스럽게 -log(H(x)) 라는 cost function이 나오게 됩니다.

 

그리고 컴퓨터로 연산을 할 때는 if문을 사용해서 y==1인 경우와 y==0인 경우로 나누지 않고,

그냥 위의 수식을 사용하게 될 것입니다.

 

Gradient Descent

(위의 ppt의 Gradient decent는 오타입니다...ㅎㅎ;)

 

Gradient descent는 그냥 다른 모델과 동일하게 cost(W)를 W에 대해 미분하는 것으로 적용하면 됩니다.

그리고 이를 tensorflow를 사용해서 코드로 적용할 때는 그냥 GradientDescentOptimizer(a) 로 적용하면 됩니다.

(실제 cost값을 미분하면 어떤 값이 나오는지는 그냥 설명하지 않겠습니다. 매우 불필요합니다. 부록에서도 설명 안할듯)

 

 

이렇게 Logistic regression에 대해서 알아봤습니다.

사실 이렇게만 설명해도 Logistic regression이 어떤 개념인지는 모두 이해하셨으리라 믿지만,

나중에 부록편에서 조금 더 수학적으로 접근해서 왜 cost function이 저렇게 나오는지 설명하겠습니다.

 

그럼 다음엔 softmax regression (multinomial classification)으로 찾아뵙겠습니다!

다변수 선형 회귀

이번 포스팅에서는, Multivariable Linear Regression, 즉 다변수 선형 회귀에 대해서 알아보겠습니다.

복습시간 (Moment of Truth!)

일단 저번 시간까지 했던 내용들을 복습해 보겠습니다.

일반적인 Linear Regression의 Hypothesis는 H(x) = Wx + b였죠?

Cost function은 H(x) - y를 제곱해서 모두 더한 뒤 평균값을 내주는 것이었고...

Gradient Descent는 가장 적절한 (cost(W) 값이 가장 작은) W값을 찾아내는 알고리즘이었습니다.

간단한 Linear Regression 데이터

그리고 우리가 마주했던 데이터들은 다들 이런 형식으로 생겼습니다.

x값 하나당 y값 하나가 주어지는 형식이었죠.

이때, x는 하나의 feature을 의미합니다.

가령, 위의 경우엔 특정 점수 y를 그 점수를 갖게 되었던 특징인 feature x를 통해 알아봤던 것이죠.

그래서 위의 사진에서 one-variable one-feature라고 적혀있는 것입니다.

변수 하나에 특징도 하나밖에 (공부한 시간) 없으니까요.

데이터가 세배!!

그런데, 오늘 배울 Multi-variable Linear Regression은 데이터가 조금 다르게 들어옵니다.

x값이 하나가 아니라, 두 개, 세 개, 혹은 10000개도 들어오는데요,

각각의 x값 (x1, x2, x3)들은 각자의 특성을 띄고 있습니다.

위의 예시의 경우 x1 은 quiz1의 점수,

x2는 quiz2의 점수,

x3는 중간고사 1의 점수이고

이 점수들을 모두 어떠한 방식으로 계산했을 때 최종 점수인 Y가 나오게 되는 것입니다.

그냥 이러면 끝.

그런데, 그렇게까지 어려워지진 않았습니다!

Linear Regression의 기본형인 H(x) = Wx + b 를 그대로 따라서,

H(x1, x2, x3) = w1x1 + w2x2 + w3x3 + b

로 약간만 변형되었을 뿐입니다.

 

잠깐만 살펴보면, x의 종류 (feature의 개수)가 늘어나면, 그에 따라 w의 개수도 늘어나게 됩니다!

x1에는 w1, x2에는 w2, x3에는 w3를 곱해주는 식으로 말이죠.

그리고, b의 값은 여전히 그대로 남아있습니다.

feature가 많아졌다고 해서 b의 개수도 많아지진 않은 것이죠.

(그도 당연한 것이, 각자의 x값에 b를 더하더라도 어차피 상수 하나 더한 거랑 같으니까요.)

cost function도 요정도로만 바뀜 ㅎ

그럼, Cost function은 어떻게 바뀌었을까요?

H(x1, x2, x3) = w1x1 + w2x2 + w3x3 + b

를 그대로 우리가 사용하던 Cost function 안에 집어넣으면 됩니다.

즉, H(x1, x2, x3) - y 를 제곱한 것을 모두 더해서 평균을 내는 것이죠.

조금만 더 풀자면, H(x1, x2, x3) = w1x1 + w2x2 + w3x3 + b 이므로,

w1x1 + w2x2 + w3x3 + b - 를 제곱해서 모두 더해주는 것이죠.

다변수... 다 변수?

그리고 x1, x2, x3와 같이 feature의 개수가 세 개가 아니고 무수히 많더라도, 위의 식처럼

H(x1, x2, x3,... , xn) = w1x1 + w2x2 + w3x3 +... + wnxn + b

로 표현이 가능합니다.

즉, 우리가 원래 알고 있던 Linear Regression의 식을 아주 쬐끔만 변형시켜 주면,

Multi-variable Linear Regression도 뚝딱 해낼 수 있습니다.

 

그런데, 중요한 것은 그게 아니고,

"그래서 이거 계산 어떻게 할건데?"입니다.

 

그러니깐, 기본적인 Linear Regression에서는 x값이 10개 정도 주어지고, w값이 하나니깐

x1 * w + x2 * w + x3 * w +... + x10 * w + b

정도로 계산이 가능했고, 그냥 {x1, x2, x3,... , x10} * w + b만 해도 되었습니다.

 

하지만, feature이 많아져서, 상황이 조금 달라졌습니다.

x1의 첫 번째 데이터를 x11, x3의 네 번째 데이터를 x34... 이런 식으로 쓰고, feature가 n개이고 데이터의 개수가 m 개라면 우리가 계산해야 할 식은

   x11 * w1 + x21 * w2 +... + xn1 * wn + b

+ x12 * w1 + x22 * w2 +... + xn2 * wn + b

...

+ x1m * w1 + x2m * w2 +... + xnm * wn + b

 

처럼... 딱 봐도 복잡한 이차원 배열 * 일차원 배열을 계산해야 합니다.

하지만, 이것을 반복문으로 그냥 쭉 돌려버릴 수도 없는 것이...

가령 n과 m이 각각 10 만씩이라고만 해도,

반복문으로 돌리면 100억 번의 연산을 해야 한다는 말도 안 되는 결과가 나오기 때문입니다.

그러면 이것을 어떻게 간단하게 연산할 수 있을까요?

Matrix multiplication - 행렬곱

바로, "Matrix multiplication", 즉 "행렬곱"으로 이 문제를 해결합니다.

행렬곱은 어떤 식으로 진행되는지 위의 그림을 통해 알아봅시다.

(헷갈릴까 봐 써놓는데 - 가로가 행이고 세로가 열입니다!!!)

왼쪽의 [[1,2,3], [4,5,6]]의 (2,3)의 행렬과 [[7,8], [9,10], [11,12]]의 (3,2) 행렬을 곱하는 것은 간단합니다.

 

왼쪽의 행렬의 첫 번째 행인 [1,2,3]의 각각의 요소들을 오른쪽의 행렬의 첫 번째 열인 [7,9,11]로 곱해서 더해줍니다.

즉, 1*7 + 2*9 + 3*11 = 7 + 18 + 33 = 58

이 되는 겁니다.

그리고, 이 값을 결괏값의 행렬의 첫 번째 행, 첫 번째 열에 놓습니다.

 

두 번째도 동일하게 진행하면 됩니다.

왼쪽의 행렬의 첫 번째 행인 [1,2,3]의 각각의 요소들을 오른쪽의 행렬의 두 번째 열인 [8,10,12]로 곱해서 더해줍니다.

그러면, 1*8 + 2*10 + 3*12 = 8 + 20 + 36 = 64가 됩니다.

그리고, 이 값을 결괏값의 행렬의 첫 번째 행, 두 번째 열에 놓습니다.

 

두 번째 열은 직접 한번 해보시기 바랍니다.

행렬곱을 그래서 어떻게 쓸건데??

자, 대충 배웠으니 한번 대충 적용해 봅시다.

w1x1 + w2x2 + w3x3을 행렬로 계산하려면 어떻게 해야 할까요?

 

x1, x2, x3를 (1,3)의 크기의 행렬로 놓고,

w1, w2, w3을 (3,1)의 크기의 행렬로 놓는다면,

행렬곱을 통해 x1 w1 + x2w2 + x3w3를 구할 수 있게 됩니다.

 

아니 근데 저걸로 어떻게 저걸 계산하냐고??

그런데, 우리가 가지고 있는 데이터는 x1, x2, x3값이 각각 하나만 들어있는 데이터가 아니죠?

x1 여러 개, x2 여러 개, x3 여러 개로 이루어진 데이터를 갖고 있는데, 이것을 어떻게 계산할까요?

아까 했던거 또나오는거다!

아까 저 위에서 했던 짓을 똑같이 반복하면 됩니다.

우선, x값들의 행렬 중 첫 번째 행인 x11, x12, x13과 w1, w2, w3를 곱하여,

x11w1 + x12w2 + x13w3을 결괏값 행렬의 첫 번째 요소로 넣어줍니다.

그다음엔 x21w1 + w22w2 + w23w3 을 넣게 될 것이고,

그것을 마지막 데이터인 x51, x52, x53까지 반복하면 되는 것입니다.

 

그러면, 왼쪽의 x값의 데이터와 오른쪽의 w값의 데이터를 통해 결괏값을 행렬로 도출해 낼 수 있는 것이죠.

중요한 거니까 꼭 기억하도록! H(X) = XW!!

그런데 행렬곱에는 특징이 하나 있습니다.

입력되는 데이터의 형태에 따라 결괏값의 형태가 달라진다는 것이죠.

가령 바로 위의 예시를 보면, (5,3) 크기의 데이터와 (3,1) 크기의 데이터를 행렬곱하면, (5,1) 크기의 결괏값이 나오게 됩니다.

 

어떻게 보면 당연한 것이긴 합니다.

왼쪽의 (5,3) 행렬의 각각의 행을 오른쪽 (3,1)의 행렬에 곱해서 모두 더한 값은, 결괏값인 (5,1)의 행들에 집어넣고 있으니까요.

 

그런데, 여기서 중요한 점 하나가 더 있습니다!!

만약, (5,3) 크기의 행렬에 (2,1) 크기의 행렬을 행렬곱시키면 어떻게 될까요?

... 행렬곱 시킬 수 없습니다.. ㅎㅎ

이것도 어떻게 보면 당연한 것이겠지만,

x1, x2, x3를 w1, w2에만 곱할 수는 없는 노릇 아니겠습니까 ㅎㅎ

 

 

즉, 행렬곱을 계산해 줄 때에는 데이터의 크기를 잘 생각해야 합니다!

(n, m) 크기의 행렬을 x값으로 사용할 것이라면,

(m, 1) 크기의 행렬을 w값으로 사용해 주어야 한다는 것입니다.

그러면 결괏값은 (n, 1) 크기의 행렬로 나오게 되겠지요.

중요한 점이 두개지요!!!

그런데, 중요한 게 또 또 있습니다!

행렬곱은 일반적인 곱셈과는 다르게 곱셈의 순서가 중요하다는 것입니다!

 

위의 식처럼, (5, 3) 크기의 행렬과 (3, 1)를 곱하면 (5, 1)이라는 행렬이 나오지만,

반대로 (3, 1) 크기의 행렬과 (5, 3) 크기의 행렬은 곱할 수 없다는 것입니다.

즉, 순서가 매우 매우 매우 중요합니다!!

 

앞 행렬의 행 크기와, 뒷 행렬의 열 크기가 동일해야 한다는 것입니다!

아까 전과 마찬가지로, (m, n)의 행렬에 곱할 수 있는 행렬은 (n , k) 꼴의 행렬뿐입니다.

(결괏값은 (m, k) 크기의 행렬로 나오겠죠.)

지금까지 설명한거 짤

 

아까 설명한거 짤 (2)
그래서 진짜 중요한게 무엇인가!

즉, 지금까지 하고 싶은 말이 무엇인고 하니...

우리가 Python이나 Tensorflow로 위의 Linear Regression을 구현하려면

지금까지 배웠던 H(x) = Wx + b 로 계산하는 것이 아니고,

H(X) = XW로 구현해야 한다는 것입니다!

 

이것을 특별히 더 강조한 이유는 간단합니다.

이거 처음 배울 때 저는 이 행렬 순서를 맞춰야 된다는 사실을 모른 채라 삽질을 오지게 했기 때문이죠 ㅎ

여러분들은 행렬의 크기를 맞추지 않아서 삽질하는 일은 없도록 합시다!

다음 이 시간엔..?

다음 포스팅에서는 Logistic Regression에 대해서 알아보겠습니다.

 

그럼 안녕!!

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인데;)

그럼 안녕!

본 글은 스스로 정리 겸, 머신러닝을 처음 배우는 사람들도 쉽게 머신러닝을 배울 수 있도록 쓴 글입니다.

수학적 지식이 부족하더라도, 머신러닝이 어떻게 돌아가는지 최대한 쉽게 이해할 수 있도록 적는 것을 목표로 하고 있습니다.

sung kim 님의 '모두를 위한 딥러닝'의 자료를 사용하여 설명합니다.

Lecture 2

안녕하세요. 이번 포스팅에서는 Linear regression 기술에 대해서 알아 볼 것입니다.

 

시험 성적 예측하기!

위의 표에 나온 것이 바로, Supervised learning에서 사용되는 Training data (Training set) 라는 것입니다.

어떤 값 x와, 그 특정한 x값에 대한 정답인 y값들이 나열되어 있는 것이죠.

위의 시험 성적 예측의 예시같은 경우, x값을 공부한 시간으로 주어주고, y값을 그 공부 시간에 따른 시험 성적으로 주어진 것입니다.

 

그렇다면, 우리는 위의 데이터를 보고 이런 생각을 할 수 있습니다. "공부 시간이 많을수록 점수가 높아지는구나!" 

 

그런데, 만약 우리가 8시간을 공부한다면, 몇 점을 맞을 수 있을까요? 아마 9시간을 공부해서 나온 성적인 80점보다는 조금 낮은 점수가 나올테고, 3시간을 공부했을 때 나온 성적인 50점보단 높은 성적일 겁니다.

 

이렇게, 이미 갖고 있는 데이터(공부 시간당 성적)를 기반으로 특정 x값(공부할 시간)에 대한 정답인 y값(나올 성적)을 예측하는 데 사용되는 기술을 "regression" (회귀) 이라고 합니다. 그리고, 갖고 있는 데이터들은 labeling 된, 즉 이미 입력값과 그에 따른 정답이 존재하는 데이터이므로, 이것은 Supervised learning의 한 종류라고 할 수 있겠지요.

간단한 데이터 ㅎㅎ

그렇다면, 이제부터 linear regression이 무엇인지 정확히 알아가봅시다.

설명을 간단히 하기 위해서, 데이터를 굉장히 단순한 형태로 놓겠습니다.

그리고 이것을 그래프에 그리면, 위의 오른쪽 그래프와 같은 형태가 될 것입니다.

X=1일때 Y=1, X=2일때 Y=2, X=3일때 Y=3 인 표와 그래프이죠.

선형 가설??

그리고, 우리들이 알고 싶은 것은 X값이 4일때의 Y값, X값이 1.5일떄의 Y값과 같은 특정 X값에 따른 Y값입니다.

이것을 알기 위해서, 우리는 대략적인 "가설" 을 세울 필요가 있습니다. "대충 선 하나를 그으면 이 데이터를 잘 표현하는 선이 될거야!" 와 같이 말이죠.

 

Linear Hypothesis라 함은, 이렇게 어떤 선을 그었을 때 (일차함수를 그렸을 때) 그 선은 데이터를 잘 표현할 것이다! 하는 가설입니다.

일반적으로, 이렇게 Linear한 선으로 표현할 때 어느 정도 데이터를 잘 표현하는 경우가 많습니다. 가령, 내가 운동한 시간이 늘어나면 살도 그만큼 빠질 것이고, 공부를 한 만큼 성적도 그만큼 오르는 것도 Linear하게 표현할 수 있을 것입니다.(정확히 데이터에 들어맞는다는 것이 아니라, 어느 정도 잘 나타낼 수 있을 것이라는 겁니다.) 그렇기 때문에, 이 Linear hypothesis를 사용하는 것입니다.

그리고, 어떻게 그은 선이 가장 데이터에 적합한지를 알아가는 과정을 Linear regression의 학습과정이라고 합니다.

선 세개인 그래프는 뭐라고 할까? 삼선그래프! 엌ㅋㅋㅋ

그렇다면 이제 선을 한번 그어봅시다! 일반적으로, 그래프 위의 선은 일차함수로 나타낼 수 있겠죠?

가령, 위의 파란 선은 y=x라는 일차함수 그래프로 표현할 수 있습니다.

 

이처럼, Linear한 선을 나타낼 때 사용하는 함수를 H(x)라 합니다.

그리고 H(x)는 일차함수이기에, H(x) = Wx + b 라고 둘 수 있을 것입니다. (y=ax+b와 같은 의미입니다!)

가령, 파란 선은 H(x) = 1x + 0 이라고 할 수 있고, 이떄 W값은 1, b값은 0이라고 할 수 있겠습니다.

 

파란 선이 노란 선과 빨간 선보다 더 좋은 가설입니다.

그렇다면, 위의 세 개의 선 중 어떤 것이 가장 데이터를 잘 표현하고 있나요? 당연히 파란 색의 선이 이 데이터를 잘 표현하는 선이겠죠? 아무래도 세 개의 선 중 데이터에 가장 가까운 것이 파란색 선이니까요.

 

이렇게 가장 좋은 선을 알아내는 것을 조금 더 정확히 말하자면,

"H(x) = Wx + b에서, W값과 b값에 어떤 값을 대입해야 우리의 데이터에 가장 가까운 가설 H(x)가 만들어질까?"

라고 할 수 있습니다.

 

가령, 위의 노란색 선의 H(x)는 대략 H(x) = x/2 + 2 이므로, W=1/2, b=2 이고

파란색 선의 H(x)는 대략 H(x) = x 이므로, W=1, b=0입니다.

그리고 노란색 선의 H(x)인 W=1/2, b=2보다 파란색 선의 W=1, b=0이 더욱 우리의 데이터에 가까운 W값과 b값이 되는 것이죠.

바로 이러한 W값과 b값을 찾아내는 과정을 Linear regression의 학습이라고 합니다.

 

그런데, 여기엔 문제가 있습니다. 가장 적절한 W값과 b값을 찾아내기 위해서는, W값과 b값이 얼마나 좋은 값인지를 알아내야 합니다.

위에서는 직접 그림을 그려서 더 데이터에 가까워 보이는 선을 택했지만, 일일히 그렇게 직선을 그려볼 수도 없는 노릇입니다.

또, 가령 위의 노란색 선과 빨간색 선 중 어떤 선이 얼마나 더 적절한지 물어본다면, 어떻게 대답해야 할까요?

뭔가 저거 비틀린 시소처럼 생기지 않았음??

여기서 우리는 이런 아이디어를 생각해 낼 수 있습니다. "직선이 각각의 데이터를 나타내는 점들과의 거리가 작으면 작을수록, 데이터에 더 적합한 직선일거야!" 라구요.

결국, 직선을 최대한 데이터에 가깝게 놓는 것(적합하게 하는 것)이 가장 적절한 직선을 찾는 것이 우리의 목적이니까요.

 

Cost function, 직역하면 비용 함수

그리고, "직선과 데이터가 떨어져 있는 거리"와 같이, 얼마나 우리의 직선이 데이터를 잘 맞추는지를 나타내는 것을 바로 Cost function(비용 함수) 라고 합니다. 그리고, Cost function을 통해 도출된 값은 error 또는 cost (오차값)라고 합니다.

 

직선과 데이터의 거리가 작으면 작을수록 좋으므로, cost는 낮으면 낮을수록 더 좋은 것이겠지요. (직선이 더 데이터에 잘 맞는다는 뜻 ㅎ)

 

그럼 Cost function은 어떻게 만들면 될까요?

 

우리의 가설 함수(직선) H(x) 에서 정답 데이터의 값 y를 빼면 되지 않을까요?

즉, Cost function : H(x) - y 라고 하면 되지 않을까요??

 

하지만...(그치만...) 그렇게 Cost function을 설정해버리면, 한 가지 문제가 생깁니다. 바로, 거리가 음수가 될 수도 있다는 것이죠. 위의 예시의 경우, Cost function을 H(x) - y 라고 설정해 버리면, x=1일때는 음수, x=3일때는 양수가 나와버려서 정확히 우리가 원하는, 직선과 데이터의 적합성 을 찾을 수 없게 됩니다.

 

그래서 고안한 식이 바로 위의 식입니다.

저 식이 의미하는 것이 무엇인고 하니, 모든 각각의 x값과 y값에 대한

$$(H(x) - y)^2$$ 을 모두 더한 후,

데이터의 개수인 m만큼 나눠줍니다. (각각의 데이터에 대한 오차의 평균값을 구하기 위함입니다.)

 

부연 설명을 첨가하자면...

 

(H(x) - y)를 제곱한 것에는 두 가지 이유가 있습니다.

 

첫째는, H(x) - y의 값이 음수가 아니게 하기 위해서 입니다.

위에서도 언급했듯이, 직선과 데이터의 거리가 음수이면 안되니까요.

 

둘째는, 너무 멀리 있는 데이터에 대해 추가적인 패널티를 주기 위해서 입니다.

Linear regression의 최종적인 목표는, 결국 데이터를 가장 잘 나타내는 직선을 찾는 것입니다.

그런데, 만약 엄청 멀리 있는 데이터에 대한 오차값과 가까이 있는 데이터에 대한 오차값의 차이가 크지 않다면,

직선이 일부 데이터에만 정확히 맞춰지고, 어떤 데이터들에 대해서는 전혀 맞춰지지 않는 경우가 발생합니다.

즉, 10만큼 멀리있으면 10만큼의 오차값을 추가하는 것이 아니라, 100만큼의 오차값을 줌으로써 최대한 직선을 많은 데이터에 맞출 수 있게 돕는 역할을 해 주는 것입니다.

 

 

 

최종 식

결국, 최종적인 식은 다음과 같은 형태가 됩니다.

이 때, 특정 H(x)에 대한 Cost function을 위와 같이, Cost(W,b) 라고 씁니다.

 

자, 그럼 이제 우리의 다음 목표는, cost값을 최소화 시키는 방법을 찾는 것입니다.

결국, cost값이 낮아야 직선과 데이터의 거리가 최소화 되는 것이고,

결국 데이터와 가장 잘 맞는 직선이 나타날테니까요.

 

다음 포스팅에서는, cost값을 최소화시키는 방법에 대해서 알아보도록 하겠습니다.

 

 

 

 

 

확인문제 1. Cost function을 H(x) - y 로 설정하지 않는 이유는?

 

확인문제 2. Cost function에서, H(x) - y 의 값을 제곱하는 이유는?

 

확인문제 3. 위에서 설명한 Cost function을 사용하고,

데이터 (x,y) = { (1, 5), (2, 4), (3,2) }, 가설함수 H(x) = 2x - 1 라고 할 때 Cost값은?

 

 

답이 아리송한게 있다면, 댓글 남겨주세요!

본 글은 스스로 정리 겸, 머신러닝을 처음 배우는 사람들도 쉽게 머신러닝을 배울 수 있도록 쓴 글입니다.

수학적 지식이 부족하더라도, 머신러닝이 어떻게 돌아가는지 최대한 쉽게 이해할 수 있도록 적는 것을 목표로 하고 있습니다.

sung kim 님의 '모두를 위한 딥러닝'의 자료를 사용하여 설명합니다.

 

+ lec 0은 따로 작성하지 않겠습니다.

lec 1 - 머신러닝 기초

 

이번 Lecture 1에서는, 머신러닝이 무엇인지 간단하게 알아보고, supervised & unsupervised, regression, classification이 무엇인지 간략하게 알아보도록 하겠습니다.

머신러닝은 'explicit programming', 즉 '명시적 프로그래밍'의 한계에서 착안한 기술입니다.

 

가령, 우리가 스팸메일을 필터링하는 프로그램을 작성해야 한다고 해봅시다. 어떤 점들을 고려해야 할까요?

일단 메일 내용이 이상한 기호로 도배되어 있는지 확인하고, 특정 상표명으로 도배되어있는지 확인하는 등 굉장히 많은 점들을 고려해야 할 것입니다. 그런데 그렇게 고려한다 한들, 스팸메일이 완벽하게 막히긴 할까요?

 

스팸메일 예시..?

 

 

정말 어떻게 프로그래밍을 짠다 해도, 정말 오묘하게 글을 바꿔버린다던지, 정상적인 메일을 쓰는 척하면서 광고를 한다던지 등의 사례에 다 뚫려버리고 말겠죠? 위 사진처럼 스팸메일이 사진으로 온다면?? 더 필터링하기 힘들어질 것입니다.

 

머신 러닝은 이러한 explicit programming을 보완하기 위하여 만들어진 기술로, 인간이 직접 프로그래밍을 하지 않아도 컴퓨터가 알아서 학습하게 하여 explicit하게 programming을 하지 않아도 되게 만들어 줍니다. 가령, 우리가 명시적으로 어떤 어떤 글들을 막아라!라고 하지 않아도 알아서 글을 분석해서 막아준다는 것이죠.

그럼 이제부터 머신러닝의 종류 (학습 방법의 종류)에 대해서 알아보겠습니다.

첫 번째는 Supervised learning(지도 학습) 입니다. 

Supervised learning은 인간이 직접 컴퓨터에 답이 정해진 데이터들을 입력하여 컴퓨터를 학습시키는 방법입니다.

 

Supervised learning 예시

Supervised learning의 예시 중 하나는, 이미지들을 고양이, 개, 머그컵, 모자 등과 같은 것들로 분류하는 것입니다.

우리가 컴퓨터에게 고양이 사진들을 "이 사진은 고양이란다!" 라고 알려주며 데이터를 입력하면, 컴퓨터가 그 데이터를 바탕으로, 다른 이미지들을 입력받아도 "아! 이건 고양이구나!" 하고 분류할 수 있게 하는 것이죠.

Unsupervised learning

 

다음은 Unsupervised learning(비지도 학습)입니다.

이것도 Supervised learning과 마찬가지로 컴퓨터에게 데이터를 입력한다는 것은 동일하지만, 이번에는 답을 주지 않은 채로 컴퓨터에게 데이터를 입력합니다. 즉, 아까처럼 '이 사진은 고양이란다!' 하며 데이터를 던져주지는 않는다는 것이죠. 그리고, 그 상태로 컴퓨터가 알아서 데이터를 분류하도록 학습합니다.

 

가장 좋은 예시중 하나는 구글 뉴스입니다. 

 

구글 뉴스, 인공지능이 알아서 뉴스들을 분류해준다.

구글 뉴스는 위와 같이 여러가지 주제들을 바탕으로 뉴스를 제공합니다. 그중 사용자가 보고 싶어 하는 주제에 대해 "전체 콘텐츠 보기"를 선택하면, 그 주제에 대한 기사가 주르륵 나옵니다.

 

이런 인공지능은 어떻게 만들까요? 아까 전의 Supervised learning을 사용하기엔, 수많은 기사들이 엄청나게 쏟아져 나오고, 매일매일 새로운 주제로 기사들이 나오는데 이것들을 죄다 labeling 하기엔, 그러니까 "이게 어떤 주제다!" 하고 컴퓨터에게 알려주기엔 너무 힘들겠죠?

이럴 때 Unsupervised learning을 사용하면 됩니다. 컴퓨터에게 뉴스 기사 분류법을 학습시키고, 우리가 던져주는 뉴스들 중 같은 주제인 것들만을 분류해 주는 것이죠.

 

구글 뉴스 분류 예시. (글쓴이의 정치적 견해가 반영된 것이 아님을 알립니다.)

 

하지만, 우리들은 앞으로 Unsupervised learning에 대해서는 딱히 언급하지 않을 것입니다.

Unsupervised learning이 애초에 Supervised learning보다 학습하기 까다롭고, 조금 더 어려운 감이 있기 때문이죠. 게다가, 많은 문제들은 Supervised learning을 활용하여 해결될 수 있습니다.

Supervised learning - 흔한 머신 러닝의 문제 유형

Supervised learning을 사용하는 대표적인 예시들을 들어보겠습니다.

이미지 라벨링 : 이미지들을 각각의 태그로 분류하는 작업. 위의 개/고양이/머그컵/모자 예시에 해당한다.

이메일 스팸 필터링 : 스팸메일을 분류하는 작업. 위의 "히어로즈 오브 더 스톰" 예시에 해당한다.

시험 성적 예측 : 시험 성적 예측(...). 가령, 저번 시험의 성적들과 공부한 시간을 바탕으로 다음 시험에서 몇 점을 받을지 예측하는 것.

 

이러한 것들을 보면, 대부분 explicit하게 프로그래밍한 경우엔 해결하기 힘든 작업들이지만, 머신 러닝을 사용하면 explicit programming을 사용하는 것보다 훨씬 수월하게 위의 문제들을 해결할 수 있을 것입니다.

 

supervised learning의 유형

 

그리고, 이번에는 supervised learning의 종류에 대해서 알아봅시다.

이번에는 시험 성적을 예측하는 프로그램을 만든다고 가정해보죠.

 

"저번에 봤던 시험 성적들과 공부 시간을 종합했을 때, 내 다음 시험성적은 몇점일까?" 와 같은, 일련의 데이터를 통해서 어떠한 값 (내 공부시간)을 입력했을 때 특정한 값 (예측된 내 시험 성적)이 나오는 문제는, regression(회귀) 문제라고 합니다.

 

"내가 이만큼 공부했을 때 다음 시험을 pass할수 있을까?"와 같이, 어떠한 값 (내 공부시간)을 입력했을 때 PASS/FAIL과 같이 두 가지로 분류되는 문제의 경우, binary classification(이진 분류) 문제라고 합니다.

 

"내가 이만큼 공부했을 때 등급을 A,B,C,D,E,F 중 뭘 맞을까?"와 같이, 어떠한 값 (내 공부시간)을 입력했을 때 여러 가지 정답(A, B, C,...)중 하나를 예측하는 문제는, multi-label classification (멀티 라벨 분류) 문제라고 합니다.

 

크게 보자면, 내 데이터를 입력했을 때 특정한 값 (주로 숫자)가 나왔으면 좋겠다! 하는 것들은 regression을 사용하여 해결하면 되고, 특정한 태그들 (A,B,C, ... 또는 PASS/FAIL 등)가 나왔으면 좋겠다! 하는 것들은 classification (binary/multi-label)을 사용하여 해결하면 된다는 것입니다.

예시 1 - regression 문제
예시 2 - binary classification 문제
예시 3 - multi-label classification 문제

 

이렇게 우리는 머신러닝이 무엇인지, Supervised learning / Unsupervised learning이 무엇인지, 그리고 Supervised learning의 유형들 (regression, classification)에 대해서 알아봤습니다.

 

 

 

그럼 여기서 확인문제!

 

확인 문제 1. 머신러닝은 어떤 문제들을 해결하는데 주로 사용될까?

 

확인 문제 2. 어떤 사진들을 특정 태그로 분류하고 싶다고 할 때, Supervised learning 과 Unsupervised learning 중 어떤 방법을 사용해야 할까?

 

확인문제 3. 어떤 집의 위치, 크기 등을 바탕으로 그 집의 가격을 예측하는 프로그램을 작성하고자 할 때, regression과 classification 중 어떤 것을 사용해야 할까?

 

 

만약 이 문제 중 하나라도 풀리지 않는다면, 다시 한번 공부해서 확실히 내용을 익힐 수 있도록 하면 좋겠습니다.

 

 

다음 포스팅에서는 Linear regression이라는, regression 유형 중 가장 쉬운 모델 중 하나를 살펴보도록 하겠습니다.

+ Recent posts