by Yngie

과적합과 과소적합 (Overfitting & Underfitting)

|

본 포스트는 문일철 교수님의 인공지능 및 기계학습 개론 I 강의를 바탕으로 작성하였습니다.

Overfitting & Underfitting

Train Data and Test Data

머신러닝의 목적은 기계에게 데이터를 학습시켜 더 정확한 모델을 만들어 내도록 하는 것입니다. 기계를 학습시켜 모델을 만드는 과정을 수험생에 빗대어 생각해봅시다. 이 수험생은 학습 과정에서 교과서나 문제지에 있는 수많은 문제를 풀 것입니다. 학습 과정에서 익히게 되는 이런 문제가 머신러닝의 관점에서는 학습 데이터셋(Train dataset)이 됩니다. 교과서나 문제지를 기반으로 문제 유형을 파악하고 그에 맞게 풀이 방법을 익히는 것처럼 기계도 학습 데이터셋을 통해서 데이터에 맞는 모델을 생성하고 수정해나갑니다.

하지만 문제지를 잘 푸는 학생이라고 항상 좋은 등급을 줄 수는 없습니다. 그 학생이 어떤 방식으로 공부를 했는지(예를 들어, 문제지 답만 외우지는 않았는지)를 테스트하기 위한 수능같은 과정이 필요합니다. 문제지에 있는 문제만 잘 푸는지 아니면 전반적으로 실력이 좋은 학생인지 가늠하기 위한 단계이지요. 이렇게 테스트하기 위한 시험이 머신러닝 관점에서는 시험 데이터셋(Test dataset)이 됩니다. 모델도 실제 데이터에 적용하기 전에 훈련 데이터셋에만 잘 맞는지 아닌지를 가늠하기 위해 시험을 보아야 하는 것이지요.

중요한 점은 학습 과정 중에 시험 데이터셋을 기계가 보게 해서는 안된다는 것입니다. 수능 문제가 시중 교과서나 문제지에 없는 문제로 출시되는 이유와도 비슷합니다. 만약 시중 문제지에 있는 문제가 수능에 많이 나오게 된다면 수험생의 진정한 실력을 측정하는 데에 오차를 줄 수도 있습니다. 문제를 외워서 풀거나 하는 학생들이 있을 테니까요. (EBS 연계는 배제하고 생각하겠습니다 ㅠㅠ)

마찬가지로 시험 데이터셋이 학습 데이터셋의 일부로 들어가게 된다면, 시험 데이터셋은 이를 통해 학습한 기계를 제대로 평가하는 척도가 되지 못할 것입니다. 그렇기 때문에 실제로 머신러닝 과정에서는 학습 데이터셋과 시험 데이터셋을 철저히 분리해줍니다. 일반적으로 가지고 있는 전체 데이터셋 중 임의로 선택한 15~20% 정도를 시험 데이터셋으로 분류한 후 나머지 학습 데이터셋만으로 모델 학습을 진행합니다.

Overfitting & Underfitting

모델을 생성하는 방법에 따라서 다양한 모델이 생성될 수 있습니다. 아래 그림을 봅시다. 이 그림은 주어진 데이터에 대해 다항 선형 회귀(Polynomial linear regression)를 사용하여 생성한 모델의 그래프를 각각 나타낸 것입니다.

over_under_fit

이미지 출처 : educative.io

먼저 가운데 그려진 그래프부터 살펴보겠습니다. 이 그래프를 그린 모델은 전체 변수 범위에서 데이터의 모양을 그럴듯하게 근사하고 있음을 알 수 있습니다. 물론 학습 데이터에 대해 100%의 적합도를 보여주지는 않지만 새로운 데이터가 들어오더라도 어느 정도 잘 맞을 것으로 예측할 수 있습니다.

왼쪽에 있는 선형 모델은 변수가 0인 쪽의 데이터 몇 개에 대해서는 비교적 잘 근사하는 듯합니다. 하지만, 나머지 데이터는 회귀 그래프에서 떨어져 있고, 변수가 큰 부분의 데이터는 우하향하고 있는데 회귀 그래프는 그대로 우상향하고 있는 것을 보면 제대로 회귀하지 못하고 있다고 볼 수 있습니다.

오른쪽에 그려진 그래프는 어떨까요? 학습 데이터와 생성된 모델의 오차를 구해보면 0에 가까울 것입니다. 회귀 그래프가 모든 점을 지나고 있는 것을 볼 수 있습니다. 가운데 그래프보다 훈련 데이터를 잘 만족하는 오른쪽 그래프를 만드는 모델의 성능이 더 좋은 것 아닐까요?

어떤 모델이 좋은 지를 가늠하기 위해서 시험 데이터 하나를 추가하여 모델과의 오차가 얼마인지를 비교해 보겠습니다. 시험 데이터는 아래 그림에서 빨간색 점으로 나타납니다.

with_test_data

추가된 시험 데이터는 학습 데이터셋의 경향을 크게 벗어나지 않는 것처럼 보입니다. 그런데 생성된 각 모델과의 오차는 어떻게 될까요? 왼쪽 그래프부터 보면 오차가 상당히 많이 나는 것을 볼 수 있습니다. 훈련 데이터셋을 제대로 회귀하지 못했으니 그와 비슷한 시험 데이터를 비교했을 때에도 큰 오차를 보이는 것을 알 수 있습니다. 다음으로 가운데 모델을 보겠습니다. 가운데 모델은 오차가 크지 않습니다. 학습 데이터를 어느 정도 잘 근사했으니 시험 데이터도 비슷하게 근사하는 것을 볼 수 있습니다. 그렇다면 학습 데이터를 100%에 가깝게 근사했던 오른쪽 모델은 어떻게 될까요? 이 모델은 학습 데이터와의 오차가 없었음에도 시험 데이터와는 큰 오차를 보이는 것을 알 수 있습니다.

위 이미지에서 왼쪽 그래프와 같이 너무 단순한 모델을 생성하여 학습 데이터와 잘 맞지 않을 때 모델이 과소적합(Underfitting)되었다고 합니다. 이럴 때는 모델의 복잡도를 늘려줌으로써 문제를 해결해야 합니다. 반대로 오른쪽처럼 너무 복잡한 모델을 생성하는 바람에 학습 데이터에는 굉장히 잘 맞지만 새로운 데이터에는 잘 맞지 않는 현상을 과적합(Overfitting, 과대적합)이라고 합니다.

위에서 살펴본 바와 같이 왼쪽 그래프와 오른쪽 그래프는 시험 데이터와의 오차가 발생하는 이유가 다릅니다. 전자는 훈련 데이터도 제대로 근사를 못할 만큼 모델이 단순한 것이 문제였습니다. 이런 경우에 발생하는 오차를 편향(Bias)이라고 합니다. 후자는 훈련 데이터에 대해서는 근사를 매우 잘하지만 새로운 데이터가 들어왔을 때 제대로 근사하지 못한다는 문제가 있었습니다. 이런 경우에 발생하는 오차는 분산(Variance)이라고 합니다.

Bias-Variance Tradeoff

단순한 모델에서 발생하는 편향을 줄이기 위해 모델의 복잡도를 늘리면 분산이 늘어나고, 복잡한 모델에서 분산을 줄이기 위해서 모델을 단순화 하면 편향이 늘어나게 됩니다. 편향과 분산은 한쪽을 줄이면 다른 한쪽이 증가하는 성질이 있습니다. 이를 편향-분산 트레이드오프(Bias-Variance Tradeoff)라고 합니다.

편향-분산 트레이드 오프가 발생하는 과정을 수식을 통해서 알아봅시다. 일단 우리가 생성한 모델에서 발생하는 모든 오차의 합을 $E_{\text{out}}$ 이라고 합시다. 이 오차를 위에서 살펴본 것처럼 두 가지로 나눠 생각해볼 수 있습니다.

하나는 알고리즘을 학습하는 과정(Approximation)에서 발생하는 오차 $E_{\text{in}}$ 입니다. 이 경우는 위에서 살펴본 편향에 해당합니다. 나머지 하나는 모든 데이터를 관측하지 못하는 데(Generalization)서 발생하는 오차 $\Omega$ 입니다. 이 오차는 위에서 살펴본 분산에 해당합니다. 이를 수식으로 나타내면 다음과 같이 나타낼 수 있습니다.

[E_{\text{out}} \leq E_{\text{in}} + \Omega]

우리가 찾고자 하는 목적 함수를 $f$ 라 하고, 기계가 학습하여 생성한 모델의 함수를 $g$ 라고 합시다. 존재하는 데이터 $D$ 에 대해서 생성되는 모델의 함수를 $g^D$ 라고 해봅시다. 이를 사용하면 데이터셋 $D$ 안에 있는 인스턴스 하나에 의해 발생하는 오차를 다음과 같이 나타낼 수 있습니다.

[E_{\text{out}}(g^D(x)) = E_X \bigg[\big(g^D(x)-f(x)\big)^2\bigg]]

이를 데이터셋 전체에 대한 오차 기댓값을 계산하는 수식으로 변형할 수 있습니다.

[E_D[E_{\text{out}}(g^D(x)] = E_D\bigg[E_X \big[\big(g^D(x)-f(x)\big)^2\big] \bigg] = E_X\bigg[E_D \big[\big(g^D(x)-f(x)\big)^2\big] \bigg]]

약간의 트릭을 사용하면 $E_D \big[\big(g^D(x)-f(x)\big)^2\big]$ 부분을 간단하게 만들어줄 수 있습니다. 식 변형 과정 중에 등장하는 $\bar{g}(x)$ 는 무한 개의 데이터셋이 주어질 때 생성되는 모델의 평균으로 수식으로 나타내면 $\bar{g}(x) = E_D(g^D(x))$ 입니다.

[\begin{aligned} E_D \big[\big(g^D(x)-f(x)\big)^2\big] &= E_D \big[\big(g^D(x)-\bar{g}(x) + \bar{g}(x) -f(x)\big)^2\big]
&= E_D \big[\big(g^D(x)-\bar{g}(x)\big)^2 + \big(\bar{g}(x) -f(x)\big)^2 + 2\big(g^D(x)-\bar{g}(x)\big)\big(\bar{g}(x) -f(x)\big)\big]
&= E_D \big[\big(g^D(x)-\bar{g}(x)\big)^2\big] + \big(\bar{g}(x) -f(x)\big)^2 + E_D\big[2\big(g^D(x)-\bar{g}(x)\big)\big(\bar{g}(x) -f(x)\big)\big]
&= E_D \big[\big(g^D(x)-\bar{g}(x)\big)^2\big] + \big(\bar{g}(x) -f(x)\big)^2
&\because \bar{g}(x) = E_D(g^D(x)) \end{aligned}]

변형한 식을 원래의 식에 대입하면 데이터 셋을 통해 생성된 모델로부터 발생하는 오차를 다음과 같은 수식으로 나타낼 수 있습니다.

[E_D[E_{\text{out}}(g^D(x)] = E_X\bigg[E_D \big[\big(g^D(x)-\bar{g}(x)\big)^2\big] + \big(\bar{g}(x) -f(x)\big)^2\bigg]]

유도된 식에서 $E_X$ 이하의 부분을 첫 번째 항과 두 번째 항으로 나눌 수 있습니다. 첫 번째 항은 분산(Variance)에 해당하는 항입니다. 수식 $E_D \big[\big(g^D(x)-\bar{g}(x)\big)^2\big]$ 으로부터 ‘무한 개의 데이터셋으로부터 이끌어 낸 가설과 특정 데이터셋 $D$ 로부터 이끌어낸 가설 사이의 차이’ 라는 의미를 이끌어낼 수 있습니다. 이는 앞서 알아본 학습 데이터셋 이외의 데이터로부터 발생하는 오차의 의미이기도 하지요.

두 번째 항은 편향(Bias)의 제곱과 관련되어 있습니다. 분산의 수식으로부터 의미를 이끌어내 봅시다. $\big(\bar{g}(x) -f(x)\big)$ 로부터 ‘무한 개의 데이터셋으로부터 이끌어 낸 가설과 목적 함수의 차이’ 라는 의미를 이끌어낼 수 있습니다. 이는 위에서 모델을 근사(approximation)하는 과정에서 학습의 한계 때문에 발생하는 오차라고 말한 것과 같습니다.

그렇다면 편향이 큰 모델과, 분산이 큰 모델 중 어떤 모델을 선택하는 것이 좋을까요? 특정 데이터셋을 통해 학습시킨 결과, 전체 오차 $E_{\text{out}}$는 같지만 편향과 분산은 다른 두 모델이 생성되었다고 합시다. 예를 들어, 한 모델은 편향과 분산의 비율이 $7:3$ 이고 다른 모델은 $3:7$ 이라고 합시다. 어떤 모델을 선택해야 할까요? 이럴 때는 오컴의 면도날(Ockham’s razor)의 힘을 빌립니다. 위키피디아에 있는 ‘오컴의 면도날’의 원문은 다음과 같습니다.

  1. “많은 것들을 필요없이 가정해서는 안된다” (Pluralitas non est ponenda sine neccesitate.)
  2. “더 적은 수의 논리로 설명이 가능한 경우, 많은 수의 논리를 세우지 말라.”(Frustra fit per plura quod potest fieri per pauciora.) - 위키피디아 : 오컴의 면도날

좀 더 쉽게 말하자면 “같은 현상을 설명하는 주장들이 있다면 그 중 가장 가정이 적은(간단한) 것을 선택하라” 라는 의미입니다. 결국 우리는 두 모델 중 복잡한, 즉 고려하는 특성이 많은 모델은 배제해주어야 합니다. 그렇기 때문에 편향의 비율이 더 높은 모델을 선택하는 것이 더 옳게 됩니다.

Regularization

정칙화(Regularization)는 오버피팅을 방지하기 위한 하나의 방법입니다. 정칙화를 적용한 모델은 데이터에 민감하게 반응하지 않기 때문에 분산에 의한 오차를 줄일 수 있습니다. 수식 관점에서 보면 비용 함수에 정칙화와 관련된 항(Regularization term)을 추가하여 모델을 조정하게 됩니다.

선형 회귀(Linear regression)모델을 규제하는 방법에 대해서 알아봅시다. 선형 회귀 모델에 정칙화를 해주는 방법은 크게 두 가지로 나누어집니다. 첫 번째는 가장 많이 사용되는 릿지(Ridge) 입니다. 릿지는 L2 norm을 사용하여 규제를 가하므로 L2 정칙화라고도 부릅니다. 특정한 경우에는 L1 정칙화라고도 불리는 라쏘(Lasso)를 사용하기도 하며 두 방법을 혼합한 엘라스틱넷(Elastic Net)을 사용하기도 합니다.

각 방법을 사용할 때 비용 함수 $C(\theta)$ 는 다음과 같이 변하게 됩니다.

[\begin{aligned} \text{without Regulation : }C(\theta) &= \frac{1}{2} \sum^N_{n=0}(\text{Train}n - g(x_n, \theta))^2
\text{Ridge : }C(\theta) &= \frac{1}{2} \sum^N
{n=0}(\text{Train}n - g(x_n, \theta))^2 + \frac{\alpha}{2} \Vert \theta\Vert^2
\text{Lasso : }C(\theta) &= \frac{1}{2} \sum^N
{n=0}(\text{Train}_n - g(x_n, \theta))^2 + \alpha \Vert \theta\Vert \end{aligned}]

릿지에 의해서 구해지는 파라미터 $\theta$ 가 어떻게 달라지는 지를 수식으로 알아보겠습니다. 비용 함수를 최소화하는 $\theta$ 를 구하는 것이 목적이므로 미분하여 0이 되는 점을 최소제곱법을 사용하여 구하면 됩니다.

Ridge에 의해 구해지는 $w$ 가 어떻게 달라지는지 수식으로 나타내 보자. 오차 함수를 최소화하는 $w$ 를 구하는 것이므로 $E(w)$ 를 $w$ 로 미분하여 0이 되는 지점을 구한다.

[\begin{aligned} \frac{d}{d\theta}C(\theta) &= \frac{d}{d\theta}(\frac{1}{2}\Vert\text{Train} - X\theta \Vert ^2 + \frac{\alpha}{2} \Vert \theta\Vert^2)
&= \frac{d}{d\theta}(\frac{1}{2}(\text{Train} - X\theta)^T(\text{Train} - X\theta) + \frac{\alpha}{2}\theta^T\theta)
&= \frac{d}{d\theta}(\frac{1}{2}\text{Train}^T\text{Train} - X^T\theta \cdot \text{Train} + \frac{1}{2}X^TX \theta^T\theta + \frac{\alpha}{2} \theta^T\theta)
&= - X^T \cdot \text{Train} + X^TX \theta + \alpha \theta = 0
&\therefore \theta = (X^TX+\alpha I)^{-1} X^T \cdot \text{Train} \end{aligned}]

$\alpha$ 는 정칙화에서 등장하는 하이퍼파라미터로 정칙화의 정도를 결정합니다. $\alpha$ 가 매우 커지게 되면 $X^TX+\alpha I \approx \alpha I$ 가 되어버립니다. 결국 파라미터 행렬은 $\theta = \frac{1}{\alpha} \cdot X^T \cdot \text{Train}$ 이 되어 모델이 단순해지는 것을 알 수 있습니다. 반대로 $\alpha$ 가 0에 가까우면 정칙화를 적용하지 않았을 때와 식이 같아지기 때문에 정칙화의 영향력이 사라지게 됩니다. 실제로는 여러 $\alpha$ 값을 대입했을 때 어떤 모델이 생성되는 지를 보고 가장 적합한 모델을 선택하게 됩니다. 다음은 릿지에 다양한 $\alpha$ 를 적용했을 때의 모델을 그래프로 나타낸 것입니다. $\alpha$ 가 커질수록 모델이 단순해지는 것을 볼 수 있습니다.

ridge

이미지 출처 : analyticsvidhya.com

릿지와 라쏘 모델을 적용했을 때의 차이는 $\theta$ 중 정칙화 대상이 되는 변수들, 즉 영향이 없는 특성값에 부여되는 변수가 어떤 방식으로 처리되느냐에 있습니다. 릿지는 이런 변수들의 값을 0에 가깝게 바꿉니다. 하지만 라쏘는 이런 변수들을 아예 0으로 만들어 특성을 사라지게 합니다. 그렇기 때문에 라쏘는 조금 더 과격하게 단순해지는데 이를 아래 이미지에서 확인할 수 있습니다. 이 이미지는 라쏘를 적용했을 때 다양한 $\alpha$ 에 따라 그래프가 어떻게 변화하는 지를 나타내고 있습니다.

lasso

이미지 출처 : analyticsvidhya.com

선형 회귀 뿐만 아니라 다른 모델에도 정칙화를 적용할 수 있습니다. 아래는 로지스틱 회귀(Logistic regression)에 정칙화를 적용하는 경우입니다. 아래 식은 비용 함수를 규제 항을 더해주는 것이 아니라 우도(Likelihood)에 정칙화 항을 빼주는 방식으로 정칙화를 적용하고 있습니다. 역시 $\alpha$ 값을 변화시켜 정칙화 정도를 조정하며, $\alpha$ 가 커질수록 강한 정칙화를 수행합니다.

[\text{argmax}{\theta} \sum^m{i=1} \log p(y_i | x_i, \theta) - \alpha R(\theta)
\begin{aligned} \text{L1 : } R(\theta) &= \Vert\theta\Vert_1 = \sum^m_{i=1} \vert\theta_i\vert
\text{L2 : } R(\theta) &= \Vert\theta\Vert_2^2 = \sum^m_{i=1} \theta_i^2 \end{aligned}]

서포트 벡터 머신(Support vector machine)에도 규제를 적용할 수 있습니다. 규제를 적용한 비용 함수 $f$ 를 수식으로 아래와 같이 나타낼 수 있습니다. $C$ 값을 변화시켜 규제의 정도를 조절합니다. 선형 회귀 모델, 로지스틱 회귀 모델의 정칙화와는 달리 하이퍼파라미터 $C$ 가 커질수록 규제의 정도는 약해집니다. $C = \frac{1}{2 \alpha n}$ 이므로 비용 함수에 더해지는 $\alpha$ 값이 커질수록 $C$ 값은 줄어드는 것을 볼 수 있습니다.

[\begin{aligned} f &= \text{argmin}{f \in H} {\frac{1}{n} \sum^n{i=1}V(y_i, f(x_i)) + \alpha \Vert f\Vert^2{H}}
V(&y_i, f(x_i)) = (1-yf(x))
{+} , (s){+} = \max(s,0) \text{ 이면}
f &= \text{argmin}
{f \in H} {\frac{1}{n} \sum^n_{i=1} (1-yf(x)){+} + \alpha \Vert f\Vert^2{H}}
f &= \text{argmin}{f \in H} {C \sum^n{i=1} (1-yf(x)){+} + \frac{1}{2}\Vert f\Vert^2{H}}
C &= \frac{1}{2\alpha n} \end{aligned}]

아래는 $C$ 가 작은 값(강한 정칙화)일 때와 큰 값(약한 정칙화)일 때의 결정 경계가 어떻게 변화하는 지를 보여주는 이미지입니다. 강한 정칙화가 적용되었을 때에는 아웃라이어 값을 무시하는 것을 볼 수 있습니다. 맨 아래 그림은 추가적인 데이터가 들어왔을 때 정칙화의 효과를 보여줍니다. 약한 정칙화가 적용된 모델은 X표시된 몇 개의 인스턴스를 잘못 분류하는 것을 볼 수 있습니다

svm

svm2

이미지 출처 : stackexchange.com

Comment  Read more

서포트 벡터 머신 (SVM)

|

본 포스트는 문일철 교수님의 인공지능 및 기계학습 개론 I 강의를 바탕으로 작성하였습니다.

SVM

Decision Boundary

아래에 3개의 분류기 $H_1, H_2, H_3$이 있습니다. 여러분은 3개 중 어떤 분류기가 가장 좋아보이시나요?

svm

이미지 출처 : 위키피디아 - 서포트 벡터 머신

일단 $H_3$을 좋은 분류기라고 하기엔 무리가 있어 보입니다. 총 16개의 인스턴스 중 검은색 클래스인 인스턴스가 8개, 흰색 클래스인 인스턴스가 8개가 있는데 $H_3$은 8개의 검은색과 7개의 흰색을 하나의 클래스로 분류했습니다. 엔트로피(Entropy) 등의 지표를 사용하면 $H_3$이 좋지 않은 분류기임을 알 수 있습니다.

그렇다면 $H_1$과 $H_2$ 중에서는 어떤 분류기가 더 좋은 분류기일까요? 주어진 인스턴스만으로는 두 분류기의 성능 비교를 할 수는 없습니다. 두 분류기 모두 각자의 클래스에 맞게 분류를 잘 해냈기 때문이지요. 그러나 언뜻 보기에는 $H_2$가 조금 더 좋아 보입니다. “좋아 보이는 분류기의 비밀”은 바로 결정 경계(Decision boundary)에 있습니다. 위 그래프에 새로운 인스턴스를 추가해보도록 하겠습니다.

svm_add_data

4개의 인스턴스가 추가되었습니다. 이 4개의 인스턴스는 $H_1, H_2$ 중 어떤 분류기를 사용하여 분류하는 지에 따라서 클래스가 달라집니다. 하지만 언뜻 보아도 위쪽 2개의 인스턴스는 검은색 클래스에, 아래쪽 2개의 인스턴스는 흰색 클래스에 더 가까워 보입니다. 인스턴스의 클래스가 실제로도 위쪽 2개는 검은색 클래스, 아래쪽 2개는 흰색 클래스라고 해보겠습니다. 아래는 이를 표시한 그림입니다.

svm_add_data1

이제는 $H_2$분류기와 $H_1$중 어느 분류기가 더 좋은지 알 수 있게 되었습니다. 세 개의 분류기 중 모든 인스턴스를 잘 분류하고 있는 것은 $H_2$뿐입니다.

SVM

서포트 벡터 머신(Support Vector Machine, SVM)은 위 그림에서 빨간색으로 나타나는 분류기 $H_2$를 찾기 위한 알고리즘 입니다.

서포트 벡터 머신이 결정 경계를 찾는 방식은 다음과 같습니다. 먼저, 각 클래스에서 앞쪽(상대 클래스와 가까운 쪽)에 위치한 3개의 벡터를 찾습니다. 3개의 벡터를 선정하는 방법은 다음과 같습니다. 먼저, 각 클래스에서 가장 앞에 있는 벡터를 하나씩 찾습니다. 나머지 하나의 벡터는 클래스에 상관없이 가장 앞쪽에 위치한 것으로 찾습니다.

3개의 벡터를 찾으면 같은 클래스에 속해 있는 2개의 벡터를 찾아 이를 연결하는 하나의 직선을 긋습니다. 다음으로 이 직선과 평행하면서 나머지 하나의 벡터를 지나는 직선을 긋습니다. 마지막으로 평행선의 중점을 지나며 평행선과 평행한 하나의 직선을 더 그을 수 있는데 이 직선이 서포트 벡터 머신의 결정 경계입니다. 결정 경계를 찾는 데에 벡터의 도움을 받기 때문에 서포트 벡터 머신이라는 이름이 붙었습니다. 아래는 이렇게 구해진 서포트 벡터 머신의 결정 경계를 표시한 것입니다.

SVM_DB2

이미지 출처 : 위키피디아 - 서포트 벡터 머신

Margin

이렇게 결정된 결정 경계(실선)로부터 양쪽 직선(점선)까지의 거리를 마진(Margin)이라고 합니다. 결정 경계는 위 그림에서 볼 수 있듯 $\mathbf{w} \cdot \mathbf{x} + b = 0$으로 나타냅니다. 새로운 데이터가 들어올 경우에는 결정 경계를 기준으로 $\mathbf{w} \cdot \mathbf{x} + b > 0$ 인지 $\mathbf{w} \cdot \mathbf{x} + b > 0$ 인지에 따라서 클래스를 결정합니다. 위 그림에서는 $\mathbf{w} \cdot \mathbf{x} + b > 0$ 이면 검은색 클래스로 분류되고, $\mathbf{w} \cdot \mathbf{x} + b < 0$이면 흰색 클래스로 분류됩니다.

$\mathbf{w} \cdot \mathbf{x} + b > 0$ 인 경우를 Positive case라고 하고 $\mathbf{w} \cdot \mathbf{x} + b < 0$ 인 경우를 Negative case라고 하겠습니다. 그리고 각자의 인스턴스의 실제 클래스는 $y_i$라고 하겠습니다. 이제 신뢰도(Confidence level) $(\mathbf{w} \cdot \mathbf{x} + b)y_i$을 구할 수 있습니다. 이 신뢰도를 최대화하는 것이 서포트 벡터 머신의 목표가 됩니다.

[\text{argmax} \sum_i (\mathbf{w} \cdot \mathbf{x} + b)y_i]

신뢰도에서 $y_i$값은 실제 클래스이므로 어떤 결정 경계를 택하더라도 변화가 없습니다. 그렇기 때문에 $\mathbf{w} \cdot \mathbf{x} + b$에 해당하는 마진을 최대화하는 것이 중요합니다. 결정 경계 위에 있는 인스턴스를 $x_p$라고 하면 임의의 인스턴스 $x$는 거리 $r$을 사용하여 다음과 같이 나타낼 수 있습니다.

[x = x_p + r \frac{w}{\Vert w\Vert}]

$f(\mathbf{x}) = \mathbf{w} \cdot \mathbf{x} + b$이면 $f(x_p) = 0$이므로 위 식을 이용하여 $r$에 대한 식으로 정리할 수 있습니다.

[f(x) = w \cdot x + b = w \cdot (x_p + r \frac{w}{\Vert w \Vert}) + b = wx_p + b + r\frac{w \cdot w}{\Vert w\Vert}
\because wx_p + b = 0, \quad f(x) = r\frac{w \cdot w}{\Vert w\Vert} = r\frac{\Vert w\Vert^2}{\Vert w\Vert} = r \Vert w\Vert
\therefore r = \frac{f(x)}{\Vert w\Vert}]

좋은 결정 경계를 위해서는 마진, 즉 서포트 벡터 까지의 거리 $r$을 최대로 늘려야 합니다. 서포트 벡터 $x_s$에 대해서 $f(x_s) = w\cdot x_s + b = 1$이므로 거리 $r_s$를 아래와 같이 나타낼 수 있습니다.

[r_s = \frac{1}{\Vert w \Vert}]

즉, $r_s$ 최대로 하는 $w, b$는 $\Vert w \Vert$ 를 최소로하는 $w, b$와 같게 됩니다. 이를 수식으로 정리하면 다음과 같이 나타낼 수 있습니다.

[\max_{w,b} 2r = \max_{w,b}\frac{2}{\Vert w\Vert} = \min_{w,b} \Vert w\Vert \qquad s.t. (wx_j + b)y_j \geq 1]

위에서 $\Vert w \Vert$를 최소화하는 하는 방향으로 최적화를 진행합니다.

Losses

항상 모든 데이터를 두 쪽으로 분류할 수 있는 것은 아닙니다. 훈련 데이터가 아래와 같이 주어져 있다고 해보겠습니다.

soft_SVM

이미지 출처 : researchgate.net

위 그림에서는 Class2(빨간색 세모)의 가장 앞쪽 벡터의 뒤쪽에 Class1인 인스턴스가 위치해 있습니다. 실선으로 나타낸 결정 경계는 이 인스턴스를 잘못 분류하게 됩니다. 데이터가 이렇게 주어질 경우 인스턴스를 처리하는 방법은 크게 두 가지가 있습니다.

첫 번째는 분류기를 벗어나는 Error case에 벌칙을 주는(Penalization) 방법입니다. 관련 내용은 정칙화(Regularization)에서도 볼 수 있습니다. 두 번째는 비선형(Non-linear) 결정 경계를 긋는 방법입니다. 먼저 첫 번째 방법에 대해서 알아보도록 하겠습니다.

Error case에 벌칙을 주는 기준에 따라 두 가지로 나눌 수 있습니다. 먼저, Error case에 해당하는 인스턴스의 개수를 기준으로 벌칙을 가하는 방법입니다. 이렇게 에러의 개수에 해당하는 $#_\text{error}$를 0-1​ 손실(Loss)라고 합니다. 목적함수의 식을 아래 처럼 나타낼 수 있습니다.

[\min_{w,b} \Vert w\Vert + C \times #_{error} \quad s.t.(wx_j + b) \geq 1]

멀리 떨어진 Error case 인스턴스에 더 강한 벌칙을 가하는 방법도 있습니다. 이렇게 멀리 떨어진 가중치를 가하여 구하는 손실을 힌지 손실(Hinge Loss)라 하고 $\xi_i$로 나타냅니다. 힌지 손실은 동일 클래스의 서포트 벡터에서 $0$이며 결정 경계에서는 $1$이 됩니다. 결정 경계에서 반대 클래스 쪽으로 거리가 멀어질수록 선형적으로 증가합니다. 이 방법을 다음과 같이 나타낼 수 있습니다.

[\min_{w,b} \Vert w\Vert + C \sum_j \xi_j \quad s.t.(wx_j + b) \geq 1 - \xi_j]

아래는 0-1 손실(초록색 실선)과 힌지 손실(파란색 실선)을 나타낸 것입니다.

losses

이미지 출처 : wikipedia - Hinge loss

실제로는 두 번째 방법을 더 많이 사용합니다. 0-1 손실은 Quadratic으로 구현하기 어려우며 Error의 정도를 반영하지 못하기 때문입니다.

Soft Margin SVM

이렇게 에러를 고려하는 서포트 벡터 머신 모델을 소프트 마진 서포트 벡터 머신(Soft margin SVM)이라고 합니다. 반대로 하나의 오차도 허용하지 않는 모델을 하드 마진 서포트 벡터 머신(Hard margin SVM)이라고 합니다. 아래 그림을 보며 둘의 차이를 알아보겠습니다.

이미지 출처 : medium.com

꼭 한 클래스의 데이터가 다른 클래스 데이터 사이에 들어가 있지 않더라도 소프트 마진 서포트 벡터 머신을 사용할 수 있습니다. 이 경우에 소프트 마진 서포트 벡터 머신은 에러에 대해 강건(Robust)하다는 장점이 있습니다. 아래의 왼쪽과 오른쪽 그림은 데이터를 소프트 마진 서포트 벡터 머신과 하드 마진 서포트 벡터 머신으로 분류했을 때를 그림으로 나타낸 것입니다.

hard_vs_soft

이미지 출처 : quora.com

오른쪽 하드 마진 소프트벡터 머신은 한 개의 인스턴스도 빠뜨리지 않고 서포트 벡터 후보에 포함시키기 때문에 마진이 작은 결정 경계를 형성하게 됩니다. 반대로 소프트 마진을 적용하면 발생한 에러 하나를 무시하고 더 넓은 마진을 가지는 결정 경계를 선택한 것을 볼 수 있습니다.

소프트 마진 서포트 벡터 머신의 손실 함수를 조정하면 에러를 얼마나 고려해 줄 지를 결정할 수 있습니다. $C$ 하미퍼파라미터를 조정하여 이를 조정합니다. 위에서 사용했던 힌지 손실을 사용한 손실 함수 수식을 다시 가져와 보겠습니다.

[\min_{w,b, \xi_j}   w   + C \sum_j \xi_j \quad s.t.(wx_j + b) \geq 1 - \xi_j]

하이퍼파라미터 $C$가 커지면 커질수록 힌지 손실 값 $\xi_i$ 에 대하여 더 많은 벌칙을 가하게 됩니다. 그렇기 때문에 하나의 Error case도 허용하지 않기 위해 굉장히 마진이 좁은 결정 경계를 형성하게 되지요. 반대로 $C$가 줄어들면 Error case에 대한 벌칙이 줄어들기 때문에, Error에 강건한 결정 경계를 형성하게 됩니다. 아래는 $C$ 가 각각 $1000, 10, 0.1$로 설정한 소프트 마진 서포트 벡터 머신의 결정 경계입니다.

얼핏 보면 주어진 데이터에서는 $C$가 늘어날수록 올바른 결정 경계가 형성되는 것처럼 보입니다. 하지만 항상 그런 것은 아니기 때문에 $C$값을 조정해가며 생성되는 모델을 잘 비교한 뒤에 모델을 선택해야 합니다.

hyperpara_C

이미지 출처 : stackoverflow.com

Kernal Trick

에러를 허용하는 분류기 모델은 하나의 대안일 뿐 데이터를 잘 분류하는 분류기라고는 할 수 없습니다. 이럴 때에는 SVM의 특정 방법을 사용하여 비선형(Non-linear) 결정 경계를 그려 분류하게 됩니다.

non-linear

이미지 출처 : researchgate.net

기본적인 아이디어는 차원을 확장하여 두 데이터를 완전히 분류하는 방법과 동일합니다. 이런 방법은 선형 회귀에서 보았던 다항 회귀(Polynomial regression)와도 비슷하다고 할 수 있습니다.

하지만 SVM에서는 마구잡이로 데이터의 차원을 늘리면 계산량이 급격히 증가하게 되어 학습 시간과 컴퓨팅 자원을 많이 소모하게 됩니다. 이런 문제를 해결하기 위해 등장한 것이 커널 트릭(Kernel trick)입니다. 커널 트릭을 사용하면 계산량을 늘리지 않고도 Non-linear한 결정 경계를 그려낼 수 있습니다.

Comment  Read more

로지스틱 회귀 (Logistic Regression)

|

본 포스트는 문일철 교수님의 인공지능 및 기계학습 개론 I 강의를 바탕으로 작성하였습니다.

Logistic Regression

나이브 베이즈 분류기 에서는 최적의 분류기란 어떤 것인지에 대해 아래의 그림을 통해 알아보았습니다. 아래는 두 분류기의 확률 밀도 함수를 점선과 실선으로 각각 나타낸 것입니다.

nb1_1

이미지 출처 : 인공지능 및 기계학습 개론 학습자료

위 그림에서 베이즈 위험(Bayes’ risk)을 통해 점선보다 실선 분류기가 더 좋은 성능을 나타낼 것으로 판단하였습니다. 실선 분류기의 베이즈 위험이 더 작았기 때문입니다. 실선 분류기가 점선보다 베이즈 위험이 낮은 이유는 결정 경계(Decision boundary)에서 확률이 더욱 급격하게 변했기 때문입니다. 즉, 결정 경계에서 급하게 변할수록 더 좋은 분류기가 되는 것이지요.

이번 게시물에서 다루게 될 로지스틱 회귀는 결정 경계에서 확률이 급격하게 변하는 분류기 입니다. 로지스틱 회귀에서는 결정 경계에서 확률이 급격히 변하는 시그모이드 함수를 사용합니다. 시그모이드 함수란 무엇인지 알아봅시다.

Sigmoid

시그모이드 함수(Sigmoid function) 란 실수 정의역 범위에서 최댓값이 1이하이고 최솟값이 0이상인 미분가능한 단조증가함수입니다. 시그모이드 함수는 특정한 하나의 함수가 아니라 이런 조건을 만족하는 함수 집합입니다. $\tanh{x} , \arctan{x} , 1/(1+e^{-x})$ 등 다양한 형태의 시그모이드 함수가 있습니다. 이 중 세 번째에 있는 함수를 로지스틱 함수(Logistic function) 라고 합니다. 바로 이 로지스틱 함수를 사용한 회귀이기 때문에 로지스틱 회귀라는 이름이 붙은 것입니다.

로지스틱 함수를 사용하는 이유는 미분 계산이 쉽기 때문입니다. 일반적으로 분류기를 최적화(Optimization)하기 위해서는 특정 확률이 최대 혹은 최소가 되는 점을 찾습니다. 이러한 점을 찾는 데에 미분 계산은 필수적인 관문입니다. 로지스틱 함수는 이 미분 계산을 쉽게 만들어주기 때문에 데이터셋이 많아지더라도 수행 시간을 적절한 선에서 유지할 수 있다는 장점을 가지고 있습니다.

Logistic function

로지스틱 함수의 수식을 다시 써보겠습니다.

[y = \frac{1}{1+e^{-x}}]

로지스틱 함수의 형태가 위와 같이 된 이유는 무엇일까요? 시작은 오즈(Odds) 라는 개념에서부터 시작합니다. 오즈는 확률의 또 다른 표현법 중 하나입니다. 어떤 사건이 일어날 확률을 $x$ 라고 했을 때 오즈는 다음와 가같이 나타낼 수 있습니다.

[\text{Odds} = \frac{x}{1-x}]

오즈는 한 가지 단점을 가지고 있습니다. $x$ 가 커지는 경우에 대해서는 값이 양의 무한대로 증가하지만 $x$ 가 작아지는 경우에 대해서는 0이하로는 작아지지 않는다는 것이지요. $x = 0.5$ 일 때를 기준으로 $x = 0.99$ 로 매우 클 때와 $x = 0.01$ 로 매우 작을 때 오즈가 어떻게 변하는지 봅시다.

[\begin{aligned} \text{Odds}(x = 0.5) &= \frac{0.5}{1-0.5} = 1
\text{Odds}(x = 0.99) &= \frac{0.99}{1-0.99} = 99
\text{Odds}(x = 0.01) &= \frac{0.01}{1-0.01} = \frac{1}{99} \end{aligned}]

$x = 0.5$ 일 때, 즉 어떤 사건이 일어날 때와 일어나지 않을 때의 확률이 동일할 때의 확률은 $1$ 입니다. 이를 기준으로 $x > 0.5$ 인 방향으로 변하면 오즈가 급격하게 커지지만 $x < 0.5$ 인 방향으로 변할 때는 오즈가 완만하게 줄어드는 것을 볼 수 있습니다. 둘의 증가폭을 맞추어 주기 위해 고안된 수치가 오즈에 로그를 취해준 로짓(Logit) 입니다. 로짓을 수식으로 나타내어 보겠습니다.

[\text{Logit} = \log \bigg(\frac{x}{1-x}\bigg)]

로짓 함수의 그래프는 다음과 같이 생겼습니다.

logit

이미지 출처 : 위키피디아 - 로짓

그럼 $p$ 가 변함에 따라 로짓은 어떻게 변하게 될까요? 위에서 사용했던 수치를 사용하여 로짓을 나타내 보겠습니다.

[\begin{aligned} \text{Logit}(x = 0.5) &= \log \bigg(\frac{0.5}{1-0.5}\bigg) = \log(1) = 0
\text{Logit}(x = 0.99) &= \log \bigg(\frac{0.99}{1-0.99}\bigg) = \log(99) = 4.595…
\text{Logit}(x = 0.01) &= \log \bigg(\frac{0.01}{1-0.01}\bigg) = \log(\frac{1}{99}) = -4.595… \end{aligned}]

이제는 $x=0.5$ 일 때의 값이 $0$ 이 되었습니다. 그리고 $x$ 가 $0.5$ 보다 큰 방향으로 변하든지 작은 방향으로 변하든지 로짓값이 동일한 폭으로 증감하는 것을 볼 수 있습니다. 그렇기 때문에 실제로는 오즈보다는 로짓을 더욱 많이 사용하며 로지스틱 함수를 유도하는 데에도 로짓을 사용할 것입니다. 로짓을 $x$ 로 놓고 역함수를 취하면 다음과 같은 함수가 나오게 됩니다.

[f(x) = \log \bigg(\frac{x}{1-x}\bigg) \xrightarrow{\text{inverse}} \log \bigg(\frac{e^x}{1+e^x}\bigg)]

도출된 역함수의 식 로그 이하의 부분에서 위와 아래를 $e^{f(x)}$ 로 나누어주면 처음에 보았던 로지스틱 함수와 유사한 형태가도출됩니다.

[\text{Logistic Function} : \log \bigg(\frac{1}{1+e^{-x}}\bigg)]

이렇게 도출된 로지스틱 함수는 특성값이 $x$ 인 인스턴스가 특정 클래스에 속할 확률을 구하는 데 사용됩니다. 로지스틱 함수는 로짓 함수의 역함수이므로 다음과 같은 그래프를 나타냅니다.

logistic

이미지 출처 : 위키피디아 - 로지스틱 회귀

Logistic Regression

로지스틱 함수가 유도되는 과정을 우리가 모델링하고자 하는 우도(Likelihood) $p$ 를 사용하여 다음과 같이 쓸 수 있습니다.

[f(x) = \log \big(\frac{x}{1-x}\big) \xrightarrow{\text{inverse}} x = \log \big(\frac{p}{1-p}\big) \xrightarrow{\text{fitting}} ax+b = \log \big(\frac{p}{1-p}\big)]

선형 회귀(Linear regression)에서 $\hat{f} = X\theta$ 로 나타내었던 것을 이용하여 위 식을 다음과 같이 변형할 수 있습니다.

[\begin{aligned} X\theta &= \log \big(\frac{p}{1-p}\big)
\because \hat{f} &= X\theta = ax + b \quad \text{(at Linear reg.)}
\therefore p &= \log \bigg(\frac{1}{1+e^{-X\theta}}\bigg) \end{aligned}]

다음으로 베르누이 시행의 식을 살펴봅시다. 베르누이 시행에서 $y = 1$ 일 때의 확률을 $\mu(x)$ 라고 하면 $P(y \vert x)$ 는 다음과 같이 쓸 수 있습니다.

[P(y x) = \mu(x)^y (1-\mu(x))^{1-y}]

로지스틱 함수를 사용하여 $\mu(x)$ 를 모델링하면 다음과 같은 식이 나오게 됩니다. 아래 식은 하나의 인스턴스에 대한 것이므로 $-X\theta$ 대신 $-\theta^Tx$ 를 사용하였습니다.

[\mu(x) = P(y = 1 x) = \frac{1}{1+\exp(-\theta^Tx)}]

이를 전체 인스턴스에 관한 식으로 나타내면 다음과 같이 쓸 수 있습니다.

[P(Y X) = \frac{1}{1+e^{-X\theta}}]

Parameter Estimation

로지스틱 함수가 유도되는 과정을 살펴보았으니 로지스틱 회귀가 파라미터를 추정하는 과정에 대해 살펴보겠습니다. 로지스틱 회귀가 파라미터를 추정하는 방식은 $P(Y \vert X)$ 를 추정하는 최대 조건부 우도 추정에 기반을 두고 있습니다. 최대 조건부 우도 추정식은 최대 우도 추정 식을 변형하여 다음과 같이 쓸 수 있습니다.

[\hat{\theta} = \text{argmax}\theta \prod^m{i = 1} P(Y_i X_i;\theta) = \text{argmax}\theta \sum^m{i = 1} \log \big(P(Y_i X_i;\theta) \big)]
베르누이 시행이므로 $P(Y_i X_i;\theta) = \mu(X_i)^{Y_i}(1 - \mu(X_i))^{1-Y_i}$ 를 대입하여 $\text{argmax}$ 이하의 식을 아래와 같이 변형해 줄 수 있습니다.

[\begin{aligned} \log P(Y_i|X_i;\theta) &= Y_i \log \mu(X_i) + (1-Y_i) \log (1-\mu(X_i))
&= Y_i{\log \mu(X_i) - \log (1-\mu(X_i))} + \log (1-\mu(X_i))
&= Y_i \log \bigg( \frac{\mu(X_i)}{1-\mu(X_i)}\bigg) + \log(1-\mu(X_i))
&= Y_i X_i \theta + \log (1-\mu(X_i)) = Y_i X_i \theta - \log (1+e^{X_i\theta})
\because \log(1-\mu(X_i)) &= \log(1 - \frac{1}{1+e^{-X_i \theta}}) = \log (\frac{1}{1+e^{X_i \theta}}) \end{aligned}]

변형한 식을 대입합니다.

[\begin{aligned} \hat{\theta} &= \text{argmax}\theta \sum^m{i = 1} \log \big(P(Y_i|X_i;\theta) \big)
&= \text{argmax}\theta \sum^m{i = 1} \big{Y_i X_i \theta - \log (1+e^{X_i\theta})\big} \end{aligned}]

최대 우도 추정에서 했던 것과 같이 $\text{argmax}$ 이하의 식을 $\theta$ 로 미분하여 0이 되는 $\theta$ 를 찾아야 합니다.

[\begin{aligned} \frac{\partial}{\partial \theta} \bigg{\sum^m_{i = 1} Y_i X_i \theta - \log (1+e^{X_i\theta})\bigg} &= \bigg{ \sum^m_{i = 1}Y_iX_i \bigg} + \bigg{ \sum^m_{i = 1} -\frac{1}{1+e^{X_i\theta}} \times e^{X_i\theta} \times X_i\bigg}
&= \sum^m_{i = 1} X_i \bigg( Y_i - \frac{e^{X_i \theta}}{1+e^{X_i \theta}}\bigg)
&= \sum^m_{i = 1} X_i \big( Y_i - P(Y_i = 1|X_i;\theta)\big) = 0 \end{aligned}]

이 식은 선형 회귀에서의 최소제곱법 처럼 하나의 닫힌 해가 나오지 않습니다. 그러므로 우리는 경사법을 통해 해를 근사해 나갈 수 밖에 없습니다. 여기서는 최대 조건부 우도를 구하는, 즉 $\text{argmax}$ 인 지점을 구하는 것이므로 경사 상승법을 사용합니다.

with Gradient Ascent

경사 상승법을 통해 해를 추정해봅시다. 경사 하강법에서는 $x_t$ 가 $x_{t+1}$ 로 갱신될 때마다 기울기가 내려가는, 즉 Negative한 방향으로 갱신되므로 다음과 같이 식을 써줄 수 있었습니다.

[x_{t+1} \leftarrow x_t - h\frac{f^\prime(x_t)}{ f^\prime(x_t) }]

경사 상승법은 반대로 기울기가 상승하는 방향으로 갱신해나가므로 부호를 반대로 바꿔주어야 합니다.

[x_{t+1} \leftarrow x_t + h\frac{f^\prime(x_t)}{ f^\prime(x_t) }]

이제 $\theta$ 에 대하여 어떻게 갱신되는지를 알아봅시다. 위에서 미분한 식을 그대로 가져올 수 있습니다.

[\begin{aligned} \theta^{t+1}j \leftarrow \theta^t_j + h\frac{\partial f(\theta^t)}{\partial \theta} &= \theta^t_j + h \bigg{\sum^m{i = 1} X_{i,j} \big( Y_i - P(Y_i = 1|X_i;\theta^t\big)\bigg}
&= \theta^t_j + \frac{h}{C} \bigg{\sum^m_{i = 1} X_{i,j} \bigg( Y_i - \frac{e^{X_i \theta^t}}{1+e^{X_i \theta^t}}\bigg)\bigg} \end{aligned}]

비용 함수로 생각하기

위에서 등장한 것을 활용하여 비용 함수를 최소화하는 과정으로도 생각해 볼 수 있습니다. (위와 같은 과정이지만 비용 함수를 사용하여 설명하는 책들이 많을 것입니다.) 여기서 비용 함수는 음의 로그 우도(Negative log-likelihood) 함수를 사용합니다. 음의 로그 우도 함수는 추정한 우도에 음의 로그를 취해준 $- \log P(Y \vert X)$ 로 표현됩니다. 비용 함수의 식을 다음과 같이 쓸 수 있습니다.

[\begin{aligned} -\log P(Y \vert X;\theta) &= -\log \sum^m_{i = 1} \big{ Y_i \log \mu(X_i) + (1-Y_i) \log (1-\mu(X_i)) \big}
\because P(Y_i|X_i;\theta) &= \mu(X_i)^{Y_i}(1 - \mu(X_i))^{1-Y_i} \end{aligned}]

우리의 목적은 비용 함수를 최소화하는 것이므로 $\text{argmin}_\theta$ 을 사용하여 나타낼 수 있습니다.

[\begin{aligned} &\text{argmin}\theta \big(-\log P(Y \vert X;\theta)\big)\ = &\text{argmin}\theta \bigg(-\log \sum_{1 \leq i \leq N} \big{ Y_i \log \mu(X_i) + (1-Y_i) \log (1-\mu(X_i)) \big}\bigg) \end{aligned}]

위에서 $\text{argmin}$ 이하의 식을 미분하여 나온 식의 값이 0이 되는 $\theta$ 를 경사 하강법으로 찾는 과정은 경사 상승법으로 최대 조건부 우도를 추정한 것과 동일하게 됩니다.

Softmax Regression

개념을 확장시켜 인스턴스를 다중 클래스로 분류하는 작업에 로지스틱 회귀를 적용시켜 봅시다. 로지스틱 회귀의 방법을 다중 분류에 적용한 것을 다항 로지스틱 회귀(Multinomial logistic regression) 또는 소프트맥스 회귀(Softmax regression) 라고 합니다. 샘플 $x$ 에 대해 일련의 파라미터를 곱하여 각 클래스에 속할 점수(Score)를 구합니다. 다음과 같이 클래스 $k$ 에 대한 점수 $s_k(x)$ 를 구할 수 있습니다.

[s_k(x) = \theta^T_k x]

모든 클래스에 대해 구해진 점수에 소프트맥스 함수 $\sigma(x)$ 를 취해주어 $k$ 클래스에 속할 확률 $P(Y=k \vert X)$ 를 구할 수 있습니다.

[P(Y=k X) = \sigma(s_k(x)) = \frac{\exp(s_k(x))}{\sum^K_{i=1}\exp(s_j(x))}]

소프트맥스 회귀 모델은 로그 범주 사이의 크로스 엔트로피(Categorical Cross entropy) 를 비용 함수로 사용합니다. 식 자체는 로지스틱 회귀의 비용 함수였던 음의 로그 우도와 동일합니다.

[\begin{aligned} -\log P(Y|X;\theta) &= -\log \prod^m_{i=1}\prod^K_{k=1}\pi_k^{y_k}
&= - \sum^m_{i=1}\sum^K_{k=1} y_k \log \pi_k \end{aligned}]

여기서도 비용 함수를 최소화 해야 하므로 $\text{argmin}$ 을 사용하여 나타낼 수 있습니다.

[\begin{aligned} &\text{argmin}\theta \big( -\log P(Y|X;\theta) \big)
= &\text{argmin}
\theta \bigg(- \sum^m_{i=1}\sum^K_{k=1} y_k \log \pi_k \bigg) \end{aligned}]

$\text{argmin}$ 이하의 식을 미분하여 0이되는 $\theta$ 를 찾는 수식은 다음과 같습니다. 아래 식을 만족하는 $\theta$ 의 값 역시 열린 해의 형태이므로 경사 하강법을 통해 근사해나가야 합니다.

[\frac{1}{m}\sum^m_{i = 1}\sum^K_{k=1} X_{i,j} \big(P(Y_i = k X_i;\theta) - Y_i\big) = 0]

Comment  Read more

나이브 베이즈 분류기 (Naive Bayes Classifier)

|

본 포스트는 문일철 교수님의 인공지능 및 기계학습 개론 I 강의를 바탕으로 작성하였습니다.

Bayes Decision Theory

나이브 베이즈 분류기(Naive Bayes Classifier) 는 간단하고 여러 분류 문제에 적용하기 쉬우면서도 뛰어난 성능을 보이는 분류기 중 하나입니다. 인스턴스의 레이블을 예측할 때 베이즈 결정 이론(Bayes decision theory) 을 사용하여 판단하기 때문에 이러한 이름이 붙었습니다. 이번 게시물에서는 베이즈 결정 이론이란 무엇인지? 그리고 베이즈 분류기는 이름 앞에 왜 나이브(Naive)라는 수식어가 붙는 지를 알아봅시다.

최적(Optimal)의 분류기란?

다음의 그림을 통해 최적의 분류기란 어떤 것인지 알아보도록 합시다. 아래 그림에는 점선으로 나타나는 분류기 하나와 실선으로 나타나는 분류기 하나가 있습니다.

nb1

이미지 출처 : 인공지능 및 기계학습 개론 학습자료

위 그림에서 $x$ 축은 특성값을 나타내며 각 $x$ 에서의 $y$ 값은 특정 클래스를 나타낼 확률을 나타냅니다. 중간에 두 그래프가 만나는 부분을 결정 경계(Decision boundary) 라고 하며 이 결정 경계를 기준으로 $x$ 가 왼쪽인지 오른쪽인지에 따라 분류기가 예측하는 값인 $\hat{y}$ 가 달라지게 됩니다. 그렇다면 두 분류기 중 어떤 것이 더 좋은 분류기일까요? 분류기의 성능은 위 그림에도 나와있는 베이즈 위험(Bayes Risk) 에 따라 판단할 수 있습니다. 베이즈 위험이 무엇인지 알아보기 위해 위 그림에 임의의 $x_1$ 에 해당하는 세로선을 그어 보겠습니다.

nb1_1

이미지 출처 : 인공지능 및 기계학습 개론 학습자료

위 그림에서 $x_1$ 은 결정 경계 왼쪽에 위치하고 있으므로 $x_1$ 을 입력한다면 두 분류기 모두 초록 클래스로 분류할 것입니다. 하지만 이 점에서도 각각의 분류기는 빨강 클래스일 확률을 가지고 있습니다. 점선 분류기는 주황색 점으로 나타나는 위치의 $y$ 값인 $y_1$ , 실선 분류기는 파란색 점으로 나타나는 위치의 $y$ 값인 $y_2$ 만큼이 특성값 $x_1$ 에 대하여 빨강 클래스일 확률입니다. 하지만 분류기는 이런 확률을 무시하고 초록 클래스를 선택합니다. 이렇게 무시되는 확률을 모든 $x$ 에 대해 적분한 것이 베이즈 위험입니다. 따라서 점선 분류기의 베이즈 위험은 위 그림에서 (하늘색 + 갈색)으로 나타나는 부분인 $S_1 + S_2 + S_3$ 가 됩니다. 그리고 실선 분류기의 베이즈 위험은 위 그림에서 갈색으로 나타나는 부분인 $S_3$ 이 됩니다. 더 좋은 분류기라면 클래스를 선택할 때 해당 클래스가 아닐 확률, 즉 베이즈 위험을 더 작게 할 것입니다. 따라서 위 그림에서는 베이즈 위험이 더 적은 실선 분류기가 더 좋은 성능을 보인다고 할 수 있습니다.

최적의 분류기라면 베이즈 위험을 최소화해야 할 것입니다. 클래스를 잘못 선택할 확률을 가장 적게 하는 것이므로 최적의 분류기 $f^*$ 를 다음과 같은 수식으로 나타낼 수 있습니다.

[f^* = \text{argmin}_f P(f(X) \neq Y)]

위 식을 전체 클래스가 2개 뿐인 이진 분류(Binary classification)에 대해서는 다음과 같이 쓸 수도 있습니다.

[f^* = \text{argmax}_{Y=y} P(Y=y\vert X=x)]

Bayes Classifier

이제는 최적의 분류기 $f^*$ 에 대한 식을 우리가 다룰 수 있는 형태로 식을 변형할 차례입니다. 최대 사후확률 추정 에서 주어진 데이터셋으로부터 특정 클래스일 확률을 추정하는 방법을 배웠습니다. 최대 사후확률 추정에서 사용했던 베이즈 정리를 사용하여 위 식을 다음과 같이 바꿔쓸 수 있습니다.

[f^* = \text{argmax}{Y=y} P(Y=y\vert X=x) = \text{argmax}{Y=y} P(X=x\vert Y=y)P(Y=y)
\text{ }
\because P(Y=y \vert X=x) = \frac{P(X=x \vert Y=y)P(Y=y)}{P(X=x)} \quad \text{and} \quad P(X) \text{ is constant} \]

변형한 베이즈 분류기 $f^*$ 의 수식을 다시 써보겠습니다.

[f^* = \text{argmax}_{Y=y} P(X=x\vert Y=y)P(Y=y)]

위 식에서 $\text{argmax}$ 이하의 두 항 중에서 왼쪽을 Class conditional density라 하고 Class prior라고 합니다.

Naive Bayes Classifier

이제 왜 나이브 베이즈 분류기의 앞에 나이브(Naive)라는 수식어가 붙는지 알아볼 것입니다. 분류기를 만들 때 가장 문제가 되는 것은 데이터셋 내에 있는 특성끼리 어떤 관계를 맺고 있는지 알 수 없기 때문입니다. 데이터셋 내에 있는 모든 특성이 관계를 맺고 있다면 클래스가 $k$ 개이고 특성이 $d$ 개일 때 Class conditional density를 구하기 위해서는 $(2^d-1)k$ 개의 파라미터가 필요합니다. 그리고 Class prior를 구하기 위해서는 $k-1$ 개의 파라미터가 필요하지요. 규칙 기반 학습 에서 사용했던 예시 데이터셋에서 모든 특성이 관계를 맺고 있다면 몇 개의 파라미터가 필요할까요?

하늘 상태 온도 습도 바람 해수 온도 일기 예보 물놀이를 나갈까?
맑음 따듯함 보통 강함 따듯함 일정함
맑음 따듯함 높음 강함 따듯함 일정함
흐림 추움 높음 강함 따듯함 가변적 아니오
맑음 따듯함 높음 강함 차가움 가변적

클래스의 개수 $k = 1$ 이고, 특성의 개수 $d = 6$ 이므로 $2 \cdot (2^6-1) \times (2 - 1) = 126$ 개의 파라미터가 필요하게 됩니다. 모든 특성이 관계를 맺고 있다면 상당히 간단해보이는 데이터셋으로부터 분류 기준을 이끌어 내는 데만도 많은 파라미터를 필요로 하게 됩니다. 실제 데이터는 수십 ~ 수백 개의 특성을 가지고 있는 경우가 많습니다. 특성의 개수에 따라 필요한 파라미터의 개수는 기하급수적으로 늘어나므로 특성 사이의 관계를 어떻게 해결해주지 않으면 필요한 파라미터의 개수는 엄청나게 늘어날 것입니다. 실제로 20개의 특성을 가진 데이터셋이라면 필요한 파라미터의 개수는 100만개가 넘습니다. 이 문제를 해결해줄 조건부 독립에 대해 알아봅시다.

Conditional Independence

조건부 독립(Conditional Independence) 은 특성의 개수를 줄이지 않고도 필요한 파라미터의 개수를 줄일 수 있는 방법입니다. 조건부 독립이 무엇이길래 이런 일을 할 수 있는 것일까요? 조건부 독립은 임의의 관계에 있는 두 사건이 주어진 조건하에서는 독립이 되는 경우를 말합니다. 조건부 독립의 예시를 몇 가지 들어봅시다.

“비가 오는 사건”“천둥이 치는 사건” 이 있다고 해봅시다. 두 사건 사이에는 어떤 관계가 있어 보입니다. 그런데 가운데 “번개가 쳤다” 라는 조건이 주어졌다고 해봅시다. “번개가 쳤다” 라는 조건하에서는 “천둥이 치는 사건”“비가 오는 사건” 은 독립이 되어버립니다. 각각을 확률로 나타내어 보겠습니다. (해당 예시에서 마른 하늘에 번개가 치는 것은 예외로 합니다.)

[\begin{aligned} P(천둥=침|비=옴) &\neq P(천둥=침)
P(천둥=침|비=옴, 번개=침) &= P(천둥=침|번개=침)
P(비|천둥=침, 번개=침) &= P(비=옴|번개=침)
\because P(천둥=침, 비|번개=침) &= P(천둥=침|번개=침)P(비=옴|번개=침) \end{aligned}]

천둥과 비는 독립이 아니므로 비가 왔을 때 천둥이 칠 확률 $P(천둥 \vert 비)$ 와 아무런 조건이 없을 때 천둥이 칠 확률 $P(천둥)$ 은 같지 않습니다. 비가 올 때 천둥이 칠 확률이 훨씬 높겠지요. 하지만 번개라는 조건이 주어지면 다른 두 사건은 이 조건에

두 번째 예시는 그림과 함께 알아봅시다. 아래 그림은 지휘관과 지휘관의 명령을 따르는 직원 A,B 를 그림으로 나타낸 것입니다.

이미지 출처 : 인공지능 및 기계학습 개론 학습자료

먼저 A가 지휘관의 명령을 듣지 못하는 상태, 즉 지휘관의 명령을 알 수 없는 상태라고 가정해 봅시다. 이 경우에는 B가 앞으로 가는 것을 보았을 때와 그렇지 않을 때 A가 앞으로 갈 확률은 다를 것입니다. 아무래도 B가 앞으로 가는 것을 본다면 ‘지휘관이 B에게 명령을 내렸겠구나’라고 생각하고 앞으로 가게 되겠지요. 수식으로는 아래와 같이 나타낼 수 있습니다.

[P(\text{OfficerA=Go} \vert \text{OfficerB=Go}) \neq P(\text{OfficerA=Go})]

이번에는 A가 지휘관의 명령을 들을 수 있는 상태라고 가정하고 같은 상황에 대한 확률을 구해봅시다. 지휘관의 명령을 들을 수 있다면 B가 앞으로 가든 말든 A가 앞으로 갈 확률에는 차이가 없습니다. B가 앞으로 가든지 말든지 지휘관의 명령만 따라서 움직이면 되기 때문입니다.

[P(\text{OfficerA=Go} \vert \text{OfficerB=Go, Commander = Go}) = P(\text{OfficerA=Go} \vert \text{Commander=Go})]

이렇게 독립이 아닌 두 사건에 대해 특정 조건이 개입했을 때 조건부 확률이 독립이 되는 관계를 조건부 독립이라고 합니다. 조건 $y$ 에 대하여 조건부 독립인 사건 $x_1, \cdots, x_n$ 은 다음과 같은 수식을 만족합니다.

[( \forall x_1, x_2,y)
\begin{aligned} P(x_1 \vert x_2, y) &= P(x_1 \vert y)
\therefore P(x_1,x_2 \vert y) &= P(x_1 \vert y)P(x_2 \vert y) \end{aligned}]

마지막 등식을 사용하여 Class conditional density의 항을 다음과 같이 변형할 수 있습니다.

[P(X= {x_1, …, x_d} \vert Y=y) \rightarrow \prod^d_{i=1} P(X_i = x_i \vert Y=y)]

Naive Bayes Classifier

베이즈 분류기를 수식으로 나타낸 $f^*$ 에 변형된 수식을 적용해봅시다.

[\begin{aligned} f^* &= \text{argmax}{Y=y} P(X = x \vert Y = y) P(Y = y)
&\approx \text{argmax}
{Y=y} P(Y = y) \prod_{1 \leq i \leq d} P(X_i = x_i \vert Y=y) \end{aligned}]

특성 $x_1, … ,x_d$ 가 모두 관계를 맺고 있을 때 Class conditional density 항을 구하기 위해서 필요한 파라미터의 개수는 $(2^d-1)k$ 였습니다. 식을 변형한 후에는 어떻게 될까요? 변형한 식에서 Class conditional density 부분을 구하기 위해 필요한 파라미터의 개수는 $d \cdot k$ 개가 됩니다. 위에서 했던 것처럼 특성이 $6$ 개, 클래스가 $2$ 개인 분류 문제를 위해서 필요한 파라미터의 개수를 구해봅시다. Class prior 항을 구하기 위해 필요한 파라미터의 개수는 $k-1$ 로 동일하므로 $6 \cdot 2 \times 1 = 12$ 개가 됩니다. 훨씬 더 줄어든 것을 볼 수 있습니다.

하지만 현실세계에서는 특성들이 서로 조건부독립을 만족하지 않는 경우가 대부분입니다. 파라미터의 개수를 줄이기 위한 가정이 말 그대로 너무 순진한(Naive, 나이브) 한 가정이기 때문에 이 가정을 사용한 베이즈 분류기를 나이브 베이즈 분류기(Naive Bayes Classifier) 라고 부릅니다. 나이브 베이즈 분류기는 비록 특수한 가정을 사용하였지만 몇몇 태스크에서 다른 복잡한 모델보다도 더 좋은 성능을 내기도 합니다.

Comment  Read more

선형 회귀 (Linear Regression)

|

본 포스트는 문일철 교수님의 인공지능 및 기계학습 개론 I 강의를 바탕으로 작성하였습니다.

Linear Regression

이번에는 레이블이 “예”, “아니오” 와 같은 범주형(Categorical) 변수가 아니라 연속형(Continuous)인 인스턴스로 구성된 데이터셋에 대해 알아보도록 합시다. 이런 데이터는 선형의 형태를 가지고 있다고 추측해볼 수 있습니다. 아래 이미지를 보며 설명을 이어나가도록 하겠습니다.

linear_reg1

이미지 출처 : 위키피디아 - 선형회귀

위 그림에서 파란색 점은 각 데이터의 연속형인 레이블을 마크한 것이고, 빨간색 선은 파란색 점과 가장 잘 부합하는 하나의 직선(혹은 곡선)입니다. 이번 게시물에서는 특정 데이터셋의 특성(Feature)과 레이블간에 선형(Linear)의 관계가 있다는 가설을 세웠을 때 이 선형의 그래프를 예측해보는 선형회귀(Linear Regression) 에 대해서 알아봅시다.

가장 기본적인 선형 회귀는 직선의 형태를 가지므로 기울기를 나타내는 파라미터를 $\theta_i (i \geq 1)$ 라고 하고 편향(Bias)을 나타내는 파라미터를 $\theta_0$ 라고 하면 속성값 $x_i$ 에 대한 회귀 가설식 $h$ 을 아래와 같이 나타낼 수 있습니다.

[h:\hat{f}(x;\theta) = \theta_0 + \sum_{i=1}^n \theta_i x_i = \sum_{i=0}^n \theta_i x_i]

위 식에서 속성값에 해당하는 $x_i$ 는 데이터로부터 주어져 있습니다. 그렇기 때문에 우리의 목표는 데이터에 더 잘 부합하는 적절한 $\theta$ 를 찾아 좋은 가설을 만드는 것이 되겠습니다.

Find $\theta$ , 최소제곱법

최소제곱법(Least Squared Method) 은 가장 적절한 $\theta$ 를 찾는 방법 중 하나입니다. 최소 제곱법은 정규방정식이라는 행렬 연산을 기반으로 합니다. 위에서 사용한 가설식 $h$ 를 행렬을 사용하여 간단하게 나타내 봅시다. 아래 식에서 각 행(Row)은 인스턴스의 특성값을 나타내며, $D$ 는 데이터셋 내에 있는 행의 개수가 됩니다.

[h: \hat{f}(x;\theta) = \sum_{i=0}^n \theta_i x_i \rightarrow \hat{f} = X \theta
X = \left(\begin{array}{cccc} 1 & x^1_1 & \cdots & x^1_n \ \vdots & \vdots & \ddots & \vdots \ 1 & x^D_1 & \cdots & x_n^D \end{array}\right), \theta = \left(\begin{array}{c} \theta_0 \ \theta_1 \ \vdots \ \theta_n \end{array}\right)]

규칙 기반 학습 에서도 알아보았던 것처럼 현실 세계는 완벽한 세계(Perfect world)와는 달리 다양한 노이즈가 존재합니다. 그렇기 때문에 현실 세계를 근사하는 함수 $f (\neq \hat{f})$ 에는 에러 $e$ 에 대한 항을 포함하여 나타냅니다.

[f(x;\theta) = \sum_{i=0}^n \theta_i x_i + e = y \rightarrow f = X \theta + e = Y]

우리의 목표는 $\theta$ 를 조정하여 노이즈로부터 발생하는 에러 $e$ 를 최소화하는 것입니다. $\text{argmin}$ 을 사용하여 수식으로 이를 표현하면 다음과 같습니다.

[\hat{\theta} = \text{argmin}\theta (e)^2 = \text{argmin}\theta (f - \hat{f})^2]

$f, \hat{f}$ 에 $Y, X\theta$ 를 각각 대입한 뒤 다음과 같이 변형할 수 습니다. 마지막에 등장하는 $Y^T Y$ 는 $\theta$ 값이 변해도 변하지 않는 상수(Constant)기 때문에 $\text{argmin}$ 이후의 식에서 삭제해 주어도 문제가 되지 않습니다. \(\begin{aligned} \hat{\theta} &= \text{argmin}_\theta (e)^2 = \text{argmin}_\theta (f - \hat{f})^2 \\ &= \text{argmin}_\theta (Y - X\theta)^2 = \text{argmin}_\theta (Y - X\theta)^T (Y - X\theta) = \text{argmin}_\theta (Y^T - \theta^TX^T) (Y - X\theta) \\ &= \text{argmin}_\theta (\theta^TX^TX\theta - 2\theta^TX^TY + Y^T Y) = \text{argmin}_\theta (\theta^TX^TX\theta - 2\theta^TX^TY) \end{aligned}\)

다음으로 $\text{argmin}$ 이하의 행렬식을 $\theta$ 에 대해 미분한 뒤 그 값이 $0$ 이 되는 $\theta$ 를 찾아내어 $\hat{\theta}$ 를 구할 수 있습니다.

[\begin{aligned} \nabla_\theta (\theta^TX^TX\theta - 2\theta^TX^TY) = 0
2X^TX\theta - 2X^TY = 0
\therefore \theta = (X^TX)^{-1}X^TY \end{aligned}]

최소제곱법 덕분에 우리는 데이터셋이 주어지면 인스턴스의 특성값으로 구성된 행렬 $X$ 와 실제 레이블로 구성된 행렬 $Y$ 를 만든 뒤, 해당 데이터셋을 가장 잘 근사하는 선형 함수의 파라미터 $\theta$ 를 구해낼 수 있게 되었습니다.

하지만 간단해 보이는 최소제곱법에도 단점이 있습니다. 해당 알고리즘이 행렬 연산에 기반한 방식이기 때문에 특성 수에 따라 복잡도가 엄청나게 늘어나게 됩니다. 최소제곱법의 복잡도는 아래와 같습니다.

최소제곱법의 복잡도 인스턴스(샘플)의 개수 $m$ 특성의 개수 $n$
빅 - $O$ 표기법 $O(m)$ $O(n^{2.4} \sim n^3)$

위 표로부터 최소제곱법 알고리즘의 복잡도가 샘플의 개수에는 큰 영향을 받지 않지만, 특성의 개수에는 상당히 큰 영향을 받고 있음을 알 수 있습니다. 분석할 데이터셋이 인스턴스의 개수만 많고 특성의 개수는 적다면 최소제곱법을 사용하는 것이 올바른 방법이 되겠습니다. 하지만 인스턴스가 수십 ~ 수백개 이상의 특성을 가지고 있다면 최소제곱법을 사용하는 것은 너무 많은 시간과 컴퓨팅 자원을 필요로 하게 됩니다. 이런 데이터셋을 분석하기 위해서는 특성의 개수에 큰 영향을 받지 않는 다른 알고리즘을 사용해야 합니다. 다음으로 그런 알고리즘인 경사 하강법에 대해 알아봅시다.

Gradient Descent, 경사 하강법

경사 하강법(Gradient Descent) 은 최소제곱법과 같이 최적의 $\theta$ 를 찾아가는 알고리즘입니다. 경사 하강법에는 비용 함수(Cost function) 라는 개념이 등장합니다. 비용 함수 마다 약간의 차이가 있기는 하지만 큰 범주에서는 예측값과 실제값의 차이, 즉 $f - \hat{f}$ 라고 할 수 있습니다. 우리는 실제값과 가장 유사한 예측값을 알아내는 것이 목적이므로 비용 함수를 최소화하는 방향으로 파라미터 $\theta$ 를 조정해나가게 됩니다. 아래는 경사 하강법이 진행되는 과정을 이미지로 나타낸 것입니다.

grad_desc

이미지 출처 : mc.ai

경사 하강법에 본격적으로 들어가기 전에 선형 회귀에서 가장 흔히 사용되는 비용 함수인 평균 제곱 오차(Mean square error, MSE) 에 대해 알아봅시다. 평균 제곱 오차의 수식은 아래와 같습니다. 아래 식에서 $m$ 은 인스턴스의 개수를, $i$ 는 행의 인덱스를 나타냅니다.

[MSE(X, h_\theta) = \frac{1}{m} \sum^m_{i=1} (\theta^T \cdot x^i - y^i)^2]

평균 제곱 오차의 식을 보면 실제 오차를 제곱하여 더해준 뒤 평균을 구한 값임을 알 수 있습니다. 비록 오차에 제곱을 해주었지만, 우리의 목표는 오차를 정확하게 구하는 것이 아니라 오차를 최소화하는 것입니다. 그렇기 때문에 미분 계산이 더 용이한 평균 제곱 오차를 가장 많이 사용합니다.

이제 본격적으로 경사 하강법을 알아보기 위한 모든 준비가 끝났습니다. 가장 기본적인 경사 하강법에 해당하는 배치 경사 하강법(Batch Gradient Descent) 부터 알아보도록 합시다. 경사 하강법에서 가장 중요한 것은 경사, 즉 그래디언트를 계산하는 것입니다. 우리가 사용할 비용 함수인 평균 제곱 오차에 대한 파라미터 $\theta$ 의 그래디언트는 편도함수(Partial derivative) 를 이용하여 구할 수 있습니다. 편도함수의 수식은 아래와 같습니다.

[\frac{\partial}{\partial \theta_j}MSE(\theta) = \frac{2}{m}\sum_{i=1}^{m}(\theta^T \cdot x^i - y^i)x^i_j]

위 식은 각각의 파라미터 $\theta_j$ 에 대한 편도함수를 나타낸 것입니다. 그래디언트 벡터를 사용하면 이 식을 모든 파라미터에 대하여 행렬식으로 쓸 수 있습니다. 그래디언트 벡터를 사용하여 나타내 보겠습니다.

[\nabla_\theta MSE(\theta) = \left[\begin{array}{c} \frac{\partial}{\partial \theta_0}MSE(\theta) \ \frac{\partial}{\partial \theta_1}MSE(\theta) \ \vdots \ \frac{\partial}{\partial \theta_n}MSE(\theta) \end{array}\right] = \frac{2}{m}\mathbf{X}^T \cdot (\mathbf{X} \cdot \theta - \mathbf{y})]

이제 그래디언트를 구할 수 있게 되었습니다. 이제는 이 그래디언트를 우리의 목표에 맞게 사용하기 위해 목표를 다시 상기시켜 봅시다. 우리의 목표는 비용 함수가 최소가 되는 점, 즉 아래 그림에서 $\theta^\star$ 에 해당하는 점을 찾는 것이었습니다. 아래 그림을 보면 $\theta_0$ 에서 시작하여 $\theta^\star$ 까지 $\theta_1, \theta_2, \theta_3$ 으로 나아갈수록 그래디언트(기울기)가 점점 감소하는 것을 볼 수 있습니다. 그렇기 때문에 우리는 그래디언트(경사)가 $0$ 이 되는 순간까지 감소하는 방향으로 나아가야 합니다.

grad_desc

이미지 출처 : researchgate.net

이를 수식으로 나타내면 아래와 같습니다.

[\theta^{d+1} = \theta^d - \eta \cdot \nabla_\theta MSE(\theta)]

위 식에서 새로운 항 $\eta$ 가 등장했습니다. 학습률(Learning rate) 을 나타내는 $\eta$ 는 경사 하강법에서 가장 중요한 하이퍼파라미터(hyperparameter, 사용자 지정 매개변수) 중 하나입니다. 학습률은 경사 하강법에서 보폭의 크기를 지정하는 것으로 사용자가 지정한 값에 따라 달라지게 됩니다. 아래의 이미지를 참고하여 설명을 이어나가겠습니다.

learning_rate

이미지 출처 : deeplearningwizard.com

위 그림에서 왼쪽은 학습률을 너무 작게 설정한 경우입니다. 학습률이 너무 작으면 특정 반복횟수 내에서 최소점을 찾지 못하는 경우가 있습니다. 물론 반복을 계속하게 되면 최소점에 다다를 수 있겠지만 너무 많은 시간과 컴퓨팅 자원을 소비하게 됩니다. 반대로 오른쪽은 학습률을 너무 크게 설정한 경우입니다. 학습률이 크면 빠르게 최소점으로 다가갈 수 있지만 진행 도중에 최소점을 지나쳐버리는 사고가 발생할 수 있습니다. 이런 문제 때문에 여러 학습률을 설정해보면서 가장 적절한 학습률을 찾아야 합니다. 경우에 따라서는 아래 그림과 같이 처음에는 학습률을 크게 설정한 뒤 점점 감소시켜 나가는 학습률 감소(Learning rate decay) 방법을 사용하기도 합니다. (아래 그림에서 학습률 감소 방법을 사용했을 때에 고정된 학습률을 사용했을 때보다 더 적은 반복수로 최솟값에 다다르는 것을 볼 수 있습니다)

lr_decay

이미지 출처 : deeplearningwizard.com

배치 경사 하강법의 가장 큰 문제는 매번 모든 데이터셋에 대해 그래디언트를 계산한다는 점입니다. 인스턴스의 개수가 많은 데이터셋에 배치 경사 하강법을 적용할 경우 시간이 오래 걸리고 컴퓨팅 자원을 많이 소모하게 됩니다. 확률적 경사 하강법(Stochastic Gradient Descent, SGD) 은 이러한 문제를 개선하기 위한 알고리즘입니다. 확률적 경사 하강법에서는 매 스텝마다 한 개의 샘플을 무작위로 선택한 뒤 하나의 샘플에 대해 그래디언트를 계산합니다. 반복마다 사용되는 인스턴스의 숫자가 하나뿐이기 때문에 훨씬 빠른 속도로 계산을 해낼 수 있습니다. 하지만 인스턴스를 랜덤하게 하나만 선택하기 때문에 배치 경사 하강법보다 불안정하다는 단점이 있습니다.

랜덤하게 선택하지만 매번 다른 인스턴스를 선택하므로 데이터셋 내에 있는 인스턴스 개수 $m$ 만큼 반복할 경우에는 데이터셋을 모두 살피게 됩니다. 이 때 $m$ 번 만큼의 반복을 에포크(Epoch) 라고 합니다. 예를 들어, $1000$ 개의 인스턴스로 구성된 데이터셋에 확률적 경사 하강법을 사용하여 그래디언트를 개선하는 과정을 $10000$ 번 시행한다고 합시다. 이 경우에는 총 $10000 / 1000 = 10$ 에포크 만큼 반복한 것입니다.

미니배치 경사 하강법(Mini-batch Gradient Descent) 은 두 방법의 절충안에 해당하는 경사 하강법 방식입니다. 전체 데이터셋을 사용하거나 하나의 인스턴스만을 선택하지 않고 작은 샘플 세트를 구성하여 경사하강법 알고리즘을 진행해 나가는 방식입니다.

아래는 최소제곱법과 각각의 경사 하강법에 대해 특징을 표로 나타낸 것입니다.

알고리즘 샘플 수가 클 때 특성 수가 클 때 외부 메모리 학습 지원 스케일 조정 필요 하이퍼 파라미터 수
최소제곱법 빠름 느림 X X 0
배치 경사 하강법 느림 빠름 X O 2
확률적 경사 하강법 빠름 빠름 O O >=2
미니배치 경사 하강법 빠름 빠름 O O >=2

Polynomial, 다항 회귀

모든 데이터셋이 직선의 형태를 보이는 것은 아닙니다. 아래 그림을 보며 설명을 이어가도록 하겠습니다.

poly_reg

이미지 출처 : animoidin.wordpress.com

위 그림에서 초록색 직선은 $-2$ 보다 오른쪽에 위치한 데이터는 잘 근사하는 듯하지만, 왼쪽에 위치한 데이터셋은 잘 근사하고 있지 못합니다. 그에 비해 빨간색 포물선은 모든 데이터셋을 그럴듯하게 근사하고 있음을 알 수 있습니다. 다항 회귀(Polynomial Regression) 는 이렇게 직선보다 복잡한 형태를 보이는 데이터를 근사하는 알고리즘 입니다.

다항 회귀는 특성 끼리의 곱이나 한 특성의 거듭제곱을 새로운 특성으로 추가하여 선형 모델을 훈련시킵니다. 예를 들어, 특성이 두 개 $x_1, x_2$ 인 데이터에 새로운 항없이 근사하면 다음 수식과 같은 함수가 됩니다.

[\hat{f_1} = \theta_0 + \theta_1x_1 + \theta_2x_2]

하지만 서로 특성끼리 곱하거나 자기 자신을 제곱함으로써 아래 수식과 같이 데이터의 차원을 늘려줄 수 있습니다.

[\hat{f_2} = \theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_1^2 + \theta_4x_1x_2 + \theta_5x_2^2]

위와 같이 차원이 높은 근사 함수는 낮은 차원의 근사함수보다 훈련 데이터에 더 잘 맞게됩니다. 특히 데이터의 갯수보다 파라미터의 개수가 같거나 많으면 훈련 데이터에 대해서 $100\%$ 의 정확도를 보입니다. 하지만 이럴 경우 훈련 데이터가 아닌 새로운 데이터에는 맞지 않는 현상이 일어납니다. 이런 현상을 과적합(Overfitting)이라고 합니다. 그렇기 때문에 우리는 “훈련 데이터에 어느정도 잘 맞되, 새로운 데이터에도 잘 맞도록” 차원을 조정해야 합니다. 이를 편향-분산 트레이드오프(Bias - Variance Trade-off) 라 하며 이곳 에서 더욱 자세한 내용을 볼 수 있습니다. 머신러닝에서 과적합은 피해야 할 커다란 문제입니다. 그렇기 때문에 교차 검증(Cross validation)1 을 통한 학습 곡선(Learning curve)2 을 사용하여 과적합을 방지합니다.

교차 검증

  1. 폴드(Fold)라고 불리는 서브셋으로 분할한 후 그 중 하나를 검증 세트로 만든다. K개로 나누면 아래 그림과 같이 K개의 데이터셋이 만들어진다. 때문에 K-Fold 교차 검증이라고도 불린다. 이미지 출처 : 네이버 블로그 

  2. 학습 세트와 검증 세트의 학습(검증) 결과를 그래프로 나타낸 것이다. 어떤 지점에서 검증 데이터셋이 최대가 되는지 혹은 과적합이 발생하는지 등을 시각화하여 볼 수 있다. 

Comment  Read more