배치 경사 하강법 문제점
배치 경사 하강법의 문제는 매 스텝에서 전체 훈련 세트를 사용해 그레디언트를 계산한다는 것이다.
훈련 세트가 커지면 매우 느려지는 이유로 확률적 경사하강법을 사용한다.
확률적 경사하강법
매 스텝에서 한 개의 샘플을 무작위 선택하고 그에 대한 그레이디언트를 계산한다.
매 반복에서 적은 데이터를 처리하기에 속도가 매우 빠르며, 1개 샘플에 대한 메모리만 필요하므로 매우 큰 훈련 데이터 셋도 가능하다.
반면에 확률적이기에 배치 경사 하강법보다 불안정하다는 단점이 있다.
또한 매끄러운 하강이 아닌 요동치는 것을 볼 수 있는데, 요동치는 것은 지역 최솟값을 뛰어넘어서 전역 최솟값을 찾게 도와줄 수 있다.
학습률이 너무 천천히 줄어들면 오랫동안 최솟값 주변을 맴돌거나 지역 최솟값에 머무를 수 있다.
이렇게 조절하는 과정들을 학습 스케줄이라고 불린다. (매 반복에서 학습률을 결정하는 함수)
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):
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)
learning_rate = learning_schedule(epoch * m + i)
theta = theta - learning_rate * 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()
샘플을 무작위 선택하기에 어떤 샘플은 한 에포크에서 여러 번 선택될 수 있고 선택이 되지 못할 수도 있다.
그러므로 알고리즘이 에포크마다 모든 샘플을 사용하게 하려면 훈련 세트를 섞은 뒤 차례대로 하나씩 선택하고,
다음 에포크에서 다시 섞는 식의 방법을 사용해야 한다.
사이킷런에서는 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())
sgd_reg.intercept_, sgd_reg.coef_
(array([4.24365286]), array([2.8250878])) 로 정규방정식의 값과 비슷한 값을 얻었다.
미니배치 경사 하강법
각 스텝에서 전체 훈련 세트나 하나의 샘플을 기반으로 그레이디언트를 계산하는 것이 아니라 미니배치라고 부르는 임의의 작은 샘플 세트에 대해 그레이디언트를 계산한다.
미니배치 경사 하강법의 주요 장점은 행렬 연산에 최적화된 하드웨어(GPU)를 사용해 얻는 성능 향상이다.
선형 회귀를 사용한 알고리즘 비교
알고리즘 | 정규방정식 | 배치 경사 하강법 | 확률 경사 하강법 | 미니 배치 경사 하강법 |
m이 클때 | 빠름 | 느림 | 빠름 | 빠름 |
n이 클때 | 느림 | 빠름 | 빠름 | 빠름 |
하이퍼파라미터 수 | 0 | 2 | >=2 | >=2 |
스케일 조정 필요 | X | O | O | O |
사이킷런 | LinearRegression | SGDRegressor | SGDRegressor | SGDRegressor |
'공부하는 습관을 들이자 > Machine Learning For Study' 카테고리의 다른 글
Hands-on ML : 4. 5 릿지(Ridge),라쏘(Lasso),엘라스틱 넷(Elastic-net) 모델 훈련 (0) | 2022.05.20 |
---|---|
Hands-on ML : 4. 3 다항회귀 및 4.4 학습곡선 (0) | 2022.05.19 |
Hands-on ML : 4. 2 경사 하강법 (0) | 2022.05.17 |
Hands-on ML : 4. 선형 회귀 및 계산 복잡도 (시간복잡도, 공간복잡도) (0) | 2022.05.12 |
Hands-on ML : 2.1 실제 데이터로 작업&2.2 큰 그림 보기 (0) | 2022.03.24 |