본문 바로가기
인공지능

머신러닝/딥러닝 입문 - 손실을 최소화하는 방법(cost minimize)

by 너의세가지소원 2023. 9. 5.
반응형

아아... 아직 초반인데 점점 더 난이도가 올라간다. 수학식이 나오기 시작하면 머리가 꼬이는 건 어려서부터 내 고질병이었다. 받아쓰기하며 3번 이상을 반복하며 들었지만 아직은 많이 낯선 느낌이다. 더 친근해질 때까지 좀 더 달려보자.

 

[강의 영상]

 

[받아쓰기 내용]

이번 비디오에서는 지난 비디오에서 이야기했던 이 cost function을 어떻게 최소화해서 최종적으로 Linear Regression 학습을 완성하는지 말씀드리도록 하겠습니다. 역시 많은 데이터 그리고 그림 수식들은 인터넷에 있는 자료들을 사용하였습니다. 지난 비디오에서 다룬 것처럼 우리의 hypothesis가 대략 우리의 모델이 이런 형태로 \(H(x) = Wx + b\)로 주어지고 여기에 기반하여 이 cost function 즉, 우리가 가지고 있는 모델이 실제 데이터와 얼마나 다른가 얼마나 같은가를 나타내 주는 cost function을 이렇게 정의했습니다.

 

\(cost(W, b) = \frac{\mathrm{1} }{\mathrm{m}}\sum_{i=1}^{m}H(x^{(i)} - y^{(i)})^2\)


간단하게 우리의 가설의 값과 실제 값의 차이를 제곱한 다음에 그것을 총 더하고 이것을 평균으로 나누어주는 형태입니다. 이것이 cost function이고 여기에서 과제가 이 cost를 minimize하는, 최소화시키는 \(W\)와 \(b\)의 값을 우리가 가지고 있는 데이터를 통해서 구해보자는 것이 Linear Regression의 목표가 되겠습니다.

설명을 위해서, 조금 우리가 쉽게 설명하기 위해서 hypothesis를 간단하게 만들었습니다. 여기서 \(b\) 텀(term)을 없애버렸고요. 여기 \(b\)가 있었죠. 이 텀을 없애버리고, 그냥 우리의 hypothesis는 \(Wx\)다, 웨이트(weight)로만, \(b\)는 0이다. 이렇게 봐주시면 되겠습니다. 이런 경우에 우리의 cost는 역시 간단하게 \(W\)의 function이면서 여기에 \(Wx\)가 우리의 가설인 거죠. \((-y^{(i)})^2\) 나머지는 이전과 같습니다. 이렇게 좀 간략하게 hypothesis를 만들고 또 cost도 이에 따라 간략하게 되었습니다.

자 이제 우리가 이 cost를 minimize하고 싶은데요. 최소화하는 값 W를 찾고 싶은데... 그러기 위해서 이 cost라는 함수를 한번 들여다보자는 것입니다. 이 cost라는 함수는 어떻게 생겼을까? 우리 가지고 있던 데이터가 이런 데이터가 있었죠. 여기 \(x\)가 있고 \(y\)가 있고, 이런 경우에, 우리가 예를 들어, 이 \(W\)가 1일 때 cost는 얼마일까요? 이 식에다가 넣으면 되겠죠? 예를 들어 \(x\)가 1이니까 \(Wx\), 이 \(W\)가 1이라고 주어졌죠? 그렇기 때문에 이 식은 대략

 

\((1 * 1 -1)^2 + (1 * 2 - 2)^2 + (1 * 3 -3)^2\)이 될 것입니다.

 

이렇게 하면 여러분들 보시겠지만 이 값이 0이 될 것이고 또 이 값이 0이 되고 이 값이 또 0이 되죠. 다 0이 되니까 모두 합쳐서 \(m\)으로 나누지 않아도 이 값은 0이 됩니다. 이렇게 0이 되는거죠. \(x\)와 \(W\)가 0일 때, 이 값은 0이 되는구나... 그러면 이 값이 \(W\)가 0일 때는 얼마일까요? 0일 때, 같은 방법으로 계산을 해보죠. 이 \(W\)죠. 이것이 바로 \(W\)고 이게 첫번째에 있는 \(x\) 값, \(x\)의 첫번째 값이라고 할 수 있겠죠. 이게 \(y\)의 첫번째 값, \(y\)의 첫번째 값입니다. 이걸 계산하면 이렇게 해서 1이 되겠고... 1의 제곱은 1이고... 이렇게 하면 똑같죠? 두번째 데이터셋을 여기다 넣은거 해서 이건 2의 제곱 그리고 이렇게 하면 세번째 값 이건 \(W\)는 0이고 이런 식으로 넣게 되면 이 값은 3의 제곱이 9... 그래서 총 14가 되는데, 나누기 3을 해서 대략 4.67 이렇게 나오게 됩니다. \(W\)가 2일 때는 얼마인가요? 여러분들이 잠깐 비디오를 멈추시고 한번 계산해보셔도 좋겠습니다. 대략 \(W\)가 2일 때도 비슷한 값이 나올 겁니다. 4.67.

그러면 이렇게 각각의 \(W\) 값을 이렇게 구한 다음에 이런 형태의 그래프를 한번 생각해볼 수가 있겠죠. 그래프가 있는데 이 y의 축을 우리가 cost function이라고 하고, 이 \(x\)의 축을 \(W\)라고 했을 때, 아까 우리 1일 때가 값이 0이였죠? 0이었고...  0일 때 4.67, 이 정도 되는 값이고 2일 때도 4.67, 이런 식으로 여러분들이 또 데이터 값을 구해가지고 이렇게 한번 함수를 그려보는 겁니다. 이 값이 어떻게 될까? 변할까? \(y\) 값이 변함으로써 이 값이 어떻게 될까? 한번 그려보는 것이죠.

 

제가 이제 컴퓨터를 가지고 그려봤더니 우리가 가지고 있는 데이터 셋과 우리가 가지고 있는 이제 간단하게 된 cost function을 그리면 대략 이런 function이 나오게 됩니다. 이런 형태를 여러분들이 밥그릇을 엎어놓은 것 같은 이제 이런 function이 나왔죠. 자 여기서 우리의 목표가 무엇이었죠? 목표가 이것을 최소화 되는 값을 찾는 거예요. 최소화라는 것이 이 cost가 최소화되는 cost가 0인 점을 찾는 것이죠. 이 점을 기계적으로 찾아내는 것이 바로 목적이었죠. 우리가 가지고 있는 데이터를 가지고 이런 형태의 코스트 펑션을 만들어낼 수만 있으면 이 값은 어떻게 찾아낼 수 있을까요? 이 값을 기계적으로 우리가 눈으로 보면 알겠죠? 알겠는데 기계적으로 찾아내야 되는 겁니다.

그래서 여기 많이 사용되는 알고리즘이 바로 Gradient Descent Algorithm이라는 건데 이름이 좀 멋있죠? Gradient Descent Algorithm. 근데 따져보면 Gradient가 뭐냐면 경사예요. Descent가 뭔가요? Descent가 내려가는 거죠. 그래서 무슨 이야기냐면 경사를 따라 내려가는 알고리즘이다. 이런 이야기입니다. 이건 주어진 cost function을 minimize하는데 많이 사용되고요. 이것은 굉장히 많은 머신러닝의 minimization problem, 또 머신러닝 이외에도 minimization problem에 사용됩니다. 우리 같은 경우에는 cost function이 \(W\)와 \(b\)의 function이었는데 이럴 때 이 알고리즘을 적용시키면 가장 이것을 minimize하는 \(W\)와 \(b\)가 나와주는 것이죠. 물론 이것은 \(W\), \(b\) 뿐만 아니라 여러 개의 값들, 여러 개의 값들이 있을 때...

 

\(W_{1}, W_{2}, W_{3}...\)

 

많은 값들이 있는 cost function도 minimize할 수 있는 굉장히 좋은 알고리즘입니다.

 

여러분들이 만약에 한라산을 갔어요. 한라산을 이렇게 가서, 한라산이 이렇게 생겼죠. 여기가 한라산 정상입니다. 올라갔는데, 가다 보니까 여러분들 길을 잃어가지고 길을 잃어서 또 해가 막 질려고 하고 있단 말입니다. 그러면 빨리 내려와야 되겠죠 땅으로. 내려와야 되는데 여러분 같으면 이 산에서 어떻게 내려올까요 밑으로? 내가 너무 단순한 질문을 드렸죠? 굉장히 멍청한 질문을 드렸죠? 어떻게 합니까? 여러분들이 어떤 서 있는 지점에서 \(360^{\circ}\) 이렇게 쭉 돌아볼 겁니다. 이렇게 쭉 돌아보면서 가장 산밑으로 내려가는 경사가 있는 그곳을 향해 한 발짝 내딛겠죠. 그런 다음에 또 보고 계속 경사가 있는 쪽으로 내려갑니다. 이렇게 쭉쭉. 그러면 어느 시점인가 바닥에 도착하겠죠. 이게 바로 이런 멋있지만 아주 간단한 알고리즘입니다. 이게 바로 Gradient Descent Algorithm이라고 불리는 것이죠.

예를 들어 여러분들이 어떤 \(W\)를 처음에 5에서 시작했어요. 5에서 시작하면 이런 함수에서 경사도를 구할 수가 있겠죠. 경사도를 보고 경사도를 따라서 한 발짝을 옮깁니다. 또 그 시점에 있었으면 경사도를 따라서 한 발짝 움직이고요. 이 시점에 있었어요. 그러면 경사도가 이렇게 되겠죠. 그럼 이 경사도를 따라서 한 발짝 움직입니다. 자 이쯤에 왔어요 이쯤에. 이쯤에 오면 경사도가 어떻게 됩니까? 경사도가 0이죠. 그래서 여기서 한 발짝을 움직여도 사실은 경사도가 없기 때문에 거의 여기 머무르는 겁니다. 이쪽에서 시작해도 마찬가지가 되겠죠. 이쪽에서 여러분들이 시작한다고 해도 이 경사도를 따라서 이번엔 이쪽으로 움직여야 되겠죠. 그래서 최종적으로는 여기에 도착한다는 것이 Gradient Descent Algorithm입니다. 아무 지점에나 시작할 수 있어요. 어떤 점에서, 예를 들어 \(W\)가 0일 때 시작할 수도 있고 아무 값에 시작한 다음에 그런 다음에 \(W\)를 조금 바꾸는 겁니다. 일반적으로 \(bias\)도 있다고 봤을 때 \(W\)를 조금 바꾼 다음에, 그러면 이것이 바로 이 cost를 줄이게 되는 것이죠. 그런 다음에 그때 또 경사도를 계산해서 계속 계속 그 과정을 반복하는 것이죠. 그러면 이건 굉장히 재미있는 것은 어떤 점에서 여러분들이 시작하던 간에 항상 뭐 예외가 있습니다만은 항상 최저점에 도달할 수 있다는 것이 알고리즘의 가장 장점입니다. 그럼 이 경사도라는 이야기를 했는데 경사도는 여러분들 어떻게 구할까요? 혹시 여러분들 미분이라는 이야기 들어보셨죠? 미분이 어떤 주어진 그래프에서 이 경사도를 구하는 것이 바로 미분이었죠. 그래서 우리가 미분을 조금 이용하도록 하겠습니다.

 

\(cost(W) = \frac{\mathrm{1} }{\mathrm{m}}\sum_{i=1}^{m}(Wx^{(i)} - y^{(i)})^2\)

\(cost(W) = \frac{\mathrm{1} }{\mathrm{2m}}\sum_{i=1}^{m}(Wx^{(i)} - y^{(i)})^2\)

 

자 코스트를 좀 이제 그 알고리즘을 formal하게 한번 가볼텐데 이것을 좀 미분을 적용할 때 조금 쉽게 하기 위해서 숫자 2를 여기다가 적습니다. 사실 이 \(\frac{1}{m}\)을 한 것을 minimize하는 것이나 \(\frac{1}{2m}\)을 minimize하는 것이나 사실 똑같은 의미를 지닙니다. 그래서 \(2m\) 수식을 좀 간단하게 하기 위해서요. 그런 다음에 공식적인 알고리즘은 바로 \(W\)를 현재 있는 \(W\) 값에다가 이 알파라는 어떤 값, 이것을 이제 Learning Rate이라고 부르는데요. 일단 이 값은, 상수라고 반영합니다. 0.1 정도 되는... 이 값에다가 이 코스트 함수를 미분한 것.

 

[Formal Definition]

\(cost(W) = \frac{\mathrm{1} }{\mathrm{2m}}\sum_{i=1}^{m}(Wx^{(i)} - y^{(i)})^2\)

\(W := W - \alpha \frac{\partial }{\partial W}cost(W)\)

 

미분한다는 것이 아까도 말씀드렸듯이 복잡하게 생각하실 필요가 없습니다. 어떤 하나의 점에서 그 점의 기울기를 구한다는 것이죠. 그 기울기를 구해서 이런 경우에는 기울기가 플러스가 되겠죠? 플러스가 되니까 이런 경우 내가 이쪽에 서 있다면 이 마이너스를 여기 하기 때문에 \(W\)를, 이게 \(W\)니까, \(W\)를 마이너스, \(W\)가 작은 쪽으로 움직이겠다 이런 뜻이죠. 만약에 내가 이쪽 방면에 서 있다면, 여기 기울기를 구하면 이렇게 되니까 이 기울기 자체가 마이너스가 되겠죠? 그래서 마이너스 마이너스 플러스가 되니까 \(W\)를 조금 더 큰 값으로 움직이겠다라는 것의 표현입니다.

 

[Formal Definition]

\(cost(W) = \frac{\mathrm{1} }{\mathrm{2m}}\sum_{i=1}^{m}(Wx^{(i)} - y^{(i)})^2\)

\(W := W - \alpha \frac{\mathrm{1} }{\mathrm{2m}}\sum_{i=1}^{m}2(Wx^{(i)} - y^{(i)})x^{(i)}\)

\(W := W - \alpha \frac{\mathrm{1} }{\mathrm{m}}\sum_{i=1}^{m}(Wx^{(i)} - y^{(i)})x^{(i)}\)

 

그러면 이게 이제 미분을 하는 절차인데요. 미분을 이렇게 하면, 이게 제곱에다가 \(Wx\)가 있는데 이걸 \(W\)로 미분을 하게 되면 이게 2하고 \(Wx^{(i)} - y^{(i)}\)에 \(x^{(i)}\)가 됩니다. 이건 이제 미분의 공식을 그대로 적용한 것이죠. 그래서 여기에 2가 있으니까 앞에 2랑 2, 이렇게 생략을 시키면 간단하게 이런 형태의 수용적인 우리가 원하는 Descent Algorithm이 완성된 것이죠. 그래서 이것을 여러 번 실행시키면, 실행시키면서 이 \(W\) 값이 변하지 않습니까? 이 여러 번 실행시켜서 \(W\)가 변화되면 그 값이 바로 우리 처음에 cost를 minimize하는 그 값이 구해지는 것입니다, 자동으로.

 

미분 같은 거 여러분들이 걱정하거나 고민하실 필요가 없습니다. 그냥 이런 웹사이트에 들어가서 보면, 심지어는 미분을 계산해 주는 웹사이트가 있습니다. 이렇게 가서 누르면 바로 해주기 때문에 걱정하실 필요가 없다는 걸 말씀드리고요. 그래서 이제 이 Gradient Descent Algorithm이라는 것은 바로 이 하나의 수식으로 나오고, 이 수식을 기계적으로 적용만 시키면 바로 이 cost function을 최소화하는 \(W\)를 구해내고 그것이 바로 이 Linear Regression의 핵심인 학습과정을 통해서 우리가 모델을 만든다고 할 수 있겠습니다. 끝으로 우리가 설명했던 알고리즘을 한번 조금 생각해 볼 필요가 있어요.

이것은 이제 여기 슬라이드에서 나온 건데요. 예를 들어서 이쪽을 우리가 \(W\), 이쪽을 \(b\)라고 하는 함수로 줬을 때 그 cost function, 이것이 바로 cost function인 거죠. cost function을 이렇게 3차원으로 한번 그려볼 수가 있습니다. 만약에 우리가 원하는 cost function을 이렇게 그렸는데 이런 형태의 그래프가 보여진다면... 문제가 뭐냐면 내가 예를 들어 처음 시작이 이쪽이면 조금씩 조금씩 경사를 타고 내려왔더니 여기에 도착한 거예요. \(W\) 값이 0.4, \(b\) 값이 0.8 정도의 값에 도착했어요.

그런데 내가 처음에 시작점을 조금 다른 데로 잡았어요. 여기를 잡았더니 이제 경사를 타고 내려왔더니 어디로 내려오냐면 다른 쪽으로 내려오는 거예요. 자, 이렇게 되면 우리의 알고리즘이 잘 동작을 하지 않죠. 다행히도 우리의 cost function, 그리고 우리의 hypothesis를 가지고 이 cost function을 가지고 그림을 그리게 되면 이런 형태의 밥그릇을 엎어놓은 것 같은 형태의 그래프가 나오는데 이런 것을 우리가 Convex Function이라고 봅니다. 그래서 Gradient Descent... 이런 경우에는 어느 점에서 시작하든 간에 항상 도착하는 점이 우리가 원하는 지점이죠. 이런 경우에는 우리 Gradient Descent Algorithm이 항상 답을 찾는다는 것을 보장을 해주게 됩니다. 중요한 것은 여러분들이 cost function을 설계하실 때 반드시 이 cost function의 모양이 Convex Function이 되는지를 확인하셔야 되는 것입니다. 이것만 확인이 된다면 우리가 Linear Regression에 썼던 이 cost function은 이런 형태의 모양을 가지고 있어서 좋은 것이죠. 그래서 Linear Regression을 적용하기 전에 반드시 cost function이 이런 모양을 하고 있는지만 확인이 되면 전혀 문제없이 편안한 마음으로 Gradient Descent Algorithm을 사용하실 수 있습니다.

반응형

댓글