경사하강법은 미분계수를 사용해 함수의 최소값을 찾아가는 방법이다. 기계학습에서 cost function(손실함수, 목적함수)을 최소화하기 위해 사용한다.
$$ (H)x = Wx + b $$
$$ cost(W) = \frac{1}{m} \sum_{i=1}^m(Wx^{(i)}-y^{(i)})^2 $$
Cost function 이란 데이터와 데이터를 토대로 만든 모델 사이의 거리를 구해서 최적의 모델을 만들 수 있도록 하는 함수를 정의한 말이다. 쉽게 말해 실제 데이터와 예측 데이터 간의 거리, 즉 에러(잔차)를 구하는 것으로 이 거리가 적을 수록 실제 데이터에 모델이 fit되어 최적화가 되었다고 하는 것이다. Cost function은 우리의 목적이 되는 함수기 때문에 목적함수라는 이름으로도 불린다.
위의 식을 보면 Cost function은 이차 함수로 우리가 잘 알고 있는 이차 함수 그래프를 그릴 수 있다.
목적함수를 통해 찾고자 하는 것은 Loss, 손실이 최소인 weight을 찾는 것으로 이때 미분을 사용한다. 미분을 한다는 것은 그래프의 곡선에서 접선의 기울기를 구하는 것이다. 바로 이 접선의 기울기가 0인 지점이 상단의 이미지의 빨간점 즉 손실이 최소인 지점이다.
경사(기울기)를 점차 줄여가면서 최소지점을 찾아가는 방법이 바로 경사하강법이다.
* 그렇다면 여기서 드는 의문점은 왜 한번에 미분으로 기울기가 0인 지점을 구하지 않는가?
- 실제 데이터에서 보게되는 함수 들은 닫힌 형태(closed form)이 아니거나 함수의 형태가 복잡해 미분을 하기 어려운 경우가 많기 때문 이다. 또한 데이터 양이 큰 경우 경사하강법 같이 iterative 한 방법을 사용하면 계산량 측면에서 더 효율적으로 해를 구할 수 있다.
다음은 기울기를 줄여가는 방법에 대해 알아보자.
기울기가 음수라면 x가 커질수록 y값이 작아지고 기울기가 양수라면 x가 커질수록 y값도 커진다. 이를 이용해 기울기 부호가 양수라면 음의 방향으로 옮겨야 하고, 부호가 음수라면 양의 방향으로 x를 옮겨가면서 최소값을 찾아 간다.
방향을 정했으니 얼마나 이동할지도 정해야 한다. 기울기를 줄여나가는 이동거리를 step size 라고 부르고 이 step size에 따라 얼마나 이동하면서 기울기를 업데이트를 할지가 정해진다. step size가 큰 경우 이동거리가 커지므로 빠르게 수렴 할 수 있다는 장점있지만 최소값을 건너뛰어 버려서 수렴하지 못하고 발산 해버릴 수 있다. 또 step size가 너무 작은 경우 시간이 너무 오래 소요되고 최소 지점까지 도달하지 못할 수도 있다. 이 step size를 결정하는데에는 학습률이라는 파라미터가 필요한데 이에 관한 포스팅은 따로 하겠다.
또 다른 문제로 Global minimum을 찾지 못하고 Local minimum으로 빠지는 문제가 있다. 기울기가 0인 지점이 꼭 한 곳만 존재 하지 않기 때문이다. 우리가 찾고 싶은 것은 제일 낮은 곳인 빨간 점이지만 local minimum인 노란점에 빠져 나오지 못하는 경우가 생긴다.
확률적 경사하강법(Stochastic Gradient Descent)
전체 데이터를 사용하는 것은 한정된 리소스에서 비효율적이기 때문에 학습 데이터셋에서 무작위로 한 개의 샘플 데이터 셋을 추출하고, 그 샘플에 대해서만 기울기를 계산하는 방법이다. 학습 속도가 매우 빠르고 매우 큰 데이터 셋도 학습가능 하지만 무작위 추출을 하므로 노이즈가 매우 심하고 불안정하다.
미니 배치 경사하강법(mini-batch gradient descent)
BGD와 SGD의 절충안으로 전체 데이터를 배치 사이즈로 나눠 미니 배치로 학습시키는 방법이다. 예를 들어 전체 데이터가 1000개, 배치사이즈가 100이라면 전체를 100개씩 총 10묶음으로 나누어 1 epoch당 10번 경사하강법을 진행한다. 배치 경사하강법보다 계산량이 줄고 shooting이 적당히 발생해서 로컬미니멈에 빠지는 것을 어느정도 회피 할 수 있다. 학습에서 경사하강법이라고 하면 보통 이 미니 배치 경사하강법을 사용하는 것을 말한다.
Batch size 정하기
배치 사이즈는 보통 2의 n승으로 정하며 ram 용량에 따라 Out of memory가 나지 않도록 정해줘야 한다.
가능한 학습데이터 개수에 나누어 떨어지도록 하는 것이 좋은데 마지막 남은 배치가 다른 사이즈면 해당 배치의 데이터가 학습에 더 큰 비중을 가져 과도한 평가를 하게 되기 때문이다. 그렇기 때문에 보통 마지막 배치 사이즈가 다를 경우 이를 버리는 방법을 사용한다.
이어서 경사하강법을 보완한 다른 방법들...
참조 : https://angeloyeo.github.io/2020/08/16/gradient_descent.html
'머신러닝 > 딥러닝' 카테고리의 다른 글
FastText, Glove (0) | 2022.07.04 |
---|---|
가중치 초기화 (0) | 2022.07.03 |
배치 정규화, 레이어 정규화 (0) | 2022.07.03 |
역전파 Backpropagation (0) | 2022.06.19 |
경사하강법 Gradient Descent (2) (0) | 2022.06.18 |