지금까지 linear regression에서 머신이 학습하는 알고리즘으로 Gradient Descent Algorithm에 대해서 배웠습니다. 이번에는 이를 대체하여 사용할 수 있는 또 다른 방법인 Normal Equation(정규방정식)에 대해서 알아보겠습니다.
Normal Equation
아래 그림과 같이 Gradient Descent는 경사면을 하강하면서 최저점을 찾는 방식이기에 한걸음씩 내려오면서 여러번을 수행하게 됩니다. 하지만 Normal Equation을 사용하면 한번에 찾아갈 수 있는 장점이 있습니다. 물론 단점도 있습니다
J함수가 세타에 대한 2차 방정식으로 아래 그림에서와 같다고 생각해봅니다
이 공식을 세타에 대한 미분을 하고 그 값을 0으로 놓았을때 수학적으로 풀어 낸 세타 값이 곧 우리가 찾는 목표점이 됩니다.
만약에 feature가 많아지면 하단의 공식과 같이 n+1의 matrix가 되며 각각의 feature에 대한 편미분을 하여 찾아낸 세타 값들이 곧 우리가 찾는 목표점이 될 것입니다.
데이터가 4개인 dataset을 예제로 보면 아래 그림과 같습니다.(m=4)
그리고 x0, x1, x2, x3, x4의 features를 가지고 있으며 (n=5) 그에 따른 결과 값(y)이 존재합니다. 여기서 X matrix가 features를 표현하고 있으며 y vector가 m크기를 갖는 실제 값이 되겠습니다.
이때 세타는 빨간 박스의 공식과 같은 형태로 값을 찾을 수 있다고 합니다. 하나씩 보시죠
위의 dataset에서 x vector는 하나의 데이터 row의 features를 나타냅니다.
이 x vector를 transpose하면 Xt가 되며 y와 곱하기 연산이 가능해집니다. 이것을 표현하면 아래 그림과 같이 공식의 뒷부분인 Xty 부분을 이해할 수 있을겁니다.
이제 앞부분을 보면 XtX를 inverse한 것을 볼 수 있습니다.
이것은 복잡한 계산이라 손으로 계산 할 필요는 없습니다. 프로그램을 이용하면 쉽게 풀수 있기 때문입니다.
Octave라는 프로그램에서는 이것은 간단하게 계산할 수 있습니다. 아래 그림의 pinv함수를 이용하면 한줄이면 됩니다
표현이 조금 달라지는데 transpose를 x'로 표현한 것이 차이점이고 inverse를 계산하는 함수인 pinv를 사용하였습니다.
이 한줄을 수행하면 세타 값을 한번에 구할 수 있게 됩니다.
또, Gradient Descent를 사용할 경우에는 scaling을 통해서 데이터들을 정제를 해주는 작업이 필수적이였는데, 이 Normal Equation을 사용할 경우에는 이런 scaling이 필요하지 않습니다. 하지 않아도 된다고 합니다. 아마도 수학적으로 한번에 구하기 때문에 반복 작업을 하면서 길고 긴 길을 가지 않아도 되기 때문인 것 같습니다.
그럼 이 두가지 방법은 어떤 차이점이 있는지 알아보겠습니다.
Gradient Descent 를 사용할때 적절한 알파 값을 정해야 했었습니다. 그리고 많은 수의 반복적인 처리를 수행하게 됩니다
하지만 Normal Equation을 사용하면 알파 값을 신경쓰지 않아도 됩니다. 그리고 한번에 구하기 때문에 반복적인 처리를 하지 않아 빠르게 답을 찾을 수 있는 장점이 있습니다.
하지만 Normal Equation을 사용하면 XtX의 inverse를 수행하는 계산을 해야 합니다. 이 계산은 X matrix의 크기에 따라 성능상의 차이가 발생합니다. X matrix의 크기란 n 값(features의 갯수)이므로 features가 많아질수록 복잡한 계산을 수행하게 되는 것입니다.
만약 n이 10,000이하의 dataset이라면 Normal Equation은 Gradient Descent보다 빠른 결과를 나타내줄 수 있으므로 사용하는 것이 이득입니다.(이는 컴퓨터의 사양에 따라 다를수 있습니다) 그러나 n이 그보다 커진 백만단위(1,000,000)의 dataset을 처리하는 경우에는 단연 Gradient Descent가 더 빠른 결과를 보여주므로 이 알고리즘을 사용하는 것이 이득입니다.
간혹 Normal Equation을 이용해서 수행하다가 non-invertible이라는 문제가 발생할 수 있습니다, 이것은 inverse가 되지 않아 발생하는 문제인데 X matrix가 singular이거나 degenerate일 경우에 발생한다고 합니다. 하지만 Octave에서 제공하는 pinv라는 함수는 inverse를 수행하다가 같은 문제가 발생하여도 항상 올바른 값을 주도록 해주는 함수라고 합니다. 비슷한 함수로 inv가 있는데 이것을 사용하면 같은 케이스에서 오류가 발생합니다.
이런 문제는 정상적인 계산이 되지 않으므로 학습을 할 수 없게 될 것입니다.
만약 이와 같은 문제가 발생을 한다면 2가지 대응 방안이 있습니다.
첫번째는 중복된 features가 존재하는 경우에 발생을 합니다. 같의 의미(아래 그림의 예제에서는 단위만 다른 같은 사이즈 정보)를 가진 데이터를 사용하는 경우에 이런 문제가 발생할 수 있으며 이것이 발견되면 중복된 feature를 찾아 하나를 삭제하면 해결이 된다고 합니다.
두번째는 dataset의 크기에 비해서 너무 큰 features를 사용하는 경우에 발생을 합니다. m보다 n이 큰 경우로 데이터의 항목은 많은데 보유한 데이터 사이즈가 너무 작아서 발생하는 것입니다. 이런 경우에는 일부 features를 삭제하여 줄이는 방법이 있고, regularization(정규화)를 사용하는 방법이 있습니다. 정규화는 다음에 다루게 될 내용이 되겠습니다.
'Machine Learning' 카테고리의 다른 글
13. [실습] Octave/Matlab Tutorial (0) | 2016.07.13 |
---|---|
12. [실습] Octave 설치하기 (0) | 2016.07.13 |
10. Feature를 선택하는 방법과 다항식 모델(Polynomial regression) 인 경우 (0) | 2016.07.11 |
9. Gradient Descent Algorithm 사용시 유의할 점 (0) | 2016.07.10 |
8. 많은 데이터를 표현/처리하는 방법 (Multiple Features) (2) | 2016.07.09 |
댓글