[ML] 2. Linear Regression

2024. 1. 30. 15:58ML

선형 회귀(=linear regression)는 가장 기본적인 ML 기법이다.

(정확히 설명하자면, 선형 회귀는 통계학에서 온 기법이다.)

 

그럼 "회귀"가 무엇을 뜻하는지부터 살펴보자! 

회귀란 "여러 개의 독립변수(=입력)와 한 개의 종속변수(=출력) 간의 상관관계를 추정"하는 기법을 의미하며,

선형 회귀는 "입출력 간의 상관관계를 선형으로 가정하고 추정"하는 기법을 의미한다.

참고로, 회귀의 모든 변수는 연속성 변수이다.

 

다시 말해, 선형 회귀는 입출력 데이터를 보고, 입출력 관계를 가장 잘 표현한 선형함수

($y = w_1x_1 + w_2x_2 + \cdots + w_nx_n + b$)를 찾는 것이 목표이다.

즉, "최적의 $w_1, w_2, \cdots, w_n$와 $b$를 찾는 것"이 선형 회귀이다.

(참고로, $x_1, x_2, \cdots, x_n$는 입력, $y$는 출력을 뜻한다.)

 

입출력 간의 관계를 추정하는 이유는 "처음 보는 입력에 대해 적절한 출력을 반환하기 위함"이다.

 

TIP. 선형 회귀 기법을 사용하기 전, 표본상관계수를 통해 낮은 상관관계를 갖는 독립 변수를 파악해 모델링에서 배제하도록 하자.

위 작업은 선형 회귀 가정에 힘을 실어준다.

손실 함수(Loss Function)

최적의 $w_1, w_2, \cdots, w_n$를 찾기 위해서는, $w_1, w_2, \cdots, w_n$가 좋은지 판단할 수 있어야 한다.

즉, 판단 기준이 있어야 하며, 이를 "손실 함수"라고 부른다.

(물론, 수식 값이 커질수록 최적에 가까워지는 함수를 사용해도 되지만,

일반적으로 수식 값이 작을수록 최적에 가까워지는 함수를 사용한다.)

 

손실 함수는 풀고자 하는 문제에 맞게 잘 정의해야 한다.

다시 말해, 문제에서 줄이고자 하는 것이 무엇인지 잘 파악해 함수로 정의한 것을 "손실 함수"라고 한다.

(참고로, 선형 회귀는 ML의 한 기법이기 때문에, 데이터를 기반한 손실 함수를 정의해야 한다.)

 

손실 함수에 대해서는 딥러닝 시리즈에서 더 자세히 다룰 것이다.

선형 회귀 예시 (키와 몸무게)

선형 회귀로 키와 몸무게 간의 관계를 파악해보자!

다시 말해, 키와 몸무게 간의 관계가 "$(\text{hight}) = a \times (\text{weight})+b$"라고 추정했을 때,

최적의 $a$와 $b$를 파악하는 문제다.

 

이때, 손실 함수를 다음과 같이 정의해볼 수 있다.

$$\text{MSE(Mean Square Error)}=e_1^2 + e_2^2 + \cdots + e_n^2$$

($e_i$ = (i번째 데이터의 실제 몸무게) - (i번째 데이터의 예측 몸무게))

 

물론, 제곱의 합($\sum_{i=1}^n e_i^2$)말고 절댓값의 합($\sum_{i=1}^n |e_i^2|$)으로 손실 함수를 정의할 수 있다.

하지만, 제곱이 error에 더 민감하게 반응하기 때문에 제곱을 택했다.

(참고로, $n$으로 나눠주는 것이 정확한 것이지만, 나누지 않아도 손실 함수의 최소 지점은 같기에 생략했다.)

 

이제, 손실값이 최소가 되는 $a$와 $b$를 찾으면 된다.

가장 쉬운 방법은 "$a$와 $b$를 일일이 바꿔가며 손실값이 가장 낮은 $a$와 $b$를 찾는 것"이다.

하지만, 위 방법은 시간이 매우 오래 걸리는 매우 무식한 방법이다.

 

두번째 방법은 "손실 함수($\text{Loss}(a, b)$)의 도함수를 구해 미분값이 0이 되는 부분을 찾는 것"이다.

하지만, 4차 방정식만 가도 도함수를 찾기 매우 어려워, 이도 실용적인 방법은 아니다.

 

때문에, 우리는 이보다 더 빠르게 효율적으로 최적의 $a$와 $b$를 구하는 방법을 찾아봐야 한다.

최적화 기법: Gradient Descent

1. 무작위로 $a$와 $b$를 선정한다. 

2. 손실값($\text{Loss}(a, b)$)을 줄이는 방향을 찾는다.

    2.1. 손실값 $\text{Loss}(a, b)$에 대한 $a$와 $b$의 미분값(=기울기)$\left({\partial \text{Loss}(a, b) \over \partial a}, {\partial \text{Loss}(a, b) \over \partial b}\right)$을 구한다.

    2.2. 기울기가 음수면 양의 방향으로 이동하고, 양수면 음의 방향으로 이동한다.

    다시 말해, 기울기의 반대 방향으로 이동한다. 추가로, 학습률(learning rate, $\gamma$)을 곱해 학습 속도를 조절한다.

$$\begin{bmatrix} a \\ b \end{bmatrix} = \begin{bmatrix} a \\ b \end{bmatrix} - \begin{bmatrix} \gamma_a {\partial \text{Loss}(a, b) \over \partial a} \\ \gamma_b {\partial \text{Loss}(a, b) \over \partial a} \end{bmatrix}$$

3. 손실값이 줄어들지 않을 때까지 2번을 반복한다.

 

참고로, 학습률은 적절한 값으로 설정해야 한다. 값이 매우 높거나 낮으면 다음과 같은 현상이 발생하기 때문이다.

 

 

위와 방식을 사용하면 보다 효율적으로 최적의 $a$와 $b$를 구할 수 있다.

하지만, 위 방법도 여러 한계점이 존재하며, 이는 딥러닝 시리즈 때 더 자세히 다루도록 하겠다.

(한계점, local minimum, 부정확한 미분값 계산, 기울기 폭팔/손실, 모든 데이터 고려하기에 시간이 오래 걸림)

(기울기 반대 방향에 대한 다른 해석, 테일러 급수)

손실 함수에 대해서는 딥러닝 시리즈에서 더 자세히 다룰 것이다.

'ML' 카테고리의 다른 글

[ML] 3. Generalization, Overfitting, Underfitting  (0) 2024.03.26
[ML] AI vs ML vs DL  (0) 2024.02.04