일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- adp #데이터분석전문가 #데이터분석자격증 #adp후기 #adp필기
- 선형회귀 #정규방정식 #계산복잡도 #LinearRegression #Python #ML
- 티스토리블로그 #티스토리 #PDF #블로그PDF저장
- 객체의종류 #리스트 #튜플 #딕셔너리 #집합 #Python #파이썬 #list #tuple #dictionary #set
- python #dataframe #파생변수 #map #lambda #mapping
- 파이썬 #Python #가상환경 #anaconda #python설치 #python가상환경
- Chap4 #핸즈온머신러닝 #머신러닝 #핸즈온머신러닝연습문제
- 인덱싱 #슬라이싱 #python #파이썬 #수정및삭제 #원소의수정 #객체의함수 #keys#values#items#get#len#append#sort#sorted
- Chap4 #릿지회귀 #정규방정식 #확률적경사하강법 #SGD #규제가있는선형모델
- 라쏘회귀 #엘라스틱넷 #조기종료
- 경사하강법 #핸즈온머신러닝 #머신러닝 #ML
- ML #핸즈온머신러닝 #학습곡선 #편향분산트레이드오프
- Chap4
- 티스토리 #수학수식 #수학수식입력 #티스토리블로그 #수식입력
- 핸즈온머신러닝 #handson
- 키워드추출 #그래프기반순위알고리즘 #RandomSurferModel #MarcovChain #TextRank #TopicRank #EmbedRank
- 확률적경사하강법 #경사하강법 #머신러닝 #선형회귀 #ML #Chap4
- python #파이썬 #pandas #dataframe #dataframe생성 #valueerror
- Chap4 #ML #배치경사하강법 #경사하강법 #핸즈온머신러닝 #핸즈온
- Chap4 #ML #미니배치경사하강법 #경사하강법 #머신러닝 #핸즈온머신러닝
- Chap4 #다항회귀 #PolynomialRegression #ML #머신러닝
- IDE #spyder
- Today
- Total
StudyStudyStudyEveryday
머신러닝 모델 훈련 - 확률적 경사 하강법 (Stochastic Gradient Descent, SGD) 본문
머신러닝 모델 훈련 - 확률적 경사 하강법 (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번만 반복하고도 좋은 값에 도달했습니다.
사이킷런을 이용해 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판을 참고하여 작성하였습니다. *
'DataScience > 핸즈온 머신러닝 Hands-on ML' 카테고리의 다른 글
머신러닝 모델 - 다항 회귀 (Polynomial Regression) (0) | 2022.03.24 |
---|---|
머신러닝 모델 훈련 - 미니배치 경사 하강법 (Mini-Batch Gradient Descent) | 세 가지 경사 하강법 비교 (0) | 2022.03.24 |
머신러닝 모델 훈련 - 배치 경사하강법(Batch Gradient Descent) (0) | 2022.03.24 |
머신러닝 모델 훈련 - 경사하강법(Gradient Descent, GD) (0) | 2022.03.24 |
머신러닝 모델 - 선형 회귀 (Linear Regression) (0) | 2022.03.24 |