SYDLAB_inha/Machine Learning

ML - Gradient Descent / SGD / learning rate / global & local optimum / epoch / mini-batch

빈그레 2023. 9. 10. 19:33

 

 

 


How do we find the best Weight(W)?

(Gradient Descent)

 

 

 

 

 

 

Gradient Descent

 

 

 

- Gradient

Gradient는 특정값에서의 기울기를 의미한다. 

 

- Loss function

loss는 W가 어떻게 되냐에 따라 달라진다. 따라서 loss function은 W에 대한 함수로 표현될 수 있다.

처음에는 임의의 initial weight가 들어가기 때문에 loss가 높을 수 있다.
loss값이 낮아지게 하려면  기울기가 0인 쪽으로 가까워져야 한다. 


w의 변화량 식에 대해 알아보자. 먼저 loss 함수를 weight값에 대해 편미분하여 기울기를 구한다.
기울기가 0인 지점보다 우측에서는 기울기가 양수로 나오는데 기울기가 0인 지점과 가까워지도록 하려면 w값이 작아져야 하고 좌측의 경우 그와 반대 상황이기 때문에 w의 변화율에 -부호를 붙인다.

 

 

 

 

- Learning rate

Learnign rate(학습률)을 조정하여  loss가 작아지게 하기 위해 weight를 얼마나 이동할지를 정하는데,  Learning rate가 너무 작으면 오래걸리고, 너무 키우면 오히려 넘어가서 터져버릴 수 있다. ..!

따라서 적절한 learning rate를 가져야 안전하게 loss를 줄여나갈 수 있다.

 

 

 

 


 

 

 

 


Stochastic Gradient Descent (SGD)

 

 

 

 

 

 

Optimum

 

- Global Optimum 

: 가장 낮은 지점 (혹은 가장 낮은 지점) 을 말한다.

 

 

 

SGD 한계

 

:  시작점에서 내려갔다가 Gradient가 0인 곳을 만나면 그 곳이 global optimum(가장 낮은 곳)이 아님에도 갇혀버릴 수 있다. global optimum 아니지만 중간에 이렇게 갇힐 수 있는 지점들을 local optimum이라 한다.

 

gradient=0이 나오면 멈춰버리는 게 SGD의 한계점이다. 이러한  local optimum에 갇히지 않게 하기 위하여 내려가다가 그 전에 있었던 변화량의 보폭만큼 더 확인해보는 momentum과 같은 기술이 있다.

 

 

 

Gradient Descent Stochastic Gradient Descent의 차이

 

( SGD는 조금 더 부분적으로 이동하는 방법이다. )

 

 

 

Stochastic Gradient Descent (SGD)

 

본래 Gradient Descent는 n개의 데이터에 대해 각각의 i번째 sample별 loss를 더해 평균을 내는 방식으로 전체 loss를 구하며 계산한다.

하지만, 극단적으로 n이 커지면 모델을 한꺼번에 올릴 수 없어 어려움이 있다.

 

이를 해결하기 위한 개념이 batch이다.

 

 

 

 

 

 [ Batch ]

 

: 모델의 매개 변수를 업데이트 하는 데 사용되는 학습 데이터의 작은 부분 집합이다.

예를 들어, 우리에게 1000개의 sample 있는데 이를 한꺼번에 학습시킬만큼 메모리가 크지 않아 에러가 난다. 그래서 sample의 개수를 줄여가며 학습시키다보니, 200개에서는 제대로 돌아가는 것을 확인했다. 

1) 먼저, 1000개의 데이터가 들어오면, 이를 random하게 섞어준다.
2) 이후 앞쪽 200개에 대해서 loss를 구한다.
3) 그리고 그 다음 200개에 대해서 또 계산을 하고 update한다.
4) 이렇게 5번을 돌면 data set 전체를 한 바퀴 돌게 된다. 이를 epoch을 돌았다고 표현할 수 있다.
5) 이후 1000개의 데이터 sample을 다시 한번 random하게 섞고
6) 다시 앞선 200개부터 학습시킨다. 두번째 epoch에서의 첫 200개는 1번째 epoch에서의 200개와 다르다. 

이와 같이 memory가 수용할 수 있는 범위만큼의 데이터 batch 단위로 학습을 시키게 된다.



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ(참고)ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

- Full Batch  (Gradient Descent에서 사용)

 : 전체 학습 데이터셋을 한 번에 사용하여 모델의 매개변수를 업데이트한다. 안정적이지만 비용이 높은 방식이다.

- Mini-Batch 
: 학습 데이터셋을 작은 부분 집합으로 나누고, 각 미니 배치에 대해 모델을 업데이트한다.  Full batch보다 효율적이며 랜덤성이 더해진다. 일반적으로 SGD에서 사용되는 방법이다.


- SGD (확률적 경사 하강법)
: mini-batch의 크기가 1인 경우를 의미하며, 각 데이터 포인트에 대해 매개 변수를 업데이트한다. 이로인해 업데이트가 매우 빠르게 진행되지만 노이즈가 많을 수 있다.

대규모 데이터셋에서 효율적으로 모델을 훈련하면서도 랜덤성을 통해 모델이 지역 최솟값(local optimum)에 갇히지 않도록 도와준다. 

 

 

 

Epoch / Batch / Iteration

 

- epoch

 : 전체 data set을 걸쳐서 한 바퀴 순회하는 횟수 (한 epoch 내에 겹치는 sample 없다)

 

- (mini) batch

: 전체 data set을 한 꺼번에 통과시킬 수 없을 때, gpu에 가동할 수 있을만큼의 선에서 부분 set으로 조각 내는 것     //batch size도 하나의 hyperparameter이다. batch 사이즈 설정에 따라 model이 달라질 수 있다.

 

 

만약, 전체 data의 개수가 batch의 배수로 딱 나누어떨어지지 않으면, 그 나머지는 그냥 버린다. 어차피 random으로 데이터를 계속 돌리며 여러번 에폭을 돌 것이기 때문에, 이전에 버려졌던 데이터는 이후에 random으로 언제든 쓰일 수 있다.에폭을 반복하다 보면 누락되는 sample은 없다.

 

컴퓨터는 2의 n승에 최적화 되어있다. 따라서 batch size를 2의 n승으로 하는 것이 좋다. 만약 최대로 넣을 수 있는 batch size가 40이라도 2의 n승의 수를 맞추기 위하여 down시켜 32개로 사용한다. 이렇게 해야 gpu를 제대로 빠르게 활용할 수 있다. 뉴럴 네트워크에서 시간은 돈이다!!!!!!!!

 

 

 

- iteration

: batch단위로 학습을 시켰을 때의 숫자 즉, batch가 몇 번 돌고 있는지를 세는 것을 말한다. 아래 그림에서 빨간 숫자가 iteration을 세고 있는 것이다.