04. Linear Regression의 cost 최소화 알고리즘의 원리 설명 (lec 03)

드디어 정말 중요한 gradient descent 알고리듬에 대한 설명이 나온다. 정말 중요하니까, 여러 번에 걸쳐 보는 것은 필수!


왼쪽 그림은 지금까지 봐왔던 hypothesis와 cost 함수에 대한 공식이고, 오른쪽 그림은 기존 공식을 단순화하기 위해 y 절편에 해당하는 b를 없앤 공식이다. b를 없애고, cost 함수에 H(x) 대신 Wx를 직접 입력했다.

공식을 가볍게 만들기 위해 b를 없애는 것이 이상해 보일 수도 있지만, 뒤쪽 동영상에서는 실제로 b를 없앤다. W의 갯수가 많아지고, 행렬로 처리해야 하는 시점이 되면 b를 행렬에 넣어서 공식을 간단하게 만든다. 어차피 공식에서 사라질 값을, 우리의 이해를 돕기 위해 미리 없애주신 자상한 배려가 눈에 띈다.


b를 없앤 단순 버전의 공식에 대해 실제 데이터인 x, y를 직접 대입해서 cost를 계산해 본다. 오른쪽 그림은 왼쪽에서 계산한 공식이 반복된 경우를 가정한 그래프이다. 그래프의 수평은 W, 수직은 Cost라고 되어 있다. 중요하다. W의 값에 따라 Cost가 변하는 정도를 그래프로 보여주고 있다는 것을 명심하자. 밥그릇 모양이라고 교수님께서 말씀하셨다. 영어로는 Convex(볼록)하다고 말한다. 그림이 작긴 하지만, W가 0일 때, 1일 때, 2일 때만 보면 왼쪽 그림의 결과와 같음을 알 수 있다.

x와 y의 현재 데이터에서는 W가 1일 때 가장 작은 비용이 든다. W가 1이라는 것은 H(x) = X라는 뜻이고, x에 대한 y 좌표가 정확하게 일치하기 때문에 cost는 0이 된다. 다시 말해, 이것보다 작은 비용이 발생할 수는 없으므로, 현재 구한 기울기(W)가 가장 적합하다는 뜻이 된다.

x가 세 개이기 때문에 세 번 계산해야 하고, 매번 y 값을 빼서 제곱을 한 합계에 대해 평균을 내야 한다. 개인적으로는 수식을 풀어쓴 것이 더 쉽다고 느끼지만, 요소가 100개쯤 되면 (시그마)를 사용한 수식이 필요할 수밖에 없다.

W가 2일 때의 결과는 베일에 쌓여 있다. 풀어보자. W가 2라는 뜻은 H(x) = 2X 이므로 x의 모든 값에 2를 곱한 후에 계산하면 된다.

(1/3) *((2*1-1)^2 +(2*2-2)^2 +(2*3-3)^2) = (1^2 + 2^2 + 3^2)/3 = (1+4+9)/3 = 4.67

실제 그래프를 lab 03에서 출력해서 보여주고 있으니, 정말 저렇게 나오는지 궁금하겠지만, 일단 나머지를 읽고 다음 번 글을 읽어보기 바란다.


Gradient Descent 알고리듬은 왼쪽 그림에 있는 설명처럼 다음과 같은 역할을 수행한다.

1. 최저 비용을 계산하는 함수
2. 다양한 최저 계산에 사용
3. Cost 함수에 대해 최소가 되는 기울기(W)와 y 절편(b) 탐색
4. 피처(feature, 변수)가 여러 개인 버전에도 적용 가능

위의 설명을 다시 정리해 보면, 다음과 같다. 

  • 어떤 위치(왼쪽 또는 오른쪽 경사)에서 시작하더라도 최소 비용 계산
  • 기울기(W)와 y 절편( b)을 계속적으로 변경하면서 최소 비용 계산
  • 반복할 때마다 다음 번 gradients(기울기의 정도) 계산
  • 최소 비용에 수렴(converge)할 때까지 반복


공식이 변해가는 과정을 추적해 보자. 먼저 왼쪽 그림에서 데이터의 갯수가 m일 때, m과 2m 중에서 2m을 사용하겠다는 뜻이다. 리스트에 [3, 6, 9]가 들어있다고 했을 때 이걸 데이터 갯수인 m으로 나누면 [1, 2, 3]이 된다. 그런데, 2m으로 나누게 되면 [3, 6, 9]/6이 되니까 최종 결과는 [0.5, 1, 1.5]가 된다.

제곱의 평균을 구하기 위해 사용하는 m은 W와 b를 사용해서 계산이 끝난 이후에 적용하기 때문에, m으로 나누건 2m으로 나누건 W와 b에는 영향을 주지 않는다는 것을 먼저 이해해야 한다.

비용 계산의 목적은 최소 비용이 되었을 때의 W와 b가 필요하기 때문이다. 최소 비용이 얼마인지는 전혀 중요하지 않다. 여러 개의 비용이 있을 때, 이 중에서 가장 작은 비용을 찾고, 그 때의 W와 b를 사용하면 된다. 여러 개의 비용에 대해 모두 2를 곱하거나 2로 나누면, 비용은 늘어나거나 줄어들지만 상대적인 크기는 달라지지 않는다.

그렇다면, 왜 2m을 사용할까? 오른쪽 그림에 답이 있다. 제곱을 미분하게 되면 2가 앞으로 오는데, 이때 분자에 있는 2와 분모에 있는 2를 곱해서 1로 만들면 공식이 단순해지기 때문에 일부러 넣는 것이다.

가운데 그림에 이는 두 개의 공식. 위의 공식은 최소 비용을 계산하는 cost 함수, 아래는 기울기(W)의 다음 번 위치를 판단하기 위한 변량(gradients)을 계산하기 위한 공식.

  W = W - 변화량

변화량을 구하는 가장 쉽고 일반적인 수학공식은 미분(deravative)이다. 나 또한 미분을 잘 모른다. 스터디 회원의 도움을 받아 작성 중임을 고백한다. 여기서 중요한 것은 기울기(W)를 얼마나, 어떤 방향으로 변화시킬 것인지이다.  현재 위치에서 변화량을 계산해서 현재의 W에서 빼면 다음 번 W의 위치가 나오게 된다. 앞에서 나왔던 빨간 점이 찍힌 밥그릇 그래프를 보면 밥그릇의 왼쪽 경사에 있을 때는 변화량이 음수가 되어서 W의 값이 증가하게 되고 밥그릇의 오른쪽 경사에 있을 때는 변화량이 양수가 되어서 W의 값이 감소하게 된다. 결국 어느 위치에 있건 중앙에 있는 cost가 가장 적게 발생하는 최소 비용에 수렴하게 된다.

밥그릇의 오른쪽에 있을 때 기울기가 양수가 된다고 얘기했다. 미분(기울기)은 수평(x축)으로 이동할 때 수직(y축)으로 이동한 만큼의 크기를 말한다. 밥그릇 오른쪽에서는 x축도 증가하고 y축도 증가하기 때문에 크기의 차이는 있을 수 있지만, 결과는 양수가 된다. 밥그릇 왼쪽에서는 x축이 오른쪽으로 이동(증가)할 때 y축이 아래로 이동(감소)하기 때문에 결과는 음수가 된다.

그렇다면 '변화량'은 어떻게 구할 것인가? 현재 위치에서 발생한 cost에 대해 미분을 하면 된다. 그래프에서 수평은 W, 수직은 Cost라고 강조했는데, 정말 중요하다. 밥그릇에서의 미분은 W가 변하는 크기에 따른 Cost의 변화량을 측정하는 것이다. 그래서, Cost에 대해서 W로 미분을 하게 된다. 학교에서 배운 그래프에서는 x가 변할 때의 y 변화량을 계산하기 때문에 항상 x에 대해 미분을 했었다.


              


미분을 설명하려니까.. 너무 힘이 드는데.. 앞에서 공식 일부를 가져왔다. 왼쪽은 우리가 구하고자 하는 변화량이고, 가운데는 cost(W)를 가리키는 공식이다. 공식의 앞에 붙어 있는 α(알파)는 중요하지 않다. 우리가 구한 변화량을 어느 정도로 반영할 것인지에 대한 상수일 뿐이다. 왼쪽과 가운데 공식을 더하면, 오른쪽에 있는 복잡한 공식이 만들어진다. 너무 어렵다고만 생각해서인지 두 개를 더해서 오른쪽을 만들었다는 것을 꽤 오랫동안 몰랐다.

이때 분자와 분모에 있는 δ 기호는 미분에서 나타나는 도함수라고 하는 개념에 잘 설명되어 있다. 난 너무 부족해서 이 부분에 대한 설명은 넘어간다. 왼쪽 그림은 이미 W로 미분을 한 상태이고, 이제 cost(W)에 대해서 미분을 적용할 차례다.


설명이 너무 길어져서 앞의 그림을 다시 가져왔다. 첫 번째 공식에서 제곱은 두 번째 공식의 ∑(시그마) 오른쪽에 2로 변환된다. 여기에 (Wx - y)에 대해서 미분을 적용해야 하고 결과는 Wx는 x가 되고 y는 W가 없으니까 상수 처리되어서 0이 된다. 결국 (Wx - y)에 대해 W로 미분을 하면 x가 나오게 되고, 두 번째 공식의 오른쪽 끝에 추가되었다.

공통되는 것들을 정리하면 세 번째 공식이 만들어진다. 세 번째 공식의 앞에 있는 α(알파)는 우리가 임의로 추가하는 상수로 미분에는 참가하지 않는다. α(알파)가 너무 크면 오버슈팅(overshooting)이 될 수 있고, 너무 작으면 최소 비용에 수렴할 때까지 너무 오래 걸리게 된다. 이 값은 여러 번에 걸쳐 테스트하면서 결정해야 하는 중요한 값이지만, 역시 미분에는 참가하지 않는다. 뒤쪽 동영상에서 이 값을 어떻게 활용하는지 배우게 된다.


두 장의 그림은 모두 3차원으로 그려져 있고, 가로와 세로는 W와 b, 높이는 cost를 가리킨다. W와 b의 값에 따른 cost를 표현하고 있다. cost를 계산했을 때의 결과를 보여주기 때문에, 쉽게 말해 cost 함수라고 얘기할 수 있다. 오른쪽 그림의 윗부분에 cost 함수의 계산식이 나와 있다.

우리가 만든 모델의 cost 함수가 왼쪽 그래프와 같은 형태로 표현된다면, 어디서 시작하는지에 따라 지역 최저점(local minimum)에 도착할 수 있고, 우리가 원하는 최저점(global minimum)에 도착하지 못할 수 있다. 지역 최저점들이 여러 개 있을 수 있으니까, 이들을 합쳐서 local minima라고 부른다(minima는 minimum의 복수). cost 함수는 왼쪽처럼 울퉁불퉁한 형태로 동작하지 않게 만들어야 한다. 반드시 오른쪽처럼 오목한 형태가 되도록 만들어야 하는데, 이를 convex 함수라고 부른다. gradient descent 알고리듬은 convex(오목, 밥그릇) 형태에 대해서만 적용할 수 있기 때문에 매우 중요하다.

최근에 공부한 내용을 통해 모멘텀(momentum) 등의 알고리듬을 사용하면 어느 정도의 로컬 최저점을 넘어설 수 있다는 것을 알았다. 최저점을 향해 내려갈 때 관성이나 가속도같은 운동량(momentum, 기세)을 줘서 반대편으로 살짝 올라갈 수 있게 처리하는 알고리듬이 모멘텀이다.