gradient descent(경사하강법)은 딥러닝, 머신러닝 모델을 학습할 때 매개변수(hyper parameter)를 갱신하여 손실함수의 오차를 최대한 줄이려는 알고리즘이다.
자세히는 손실함수의 기울기를 구해 기울기를 가장 최소화되는 부분을 구하는 것이다.
gradient descent는 함수의 기울기를 이용해 의 값을 어디로 옮겼을 때 함수가 최솟값이 되는지 알아보는 방법이라 할 수 있다.
기울기가 양수라는 것은 가 커질 수록 함수의 값이 커진다는 것이고 음수라면 가 커질 수록 함수의 값이 작아진다는 것을 의미한다

그렇다면 기울기를 알면 어디로 옮겨야 할지 알 수 있다.
이 때 이동거리를 조절할 수 있게 step size 조절 인자를 넣기도 한다.
는 learning late(step size)
최종 수식은 다음과 같다.
step size가 큰 경우 한 번 이동하는 거리가 커지므로 빠르게 수렴할 수 있다는 장점이 있다. 하지만, step size를 너무 크게 설정해버리면 최소값을 계산하도록 수렴하지 못하고 함수 값이 계속 커지는 방향으로 최적화가 진행될 수 있다.
또, 한편 step size가 너무 작은 경우 발산하지는 않을 수 있지만 최적의 를 구하는데 소요되는 시간이 오래 걸린다는 단점이 있다.

Gradient descent의 또 다른 문제는 local minima 문제이다. 실제로 우리가 찾고 싶은 것은 아래의 그림에서 볼 수 있는 빨간점이 표시하는 global minimum이지만,gradient descent 알고리즘을 시작하는 위치는 매번 랜덤하기 때문에 어떤 경우에는 local minima에 빠져 계속 헤어나오지 못하는 경우도 생긴다.

이러한 gradient descent의 종류에는 여러가지가 있는데 몇 가지를 소개해보자면
전체 데이터를 사용해 매개변수를 갱신한다.
특징:
하나의 데이터를 사용해 매개변수를 갱신한다.
특징:
전체 데이터를 batch_size개씩(사용자 지정) 나눠 배치로 사용해 매개변수를 갱신한다.
BGD와 SGD를 합친 방법이다.
특징:
이 때 batch_size를 지정할 때 GPU의 VRAM 용량에 따라 Out of memory가 발생하지 않도록 정해줘야 한다.
또한 학습데이터 갯수가 나누어떨어지면 좋은데 예를 들어, 530 개의 데이터를 100개의 배치로 나누면, 각 배치 속 데이터는 1/100 만큼의 영향력을 갖게 된다. 그러나 마지막 배치(30개)의 데이터는 1/30의 영향력을 갖게 되어 과평가되는 경향이 있다. 그렇기 때문에 보통 마지막 배치의 사이즈가 다를 경우 이는 버리는 방법을 사용한다.
가중치를 업데이트 할때 이전 가중치의 업데이트값의 일정 비율을 더하는것으로, 가중치가 local minimum에 빠지지 않고 학습하는 방향대로 가도록 하는 방법이다.
사용 이유:
확률적 경사하강법의 단점은 비등방성함수에서 즉, 방향에 따라 자주 기울기가 달라지는 함수에서 탐색경로가 지그재그로 되어 비효율적이다
모멘텀 알고리즘은 이런 단점을 보안하기 위하여 제안된 알고리즘이다. 즉 기존 탐색방향을 고려하여 매개변수를 갱신함으로써 진동하는 것을 방지할 수 있다.
여기서 는 모멘트 효과에 대한 가중치이다. 는 0으로 초기화되어 있고 반복이 될 때마다 현재의 그래디언트 가 다음번 모멘트 에 누적된다.
특징:
일 때는, 경사가 가파른 곳에서 빠르게 이동하고 안장점 혹은 지역적 최소 지점을 벗어나기에 유리하다.
일 때는, 경사 하강법과 동일하다.
단점:
https://twojun-space.tistory.com/124
https://www.dbpia.co.kr/pdf/pdfView.do?nodeId=NODE09310459
https://velog.io/@nayoong/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%B5%9C%EC%A0%81%ED%99%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
https://angeloyeo.github.io/2020/08/16/gradient_descent.html
https://mangkyu.tistory.com/34
https://skyil.tistory.com/68