경사하강법이란?
경사하강법(Gradient Descent) 방법은, 함수의 최솟값을 찾는데 쓸 수 있는 방법 중의 하나이다.
함수의 최솟값을 찾는 수학적인 방법은, 일단 미분계수가 0인 지점을 찾는데에서 출발한다. 그러나 실제로 우리가 분석에서 맞딱드리게 되는 함수들은 closed form이 아니거나 매우 복잡하여 그 근을 계산하기 어려울 수 있다.
이럴 때, iterative한 방법을 통해 해를 구할 수 있는데 이러한 방법중 하나가 바로 경사하강법이다.
경사하강법의 유도
경사하강법은, 함수의 기울기를 바탕으로 새로운 x값을 갱신하며 최솟값이 어디인지 찾는 방법이다.
- 기울기가 양수일 경우, 함숫값은 커지는 방향이다. 따라서 x값이 줄어드는 방향으로 와야 기울기가 0에 가까워질 것.
- 반대로 기울기가 음수일 경우, 함숫값은 작아지므로, x값이 커지는 방향으로 와야 기울기가 0에 가까워질 것.
또한 기울기가 클수록, 원하는 x값의 위치에서 더 멀어져있음을 알 수 있다.
위의 상황을 수식으로 표현하면 다음과 같다.
여기서, α는 Learning Rate, 즉 학습률을 의미한다. 즉 학습의 속도를 조정하는 역할을 하는데 학습률의 올바른 설정은 중요하다.
- 학습률이 너무 작을 경우
* 알고리즘이 수렴하기 전에 반복을 많이 진행해야 하므로, 학습 시간이 많이 소요된다.
* Global Mininum이 아닌, Local Minimum에 도달할 수 있다.
- 학습률이 너무 클 경우
* 학습 시간이 적게 걸린다.
* step이 너무 커, global minimum을 지나쳐 최솟값에서 멀어질수도 있다.
경사하강법의 치명적인 단점
아무튼 iterative 하게 가는 것은 좋다. 그러면 첫 시작은 어디에서 하게 될 것인가? 현재 상태의 경사하강법에서는 첫 시작은 랜덤한 point로 빠지게 된다. 그러면 특정 상황에서는 Local Minima로 빠질수도 있다. local minima에 한번 빠지면 그 점에서는 기울기가 0이 되므로, 위의 식에 대입해보면 절대로 그 값에서 빠져나와서 본래의 global minimum을 찾을 수가 없다.
BGD, SGD
경사하강법의 대표적인 예시에는 BGD와 SGD가 있다. 이들이 나뉘는 가장 큰 기준은 모든 데이터의 편도 함수를 구할 것인지, 일부(특히 1개)의 데이터에 대해서만 처리할 것인지로 차이가 나뉘게 된다.
BGD (Batch Gradient Descent)
BGD, 배치 경사하강법은 전체 데이터 셋에 대한 에러를 구한 뒤, 기울기를 한번만 계산하여 모델의 파라미터를 업데이트 한다. 전체 학습 데이터에 대해 한번의 업데이터가 이루어지기에 전체 연산횟수가 적고, 전체 데이터에 대해 그래디언트를 계산하여 진행하기에 수렴이 안정적으로 진행된다.
그러나 이 경우 Local Optimal에 빠질 경우 나오기가 매우 어려우며, 한번에 모든 데이터를 사용하기에 학습이 오래 걸린다.
SGD ( Stochastic Gradient Descent )
SGD는 확률적 경사하강법으로도 불린다. SGD의 경우는 추출된 데이터 한 개에 대해서 gradient를 계산, 이에 대해 경사 하강 알고리즘을 적용하는 방식이다.
전체 데이터가 아니라, 랜덤하게 추출한 데이터에 대해 사용하기에, 학습 과정에서 진폭이 크고 불안정하나, 속도가 매우 빠르고 Local minima 빠질 가능성이 낮아지게 된다.
'Archive > ML & DL' 카테고리의 다른 글
[DL] Multi Layer Perceptron, Back Propagation 감잡기 (0) | 2021.06.22 |
---|---|
[DL] Pytorch Tutorial (0) | 2021.06.21 |
[DL] Single Layer Perceptron (0) | 2021.06.21 |
[ML] 배치 학습 vs 온라인 학습 (0) | 2021.06.03 |
[DS] Numpy and Pytorch 기본연산 (0) | 2021.05.03 |