2022.02.20 - [딥러닝관련/기초 이론] - 경사 하강법(Gradient Descent)
위 글에서 이어진다.
Batch Gradient Descent의 단점
이전 글에서 알아보았던 batch gradient descent의 가장 큰 문제는 무엇일까?
매 step마다 전체 데이터 셋을 사용해 gradient를 계산한다는 것이다.
당연하게도 training set이 증가하면 gradient를 계산하는 속도가 매우 느려진다.
(실험하다보면 또 알 수 있는 것인데, 전체 데이터 셋을 한 번에 학습 시키려고 하면,
내가 설정한 하이퍼 파라미터와 모델이 학습이 잘 되고 있는 건지 확인하는 것이 오래 걸린다. -> 이 경우 시간이 낭비됨)
확률적 경사 하강법(stochastic gradient descent)
반대로 stochastic gradient descent는
- 매 step에서 한 개의 샘플을 무작위로 선택하고,
- 그 샘플에 대한 gradient를 계산한다.
이는 매 iteration마다 다뤄야 할 샘플이 매우 적기 때문에 한 step 당 계산하는 속도가 매우 빠르다.
(한 step당 전체 datasets vs 1개의 datasets)
- 반면 무작위(확률적)으로 샘플링하기 때문에, 이 알고리즘은 batch gradient descent보다 훨씬 불안정하다.
cost function이 최솟값에 다다를 때까지 smooth하게 감소하지 않고 요동치며 감소한다.
시간이 지나면 최솟값에 매우 근접하겠지만 fluctuation이 지속되면서 minimum에 안착하지 못할 수 있다.
아래와 같이 cost function이 매우 불규칙할 때 stochastic gradient descent가 local minimum을 건너뛰도록
도와 줄 수 있다.이는 stochastic gradient descent가 batch gradient descent보다 global minmum을 찾을 가능성이 높다는 의미
이런 무작위성은 local minumum을 탈출시켜서 좋지만 global minimum에 다다르지 못하게 한다는 점에서는 단점이다.
이를 해결할 수 있는 한 가지 방법은 learning rate를 점진적으로 감소시키는 것.
-> 학습을 시작할 때 learning rate를 크게 -> learning rate를 점차 줄여나간다.
이를 annealing(담금질)이라고 함.
(이를 수행해주기 위해 learning rate scheduler가 많이 적용된다)
# original code from https://github.com/rickiepark/handson-ml2/blob/master/04_training_linear_models.ipynb
theta_path_sgd = []
m = len(X_b)
np.random.seed(8138)
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): # data 수만큼 range 0......len(X_b)-1
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) # m전까지 무작위 int
xi = X_b[random_index:random_index+1] # 한 개 sampling
yi = y[random_index:random_index+1] # 정답 sampling
gradients = 2 * xi.T.dot(xi.dot(theta) - yi) # gradient 계산
eta = learning_schedule(epoch * m + i) # epoch와 m, i에 따른 새로운 lr계산
theta = theta - eta * gradients # weight update
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]) # 책에는 없음
save_fig("sgd_plot") # 책에는 없음
plt.show() # 책에는 없음
위는 learning rate schedule를 적용한 stochastic gradient descent 구현
(몇개 주석은 따로 추가함)
아래는 stochastic gradient descent의 20 step의 그래프
샘플을 무작위로 선택하기 때문에 어떤 한 샘플은 여러 번 선택될 수 있고 어떤 샘플은 선택되지 못할 수도 있음
알고리즘의 모든 sample을 사용하게 하려면 training sets를 섞은 후 차례대로 하나씩 선택하고,다음 epoch에서 다시 섞는 식의 방법 적용 가능
(보통은 학습할 때 매 epoch가 끝날 때마다 training set을 shuffling을 해준다
shuffling을 하지 않으면 stochastic gradient descent는
첫 번째 label에 최적화 -> 두 번째 label에 최적화되는 식으로 진행되어,
결국 global minimum에 도달하기 어려움)
다음 글
2022.02.20 - [전체글] - Mini-batch Gradient Descent(미니배치 경사 하강법)
이 글의 내용은 많은 부분 아래 링크인 핸즈온 머신러닝 2판을 참고했으며
영리 목적이 아닌 개인적인 학습을 위해 정리한 내용을 바탕으로 작성했음을 밝힙니다.
내용 참고
'딥러닝관련 > 기초 이론' 카테고리의 다른 글
다항 회귀 (polynomial regression) (0) | 2022.02.21 |
---|---|
Mini-batch Gradient Descent(미니배치 경사 하강법) (0) | 2022.02.20 |
경사 하강법(Gradient Descent) (0) | 2022.02.20 |
Swin Transformer (0) | 2021.11.25 |
Vision Transformer (ViT) 정리 : An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (0) | 2021.11.12 |