본문 바로가기

카테고리 없음

머신러닝 알고리즘 - Linear Regression (선형 회귀), Hypothesis, Cost Function, Gradient Descent

출처 : http://it.plusblog.co.kr/221238399644


머신러닝 알고리즘을 공부하면서 가장 쉽게 이해할 수 있는 알고리즘이 Linear Regression(선형회귀)라고하는 알고리즘이다. Linear Regression은 데이터의 분포를 가장 잘 설명할 수 있는 함수를 찾아내는 머신러닝 알고리즘이다. 그림으로 예를 들어보면,

x = [1, 2, 3, 4, 5, 6, 7] y = [0.9, 2.1, 3.0, 4.0, 5.2, 5.8, 7.0]

이런 데이터가 있다고 하자. 이 데이터를 표현할 수 있는 하나의 직선을 그어보면 다음과 같다.

y = x 라는 하나의 직선 함수를 생각해보면 좌표 평면에 위치하는 데이터들을 관통하는 모습을 볼 수 있다. Linear Regression 알고리즘의 목표는 학습 데이터들을 관통하는 하나의 직선을 찾아내는 것이다.

일단 y = x 라는 함수가 찾아지면 이 함수를 이용하여 예측(prediction)을 할 수 있다. x의 값이 8일 때, 예상되는 y의 값은 8이다.

Hypothesis(가설)

Linear Regression의 목표는 학습 데이터들을 관통하는 하나의 직선을 찾아내는 것이라고 했다. 여기서 중요한 것은 '직선'이다. 여기서 Linear Regression의 가설이 나온다. '데이터들을 표현할 수 있는 직선이 존재한다'라는 Hypothesis를 만들어 낼 수 있으며, 직선을 표현할 수 있는 함수는 다음과 같다.

좌표 평면에서 직선은 W라는 기울기(weight)와 b라고하는 bias를 갖는 함수로 표현할 수 있다. Linear Regression의 목표는 학습 데이터를 잘 표현할 수 있는 직선을 찾는 것으로 W값과 b값을 찾아내는 것이라고 할 수 있다.

W와 b 값에 따라 다양한 직선이 그려질 수 있다. 위 그림에서 노란색, 빨간색, 파란색 직선이 모두 다른 W, b 값을 갖는다. 저 직선들 가운데 주어진 데이터를 가장 잘 표현하는 직선을 찾는 것이 Linear regression 알고리즘이 하는 일이다.

Cost function(Loss function)

그렇다면 어떤 직선이 현재 데이터를 얼마나 잘 표현하는지를 어떻게 계량할 것인지 정의할 필요가 있다. Linear Regression에서는 Cost function 혹은 Loss function이라고 하는 함수를 이용해서 현재 W, b 값이 학습 데이터를 얼마나 잘 표현하는지 계량한다.

그렇다면 주어진 데이터를 얼마나 잘 표현하는가는 어떻게 계량할 것인가? 직선이 예상한 값과 실제 데이터의 값이 얼마나 다른지를 살펴보면 된다. 

학습 데이터의 분포가 위 그래프에서 파란색 점으로 표현된다고 하자. 이 때, 파란색 직선이 학습 데이터를 얼마나 잘 표현하는지를 어떻게 계량할 수 있을까? 그림에서 볼 수 있듯이 같은 실제 학습 데이터에서의 y 값과 직선이 예측한 y 값의 차이를 이용하면 될 것 같다.

Linear Regression에서의 cost는 다음과 같이 정의할 수 있다.

m개의 학습 데이터가 주어졌을 때, 각 학습 데이터에 대해서 현재 직선이 예측한 값(H(x))과 실제 학습 데이터에서의 값 (y)의 차이를 제곱한 값의 평균이다. 
단순히 두 값의 차가 아닌 제곱을 씌우는 이유는 우선 0보다 크게 만들기 위함이다. 제곱을 씌우지 않은 경우 2와 1이 주어졌을 때, 차는 1이다. 하지만 빼는 순서에 따라 1이 될 수도 있고, -1이 될 수도 있다. 두 경우의 다름이지만 값으로 표현했을 때에는 1이더 크다.
두 번째 이유는 차이가 클 수록 더 페널티를 주기 위함이다. 제곱을 하기 때문에 차이가 두 배 더 크면 4배의 페널티를 받게 된다.

예를 들어 설명을 하자면, y = x라는 직선의 cost를 계산한다고 하자. x = 1, y = 1.2의 cost 값은 0.04다. ((1.2 - 1)^2 ) 반면 x = 1, y = 1이라고 할 때 Cost는 0 이다. ((1 - 1)^2)

Linear Regression 알고리즘은 학습 데이터가 주어졌을 때, Cost 값을 최소화 시켜주는 Hypothesis의 Parameter(W, b)를 찾는 알고리즘이다. 편의를 위해 Cost값을 Parameter에 대한 함수로 정의를 할 수 있다.  Hypothesis가 H(x) = Wx + b 라고 주어졌을 때, W, b 라는 Parameter에 따라 Cost가 변하는 Cost Function을 정의할 수 있다. 

이 함수의 결과 값이 최저가 되는 Parameter (W, b) 값을 찾는 것이 Linear Regression 학습 알고리즘의 핵심이다. 일반적으로는 Gradient Descent 알고리즘을 사용하여 최저 값을 찾아가게 된다.

설명의 편의를 위해 bias인 b 값을 0으로 고정하고 W값의 변화에 따라 cost(w, 0)을 그려보면 다음과 같은 모양을 갖는다.

이 함수를 보면 W의 값이 1일 때 cost가 최저가 됨을 알 수 있다. 즉, 우리가 찾아야하는 Hypothesis의 parameter 값은 W=1이 되며 이를 직선 함수로 나타내면 y = 1 * x 다시말해서 y = x 가 되는 것이다. 이걸 찾아야한다.

Gradient Descent 알고리즘

Gradient Descent 알고리즘은 '경사도 내려가기' 알고리즘이라고도 부른다. 등산을 하다가 산을 내려갈 때 우리는 경사도를 보고 경사 아래쪽으로 내려간다. 그렇게 내려가다보면 산 아래쪽에 도달하게 된다.

임의의 W값이 있을 때, Cost Function에서 해당 W값이 위치하는 지점의 기울기를 보고, W를 증가시키면서 움직여야하는지 W를 감소시키면서 움직여야하는지가 결정된다. 위 그림에서는 기울기가 음수이기 때문에 W값을 증가시키면 점점 cost 값이 낮아짐을 알 수 있다.

그렇게 W값을 늘려가다보면 W=1 근처에 도달하게 되고, 어느 순간 다시 W 값이 증가하게 되어 w = 1 근처가 가장 작은 cost를 갖는 다는 것을 알 수 있게 된다. 이런 알고리즘은 Gradient Descent 알고리즘이라고한다.

이를 수식으로 표현하면 다음과 같다.

현재 W값을 기준으로 cost 함수를 W에 대해서 미분하면 기울기가 나온다. 여기에 Learning rate라고 하는 알파값을 곱해서 나온 값을 이용해 다음 w값을 계산해낸다. 이를 여러번 반복하다보면 기울기가 최저값 부근에서 0에 수렴하게 되고, 결국 W값이 cost(W)를 최소화하는 인근에 수렴하게 된다.

Cost 함수를 풀어내면 위와 같이 W에 대한 수식으로 만들어낼 수 있다. 이 때 수식의 간략화를 위해서 Cost의 평균을 구하는 부분에 2를 더 나눴다. 2를 더 나누더라도 cost 값이 최소화되는 W값은 동일하다.

미분을 풀어내면 위와 같은 Gradient Descent 알고리즘이 나온다. 이 값을 이용해서 Cost를 최소화하는 Hypothesis의 parameter들을 찾아낼 수 있다.