5. 머신러닝 알고리즘 : 선형회귀(linear regression)
캡쳐 사진 및 글작성에 대한 도움 출저 : 유튜브 - 허민석님
머신러닝 중 Supervised Learning(정답이 주어진 데이터를 학습하여 분석)에는 2가지 카테고리가 있다.
바로 Classification와 Regression이다.
Classification
classification에는 classifier(분류기)가 있다. 그에 해당하는 것이 knn, decision tree, SVM(딥러닝시 DNN, CNN ) 등등이 있다.
그 분류기에 정답을 가진 data로 train해주고 난 뒤, train이 끝나면, test시에는 정답이 없는 data를, 학습된 class를 기초로 판단하게 하는 것이다.
Regression
사람의 무게를 줬을 때, 그 사람의 키를 예측하는 등의 문제이다. 즉, class로 나눠져있지 않고 정답이 -무한대 ~ +무한대의 범위에 있는 것을 예측한다.
Linear Regression
직선, 즉 일차함수의 개념인 y = ax +b 직선을 임의로 그려놓고, 그 직선을 바탕으로 예측하는 것이 선형회귀이다.
그렇다면, 아래와 같은 초록색직선과 빨간색 직선중 어느 모델이 더 예측을 잘할까?
잘 모르겠다면 아래 문제는 어떠한가?
둘중에 어느 직선이 더 예측하기 쉬울까?
많은 사람들이 왼쪽이 더 예측하기 쉬운모델이라고 한다. 왜냐하면 모든 점들이 직선상에 존재하기 때문이다.
이것을 수치적으로 나타내보자.
우리가 예측하기 위해 만든 모델인 y=ax+b직선과 실제 데이터를 찍어놓은 점들의 y값 차이를 error라고 한다.
즉, 아래와 같이 점과 직선사이의 수직거리가 있어야 'error가 있다'라고 말할 수 있는 것이다.
그에 비해 왼쪽에 있는 직선의 경우 에러가 전혀없다.
그렇다면, 왼쪽의 직선모델이 에러가 전혀없으므로, 왼쪽 직선모델이 더 낫다고 할 수 있다.
이제 수학적으로 더 파고 들어가 보자. error이외에 square error라는 것이 있다.
error를 제곱해서 넓이로 보는 이유는 무엇일까?
- 우리 눈에 보이기 쉽다.
- 수학적으로 볼 때, 에러가 조금이라도 있다면, 값이 증폭되어 --> 큰값과 작은값의 비교를 쉽게 할 수 있다.
- 딥러닝 등의 알고리즘인 Gradient Descent의 Backpropagation개념에서 계산이 용이하게 편미분된다.
다시 처음 문제로 돌아가보자. 둘중 어떤 모델이 더 나은 모델일까?
선형회귀에서 어떤 모델이 나은지 확인하려면 Square error의 측면에서 확인해야한다.
Square Error를 구하고, 그것을 평균 낸 Mean Square Error를 보면 왼쪽이 더 작다.
그러므로 왼쪽의 녹색의 예측직선모델이 예측을 더 잘하는 것이다.
여기에서는 확률의 개념은 등장하지 않는다. classification문제와 달리, Regression문제는 예측할 수 있는 정닶값이
앞서 말한 것처럼, -무한대 ~ +무한대 값을 가지기 때문이다.
Mean Square Error과 Cost funcion
이제 문제를 더 발전시켜 보자.
관찰된 값들이 있을 때(정답이 주어진 데이터가 있을 때), 가장 적합한 선(가장 적합한 선형회귀모델)을 그으려면 어떻게 해야할까?
즉, Linear Regression을 코딩하는 것이다.
여기서 사용하는 개념이 바로 Least Mean Squre Error (LMS Error)이다.
앞서 살펴본 개념들이 다 녹아있다.
- Error = h(x) - y : 예측값h(x)(직선모델) - 실제값y(실제 데이터의 y값)
- Square Error = Error를 제곱한 값 = ( h(x) - y )2
- Mean Square Error = Square Error를 다 더해서 n으로 나누어 평균낸 값 =
이 개념(M.S.E)를 이용하여, best한 선형회귀모델( 주어진 데이터를 예측할 수 있는 최적의 직선)을 그을 것이다.
그 과정에서 사용되는 것이 Gradient Descent 알고리즘이다.
그리고 이 알고리즘을 사용하기 위해, 알아야할 개념인 Cost function이 Mean Square Error와 같은 것이라고 봐야한다.
즉, 실제값과 가설값(예측값)의 차이를 제곱해서 평균낸 개념이 비용함수 (J(w,b), cost function)인 것이다.
그리고 이 Cost function(MeanSquareError)를 최저로 만드는 개념이 Least Mean Square Error일 것이다.
그리고 이렇게 cost function을 최저로 만드는 목적을 가진 함수이므로 목적함수 (objective function)이라고도 한다.
Gradient Descent
정답이 주어진 데이터가 있을 때, 우리는 최적의 선형회귀모델(직선)을 만들고, 그 모델의 Mean Square Error 즉, cost function을 최소로 만드는 최적의 직선을 찾아야한다.
그 cost를 최소로 하는 직선을 구하는 과정을 train(학습)이라 하고, train에 사용되는 알고리즘이 Gradient Desent알고리즘이라 하였다.
간단한 예제로서,
최초의 직선을 h(x) = wx라 두고, 이것의 cost function() 를 최소로 하는 w를 찾는 것이 목적이다.
그 과정에서 Gradient Descent알고리즘이 어떻게 사용되는지 보자.
( 머신러닝에서는 x앞에 우리가 찾아야할 w를 θ(세타)라고 한다. 나는 편의상 w라 하겠다)
- Graident Descent는 cost를 최소로 만드는 예측직선 h(x) = wx에서 최적의w를 업데이트하면서 찾아내는 과정이라고 볼 수 있다.
즉, 공식으로서는 아래와 같다.
w = w - ɑ * ( cost func을 w로 편미분 한 것)인데, 여기서 w를 업데이트 하는 변화량 dw을 보면
ɑ와 cost의 편미분이 곱해진 것이 Gradient의 핵심이라고 할 수 있다. 우항의 항목들을 살펴보자.
1)W : 첫번째 w로서, 우리가 맨첨에 초기화한 상수이다. gradient를 태워서 cost를 최소로만드는 w로점점 업데이트 될 것이다
2) ɑ : learning_rate로서, 학습속도를 조절하는 상수. 우리가 초기화한다.
3) : cost 즉, MeanSquareError를 w로 편미분한 것
이것으로 미루어볼 때, 우리는 1)2) 최초w와 a는 상수이므로 놔두고,
3) cost 편미분한것을 통해서 w를 변화시켜 최적(cost를 최소화하는)의 w로 업데이트 시킨다는 것을 확인할 수 있다. - 임의로 최초 w는 1로, ɑ는 0.01로 초기화 하자.
그러면 w에 대한 M.S.E.(cost function)을 시각화 해보면 아래와 같다.
이 때, 그라디언트에서는 w변화량이 - (음수)(알파 : 양수) * ( 위 그림의 접선의 기울기 : 양수) 으로
기존 w에서 마이너스(-)가 될 것이다.
( 참고 : cost의 편미분을 구할 때에는, 먼저 w와 cost(MSE)에 대한 시각화 후, 접선의 기울기를 생각하자!)
이제 업데이트된 w에 대해서, 그라디언트를 통해 다음 w를 구해보자.
에서 w = 0.98 - (0.01) * ( +1) = 0.97로 조금 더 줄어들 것이다. - 이러한 Graident -> w업데이트의 과정은 언제까지 반복될까?
2차 곡선상의 접선의기울기(cost편미분량)이 거의 0이 나오는 지점인 converge 까지 반복해서 w가 업데이트 된다.
이러한 w를 업데이트를 하는 과정에서 1번째의 h(x) = wx직선과 200번째의 h(x) = wx의 직선을 비교해보자.
아래와 같이 graident를 통해 200회 업데이트된 w로 구성된 직선은 MSE값(cost 값)이 매우 작아진 것을 확인할 수 있다.
1) h(x) = wx ( w=1, step1)
2) h(x) = wx( w = gradient 200회 업데이트한 w값, 0.5로 나왔다고 가정)
그러면 h(x)=wx+b의 문제는 어떻게 풀 수 있을 까?
위에서 본 예제는 b=0인 문제였다. 그러나 실제에서는 b(bias)가 거의 붙어있다고 보면 된다.
이럴 때는, b를 새로운 w2라 보고
h(x) = w1x + w2x의 문제를 풀면된다.
우리가 위에서 cost(mse)를 시각화할 때는, w가 1개 뿐이라서 2차 함수였지만, w가 하나더 늘어났기 때문에 3차원으로 표시해야한다.
하지만, 우리의 눈은 2차원만 쉽게 해석되기 때문에 이 이후의 과정은 머신러닝으로 해결하도록 하자
learning_rate(ɑ)는 어떻게 설정해야할까?
러닝레이트는 w가 업데이트되는 량을 상수로서 앞에 붙어서 조절한다. 그리고 우리가 처음에 초기화했다.
러닝레이트가 너무 적으면, 업데이트가 적게되므로, w들이 converge를 찾아서 내려가는 시간이 너무 오래 걸린다.
반대로 너무 높으면, 과격한 업데이트로, w가 converge를 지나쳐버리기도 한다.
결과적으로 적당히 조절해야 cost(loss)가 수렴한다.
'머신러닝 & 딥러닝 > 머신러닝 기초' 카테고리의 다른 글
7. 머신러닝 알고리즘 : 어떤 머신러닝 classifier를 써야할까? validation은 어떻게 할까? (1) | 2018.08.14 |
---|---|
6. Unsupervised 러닝 : K-mean 알고리즘 (클러스터링 알고리즘) 및 실습 (2) | 2018.08.10 |
4. 머신러닝 알고리즘 : 확률론과 나이브 베이즈(Naive Bayes)분류 (0) | 2018.08.08 |
3. 머신러닝 알고리즘 : 의사결정 트리(Decision Tree) 알고리즘의 수학적 접근 - ID3 알고리즘 (1) | 2018.08.06 |
2. 머신러닝 알고리즘 : 의사결정 트리(Decision Tree) 알고리즘 (0) | 2018.08.06 |