티스토리 뷰

"해당 포스팅은 Coursera 에서 수강한 Andew Ng 의 deep learning specialization 코스를 요약한 것입니다." 


1. Stochastic Gradient Descent / (Bacth) Gradient Descent / Mini-batch Gradient Descent 

이 3가지의 차이는 몇 개의 examples 을 가지고 gradient descent 를 update 하느냐에 따라 달라진다. Stochastic gradient descent 의 경우, 하나의 데이터 포인트마다 gradient update 을 하고, gradient descsent 는 m 개의 data 전체를 돌았을 때 (1 iteration) 에 update 한다. Mini batch 는 이 중간이라고 할 수 있는데 1 개와  m (데이터 전체 갯수) 사이의 수 n 에 대해서 이만큼의 데이터만을 가지고 gradient descent update.  

 

Mini-batch gradient descent 의 장점은 gradient descent 보다 더 빠르게 최적값으로 converge 한다는 것! m 개의 데이터 전체를 다 돌아야지만 gradient descent 를 하는 게 아니라, mini-batch 마다 update 를 하니까 더 자주, 빠르게 update 를 한다. 단, batch 마다 데이터의 차이가 있어서 어떤 데이터는 더 어려울 수 있기 때문에 gradient descent 가 진동하며 converge 하는 모습을 보인다. 

 

코드를 직접 짜보면 더 확실히 볼 수 있는데, Gradient descent 가 9000 번을 iterate 해야 얻을 수 있는 accuracy 를 mini-batch 를 통해서는 4000 번만에 도달하는 것이 예. 물론, Gradient descent 도 iteration 수를 더 많이 한다면 언젠가 그 accuracy 에 도달할 수 있겠지만, GPU 와 우리의 시간 = $ 

 

stochastic gradient descent 의 경우 oscilate (진동) 이 많다. Gradient descent 의 경우, 꾸준하게 한 방향으로 나아간다.
Mini-batch gradient descent 는 osciliate 가 있긴 하지만, stochastic gradient descent 보다 덜하다.

 

2. Optimization function 

그 전에 weight (w, b) 를 update 할 때는 항상 W = W - learning_rate * dW  를 사용했다. 그런데 이제 dW 를 gradient descent with momentum 혹은 gradient descent with adam 으로 바꿔줄거임! 

※ Gradient Descent with Momentum 

Mini-batch 를 사용하면,  그림에서처럼 (파란선) gradient descent 를 update 하면서 osciliation 이 생긴다. mini-batch 간 데이터가 다르기 때문에. 이렇게 서로 다른 방향으로 꺾이는게 많을수록 convergence 는 느려질 수 밖에 없고, 또 다른 문제는 큰 learning rate 을 쓸 경우 그 방향으로 그대로 튕겨져 나가서 diverging 되는 수가 있음 (보라색 선). 근데 momentum 을 이용하면 이 부분을 완화할 수 있다.

 

 

 

위 그림의 빨간 선과 같이 Osiciliation 이 생긴다고 할 때, 파란 점선은 현재의 mini-batch 를 기준으로 gradient 의 방향을 보여준다. 지난 gradients 에 비하면 상당히 꺾인 모습인 것을 알 수 있다. 그런데 여기에 지난 gradients 의 방향들을 더해 이 진동을 smooth out 하는 것이 gradient descent with momentum 이라고 할 수 있다. v라는 term 이 역할을 할 수 있는데 간단히 말하면 moving average of previous derivatives 라고 할 수 있다.

 

어떻게? 일단 지난 gradients 를  v 에 저장하고 (previous steps 의 gradients 의 exponentially weighted average) 이 값을 gradient descent 에 반영하는 것!

 

v dW 를 구하고 W 를 업데이하는 하는 식은 아래와 같다 ( 초기 v DW 값은 모두 0으로 초기화되어있음). 

이 식에서  v dW[l] 는 속도이고, beta 는 friction 역할을 한다. beta 가 크면 클수록 smooth 되는 정도도 크다 (현재의 gradient descent 보다, previous steps 의 gradients 의 영향력을 더 키우는 거니까). 반대로 beta 가 작을수록 smooth 되는 정도는 작고. 

 

W 를 업데이할 때, W- learning rate * dw 가 아니라 v term 이 추가된 dw 임

 

 

※ Gradient Descent with Adam 

Adam 은 위의 momentum 과 RMSProp (밑에 수식의 S dw, S db) 를 합친 거라고 보면 된다. 그리고 여기에 bias correction 을 더해 최종적으로는 v corrected, s corrected 를 combine 해서 parameters 를 업데이트한다. 

 

 

Adam gradient descent

 


Training data 를 Mini batch 나눌 때 Steps

 

1. Shuffle data. X 랑 Y 과 같은 순서로 섞여야 되기 때문에, 각각 데이터를 shuffle 하는 게 아니라, index 를 shuffle 하는 거임. 

    # Step 1: Shuffle (X, Y)    
    permutation = list(np.random.permutation(m))    
    shuffled_X = X[:, permutation]    
    shuffled_Y = Y[:, permutation].reshape((1,m))

 

2. Partition ((mini_x, mini_y), (mini_x, mini_y), (mini_x, mini_y), ….

3. Handle the end case

마지막 mini batch 는 다른 full mini batch 보다 더 작을 수도 있음. 그니까 for loop 을 이용해서 slicing 으로 mini-batch 를 나눈다면, 마지막 mini-batch slicing 할 때는 for loop 를 벗어나서 하되, index 에도 신경써야 함. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/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
글 보관함