Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

StudyStudyStudyEveryday

머신러닝 모델 훈련 - 확률적 경사 하강법 (Stochastic Gradient Descent, SGD) 본문

DataScience/핸즈온 머신러닝 Hands-on ML

머신러닝 모델 훈련 - 확률적 경사 하강법 (Stochastic Gradient Descent, SGD)

따듯한붕어빵 2022. 3. 24. 21:42

 

확률적 경사 하강법을 소개하는데 앞서, 본 포스팅을 이해하는데 도움이 되는 경사하강법과 배치 경사하강법에 대한 포스팅을 공유하겠습니다.

 

https://eundong64.tistory.com/4

 

머신러닝 모델 훈련 - 경사하강법(Gradient Descent, GD)

경사하강법 경사 하강법 (Gradient Descent, GD)은 여러 종류의 문제에서 최적의 해법을 찾을 수 있는 일반적인 최적화 알고리즘이다. 경사 하강법은 비용함수를 줄이기 위해 반복해서 파라미터를 조

eundong64.tistory.com

https://eundong64.tistory.com/5

 

머신러닝 모델 훈련 - 배치 경사하강법(Batch Gradient Descent)

배치 경사하강법에 대해 설명하기 전, 경사하강법에 대해 설명해놓은 포스팅을 공유하고 시작하겠다. https://eundong64.tistory.com/4 머신러닝 모델 훈련 - 경사하강법(Gradient Descent, GD) 경사하강법 경

eundong64.tistory.com

 

 

 

 

 

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

배치 경사하강법의 가장 큰 문제는 매 스텝에 전체 훈련 세트를 사용해 Gradient를 계산하는 것이다. 반대로 확률적 경사하강법은 한 개의 샘플을 무작위로 선택하고 그 하나의 샘플에 대한 Gradient를 계산한다. 즉, 전체 훈련 세트를 사용하지 않고 랜덤하게 추출한 일부 데이터를 사용한다.

 

장점

  • 따라서 매 반복에서 다루는 데이터가 매우 적어 한 번에 하나의 샘플을 처리하는데 속도가 매우 빠르다.
  • 또한, 매 반복에서 하나의 샘플만 메모리에 있으면 되므로 매우 큰 훈련 세트도 훈련 시킬 수 있다.
  • 확률적 경사하강법의 무작위성 때문에 비용 함수가 매우 불규칙할 경우 지역 최솟값(local optimal)을 건너뛸 수 있어 배치 경사 하강법보다 전역 최솟값(global optimal)을 찾을 가능성이 높다.
  • 한 번에 하나씩 훈련 샘플을 독립적으로 처리하기 때문에 온라인 학습에 잘 맞는다.

단점

  • 확률적이기 때문에 배치 경사 하강법보다 훨씬 불안정하다. 비용함수가 최솟값에 다다를 때까지 위아래로 요동치면서 평균적으로 감소한다. 따라서 알고리즘이 멈출 때 좋은 파라미터를 구할 수 있지만 최적치는 아닐 것이다.
  • 확률적 경사하강법의 무작위성 때문에 전역 최솟값에 다다르지 못할 수 있다.
  • 오차율이 크고 GPU의 성능을 모두 활용하지 못할 수 있다.

 

위 장단점에서 확률적 경사하강법의 무작위성 때문에 발생하는 모순점을 해결하는 한 가지 방법은 학습률을 점진적으로 감소시키는 것이다. 시작할 때는 학습률을 크게하고 (지역최솟값에 빠지지 않게하고) 점차 작게 줄여 전역 최솟값에 도달하게 한다.

 

단, 학습률이 너무 빨리 줄어들면 지역 최솟값에 갇히거나 최솟값에 도달하기 전에 멈취버릴 수도 있고, 학습률이 너무 천천히 줄어들면 오랫동안 최솟값 주변을 맴돌거나 지역 최솟값에 머무를 수 있다. 여기서 매 반복 시 학습률을 결정하는 함수를 학습 스케줄 (learning schedule)이라고 부른다.

 

 

여기서 모델의 레이어층을 하나의 행렬곱으로 볼 수 있다. 따라서 벡터(하나의 데이터)를 넣으면 벡터X행렬 연산을 연속적으로 하게 되는 것이다.

 

다음은 간단한 학습 스케줄을 사용한 확률적 경사 하강법 구현이다.

 

n_epochs = 50
t0, t1 = 5, 50  # 학습 스케줄 하이퍼파라미터

def learning_schedule(t):
    return t0 / (t + t1)

theta = np.random.randn(2,1)  # 랜덤 초기화

for epoch in range(n_epochs):
    for i in range(m):
        if epoch == 0 and i < 20:                 
            y_predict = X_new_b.dot(theta)        
            style = "b-" if i > 0 else "r--"      
            plt.plot(X_new, y_predict, style)     
        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.dot(xi.dot(theta) - yi)
        eta = learning_schedule(epoch * m + i)
        theta = theta - eta * gradients
        theta_path_sgd.append(theta)              

plt.plot(X, y, "b.")                              
plt.xlabel("$x_1$", fontsize=18)                  
plt.ylabel("$y$", rotation=0, fontsize=18)        
plt.axis([0, 2, 0, 15])                           
plt.show()

여기서 epoch는 반복을 얼마나 하는 지를 의미한다. 이 코드에서는 훈련 세트에서 50번만 반복하고도 좋은 값에 도달했습니다.

 

 

이 그래프는 훈련 스텝의 첫 20개를 보여줍니다.

 

 

사이킷런을 이용해 SGD로 선형회귀 수행하기

사이킷런에서는 SGD로 선형회귀를 하면 기본값으로 제곱오차비용 함수를 최적화하는 SGDRegressor 클래스를 사용한다.

 

from sklearn.linear_model import SGDRegressor

sgd_reg = SGDRegressor(max_iter=1000, tol=1e-3, penalty=None, eta0=0.1, random_state=42)
sgd_reg.fit(X, y.ravel())
  • max_iter : 최대로 epoch를 얼마나 실행하는지 설정하는 것이다. (학습을 반복하는 횟수, 수가 너무 크면 과적합이 일어날 수 있음)
  • tol : 반복학습 시 산출되는 loss가 tol보다 큰 경우까지만 학습 진행하도록하는 지점이다. 즉, max_iter에 도달하지 않아도 loss < tol인 경우 학습을 중단한다.
  • eta0 : 학습률로, 0.1인 경우 기본 학습 스케줄을 사용한다.
  • penalty : 규제로 이 코드의 경우 사용하지 않았다.
  • random_state : 코드 반복시 무작위성으로 인해 결과가 계속 바뀌는 것을 방지 해주는 것이다.

 

사이킷런의 SGDRegressor과 SGDClassifier에서 partial_fit 메서드를 이용하면 모델 파라미터를 초기화하지 않고 미니배치 학습을 위해 반복적으로 호출할 수 있다. 하지만 partial_fit 메서드는 fit 메서드와 동일하게 미니배치의 샘플을 하나씩 적용하므로 엄밀히 말하면 미니배치 경사 하강법 알고리즘은 아니다.

 

 

 


* 해당 포스팅은 머신러닝 학습 중 핸즈온 머신러닝 2판을 참고하여 작성하였습니다. *

 

 

 

 

 

 

 

Comments