저번 포스팅에서 분류에 대한 전반적인 시스템에 대해 알아보았습니다.
이번 글에서는 모델 학습 방법 중 경사하강법을 이용한 학습 방법에 대해 알아보도록 하겠습니다.
지난 포스팅에서 살펴봤던 KNN, SVM 등은 거리 기반 알고리즘으로 최적의 파라미터를 찾기 위해 GridSearch를 해야 한다는 특징이 있습니다.
하지만 이번에 알아볼 학습 방법은 데이터에 맞게 가중치를 갱신하는 방식으로 모델 최적화를 하게 됩니다.
먼저 해결해야할 상황에 대해 정의하고 시작하겠습니다.
아래와 같이 데이터가 분포되어 있습니다.
이때, 이 데이터셋을 가장 잘 설명할 수 있는 직선을 찾는 문제입니다.
즉, 아래의 식에서 $ \theta $를 찾는 선형 회귀 문제입니다.
이 문제를 크게 두 가지 방식으로 직선의 가중치를 찾아보도록 하겠습니다.
정규 방정식(Normal Equation)
첫 번째는 해석적인 방법을 통해 비용 함수를 최소화하는 $ \theta $를 바로 얻을 수 있는 수학 공식을 이용하는 것입니다.
이를 정규 방정식이라고 합니다.
이때 사용하는 $ \theta $의 추정치는 다음과 같습니다.
증명하는 여러 방법들이 존재하지만 간단하게 위의 식이 도출되는 과정을 살펴보겠습니다.
문제 정의를 수식으로 나타내겠습니다.
비용함수인 $J(\theta)$를 최소화하는 것을 목표로 합니다.
$$J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(\hat{y_{i}}-y_{i})^{2} $$
$$J(\theta)=\left\|X\theta-y \right\|$$
$$\hat{\theta}=argmin\left\|X\theta-y \right\|$$
여기서 간단한 예를 들어보겠습니다.
$y=x^{2}$에서 $y$의 최소값을 찾으려면 어떻게 해야 될까요?
다들 자동적으로 x에 관해서 미분을 할 것입니다.
마찬가지로 비용함수를 최소화하는 $\theta$를 구하기 위해서는 위의 식을 $\theta$로 미분해야 됩니다.
따라서 미분을 해주겠습니다.
※ 연속적으로 진행되는 부분이니 코멘트 없이 수식으로 이어나가겠습니다.
$$0=\frac{1}{m}X^{T}(X\hat{\theta}-y)$$
$$X^{T}X\hat{\theta}=X^{T}y$$
$$\hat{\theta}=(X^{T}X)^{-1}X^{T}y$$
위의 과정이 이해가 잘 안 되시면 행렬의 미분에 대해 익숙해지시고 다시 보시면 쉽게 이해되실 겁니다.
이러한 과정을 거쳐 나온 $\theta$를 이용해 한번에 가중치를 구하게 됩니다.
코드로 알아보겠습니다.
먼저 임의의 데이터를 생성해 주도록 하겠습니다.
import numpy as np
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
그리고 정규 방정식을 이용해 $\hat{\theta}$를 구해보도록 하겠습니다.
X_b = np.c_[np.ones((100, 1)), X]
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
3과 4를 기대했지만 잡음으로 인해 살짝 아쉬운 값이 도출되었습니다.
경사 하강법(Gradient Descent, GD)
정규 방정식이 한 번에 값이 나오는 방식이라고 하면 경사 하강법은 반복해서 파라미터를 조정해 가는 방식입니다.
초기에 임의의 값으로 시작해 데이터를 대입해 비용함수가 낮아지는 방식으로 파라미터를 업데이트하게 됩니다.
간단하게 과정을 살펴보겠습니다.
- 임의의 시작 점을 설정합니다.
- 해당 지점의 기울기를 계산해 최솟값 방향으로 일정 step만큼 이동합니다.
- 이동한 부분에서의 기울기를 계산하고 다시 아래 방향으로 나아갑니다.
- 기울기가 0이 되는 지점이 될 때까지 1~3을 반복합니다.
경사 하강법을 하기 위해서 알아야 될 부분이 크게 2가지 있습니다.
식으로 알아보겠습니다.
학습률(learning rate)과 이동 방향입니다.
먼저 최솟값 방향으로 이동하려면 어떻게 해야 될까요?
만약 현재 있는 지점에서 기울기가 음수면 optimal point는 그보다 오른쪽에 있을 겁니다.
따라서 우측(양의 방향)으로 이동하게 해야 됩니다.
하지만 기울기가 양수면 optimal point는 그보다 왼쪽에 있을 겁니다.
따라서 왼쪽(음의 방향)으로 이동시켜야 합니다.
즉, 현재 지점의 기울기와 반대 방향으로 이동해야 합니다.
이것이 위의 수식에서 마이너스가 곱해져 있는 이유입니다.
두 번째로 얼마나 갈지에 대한 내용입니다.
만약 너무 많이 나아간다면 자칫 optimal point를 넘어서 이동할 수 있습니다.
그렇게 되면 아래로 가기보다는 우측 사진처럼 위로 발산하게 될 위험성이 있습니다.
또한 너무 작게 설정해서 미세하게 설정하게 되면 계산 시간이 너무 오래 걸릴수 있습니다.
그리고 local minimum에 빠질 수 있습니다.
그래서 learning rate는 하이퍼파라미터로 여러 가지로 설정하여 최적의 수치를 찾아야 합니다.
이제 경사 하강법에 대한 전반적인 내용이 끝났습니다.
하지만 지금까지 배운 일반적인 경사 하강법은 매 스텝마다 전체 훈련 데이터를 이용해서 계산했습니다.
이러한 방법을 배치 경사 하강법(batch gradient descent)이라고 합니다.
이런 이유로 크기가 큰 데이터를 사용할 때는 계산 비용이 커지게 된다는 단점이 존재합니다.
계산량에 대한 이슈를 보완하기 위해 여러가지 방법이 제시되었습니다.
확률적 경사 하강법(Stochastic Gradient Descent, SGD)
확률적 경사 하강법은 매 스템에서 한 개의 샘플을 무작위로 선택하고 그 하나의 샘플에 대한 그레이디언트를 계산합니다.
매 시도마다 다뤄야 할 데이터가 한 개로 매우 작기 때문에 batch gradient descent 알고리즘보다 훨씬 빠릅니다.
※ 메모리도 절약할 수 있습니다.
하지만 이 알고리즘은 batch gradient descent보다 훨씬 불안정합니다.
시간이 지나면 optimal point에 도달하겠지만 그 과정이 부드럽지 않고 위아래로 요동치는 모습이 나옵니다.
이러한 점이 local minimumt에서 탈출할 수 있도록 해주는 장점도 있지만, 반대로 global minimum에서도 벗어날 단점이 존재합니다.
미니배치 확률적 경사 하강법(Mini-Batch Stochastic Gradient Descent: MSGD)
미니배치 확률적 경사 하강법은 배치 경사 하강법과 확률적 경사 하강법의 중간이라고 생각하시면 됩니다.
각 스텝에서 미니배치라 부르는 임의의 작은 샘플 세트에 대해 그레이디언트를 계산합니다.
작은 샘플 세트를 이용해 병렬적으로 실행할 수 있기 때문에 최근 GPU의 발전으로 가장 최적화된 방법이라고 할 수 있습니다.
배치 경사 하강법보다는 불안정하지만 확률적 경사 하강법보다 덜 불규칙적으로 optimal point로 이동하게 됩니다.
마지막으로 각 모델별 경로를 비교해 보도록 하겠습니다.
이번 포스팅에서는 경사하강법에 대해 공부해 보았습니다.
경사하강법은 optimal problem에서 널리 알려진 효과적인 방법입니다.
각 방법마다의 한계점을 해결하기 위해 여러 가지 방법이 제시되었으니 다양한 논문을 확인해 보시고 자기 실험에 맞는 방법을 선택하는 게 좋을 것 같습니다.
포스팅 내용 중 다른 생각이 있는 분 혹은 수정해야 할 부분이 있으시면 댓글을 통해 그 의견을 나눠보면 너무 좋을 것 같습니다.
※ 본 포스팅의 내용은 핸즈온 머신러닝을 참고하였습니다.
'Machine Learning' 카테고리의 다른 글
[머신러닝#4] 지도학습 - 의사결정 나무(Decision Tree) (0) | 2023.07.06 |
---|---|
[머신러닝 기본#1] 분류 (0) | 2023.06.29 |
[머신러닝#3] 지도 학습 - 로지스틱 회귀(Logistic Regression) (0) | 2023.06.29 |
[머신러닝#2] 지도 학습 - KNN (0) | 2023.05.11 |
[머신러닝#1] 머신러닝 개요 (0) | 2023.05.10 |