본문 바로가기

ML&DL/머신러닝

[머신러닝] 선형 회귀(Linear Regression)의 이해

728x90
반응형

 

INDEX

1. 선형 회귀란

2. 수학적 표현

3. 경사하강법(Gradient Descent)

4. 배치 경사하강법(Batch Gradient Descent)

5. 확률적 경사하강법(Stochastic Gradient Descent)

6. 미니 배치 경사하강법(Mini Batch Gradient Descent)

7. 일반화 식(normal equation)


1. 선형 회귀란

인공지능 분야에서의 출발점이자 기초 모델 중 하나인 모델 선형 회귀(Linear Regression) 모델이다. 이름에 적혀있는 그대로 데이터 간의 선형적인 관계를 이용하자는 목적이 담겨있는 모델이다.

 

정확히 말하자면 선형 회귀는 한 개의 종속 변수(y)와 한 개 이상의 독립 변수(x)와의 선형 관계를 모델링하는 기법이다. 대표적인 예시로는 집값을 예측하는 모델이 될 수 있다. 우리는 집값(y, target variable)을 예측하기 위해 다양한 요소들(가령 방의 개수 또는 평수)인 독립 변수(x, feature, 특)를 사용할 수 있는 것이다. 

 

그래서 선형 회귀는 입력 변수 x에 대해 출력 변수 y를 예측하는 함수를 학습하는 것으로 이해할 수 다. 

 


2. 수학적 표현

선형 회귀에서 사용하는 일반적인 식

 

y : 구하고자 하는 값(종속 변수)

x : 피쳐(독립 변수)

$ \theta $ : 가중치(weight, 파라미터)

b : 편향

 

$\theta$는 가중치이다. 앞으로는 파라미터라고 표기하겠다. 독립 변수x에 곱해져 있는 꼴로 보아서 해석할 수 있는 것은 x가 y의 값에 얼마나 크게 기여하고 있냐에 비례해서 $\theta$가 결정된다는 것이다. 사실상 파라미터는 회귀 알고리즘의 주인공이라고 할 수 있다. 왜냐하면 각 피쳐에 대응하는 파라미터를 구하는 것이 우리의 최종 목적이기 때문이다. 

 

다른 항들과는 동떨어져 보이는 항인 b(bias)는 오차 변수라고도 불린다. 허나 b가 왜 굳이 존재하는지 의문이 든다. 

 

만약 b가 존재하지 않으면 어떻게 될까? 우리의 함수는 아무리 많은 학습을 거쳐도 항상 원점을 지나는 함수로 국한될 것이다. 즉 우리가 표현할 수 있는 함수의 다양성이 줄어들게 되는 것이다. 이를 막기 위해서 함수의 y절편(모든 x값이 0일 때)인 b를 따로 만들어준 것이다.

 

여기서 오해하면 안되는 것이, 선형 회귀라고 해서 직선만 의미하는 것은 아니다.

 

선형 회귀에서 "선형"의 초점은 "파라미터와 피쳐 사이의 관계"에 존재한다. 즉 $y = \theta _{1}x + \theta _{2}x^2 $도 선형 회귀로 볼 수 있는 것이다. 


참고로 데이터 셋에 있는 수만은 데이터 중에서 하나의 데이터를 다음과 같이 표현할 수 있다.

i번째 데이터 -> $(x_{}^{(i)}, y_{}^{(i)})$  

 

우리는 앞으로 수식적인 표현들을 많이 사용할 것이기 때문에 최대한 간결한 표현을 지향해야 한다. 즉 b를 우리가 구해야 하는 $\theta_{0}$로 간주하면 아래와 같이 간결하게 표현할 수 있다.

 

$h(x) = \sum_{j=0}^{n}\theta_{j}x_{j}$              when $x_{0}=1$  (n : 피쳐의 개수)

 

h(x)는 x에 대한 함수라는 뜻이고 함수 h는 추측(hypothesis)의 의미를 가지고 있다. 위의 시그마 연산을 행렬의 곱셈으로 더 간단히 표현하면 아래와 같다.

 

$$h(x) = \Theta x$$  

 

단 $\Theta$와 $x$의 요소는 아래와 같다.

 \begin{pmatrix}\theta_{0}\\\theta_{1}\\\vdots \\\theta_{n}\end{pmatrix} \begin{pmatrix}x_{0}\\ x _{1}\\\vdots \\x _{n}\end{pmatrix} $$\Theta, x \in \mathbb{R}_{}^{n+1}$$

 


3. 경사하강법(Gradient Descent)

결국 우리의 최종 목적은 예측 값(h)과 현실 값(y)의 차이를 가장 작게 해주는 파라미터($\Theta$)들을 찾는 것이다. 오차를 나타내는 지표는 최소 제곱법이 있다. 이 방법을 그대로 적용하면 우리의 목표는 아래의 수식을 최소화시키는 $\Theta$를 찾아주면 된다.

$$\frac{1}{2}(h(x)-y)_{}^{2} = \frac{1}{2}(\Theta_{}^{T}x-y)_{}^{2}$$

(벡터는 기존에 열벡터로 표현되기 때문에 내적(점곱)을 위해서는 전치가 필요하고 1/2는 미분 시 계산의 편리성을 위해 존재한다.) 이제 위의 수식을 전체 훈련 데이터 셋에 대한 수식으로 만들어 주면 손실 함수(J)는 다음과 같다.

$$J(\Theta)=\frac{1}{2m}\sum_{i=1}^{m}(h(x_{}^{(i)}))-y_{}^{(i)})_{}^{2}$$

(m : 훈련 셋의 개수)

 

반드시 n과 m이 무엇을 의미하는지 알고 넘어가길 바란다. 피쳐(파라미터, n)의 개수와 훈련 데이터 셋의 개수(m)는 앞으로 수식 작성에 있어서 매우 중요한 역할을 하고 수식의 이해도를 높여준다. 시그마에 n이 있으면 '아 이 수식은 파라미터에 대한 수식이구나' 또는 m이 있으면 '전체 데이터셋을 훑는 수식이군'으로 추론할 수 있는 힘을 갖게 되는 것이다.    

 


이차 함수를 떠올려 보자. 이 함수의 최솟값을 찾기 위해서는 그 함수의 도함수값이 0인 지점을 찾으면 된다. 우리의 경우도 마찬가지이다. 손실 함수 J의 도함수를 구하고 도함수값이 0인 지점이면서 J값이 최소인 지점에서의 파라미터값들을 얻으면 된다. 

 

하지만 문제가 있다. 손실 함수 J는 입력 파라미터가 n+1개 존재하고 파라미터의 개수가 많은 만큼 복잡한 함수가 만들어지기 때문에 어디가 전역 최솟값인지 한눈에 알 수 없다. 

 

그래서 우리는 미분법 중에서 특별한 미분법인 경사하강법을 사용할 것이다. 예를 들어 현재 점 A에 위치했다고 가정하자. 점 A에서 경사하강법을 사용하면 곡면의 가장 가파른 방향으로의 벡터를 알 수 있다. 즉 경사하강법으로 얻은 결과를 토대로 점 A를 움직이면 되는 것이다.

위의 그림처럼 파라미터가 2개뿐이라고 가정하자(파라미터가 3개 이상인 예시 그림은 인터넷상에 존재하지 않는다. 왜냐하면 사실상 어떤 그래프를 시각적으로 나타낼 수 있는 것은 2 변수 함수가 최대이기 때문이다).

 

빨간색에 가까울수록 J의 값이 큰 것이고 파란색일수록 그의 반대이다. 우리는 점 A가 최대한 파란 등고선 쪽으로 이동하기를 바라고 있다. 이 목적에 달성하려면 무작위의 파라미터를 설정한 다음에 경사하강법을 충분히 반복해 주면 J를 꽤나 낮추어 주는 파라미터 조합을 찾을 수 있게 될 것이다. 

 

그래서 손실 함수 J가 수렴하는 순간이 생길 것이고 이 순간에서 반복을 멈추면 되는 것이다. 하나의 파라미터만 놓고 봤을 때의 수식은 아래와 같다.

$\theta_{j}:= \theta_{j} - \alpha \frac{\partial }{\partial \theta_{j}}J(\theta)$ for all j

식 자체의 의미는 모든 파라미터마다(for all j, 0$\leqslant$j$\leqslant$n) 기존의 파라미터 값에서 특정 값을 뺀 상태를 다시 기존 값에 대입하는 것이다. 즉 업데이트를 수행한 셈이다. 

 

여기서 $\alpha$는 학습률(learning rate)이다. 학습률은 손실 함수의 최솟값을 향해 이동하면서 각 반복에서 단계(스탭) 크기를 결정하는 하이퍼파라미터이다. 하이퍼파라미터는 파라미터와는 다르게 학습을 통해 얻어지는 것이 아닌 모델 실행 전에 사용자가 임의로 지정하는 매개변수이다. 주로 학습률은 0.01과 0.001을 취한다. 학습률이 너무 크면 한 번의 업데이트(파라미터 업데이트)를 했을 때 스탭 크기가 커져서 수렴하지 못하고 진동하는 현상이 발생할 수 있고 반대로 너무 작으면 한번의 업데이트 스탭이 너무 작아 조기 수렴으로 이어지거나 학습시간이 길어질 수 있다.

 

다소 의아할 수 있는 부분이 왜 하필 학습률 앞에 음수를 붙일까 이다. 다시 이차함수를 떠올려보자. 

$x=a$에서 도함수값은 양수이다. 하지만 함수 $f(x)$의 최솟값은 해당 점보다 좌측에 있을 것으로 예상된다. 즉 기울기의 부호의 반대로 움직여야지 $f(x)$의 값을 감소시킬 수 있다는 결론을 얻게 된다.

 

이제 위의 파라미터 업데이트 수식이 어떻게 풀어지는지를 살펴보자. 이해를 돕기 위해 하나의 훈련 셋에서 $j=1$일때에 대해 편$$\frac{\partial }{\partial \theta_{1}}J(\Theta)=\frac{\partial }{\partial \theta_{1}}\frac{1}{2}(h(x)-y)^2=\frac{\partial }{\partial \theta_{1}}(\theta_{0}x_{0}+\theta_{1}x_{1}+\cdots+\theta_{n}x_{n}-y)^2=(h(x)-y)x_{1}$$

즉 일반화한 식으로 표현해 주면 아래와 같다.

$\theta_{j}:= \theta_{j} - \frac{\alpha}{m}\sum_{i=1}^{m}(x_{j}^{(i)}(h(x_{}^{(i)}
)-y_{}^{(i)}))$    for all j(0$\leqslant$j$\leqslant$n)

예를 들어 집 값을 예측함에 있어서 파라미터를 2개로 정했다고 가정하자, 하나는 방의 개수고 다른 하나는 평수이다. 갖고 있는 데이터의 개수가 100개라고 가정하면 n=2, m=100이 되는 것이다. 즉 $\theta_{0}$은 더미 파라미터(bias 부분), $\theta_{1}$은 방 개수 파라미터, $\theta_{2}$은 평수 파라미터   

 


4. 배치 경사하강법(Batch Gradient Descent)

 

배치는 전체 데이터 셋을 묶음으로 의미한다. 즉 파라미터를 업데이트함에 있어서 모든 데이터 셋을 전부 고려한다라는 것이다.

가로 축은 방의 수의 파라미터, 세로 축은 평수의 파라미터

시각적으로 파라미터가 2개인 집값 손실 함수를 등고선으로 나타내 보면 위의 그림과 같을 것이다. 이제 무작위의 $\Theta$값으로 시작한다. 주로 파라미터를 0으로 초기화하고 시작하긴 하지만 별 상관없다.  

 

점 A에서 시작한다고 가정했을 때 등고선을 타서 가장 가파른 방향으로 이동할 것이다. 한 번의 스탭(화살표 하나)만큼 이동하기 위해서 BGD는 모든 데이터 셋의 손실을 계산한다. 계속 계산을 진행하다 보면 전역 최솟값에 도달한다는 전략인 셈이다.

 

장점 : 전체 데이터 셋을 사용해서 그라디언트를 계산하기 때문에 정확한 전역 최솟값으로 파라미터를 움직일 확률이 크다. 

단점 : 전체 데이터를 읽는 만큼 한 스탭 움직이는 데에 필요한 비용이 데이터가 크면 클수록 어마어마해질 수 있다. 또한 지역 최솟값을 전역 최솟값으로 착각해서 조기 수렴으로 이어질 수도 있다.    


5. 확률적 경사하강법(Stochastic Gradient Descent)

BGD의 한계인 연산 속도를 극복하기 위해 고안된 방법이다. SGD는 한 번의 스탭을 위해 데이터 셋에서 무작위로 하나의 훈련 데이터만 뽑은 다음에 해당 데이터의 손실 함수만 갖고 그라디언트를 계산한다. 

예를 들어 현재 함수의 손실 함수가 $J(\theta)=e_{1}^2+ e_{2}^2+ e_{3}^2+ e_{4}^2+ e_{5}^2$ 라고 가정하자. 여기서 $e_{i}$는 i번째 훈련 데이터 셋과 현재 $h(x)$와의 오차이다. 편의를 위해 $\frac{1}{2}$은 생략하였다.

 

BGD는$e_{1}$ 부터 $e_{5}$까지 모든 손실에 대해 그라디언트를 각각 계산했다면 SGD에서는 하나만 무작위로 뽑는다. 가령 $e_{3}$가 뽑혔다고 가정하다. 그렇면 $e_{3}$에 대한 그라디언트만 계산하고 그 결과에 근거해서 스탭을 나아가면 된다. 나머지 4개의 손실 함수들을 일단은 신경 쓰지 않는 것이다. 이후 무작위로 다른 손실 함수를 선택해서 연산을 계속 이어나가면 된다.   

그림으로 이해해 보자. 위의 GDB와 같은 상황의 그림이고 빨주노초파 순서로 $e_{1}$ ~ $e_{5}$의 손실 함수이다. 즉 5개의 손실 함수가 모여서 검은색 등고선으로 표현된 손실 함수를 만들었던 것이다. 

 

그림에서 보면 SGD가 채택한 훈련 데이터 셋은 1, 2, 5, 3, 5, 4, 2,... 인 것을 알 수 있다. 

 

즉 파라미터를 업데이트할 때 집 데이터 예시 1개만 가지고 그 1개에 최대한 직선 h(x)를 맞추려는 방향으로 업데이트를 진행하는 것이다. 수렴을 위한 업데이트 횟수는 SGD가 BGD보다 많지만 연산 속도에서는 SGD가 압승이므로 전역 최솟값 주변에 도달하는 속도가 더 빠르다.

 

장점 : 한 발자국 움직이는 데에 BGD가 전체 데이터를 훑어야 하는 한편 SGD는 1번만 훑으면 된다. 또한 무작위성 덕분에 지역 최솟값으로부터의 탈출이 쉽다.   

단점 : 전역 최솟값 주변에 다다랐다고 한들 무작위성 때문에 수렴 대신 계속 진동하는 양상을 띤다.

 

SGD는 수렴이 일어나지 않기 때문에 어딘가에서는 연산을 멈추게 해야 한다. 즉 전역 최솟값에서 약간 벗어난 지점일지 몰라도 꽤나 빠른 속도로 좋은 파라미터를 얻었기 때문에 괜찮다. 최적은 아니지만 빠른 시간 안에 괜찮은 값을 얻은 것이다.

 

그렇다면 SGD를 사용하다가 후반에 가서 BGD로 바꾸면 좋지 않을까라는 의문이 든다. 

 

하지만 이 아이디어는 BGD와 SGD를 애초에 사용한 목적 자체에 위반된다. SGD를 애초에 사용한 이유는 한 발자국의 연산 자체도 너무 부담이 큰 데이터 셋 때문이다. 즉 정확도를 높이겠다고 몇 테라 바이트짜리 데이터 셋에 SGD로 전역 최솟값에 접근한 다음에 BGD로 바꾸는 행위 자체부터 애초에 사용하면 안 되는 알고리즘인 것이다.


6. 미니 배치 경사하강법(Mini Batch Gradient Descent)

BGD와 SGD의 절충안이다. 한 스텝 움직이는 데에 사용되는 데이터 셋을 전체 훈련 데이터 셋 중에서 일부만 떼서 랜덤으로 학습시키는 것이다. 이 분리된 데이터 셋들을 미니 배치라고 한다. 예를 들어 1000개의 데이터 셋이 있을 때 100개씩 끊어서 손실 함수의 그라디언트를 계산하는 것이다. 참고로 배치 하나에 들어 있는 데이터의 개수는 주로 $2^n$꼴로 끊는다. 

 

이렇게 되면 절충적으로 BGD의 정확도와 SGD의 속도를 일부 얻을 수 있다. 


7. 일반화 식(normal equation)

선형회귀에서만 사용할 수 있는 한 번에 최적의 파라미터에 접근할 수 있는 방법이 있다. 물론 이 단원을 수학적으로 이해해 보자는 취지이다. 실재 사용 조건은 디자인 행렬(design matrix) $X$가 반드시 non singular 해야 한다.

 


이미지 출처 : [Machine Learning] 경사 하강법(Gradient Descent) :: 지금은 독일 (minicokr.com)

참고 자료 : Stanford CS229: Machine Learning - Linear Regression and Gradient Descent | Lecture 2 (Autumn 2018) (youtube.com)

 

728x90
반응형