2-1 Multivariate Linear Regression 본문
우리는 feature가 하나인 집 값 예측 문제를 다뤘다.
실제로 집 값을 예측하기 위해선 여러 feature들을 고려해야 한다.
이제 feature가 여러 개인 문제를 다뤄보도록 한다.
집 값을 예측하기 위해 4개의 사이즈, 침실 수, 층 수, 지어진 기간 등의 여러 변수를 고려해보자
이러한 feature들을 x1, x2, x3, x4라는 notation을 사용하여 나타내며 예측을 해야 하는 price는 y로 둔다.
Feature를 표기하는 notation에 대해 좀 더 살펴보면
N은 feature의 개수가 된다. 여기선 4개의 feature를 사용할 것이기 때문에 n=4가 된다.
X의 위첨자를 사용한 x^(i)는 training sample 중에 i 번째 sample을 가리킨다는 뜻이다.
따라서 x^(2)는 두 번째 sample을 가리키며 이는 오른쪽에 표기한 4차원 벡터로 나타낼 수 있다.
마지막으로 아래첨자 j가 더해진 표기는 i번째 feature vector에서 j번째 원소를 가리킨다는 뜻이다.
따라서 4개의 feature를 사용해서 가설 h(x)를 만들면 이렇게 정의할 수 있다.
하지만 현실에 존재하는 문제는 고려해야 하는 feature의 수가 굉장히 많을 것이다.
만약 n개의 feature를 사용해야 한다면 가설 h(x)는 이렇게 정의할 수 있다.
그리고 이렇게 정의한 가설을 벡터를 사용하여 좀 더 간편하게 정의할 수 있다.
N개의 θ있다. 따라서 변량의 수도 n개로 맞추기 위해 x0를 1로 설정하자
그러면 X는 n+1차원의 벡터, θ역시 n+1차원의 벡터로 표기할 수 있다.
θtranspose를 적용하여 x와 내적을 하면 정말 간단하게 n개의 feature를 가지는 h(x)를 표기할 수 있다.
이렇게 여러 개의 feature를 가지는 선형회귀를 Multivariate
linear regression(다변량 선형회귀)라고 한다.
독립변수 x(feature)가 여러 개인 선형 회귀를 다중 선형 회귀라고 한다.
종속변수 2개 이상이여서 y가 벡터인 경우 다변량 선형회귀라고 한다.
종속변수 1개, 독립변수 1개, => 단변량 단일 선형 회귀
종속변수 2개 이상, 독립변수 1개 => 다변량 단일 선형 회귀
종속변수 1개, 독립변수 2개 이상 => 단변량 다중 선형 회귀
종속변수, 독립변수가 모두 2개 이상 => 다변량 다중 선형 회귀
우리는 앞서 feature가 n개인 h(x)를 어떻게 정의하는지 배웠다.
n개의 파라미터를 가지는 cost function의 정의도 똑같다. 다만 θ0, θ1, … , θn이라고 일일이 나열하기보다
파라미터 θ집합을 n+1차원의 벡터로 간단하게 사용하자
그러면 cost function의 정의 역시 θ벡터의 비용함수로 정의할 수 있다.
Gradient descent 알고리즘을 사용해서 나타낸 수학적 정의도 이렇게 표현할 수 있다.
우리는 n=1일 때 Gradient descent를 이렇게 정의하였다.
만약 n이 1이상이라면 Gradient descent를 오른쪽과 같이 나타내면 된다.
업데이트 rule은 feature의 수와 상관없이 항상 동일하다.
N개의 feature를 다루는 가설 h(x)를 정의하고 이를 n+1차원의 벡터로 간단히 나타내기 위해 x0를 1로 두고 벡터를 만들었다.
이것은 θ0를 업데이트하는 식에서 보듯이 뒤에 x0가 1로서 곱해지는 것과 같다.
Feature scaling을 사용해서 Gradient descent 알고리즘이 더 빠르게 수렴할 수 있게 한다.
아이디어는 feature들의 scale을 서로 비슷하게 맞춰주자는 것이다.
예를 들어 x1은 0~2000 범위 사이의 값을 가지고 x2는 1~5 사이의 값을 가진다고 하면 비용함수 J를 대략 그렸을 때 대략 이런 긴 타원 모양이 나오게 된다.
(여기선 θ0를 생략하였다. 그리고 x1이 θ1에 대응되어야 하는데 자료상의 오타인 것 같다.)
그리고 이러한 비용함수에 gradient descent를 적용한다면 이렇게 왔다 갔다 진동하면서 굉장히 많은 시간이 지나야 최소값에 도달한다.
이는 타원의 모양이 더 얇아질 수록 더 많은 시간이 걸릴 수 있다는 문제가 된다.
바로 이러한 문제를 해결하기 위해 feature를 조절(scale)하는 것이다.
Feature x_1을 집 크기를 2000으로 나눈 값이라 하고, feature x_2는 침실 수를 5로 나눈 값으로 조절해주자
그러면 범위가 0에서 1사이로 바뀐다.
그러면 비용함수의 모양은 훨씬 더 원에 가까워질 것이다.
이렇게 되면 gradient descent를 적용했을 때 난해한 경로로 복잡한 궤도를 그리며 이동하기보다 올바른 방향으로 이동하게 된다.
일반적으론 feature를 scaling할 때 -1 ~ 1사이의 값으로 조절해주지만 반드시 이 범위를 맞춰야 하는 것은 아니다.
비슷한 범위를 갖도록 대략적으로 맞춰주면 된다. (이건 명확한 rule이 존재하는 것이 아니라 사람마다 그 기준이 조금 다를 수 있다.)
따라서 x_1을 조절해서 0~3이라는 범위를 갖도록 조절하고 x_2는 -2~0.5사이의 값으로 조절해주어도 괜찮다. +-1과 비슷한 값이기 때문에 gradient descent를 적용하기에 충분하다.
그러나 -100~100, -0.0001 ~ 0.0001처럼 +-1보다 굉장히 크고 굉장히 작은 범위를 갖는 건 안 된다.
그리고 feature를 scaling을 위한 mean normalization이라는 기법을 소개한다.
Mean normalization은 x_i라는 feature를 (x_i - u_i)로 바꿔준다. 이러면 일단 평균이 대략 0이 된다. (feature x_0은 1이기 때문에 x_0에는 사용하지 않는다.)
이렇게 평균값을 빼고나서 그 feature 범위의 (최대값-최소값)으로 나눠주면 된다. 혹은 표준편차를 알고 있다면 표준편차로 나눠줘도 된다.
집 크기, 침실 수 feature에 mean normalization을 적용했을 때 범위가 -0.5 ~ 0.5로 scaling된다.
(침실 수 feature는 범위가 1~5니까 최대값 - 최소값이 4가 아닌가요? -> 그렇게 해도 되고 이렇게 해도 된다. 어차피 근사값이기 때문에 크게 상관없다.)
다시 말하지만 feature scaling의 중요한 것은 gradient descent가 더 빠르게 수렴할 수 있도록 범위를 대략적으로 조절하는 것이지 반드시 이 범위에 들어가게 만들어야 되는 게 아니다.
이번에는 Gradient descent에서 learning rate를 디버깅하고 어떤 값으로 초기화 하는게 좋은 것인지 알아보자
이 그래프는 gradient descent 반복 횟수에 따라 cost function의 값이 줄어드는 것을 보여주는 그래프이다.
Iteration 100, 200, 300 등 각 지점에서의 cost값이 얼마인지 그리고 그때의 파라미터 θ값이 구할 수 있다.
그리고 반복을 계속 할 때마다 cost값이 지속적으로 감소되는 모습을 보인다.
그러나 iteration이 300번 이상 넘어갔을 때는 그다지 감소되는 것 같지는 않다. 이러한 경우엔 거의 수렴한 것이기 때문에 cost function이 더 이상 줄어들지 않는 것이다.
문제마다 다르겠지만 gradient descent가 수렴하기 위한 iteration 수는 다르다. 어떤 경우에는 30번만에 혹은 3000번 어쩌면 300만번 이상 반복이 필요할 수도 있다.
즉 gradient descent가 수렴하기 위한 iteration 수를 사전에 알기는 어렵기 때문에 일반적으론 iteration에 따른 cost function의 그래프를 그려서 수렴하는지 아닌지 판단한다.
또한 현재 gradient descent가 수렴하는지 아닌지 알려주는 automatic convergence test 알고리즘이 있다.
이 알고리즘은 gradient descent를 반복하면서 cost값의 감소량이 10^(-3)보다 적게 줄어들었다면 수렴했다고 판단한다.
물론 이러한 방법을 잘 쓰지는 않으며 임계값을 얼마로 설정해야 하는지도 어려운 문제이다.
그래서 일반적으론 그래프를 그리면서 gradient descent가 제대로 작동하는지 아닌지 판단한다.
다음으로 gradient descent가 제대로 작동하지 않을 때 어떻게 해야 하는지 알아보자
만약 cost function의 그래프가 왼쪽과 같이 나타난다면 이는 gradient descent가 제대로 수렴하지 못 하는 것이다.
이렇게 cost값이 지속적으로 증가되는 경우는 learning rate값이 너무 크기 때문에 최소값에 도달하지 못 하고 over shooting 현상이 발생하여 나타나는 문제다.
따라서 이러한 문제에 직면하면 learning rate를 더 작은 값으로 사용하면 된다.
또 다른 예로 cost function 값이 내려갔다가 다시 올라가고, 다시 내려갔다가 올라가는 경우도 있다.
이러한 경우에도 learning rate값을 작게 해주면 된다.
여기선 수학적으로 증명하지는 않지만, learning rate값이 적절하게 작으면 cost function은 지속적으로 감소된다고 한다.
따라서 cost function이 감소되지 않으면 learning rate값이 매우 크다는 것이다. 그렇다고 해서 learning rate를 매우 작게 하는 것도 문제가 된다. 왜냐하면 gradient descent가 수렴하는데 너무 많은 시간이 걸리기 때문이다.
정리하자면 learning rate값이 너무 작으면 수렴 속도가 느려지고 너무 크면 cost function이 감소되지 않아 수렴하지 못할 수도 있다.
또한 너무 큰 경우에도 수렴속도가 느려지는 문제가 발생할 수도 있다.
하지만 대부분의 문제는 cost function이 iteration을 해도 제대로 감소되지 않는 경우이다.
이러한 경우엔 cost function의 그래프를 그려서 어떤 현상이 발생했는지 알아보는 것이 좋다.
그리고 gradient descent를 할 때 learning rate의 값을 어떤 범위 내의 값으로 사용한다.
0.001, 0.01, 0.1, 1처럼 10배씩 늘려보면서 너무 작은 게 문제였다면 10배만큼 키워보고 너무 커서 문제였다면 10배 줄여보는 것이다.
그래서 cost 값이 빠르게 감소하는 learning rate값을 선택한다.
그러나 실제로 10배씩 늘리고 줄이는 건 너무 크게 조절하는 거라서 교수님은 3배씩 늘리거나 줄인다고 한다.
이렇게 하면서 가능한 가장 작은 값과 큰 값을 찾는다. 그래서 가장 큰 값에서 조금 작은 값을 선택하거나 가장 작은 값에서 조금 큰 값을 선택한다.
이러한 방법을 사용해서 적절한 learning rate를 찾고 gradient descent가 잘 작동할 수 있게 할 수 있다.
Feature를 간단하게 선택하는 방법, 적절한 feature 선택에 따른 좋은 학습 알고리즘을 만들고 다항 회귀에 대해서 알아본다.
집 값을 예측하는 모델을 만들기 위해 우리는 frontage와 depth라는 2개의 feature를 사용해서 가설 h(x)를 만들었다.
Frontage와 depth 두 feature는 사실 집의 면적을 계산하기 위한 너비와 높이를 나타내는 feature이다.
Frontage와 depth를 곱하면 집의 면적을 나타내는 area라는 feature를 표현할 수 있다.
이렇게 되면 2개의 feature를 사용하는 것이 아니라 하나의 feature를 사용해서 더 간결한 모델을 만들 수 있다.
문제와 Feature의 특성을 제대로 이해하여 feature를 곧이 곧대로 사용하는 것보다 현재 feature들을 이용해서 새로운 feature를 정의하고 더 나은 모델을 만들 수 있는 것이다.
Feature를 선택하는 것과 다항회귀는 밀접한 관련이 있다.
위와 같은 data set이 있을 때 어떤 모델을 사용하는 것이 이 data set을 잘 나타낼 수 있을까?
여러 개가 있겠지만 딱 봐도 직선은 그다지 좋은 모델은 아닌 것 같다.
그러면 곡선 형태의 2차식이 적절할까?
2차식 모델을 사용하면 특정 데이터를 잘 나타낼 수는 있겠지만 2차식의 특징에 따라 언젠가는 함수가 내려가게 된다.
집이 더 커지는데 가격이 떨어지는 것은 말이 안되기 때문에 2차식 역시 좋은 모델이 될 수 없다.
만약 우리가 3차식 모델을 사용한다면 이 data set을 잘 나타낼 수 있을 것이다.
집이 커지는데 가격이 오히려 내려가는 2차식을 사용했을 때 나타났던 문제도 해결되었다.
그러면 3차식 모델을 사용해서 이 data를 잘 표현할 수 있는 모델을 어떻게 만들 수 있을까?
아이디어는 기존의 다중 선형회귀 구조를 이용하는 것이다.
우리가 사용하는 feature는 size하나밖에 없으니까 이것을 제곱, 세제곱하는 방식으로 치환하여 선형회귀 식과 같아지도록 만드는 것이다.
이렇게 되면 각 feature의 범위가 매우 커지기 때문에 서로 비슷한 범위를 가지도록 feature scaling을 적용하는 것이 매우 중요해진다.
해당 data set을 잘 나타내는 모델을 만들기 위해 우리는 2차식 모델을 사용했을 때 어떤 문제가 있었고 그 문제를 해결하기 위해 3차식 모델을 사용해보았다.
3차식 모델을 사용하지 않고 다른 방법으로 feature를 다루는 것을 알아보자
data의 모양을 제곱근 함수의 관점에서 바라보고 제곱근 함수를 사용하는 것이다. 제곱근 함수는 감소하지 않고 천천히 증가하는 모양을 띄기 때문에 2차식의 문제도 해결할 수 있고 data set을 잘 나타내는 모델이 될 수 있다.
이렇게 같은 문제를 서로 다른 관점에서 바라보면서 좋은 feature를 가지고 더 나은 모델을 만들 수 있다.
'ML & DL > Coursera-ML' 카테고리의 다른 글
3-2 Logistic Regression Model (0) | 2019.01.09 |
---|---|
3-1 Classification and Representation (0) | 2019.01.09 |
2-2 Computing Parameters Analytically (0) | 2019.01.08 |
1-3 Parameter Learning: Gradient Descent (0) | 2019.01.06 |
1-1, 1-2 Intro & Model and Cost function (0) | 2019.01.03 |