경사하강법 알고리즘
경사하강법은 이름에서 유추할 수 있듯이 기울기(경사, Gradient)를 이용하여 손실함수의 값을 최소화하는 방법이다. 함수의 경사(즉 미분값)를 이용하여 현재 위치에서 가장 낮은 방향으로 이동하며 최솟값에 도달하는 방식이다. 그러므로 경사하강법은 함수의 최솟값을 찾는 반복적인 최적화 알고리즘이라고 할 수 있다.
머신러닝에서 우리가 조정하고자 하는 값(변수)은 가중치(weight, w)와 바이어스(bias, b)이다. 따라서 손실함수를 w와 b에 관한 함수로 생각하면 된다.
함수를 미분하면 기울기를 얻을 수 있다. 손실함수의 미분계수가 음이라면 w를 양의 방향으로, 손실 함수의 미분계수가 양이라면 w를 음의 방향으로 이동시킨다. (이때 w를 얼마만큼 이동시키는지를 학습률이라고 한다)
이런 방식을 여러번 반복하여 최종적으로 w값을 손실함수가 최솟값을 갖도록 조정해주는 것이 바로 경사하강법이다.
경사하강법이 필요한 이유
- 간단하여 이해하기도 쉽고 구현도 쉽다., 수학적 배경지식이 많이 필요로 하지도 않는다.
- 대부분의 문제에 적용가능하며, 빠른 속도로 최솟값에 근접한다.
- 다양한 변수와 제약조건을 가진 문제에 적용이 가능하다.
경사하강법의 한계
경사하강법은 머신러닝에서 모델을 주어진 데이터에 맞게 학습시킬 수 있는 좋은 방법이다. 하지만 경사하강법은 기본적으로 기울기를 이용하여 가중치를 업데이트하기 때문에 근본적인 몇 가지 문제점을 갖는다.
- 높은 차원의 문제에는 연산량이 증가하고 컴퓨터 자원을 소모하므로 수렴 속도가 느려질 수 있다
- 지역극소값 빠질 수 있다. 전역 최솟값 대신 지역 최솟값에 도달하여 최적의 결과를 얻지 못할 수 있다
- 학습률 설정에 민감하다. 학습률이 너무 크면 발산, 너무 작으면 수렴속도가 느려진다. (saddle point에 도달하여 최솟값을 찾지 못할 수 있다)
1) 많은 연산량과 컴퓨터 자원 소모
경사하강법은 데이터(입력값) 하나가 모델을 지날 때마다 모든 가중치를 한 번씩 업데이트한다. 가중치가 적은 모델의 경우 문제가 될 것이 없으나, 만약 모델의 가중치가 매우 많다면 모든 가중치에 대해 연산을 적용하기 때문에 많은 연산량을 요구합니다. 또한 실제로 모델을 학습시킬 때 수많은 데이터를 모델에 주입시키기 때문에 상당한 연산량과 컴퓨터적 자원을 요구하게 됩니다. 모델을 평가할 때 정확도뿐만 아니라 연산량, 학습시간, 메모리 소비량 등도 평가 요소가 되기 때문에 이는 경사하강법의 치명적인 약점이라 할 수 있습니다.
이 문제를 해결하기 위해 한번의 경사하강법을 실시할 때 무작위로 하나의 가중치에 대해서만 업데이트를 하도록 하는 확률적경사하강법(Stochastic Gradient Descent,SGD)라는 방법이 고안되었다.
2) Local Minima (지역극소값) 문제
다음으로 손실함수가 지역극소값(local minima)들을 갖는 경우를 살펴보겠습니다. 우리가 찾아나가야 할 가중치의 값은 손실 함수가 전역 최소값(globla minimum)을 갖는 점, 즉 그림상의 빨간 점이다. 하지만 만약 초기 시작점이 그림상의 노란 점이라면 전역 최솟값으로 향해 다가오는 도중에 지역 극솟값에 수렴해버릴 가능성이 있습니다. 지역 극솟값에서의 손실 함수의 기울기 또한 0이므로 w가 지역 극솟값에 갇혀 더 이상 업데이트되지 못할 수도 있다.
이처럼 손실함수의 전역 최솟값이 아닌 지역 극솟값으로 수렴하는 문제를 local minima문제라고 한다.
3) Plateau 현상 (고원 현상)
경사하강법은 기본적으로 기울기를 이용하는 방법이다. 따라서 가중치를 기울기가 큰 지점에서는 빠르게 수렴하도록, 기울기가 작은 지점에서는 천천히 수렴하도록 해준다. 하지만 위의 그림과 같이 평탄한 영역에 대해서는 기울기가 0에 수렴한다. 이런 지점에서 경사하강법을 사용하면 결국 가중치가 업데이트되지 못하고 전역 최솟값을 갖는 지점이 아닌 점에서 정지해버릴 위험이 있다. 이 현상은 'local minima 문제'에 비해 상대적으로 자주 발생하는 현상이다.
4) 학습률의 수렴, 발산 문제 (Oscillation 문제)
경사하강법은 현재 위치(시작 포인트)에서 최적값 방향으로 수렴하는 것이 아닌 기울기를 따라 수렴한다. 만약 가중치들이 손실 함수에 미치는 영향이 크게 상이하다면 위의 그림과 같이 크게 진동하며 최적값에 느리게 수렴하게 되는데, 이를 Oscillation(진동) 현상이라고 한다.
진동폭이 크다는 것은 가중치가 불안정하게 수렴한다는 것이고, 만약 이동거리(step size)가 크다면 최적값에 수렴하지 못하고 발산해버릴 위험도 있다. 따라서 가중치가 업데이트될 때 진동폭을 최대한 작게 만들어주는 것 또한 옵티마이저를 설정할 때 중요한 고려사항이다.
경사하강법의 한계 극복을 위한 방안 – 옵티마이저
경사하강법은 기울기를 이용하여 가중치를 업데이트해가며 손실 함수의 최적값을 찾아가는 방법이다. 위의 문제들을 완화하기 위하여 경사하강법에서 보완된 여러 옵티마이저가 개발되었으나, 이들도 위의 문제들을 완벽하게 해결하지는 못한다.
머신러닝은 타깃과 예측값(모델이 출력한 값)의 오차를 최소화하는 방향으로 모델의 파라미터들을 조정하여 가장 알맞은 모델을 찾아낸다. 오차를 정의하는 방법에는 여러가지가 있다.
- 평균 제곱 오차 (Mean Squre Error, MSE)
- 평균 제곱근 오차 (Root Mean square Error, RMSE)
- 이진 교차 엔트로피 ( Binary Cross-entropy)
- 카테고리컬 교차 엔트로피 ( Categorical Cross-entropy)
머신러닝에서는 오차를 손실(Loss) 또는 비용 (Cost), 오차를 정의한 함수를 손실함수(Loss function) 또는 비용함수 (Cost function)라고 하고, 머신러닝 알고리즘은 손실함수의 값을 최소화하는 방향으로 학습하는 것이 목적이다. 경사하강법(Gradient Descent)은 옵티마이저(Optimizer)의 한 종류로, 손실함수의 값을 최소화하는 방법이다.
옵티마이저는 주어진 데이터에 맞게 모델 파라미터들을 최적화시켜주는 역할을 한다. 즉, 손실 함수의 값이 최대한 작아지도록 모델 파라미터들을 조정해준다. 사실 머신러닝에는 경사하강법 외에도 여러 옵티마이저가 존재한다.
그림에서도 볼 수 있듯이 결국 다른 옵티마이저들도 경사하강법(Gradient Descent, GD)에서 새로운 개념을 추가하거나 단점을 보완해나가면서 만들어진 것이다..
(참고) 주요 옵티마이저
경사하강법을 사용했을 때 saddle point에 도달하여 최솟값을 찾지 못하는 문제를 해결하기 위한 방법은 다음과 같다.
모멘텀 (Momentum)
이전 업데이트 방향을 고려하여 현재 업데이트 방향을 조절. saddle point에서 벗어나 최소값 방향으로 이동할 가능성이 증가한다
RMSProp (Root Mean Square Propagation)
과거 업데이트 값들의 제곱평균을 사용하여 학습률 조절. 학습률 변화를 안정화하고 saddle point에 빠질 가능성을 감소시킨다. 모멘텀보다 더 안정적이고 효율적인 최적화 알고리즘으로 알려져 있다.
Adam (Adaptive Moment Estimation)
모멘텀과 RMSProp의 장점을 결합한 최적화 알고리즘. 학습률 조절을 통해 saddle point에서 벗어나 최소값 방향으로 이동할 가능성이 증가한다