특정 값을 예측하기 위해서는 모델을 훈련시켜야 합니다
모델 훈련
먼저 가장 간단한 모델 중 하나인 선형 회귀부터 시작합니다. 선형 회귀를 훈련시키는 2가지 방법이 있습니다.
선형회귀란?
한 개의 독립 변수와 한 개의 종속 변수 간의 관계를 나타내며, 그 관계는 직선으로 표현됩니다.
선형 회귀 훈련 방법
1. 직접 계산할 수 있는 공식을 사용하여 훈련셋에 가장 잘 맞는 모델 파라미터(즉, 훈련셋에 대해 비용 함수를 최소화하는 모델 파라미터)를 구합니다
2. 경사 하강법(GD)이라 불리는 반복적인 최적화 방식을 사용하여 모델 파라미터를 조금씩 바꾸면서 비용함수(RMSE)를 훈련셋에 대해 최소화시킵니다.
- RMSE(X, h)는 가설 h를 예제들에 적용해 측정한 비용 함수 -> 즉 모델 파라미터를 조절하면서 RMSE(X, h)의 값을 최소화 시켜야 합니다.
선형 회귀
선형 회귀가 어디서 주로 사용되는지 대표적인 예시를 먼저 확인하겠습니다.
- 주택 가격 예측
사례: 부동산 시장에서 주택의 가격을 예측하고자 할 때.
설명: 주택의 면적, 방의 개수, 위치, 연식 등의 특성 값을 이용하여 주택의 가격을 예측할 수 있습니다. - 매출 예측
사례: 소매업체가 월별 매출을 예측하고자 할 때.
설명: 광고 비용, 프로모션, 계절성 등의 특성 값을 사용하여 월별 매출액을 예측할 수 있습니다. - 급여 예측
사례: 특정 직무나 산업에서 직원의 급여를 예측하고자 할 때.
설명: 경력, 학력, 지역, 직무 종류 등의 특성 값을 사용하여 급여 수준을 예측할 수 있습니다. - 의료 분야
사례: 환자의 병원 체류 기간을 예측하고자 할 때.
설명: 환자의 나이, 병력, 현재 상태, 치료 방법 등의 특성 값을 사용하여 병원 체류 기간을 예측할 수 있습니다. - 광고 효과 분석
사례: 광고 캠페인의 효과를 분석하고자 할 때.
설명: 광고 노출 횟수, 광고 비용, 클릭률 등의 특성 값을 사용하여 판매량 증가 또는 웹사이트 방문자 수를 예측할 수 있습니다. - 경제 예측
사례: 경제 지표를 예측하고자 할 때.
설명: 실업률, 금리, 소비자 지출 등의 특성 값를 사용하여 GDP 성장률, 인플레이션 등의 경제 지표를 예측할 수 있습니다. - 에너지 소비 예측
사례: 가정이나 산업의 에너지 소비량을 예측하고자 할 때.
설명: 외부 온도, 가전제품 사용 시간, 가구 수 등의 특성 값을 사용하여 에너지 소비량을 예측할 수 있습니다.
간단한 삶의 만족도에 대한 간단한 선형 회귀 모델입니다
이 모델은 1인당_GDP에 대한 선형 함수입니다 (⍬0 + ⍬1이 모델 파라미터, 즉 각 특성의 중요도를 결정하는 가중치를 의미)
더 일반적으로 선형 모델은 아래 식처럼 입력 특성의 가중치 합(⍬1,⍬2,...⍬n)과 절편(⍬0 편향)이라는 상수를 더해 예측을 만듭니다.
가중치: 특성의 중요도를 결정합니다. (ex. ⍬ 가중치가 높으면 특성의 중요도가 올라가고 반대로 낮으면 중요도가 낮아진다)
편향: 편향은 ⍬0 로 y 절편을 결정하는데 사용됩니다.
위에 언급한 식을 아래처럼 벡터 형태로 더 간단하게 표현될 수 있습니다.
- 편향은 주로 입력 데이터에 1을 추가하여 사용됩니다.
선형 회귀 모델이 무엇인지 알아봤습니다, 다음으로는 선형 회귀 모델을 훈련시키는 방법입니다.
선형 회귀 모델 성능지표 (RMSE)
이제 훈련을 시킵니다. 모델을 훈련시킨다는 것은 훈련셋에 가장 잘 맞도록 모델 파라미터를 설정하는 것입니다.
선형 회귀 모델을 훈련시키려면 RMSE(비용함수)를 최소화하는 ⍬(모델 파라미터)를 찾아야합니다.
> RMSE 란 회귀에 가장 널리 사용되는 성능 측정 지표
> 비용함수가 0이면 완벽한 것이고, 가장 작을 때 선택한 모델 파라미터가 무엇인지를 구해야 합니다.
실제로 RMSE보다 MSE를 최소화하는 것이 같은 결과를 내면서 더 간단합니다. (결국 MSE는 RMSE에서 root를 뺀 것이기 때문)
훈련셋 X에 대한 선형 회귀 가설 h⍬의 MSE는 다음과 같이 계산합니다.
선형 회귀 모델의 MSE 비용함수
위에 비용함수를 간단하게 MSE(⍬)라고 표기할 수 있습니다
정규방정식
위 선형 회귀 모델의 비용 함수를 최소화하는 ⍬값을 찾기 위한 방법이 수학 공식이 있는데 이것을 바로 정규방정식이라고 합니다.
> 비용함수는 0에 가까울수록 완벽한 것이기 때문에 가장 작게 만드는 ⍬값을 찾아야한다.
정규방정식
X: 특성값을 포함하는 행렬
X^T: 특성값을 포함하는 행렬의 전치(X축과 Y축을 바꾼 것)
y: 정답이 들어있는 타겟 벡터
정규방정식을 사용하면 RMSE를 최소화 시키는 ⍬ 모델 파라미터를 구할 수 있습니다, 그러면 무조건 모델 파라미터를 한번에 구하는 정규방정식을 사용하는게 더 좋은게 아닌가라?는 생각이 듭니다.
-> 하지만 정규방정식을 사용하는 것이 항상 좋은 것은 아닙니다. 왜냐면 정규방정식은 (n + 1) x (n + 1) 크기가 되는 X^T * X의 역행렬을 계산합니다 (n은 특성 수). 즉 역행렬을 계산하는 시간 복잡도는 일반적으로 O(n^2.4)에서 O(n^3)사이 즉 다시 말해 특성 수가 두 배로 늘어나면 계산 시간이 대략 5.3에서 8배로 증가합니다.
정규방정식을 쉽게 이해하려면 위에 MSE를 보면서 생각하면 간단합니다.
( ) 내부에 있는 값들(오차)이 결국 0이 되면 좋은 것입니다, 그러기 위해서 해당 식을 0이 되도록 만드는 것 입니다.
정규방정식 구하는 코드
정규방정식은 RMSE를 최소화하는 ⍬값을 찾기 위한 방법이 수학 공식입니다, 이 수학 공식을 풀게 되면 비용함수를 최소화시키는 각 특성값 ⍬를 구할 수 있게 됩니다.
먼저 정규방정식으로 최소 특성값을 구하기 위해서 데이터를 임의로 만듭니다.
import numpy as np
np.random.seed(42) # to make this code example reproducible
m = 100 # number of instances
X = 2 * np.random.rand(m, 1) # column vector
y = 4 + 3 * X + np.random.randn(m, 1) # column vector
- y = 4 + 3x 에 X를 특성값으로 입력하고 표준정규분포에서 난수를 생성하여 잡음(np.random(m, 1)을 추가합니다
import matplotlib.pyplot as plt
plt.plot(X, y, "b.")
plt.xlabel("$x_1$")
plt.ylabel("$y$", rotation=0)
plt.axis([0, 2, 0, 15])
plt.show()
- 이후 그림을 그려서 결과를 확인해봅니다.
- 난수를 생성하여 잡음을 추가했기 때문에 데이터가 튀는 것을 확인할 수 있습니다.
theta_best = np.linalg.inv(X_b.T @ X_b) @ X_b.T @ y
- 위 코드는 다름이 아닌 위에서 정규방정식을 그대로 구한 결과입니다.
- @는 파이썬에서 행렬곱 연산자를 의미합니다.
- 실행 결과로 RMSE를 최소화하는 특성값 각각 ⍬0은 4.2, ⍬1은 2.7 정도가 나오는 것을 확인할 수 있습니다.
- y = 4 + 3x 에서 ⍬0은 4, ⍬1은 3인 것을 확인할 수 있었지만 랜덤으로 잡음을 추가하여 값이 다른 것도 확인할 수 있습니다.
경사 하강법
여러 종류 문제에서 최적의 해법을 찾을 수 있는 일반적인 최적화 알고리즘
정규방정식으로 계산을 하여 최적의 특성값을 찾는 방법이 있었지만 계산 복잡도가 너무 높다는 것을 알 수 있었습니다.
계산 복잡도 문제를 극복하기위해 경사 하강법을 이용하여 최소 비용함수를 구할 수 있겠습니다.
경사 하강법의 기본 아이디어는 비용 함수를 최소화하기 위해 반복해서 파라미터를 조정해가는 것입니다.
경사 하강법 기본 절차
- 파라미터 백터 ⍬에 대해 비용 함수의 현재 그레이디언트(기울기)를 계산
- 그레이디언트가 감소하는 방향으로 진행 (즉, 파라미터 벡터 ⍬를 조정)
- 그레이디언트가 0이 될 때까지 반복 (0이 되면 최소값에 도달)
어두운 밤에 헬리콥터를 타고 산 정상에서 내려서 불빛 없이 하산을 한다는 느낌으로 이해를 하면 되겠습니다. - 아무것도 보이지 않기 때문에 기울지만으로 하산을 완료했는지 판단합니다.
학습률의 중요성
학습률이 작을 때
- 학습률이 너무 크면, 큰 값으로 발산되어 해법을 찾지 못할 수도 있습니다.
- 중간 중간에 지역 최소값을 건너뛸 수 있습니다
학습률이 클 때
- 학습률이 너무 작으면, 반복이 많이 진행되고 시간이 오래 걸립니다.
- 학습하는데 시간이 오래 걸립니다.
- 중간 중간에 지역 최소값을 건너뛸 수 없습니다.
지역 최소값과 전역 최소값
- 지역 최소값은 말 그대로 전체적인 그림이 아닌 특정 지역에서 최소값이라고 해석될 수 있습니다.
- 전역 최소값은 전체적인 그림에서 가장 기울기가 낮은 값을 의미합니다.
경사 하강법의 문제점
지역 최소값과 전역 최소값을 알게 되었다면 이제 경사 하강법의 문제점도 이해할 수 있습니다.
산에서 내려올 때 기울기라는 감각만으로 하산을 완료했는지 판단합니다, 하지만 경사도가 최솟값이라고 하여 하산이 완료됐다고 판단하기에는 너무 섣부릅니다. 지역 최솟값이 존재하기 때문이죠. 또는 평지가 존재하면 다 내려왔다고 착각을 할 수 있게 됩니다.
위에 그림을 통해서 이해할 수 있습니다.
왼쪽에서 시작하면 학습에 의해 지역 최소값에 수렴하게 되며 전역 최소값보다 좋지 않은 결과를 얻게 됩니다.
오른쪽에서 시작하면 평지를 지날 때 시간이 오래 걸리며 하산 완료했다고 착각하여 멈추게 된다면 전역 최소값에 도달하지 못합니다.
경사 하강법은 추가적으로 특성의 수가 많아져도 상관은 없으나 인스턴스 개수에는 민감합니다.
- 비용함수가 적게 나오는 경사도를 계산하는데 오래걸리기 때문
MSE 비용함수
그림에서 곡선은 자연스럽게 이어지는데 이는 MSE 비용 함수 때문입니다.
선형 회귀를 위한 MSE 비용 함수는 곡선에서 어떤 두 점을 선택해 선을 그어도 곡선을 가로지르지 않는 볼록 함수 입니다.
- 볼록 함수란? 두 점을 이은 선분이 두 점 사이에서 항상 곡선 위에 위치할 경우를 볼록 함수, 아래에 위치할 경우 오목 함수라고 합니다.
- 다시말해 그릇(볼록함수) 위에서 기울기가 낮은 곳으로 미끄러져 내려간다고 생각하면 이해하기 쉽습니다. (하단에 그릇 언급)
이는 지역 최솟값이 없고 '단 하나'의 전역 최솟값만 있다는 뜻입니다. 또한 연속된 함수이고 기울기가 갑자기 변하지 않습니다. 이 두 사실로부터 경사 하강법이 전역 최솟값에 가깝게 접근할 수 있다는 것을 의미합니다(학습률이 너무 높지 않고 충분한 시간이 주어지면)
특성 스케일링과 경사 하강법
- 선형 회귀의 비용 함수는 그릇 모양입니다.
- 가운데는 그릇의 바닥으로 비용함수가 최소값이 되는 곳(목적지)을 의미합니다. - 특성들의 '스케일이 매우 다르면' 길쭉한 모양 그릇이 될 수 있습니다.
- 경사 하강법 알고리즘이 최소값에 도달하는데 '긴 시간'이 걸릴 수 있습니다.
- 경사 하강법 사용 시 반드시 모든 특성이 '같은 스케일'을 갖도록 해야 합니다.
✓ 예, sklearn 의 StandardScaler
왼쪽 그림
- 특성 스케일링을 적용하여 특성 값의 스케일이 같아졌습니다.
- 스케일이 같으면 ⍬1과 ⍬2의 스케일이 같기 때문에 빠르게 비용함수 최소값을 찾을 수 있게 됩니다.
- 예를들어 ⍬1의 값이 0~100만까지 있고 ⍬2는 0~10의 값을 가진다면 표현하는데 문제가 생길 수 있습니다.
- 스케일링은 여러 종류가 있지만 StandardScaler는 값들을 평균이 0, 분산이 1인 값으로 바꿔줍니다.
- 직선으로 경사에 따라서 곧바로 내려가기 때문에 최소값으로 빠르게 수렴합니다
오른쪽 그림
- 특성 스케일링을 적용하지 않았다면 특성 값의 스케일이 다르기 때문에 ⍬1과 ⍬2의 값의 범위가 다르게 됩니다.
- 예를들어 ⍬2의 크기가 ⍬1보다 작으므로 ⍬2는 ⍬1보다 값의 스케일이 작을 것이라고 추측할 수 있겠습니다.
- 직선이 아닌 곡선을 통해 간다는 것은 여러 경사를 계산하면서 내려가는 것을 의미하기 때문에 더 오래걸립니다.
- 앞만 보면 되는 것이 아닌 주변을 다 흝어봐야 어느 방향이 경사도가 낮은지를 찾을 수 있기 때문입니다.
그림은 모델 훈련이 비용 함수를 최소화하는 모델 파라미터의 조합을 찾는 일임을 설명해줍니다.
이를 모델 파라미터 공간에서 찾는다고 말합니다. 모델이 가진 파라미터가 많을수록 이 공간의 차원은 커지고 검색이 더 어려워집니다. 300차원의 건초더미에서 바늘을 찾는 것은 차원이 3개뿐일 때보다 훨씬 어렵습니다. 다행히 선형 회귀의 경우 비용 함수가 볼록 함수(그릇 모양)이기 때문에 이 바늘은 그릇의 맨 아래에 있을 것입니다.
배치 경사 하강법
경사 하강법은 "비용 함수를 최소화하기 위해 반복해서 모델 파라미터⍬j를 조정해가는 것"이 관점입니다
그럼 경사 하강법을 구현하려면 각 모델 파라미터 ⍬j에 대해 비용 함수의 기울기를 계산해야 합니다. 다시 말해 ⍬j 가 조금 변경될 때 비용 함수가 얼마나 바뀌는지 계산해야 합니다. 이를 편도함수라고 합니다.
배치 경사 하강법은 나아가기 위해서 하나의 경사도만 찾는 것이 아닌 모든 차원에 대해서 편도함수로 계산하여 최적의 경사도를 찾습니다
ex. 하산할 때 한 방향만 발을 내딛어서 기울기를 측정하는 것이 아닌 360도로 다 발을 내딛어봐서 기울기를 측정 후 하산하는 것
그렇게 모든 차원에 대해서 계산을 한다면 차원의 수(특성의 수)가 많을수록 계산이 오래걸린다는 것을 의미합니다.
하지만 그렇게 오래 걸린다는 단점만 존재하는 것은 아닙니다. 오래 걸리는 대신 정확하다는 장점이 있습니다.
배치 경사 하강법 구현
비용함수가 최소값으로 수렴하는 모델 파라미터를 배치 경사 하강법으로 구하기 위해서는 다음 편도함수를 먼저 알아봅시다.
위 그림은 비용 함수의 편도함수입니다. (MSE에 ⍬의 값이 들어갔을 때 비용함수가 구해지게 됩니다)
- 편도함수란 모델 파라미터⍬ 가 조금 변경될 때 비용 함수가 얼마나 바뀌는지 계산해주는 함수입니다.
- 즉 편도함수를 사용하면 비용 함수가 a1에서 a2로 변했을 때 모델 파라미터⍬ 가 얼마나 변경되었는지 알 수 있습니다.
위 그림 가운데 식처럼 편도함수를 각각 계산하는 대신에 왼쪽 식(그레이디언트 벡터)처럼 한꺼번에 계산할 수 있습니다.
- 그레이디언트 벡터는 비용함수를 의미합니다
식을 계산하여 레이디언트 벡터가 구해지면 반대 방향인 아래로 가야 합니다. ⍬에서 그레이디언트 백터를 빼야 한다는 뜻입니다.
- ⍬는 현재 위치, 그레이디언트 벡터는 내려가는 정도
현재 위치(⍬)와 내려가는 정도(그레이디언트 벡터값)를 알게 되었으면 이제 경사도에 따라서 내려가면 됩니다.
즉 현재 위치 - 내려가는 정도, 다시말해 위에 식을 사용합니다. n은 학습률을 의미합니다.
이를 코드로 구현해보면 다음과 같습니다.
- eta는 학습률을 의미합니다
- n_epochs는 몇번 발걸음을 옮길 것인지, 몇번 경사도를 구해 내려갈 것인지를 의미합니다.
- theta는 랜덤으로 만들어진 모델 파라미터들입니다.
- 위에서 구한 그레이디언트 벡터와 현재 위치(theta)를 이용하여 경사도에 따라 내려갑니다.
eta = 0.1 # learning rate
n_epochs = 1000
m = len(X_b) # number of instances
np.random.seed(42)
theta = np.random.randn(2, 1) # randomly initialized model parameters
for epoch in range(n_epochs):
gradients = 2 / m * X_b.T @ (X_b @ theta - y)
theta = theta - eta * gradients
이후 theta를 실행하면 다음과 같이 비용함수를 최소화하는 모델 파라미터의 값을 구할 수 있게 됩니다.
theta
'''
array([[4.21509616],
[2.77011339]])
'''
확률적 경사 하강법 (SGD)
경사 하강법은 "비용 함수를 최소화하기 위해 반복해서 모델 파라미터⍬j를 조정해가는 것"이 관점입니다
배치 경사 하강법의 한계
배치 경사 하강법은 정확하지만 특성의 수가 많을수록 오래 걸린다는 단점이 존재합니다. 그렇기 때문에 이런 부분을 가만하면 다른 방법을 고려할 필요가 있으며 그 방법으로 확률적 경사 하강법이 존재합니다.
확률적 경사 하강법의 특징
확률적 경사 하강법은 배치 경사 하강법과 달리 매 스탭마다 모든 차원(특성의 수)을 고려하지 않고 뜻 그대로 매 스탭에서 한 개의 샘플을 무작위로 선택하고 그 하나의 샘플에 대한 경사도(비용함수)를 계산합니다.
즉 매 반복에서 다뤄야 할 데이터가 매우 적기 때문에 한 번에 하나의 샘플을 처리하면 알고리즘이 확실히 훨씬 빠릅니다. 또한 매 반복에서 하나의 샘플만 메모리에 있으면 되므로 매우 큰 훈련 세트도 훈련시킬 수 있습니다. (SGD는 외부 메모리 학습 알고리즘으로 구현 가능)
확률적 경사 하강법의 단점
하지만 확률적이라는 이름에 걸맞게 이 알고리즘은 배치 경사 하강법처럼 건실하게 모든 데이터를 사용하여 경사도(비용함수)를 계산하는 대신 건실하지 않게 무작위 데이터를 사용하여 최적의 경사도(비용함수)가 나오도록 때려 찍는 것이므로 좋은 파라미터가 구해질 수 있지만 그 파라미터가 최적의 파라미터라고는 할 수 없습니다. (아주 운좋으면 가능하겠지만..)
확률적 경사 하강법의 장점
확률적 경사 하강법의 장점으로는 비용 함수가 매우 불규칙할 때 SGD 알고리즘이 지역 최솟값을 건너뛰도록 도와주므로 확률적 경사 하강법이 배치 경사 하강법보다 전역 최솟값을 찾을 가능성이 높습니다.
확률적 경사 하강법 단점 극복
무작위성은 지역 최솟값에서 탈출시켜준다는 장점이 있지만 전역 최솟값에 다다르지 못하게 한다는 점에서는 좋지 않습니다. 이런 딜레마를 해결하는 한 가지 방법으로는 학습률을 점진적으로 감소시키는 것입니다. 시작할 때는 학습률을 크게 하고(수렴을 빠르게 하고 지역 최솟값에 빠지지 않게 합니다), 점차 작게 줄여서 SGD알고리즘이 전역 최솟값에 도달하게 합니다.
매 반복에서 학습률을 결정하는 함수를 학습 스케줄이라고 부릅니다. 학습률이 너무 빨리 줄어들면 지역 최솟값에 갇히거나 최솟값까지 가는 중간에 멈춰버릴 수도 있습니다. 확습률이 너무 천천히 줄어들면 오랫동안 최솟값 주변을 맴돌거나 훈련을 너무 일찍 중지해서 지역 최솟값에 머무를 수 있습니다.
다음 코드는 간단한 학습 스케줄을 사용한 확률적 경사 하강법의 구현입니다.
n_epochs = 50
t0, t1 = 5, 50 # 학습 스케줄 하이퍼파라미터
def learning_schedule(t):
return t0 / (t + t1)
np.random.seed(42)
theta = np.random.randn(2, 1) # 무작위 초기화
for epoch in range(n_epochs):
for iteration in range(m):
random_index = np.random.randint(m)
xi = X_b[random_index : random_index + 1] # 랜덤 데이터 선택
yi = y[random_index : random_index + 1] # 랜덤 데이터 선택
gradients = 2 * xi.T @ (xi @ theta - yi) # 랜덤 데이터를 이용한 경사도 계산
eta = learning_schedule(epoch * m + iteration)
theta = theta - eta * gradients # theta는 모델 파라미터
- n_epochs: 50번 반복하도록 설정합니다
- t0, t1: 각각 5와 50의 값을 의미하며 학습 스케줄을 구하는 5 / (t + 50) 식에 사용되며 t의 값이 증가하면서 초기 학습률은 비교적 크지만 점차 작게 줄어드는 것을 알 수 있습니다.
- 이후 1000번 (m의 샘플 수) 반복하는 동안 이 코드는 훈련 셋에서 학습 스케줄과 함께 50번(n_epochs) 반복하여 최적의 모델 파라미터를 찾습니다.
위에서 찾은 최적의 모델 파라미터를 확인해보면 ⍬0 은 대략 4.2 ⍬1 은 대략 2.7 인것을 확인할 수 있습니다.
샘플은 무작위로 선택하기 때문에 어떤 샘플은 한 epoch에서 여러 번 선택될 수 있고 어떤 샘플은 전혀 선택되지 못할 수도 있습니다. 알고리즘이 epoch마다 모든 샘플을 사용하려면 훈련셋을 섞은 후 차례대로 하나씩 선택하고 다음 에포크에서 다시 섞는 식의 방법을 사용할 수 있습니다. 그러나 이렇게 한다면 보통 더 늦게 수렴됩니다.
SKlearn에서 제공하는 SGD 알고리즘
SKlearn 이 제공하는 알고리즘을 사용하여 SGD를 직접 구현하지 않아도 됩니다
Sklearn 에서 SGD 방식으로 선형 회귀를 사용하려면 기본값으로 제곱 오차 비용 함수를 최적화하는 SGDRegressor 클래스를 사용합니다. (번외로 분류를 위한 SGDClassifier도 존재합니다) 다음 코도는 최대 1,000번 에포크 동안 실행됩니다 max_iter=1000. 또는 한 에포크에서 0.001보다 적게 손실이 줄어들 때까지 실행됩니다.
하이퍼파라미터의 종류로는 다음과 같습니다.
- max_iter: 최대 반복 횟수
- tol: 허용 오차, 0.001 보다 오차 범위가 크다면 계속 진행하고 작다면 1000번을 모두 실행하지 않고 멈춥니다.
- penalty: 정규화 기법
from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(max_iter=1000, tol=1e-5, penalty=None, eta0=0.01,
n_iter_no_change=100, random_state=42)
sgd_reg.fit(X, y.ravel())
이후 위에서 찾은 모델 파라미터의 값(절편⍬0과 계수⍬1)들은 확률적 경사 하강법을 직접 구현하였을 때 값과 매우 비슷한 값을 얻었음을 확인할 수 있습니다.
sgd_reg.intercept_, sgd_reg.coef_
#(array([4.21278812]), array([2.77270267]))
미니배치 경사 하강법
경사 하강법은 "비용 함수를 최소화하기 위해 반복해서 모델 파라미터⍬j를 조정해가는 것"이 관점입니다
미니배치 경사 하강법이란?
미니배치 경사 하강법은 배치 경사 하강법과 확률적 경사 하강법과 달리 미니배치라 부르는 임의의 작은 샘플 세트에 대해 경사도를 계산합니다. 즉 전체 데이터셋에서 일부 데이터(작은 샘플 데이터셋)만 가지고 경사도를 계산합니다.
미니배치를 어느 정도 크게 하면 이 알고리즘은 파라미터 공간에서 SGD보다 덜 불규칙하게 움직입니다. 결국 미니배치 경사 하강법이 SGD보다 최솟값에 더 가까이 도달하게 될 것입니다. 하지만 지역 최솟값에서 빠져나오기는 더 힘들 수도 있습니다.
미니배치 경사 하강법 장점
확률적 경사 하강법에 비해 미니배치 경사 하강법의 주요 장점은 행렬 연산에 최적화된 하드웨어, 특히 GPU를 사용해서 얻는 성능 향상입니다.
SKlearn에서 제공하는 미니배치 경사 하강법
sklearn에서 제공하는 SGDRegressor 의 batch_size 파라미터를 설정하게 된다면 미니배치 경사 하강법을 구현할 수 있게 됩니다.
from sklearn.linear_model import SGDRegressor
# 미니배치 크기를 지정하여 사용
sgd_regressor = SGDRegressor(max_iter=1000, tol=1e-3, batch_size=32)
sgd_regressor.fit(X_train, y_train)
배치, 확률적, 미니배치 경사 하강법의 차이점
다음은 위에서 언급한 3가지 종류의 경사 하강법이 각각 최소 비용함수를 어떻게 찾아가는지 경로를 보여주는 그림입니다.
확인해보면 모두 최솟값 근처에 도달했지만 배치 경사 하강법의 경로가 실제로 최솟값에 멈춘 반면 확률적 경사 하강법과 미니배치 경사 하강법은 근처에서 맴돌고 있습니다. 그렇지만 배치 경사 하강법에는 매 스텝에서 많은 시간이 소요되고, 확률적 경사 하강법과 미니배치 경사 하강법도 적절한 학습 스케줄을 사용하면 최솟값에 도달한다는 점도 중요합니다.
'AI > Machine Learning' 카테고리의 다른 글
머신러닝 - 결정 트리 (0) | 2024.08.24 |
---|---|
머신러닝 - 서포트 백터 머신 (0) | 2024.08.19 |
머신러닝 - 로지스틱 회귀 (0) | 2024.08.14 |
사이킷런 scikit-learn 이란? (0) | 2024.07.09 |
여러 개의 레이블을 갖는 하나의 데이터 분류하기 - 다중 레이블 분류 (2) | 2024.07.08 |