Search
Duplicate

Machine Learning/ 선형 회귀

주의) 이 페이지에서는 공식의 유도 과정 같은 것은 정리하지 않는다. 공식의 유도 과정은 <코세라 강의> 참조.

선형 회귀 (Linear Regression)

연속적인 속성의 값을 예측하기 위한 방법.
집의 크기가 얼마이고 위치가 어디일 때 집값을 얼마일 것인가에 대한 예측한다.
분포된 데이터의 결과값을 표현하는 선을 긋고 –위 이미지의 빨간색 선– 그 선을 통해 새로운 데이터가 입력 되었을 때 그 결과값을 예측한다.

선형 회귀의 가설 함수

가설 함수는 데이터의 분류에 해당하는 feature와 그 feature의 파라미터로 이루어진다.
어떤 집값에 대한 것이라면 feature는 집의 크기, 집의 위치, 집의 층 수, 창문 개수, 마당 여부, 주차장 여부 등이 각 feature가 된다.
통상적으로 feature는 x로 표현되어 각각의 feature는 x1,x2,x3...x_{1}, x_{2}, x_{3} ...식으로 표기한다.
feature는 데이터를 정의하는 사람이 정하면 되기 때문에, x2,x3x^{2}, x^{3} 같은 형태로도 만들 수 있다.
파라미터는 각 feature에 적용되어 feature의 강도를 조절하는 값으로 통상적으로 세타(θ\theta)로 표기하며, 붙어 있는 feature의 번호에 따라 θ1,θ2,θ3,...\theta_{1}, \theta_{2}, \theta_{3}, ...으로 표기한다.
feature가 없는 세타도 별도로 주는 경우가 있는데 이때 세타는 θ0\theta_{0}라고 표기한다. –이때의 feature는 x0x_{0}라고 하고 그 값은 11로 둔다.
이를 바탕으로 하는 선형회귀 가설함수는 다음과 같은 형태가 된다.
hθ(x)=θ0+θ1x1+θ2x22+θ3x33+...h_{\theta}(x) = \theta_{0} + \theta_{1}x_{1} + \theta_{2}x_{2} ^{2} + \theta_{3}x_{3}^{3} + ...
가설함수가 데이터를 제대로 나타내지 못하는 경우 –위 이미지의 가장 좌측– 과소적합(Underfitting) 이라 하고, 시험용 데이터에만 과도하게 적합한 경우 –위 이미지의 가장 우측– 과적합 (Overfitting)이라고 한다.

선형 회귀의 비용 함수

코세라 강의에서는 선형회귀의 비용함수를 모든 데이터에 대하여 가설함수에 대입한 값과 실제 결과값의 차이를 제곱하여 합산한 후 평균을 내는 것으로 사용한다. –정확히는 평균값을 추가로 1/2 한다.
J(θ0,θ1,θ2,...,θn)=12mi=1m(hθ(xiyi)2J(\theta_{0},\theta_{1}, \theta_{2}, ..., \theta_{n}) = {1 \over 2m}\sum_{i=1}^{m}(h_{\theta}(x_{i} - y_{i})^{2}

선형 회귀의 Gradient Descent

가설함수의 각 파라미터(θ\theta) 기준으로 비용함수를 편미분한 후 파라미터 α\alpha를 곱해 이전 파라미터 값에서 빼는 식으로 가설함수의 파라미터 값을 조절하면서 가설함수의 비용을 줄이는 방식을 사용한다.
θj:=αθjJ(θ0,θ1,θ2,...,θn)\theta_{j} := \alpha {\partial \over \partial \theta_{j}} J(\theta_{0}, \theta_{1}, \theta_{2}, ..., \theta_{n})
J(θ0,θ1,θ2,...,θn)J(\theta_{0}, \theta_{1}, \theta_{2}, ..., \theta_{n})를 θ\theta에 대하여 편미분한 식은  1mi=1m(hθ(xi)yi)xi{1 \over m} \sum_{i=1}^{m} (h_{\theta} (x_{i}) - y_{i}) x_{i}와 같으므로 최종 식은 다음과 같다.
θj:=α1mi=1m(hθ(xi)yi)xi\theta_{j} := \alpha {1 \over m} \sum_{i=1}^{m} (h_{\theta} (x_{i}) - y_{i}) x_{i}
:=:= 는 오른쪽의 값을 왼쪽의 변수에 대입하라는 의미.
x0x_{0}11이므로, θj\theta_{j} 가 00인 경우, 제일 뒤의 xix_{i}는 사라진다.
α\alpha는 Learning Rate라고 불리는 파라미터 값인데, α\alpha값을 얼마로 정하느냐에 따라 Gradient Descent의 속도가 달라진다. 가설함수의 비용값이 최저에 가까운 상황에서 α\alpha값이 크면 최저점으로 수렴하지 못하는 상황이 발생할 수 있으니 주의.
Gradient Descent 알고리즘의 순서는 아래와 간다.
1.
가설함수 hθ(x)h_{\theta}(x)를 만든다.
2.
가설함수와 실제 yy값의 차이를 제곱하고 평균으로 나눈 비용함수를 만든다.
3.
가설함수의 각 파라미터별로 비용함수를 편미분한 후 α\alpha를 곱해서 파라미터에서 뺀 후 파라미터를 업데이트 한다.
4.
업데이트된 파라미터를 기존 가설함수에 대입하고 2-4 과정을 반복하며 가설함수의 비용을 최소화 한다.
비용함수를 편미분한다는 개념이 중요한데, 편미분한다는 것은 결국 변화량을 계산한다는 것이고 변화량은 기울기를 의미하기 때문에, 위 과정을 반복하여 비용이 점점 줄어들면 기울기가 완만해져서 비용이 더 줄어들지 않는 지점에 도달하게 된다. 그 지점을 최적점이라고 한다.
최적점이 전역 차원에서 최적일 경우 Global Optima 이라고 하고, 지역 차원에서 최적일 경우 Local Optima이라고 한다.
최적점이 1개인 경우를 convex 라고 한다.

선형 회귀의 Feature Scaling

가설함수의 feature들은 특성상 크기에 편차가 크게 마련인데, –방의 갯수를 나타내는 feature와 집의 면적을 나타내는 feature는 크기에 차이가 발생할 수 밖에 없다– feature 별로 크기에 차이가 크면 Gradient Descent 등의 알고리즘을 적용하는데 불편한 부분이 많기 때문에 크기를 일정하게 조정하는데 이를 Feature Scaling이라고 한다.
feature를 조절하는 방법은 여러가지가 있지만 코세라 강의에서는 아래와 같은 방법을 이용한다.
(xi(해당 feature의 평균값)(해당featuremax해당featuremin){(x_{i} - (\text{해당 feature의 평균값}) \over (해당 feature의 max 값 - 해당 feature의 min 값)}
max – min 값이 아니라 표준편차를 써도 좋다고 한다.

선형 회귀의 Regularization

가설함수를 세울 때 Underfitting이나 Overfitting을 피하기 위해 feature를 조절하는 방법도 있지만, 파라미터인 θ\theta를 조절하는 방법도 있다.
가설함수의 비용함수를 구할 때 사용되는 모든 파라미터의 제곱을 합한 후 파라미터를 곱한 값을 더하여 θ\theta를 조절하는 것을 Regularization이라고 한다.
J(θ0,θ1,θ2,...,θn)=12m[i=1m(hθ(xi)yi)2+λj=1nθj2]J(\theta_{0}, \theta_{1}, \theta_{2}, ..., \theta_{n}) = {1 \over 2m}[\sum_{i=1}^{m}(h_{\theta}(x_{i}) - y_{i})^{2} + \lambda \sum_{j=1}^{n} \theta_{j}^{2}]
λ\lambda는 θ\theta의 합에 곱해지는 파라미터로 값이 커질수록 Underfitting이 될 가능성이 커지고, 값이 00에 가까울수록 Overfitting이 될 가능성이 커진다.
Regularization을 적용한 비용함수로 Gradient Descent를 구하는 경우 식은 다음과 같이 변경 된다.
θ0\theta_{0}인 경우
θ0:=θ0α1mi=1m(hθ(xi)yi)x0\theta_{0} := \theta_{0} - \alpha {1 \over m}\sum_{i=1}^{m}(h_{\theta}(x_{i}) - y_{i})x_{0}
그 외 경우
θj:=θjα[1mi=1m(hθ(xi)yi)xi+λmθj]\theta_{j} := \theta_{j} - \alpha [{1 \over m}\sum_{i=1}^{m}(h_{\theta}(x_{i}) - y_{i})x_{i} + {\lambda \over m} \theta_{j}]

선형회귀의 Normal Equation

Gradient Descent가 다소 기계적인 방법으로 최적값을 찾는 알고리즘인 반면, 해석적인 방법으로 최적값을 찾는 방법이 있는데 그것이 바로 Normal Equation이다.
Normal Equation은 실제 데이터들을 행렬에 담은 후에 계산하는 방법을 사용한다.
각 feature를 담은 데이터셋 매트릭스를 XX라고 하고, 그 결과 값을 yy벡터로 둔 후, 다음의 연산을 통해 파라미터 θ\theta의 벡터를 구한다.
θ=(XTX)1XTy\theta = (X^{T}X)^{-1} X^{T} y
Normal Equation에 Regularization을 적용하는 경우 식은 다음과 같다.
θ=(XTX+λM)1XTy\theta = (X^{T}X + \lambda M)^{-1} X^{T} y
위 식에서 MM(n+1)×(n+1)(n+1) \times (n+1) 크기의 행렬로 첫 번째 원소만 제외하고 대각선으로 11이고 나머지는 모두 00인 행렬이다. 위 이미지 참조
Normal Equation은 Gradient Descent와 달리 θ\theta를 한 번에 구할 수 있지만 역행렬을 구해야 하므로 파라미터의 수가 많아지면 Gradient Descent 보다 느리다는 단점이 있다.
n×nn \times n 행렬의 역행렬은 O(n3)O(n^{3})의 시간이 걸린다. feature의 개수가 10,000이 넘으면 Gradient Descent를 사용하는 편이 낫다고 한다.
Octave 같은 프로그램에서는 pinv(pseudo inverse) 같은 함수를 사용하면 역행렬을 구할 수 있다.
위에서 선형 회귀 문제를 풀 때 Σ\Sigma를 통한 반복문으로 계산을 하였지만, 행렬과 벡터를 이용하면 –Vectorization– 반복문 없이 한 번에 문제를 풀 수 있고, 식 자체도 Normal Equation처럼 대단히 깔끔해진다.
더불어 행렬과 벡터는 컴퓨터의 병렬처리를 이용하면 훨씬 빠르게 계산할 수 있으므로 머신러닝 문제를 풀 때는 가능한 행렬과 벡터를 이용하는 방법을 추천한다. 행렬과 벡터에 익숙해지자.