본문 바로가기
Machine-Learning/Basic

[ML] 경사하강법(Gradient Descent)

by AteN 2021. 9. 5.

경사 하강법 (Gradient Descent) ?

신경망을 학습시킨다는 것은 모델이 더 예측을 잘 하는 방향으로 가중치를 업데이트해 가는 과정이라고 할 수 있다.

그런데 어떤 방향으로, 또 얼마나 업데이트해야 할까?

우선 우리의 신경망 학습이 최종적으로 도달하고자 하는 곳을 살펴보자. 

 

아래 그래프는 가로가 가중치 w의 값을 나타내고, 세로가 비용을 나타낸다. 예측한 결과가 실제 결과와 얼마나 다른 지를 나타내는 값이 비용임을 생각해보면, 이 비용을 최소한으로 줄여나가는 것이 학습의 목적이라는 것을 이해할 수 있다 (실제로 일반적인 용어로 비용 함수를 '목적 함수'라고 한다)

우리가 학습을 통해 도달하고자 하는 목적지를 최적값(optimum), 혹은 더 쉽게 최솟값(minimum)이라고 한다.

 

비용을 최소값으로 만드는 가중치 w를  '최적 w'라고 하자. 그런데 가중치를 이 최적 w로 단번에 업데이트하지 않고, 굳이 여러 번씩 업데이트해가면서 학습하는 이유가 뭘까?

 

최적w로 단번에 업데이트를 하는 방법은 위의 그래프가 어떻게 생겼는지 정확히 아는 상태에서만 가능 한다. 하지만 우리가 처해 있는 상황은, 다음과 같이 작은 촛불에 의지해서 길을 찾아야 하는 길 잃은 등산객과 비슷한다. 최솟값으로 가기 위해서는, 우리는 어느 방향으로 몇 발자국 정도 내디뎌볼지 정도만 선택할 수 있다. 그 방법으로 기울기(gradient)를 이용해 볼 수 있다 

$$ 기울기 = 순간 변화량 $$

기울기는 간단히 말해면 순간 변화량을 말한다 

 

$$ 기울기가 작다면, 그 순간에 있어 변화량이 작다 $$

$$ 기울기가 크다면, 그 순간에 있어 변화량이 크다  $$

 

이 기울기를 가지고 어느 방향으로 가야하는지 어떻게 알 수 있을 까?

 

바로 왼쪽으로 이동하는 것이 f(x)을 감소시킬 수 있다. 즉 x의 값을 더 작은 값으로 업데이트시키면 된다 

반대의 경우도 한 번 살펴보자. 이 경우에는 x가 어느 방향으로 이동해야 f(x)을 줄 일 수 있을까?

바로 오른쪽이다. 즉 x의 값을 더 큰 값으로 업데이트시키면 된다. 

 

위에서 살펴본 두 위치의 기울기를 한 번 구해보자 

처음 살펴보았던 경우는 기울기가 양수이다 , 이경우에는 왼쪽으로 이동하면 된다 (가중치 w값 감소)

두번째로 살펴보았던 경우는 기울기가 음수다 , 이 경우에는 오른쪽으로 이동하면 된다.(가중치 w값이 증가)

 

하지만 이 경우 기울기라는 값이 매우 큰 값이 나올 수 있다. 예를 들어, 원래 x가 1이고 최적 x가 2인 상황에서 기울기 5를 방향만 맞다고 더해버리면 최소값을 넘어 엉뚱한 곳으로 갈 수 있다. 

즉, 비용의 최솟값으로 가기 위한 방향을 맞지만, 너무 많이 움직여 버리면 오히려 최솟값에서 더 멀어질 수 있는 것이다 

 

이를 방지하기 위해서 우리는 항상 기울기가 작은 상수를 곱해서 사용한다. 이를 학습률 (learning rate)이라고 한다.  

이 학습률은 말 그대로 매 업데이트 마다 학습을 얼마나 시킬지를 결정하는데, 신경망 학습에 있어서 매우 중요한 요소이다. 학습을 통해 최적값이 나오는게 아니라, 학습률만 바꿔가면서 신경망 학습을 여러번 시도해보면서 찾아내야하는 변수라고 할 수 있다. 이러한 변수를 하이퍼파라미터(hyperparameter)라고 한다 

 

머신러닝 서적이나 강의 보면 다음과 같은 수식이 등장한다.

$$ w := w- \alpha\frac{\partial C}{\partial W} $$

 

이 수식이 의미하는 바는 사실 위에서 우리가 다룬 식과 완전히 동일하다. 

 

이 수식에서 등호(=) 기호가 콜른과 함께 등장하는데, 이를 'w라는 변수를 이런 값으로 업데이트하겠다'는 의미로 이해하면 된다. 파이썬 코드에서 등호만 사용된다 

 

$$ \frac{\partial Cost}{\partial W} \; w가 변할 때, cost가 얼마나 변하는지 $$

 

기울기란 앞서 다뤘듯이 순간 변화율을 의미하는데, 다시 말해 분모에 있는 변수가 변할 때 분자에 있는 변수가 얼마나 변하는 지를 의미한다고 보면 된다. 시간 변할 떄 속도가 얼마나 변하는지가 바로 가속도인 것처럼 말이다 

 

이 기울기는 미분을 통해 구할 수 있다. 우리가 고등학교 때 배웠던 미분은 다음과 같다. 눈치 챘겠지만, 우리가 신경망에서 사용하는 미분은 기호가 조금 다른다. 왜냐하면 여기서는 편미분을 사용되기 때문이다 

 

편미분이란 단순히 여러 개의 변수들 중에서 딱 두 개만 보겠다는 뜻으로 이해하면 쉽다. 신경망 층에서 수많은 가중치 W1, W2, .. 들로 구성된 식에서 딱 W1이 변할때 cost가 어떻게 변하는지만 보겠다는 것이다 

 

다음과 같이 x, y, z 축의 그래프가 있다고 생각해 보자 

 

$$ 편미분 : \frac{\partial y}{\partial x} $$

이때 x에 대한 y의 편미분 값은 z를 무시한 채 x, y 평면에서 기울기로 계산하면 된다 

신경망에서는 가중치가 w가 하나만 존재하는 게 아니라 엄청나게 많이 존재한다. 따라서 모든 가중치 변수들을 한번에 미분해서 기울기를 계산하는 것이 아니라, 각각 편미분을 통해 아주 간단하게 기울기를 계산하고 업데이트 하는 식으로 학습을 진행하는 것이다. 이렇게 기울기를 계산해서 최솟값으로 나아가는 방법을 경사하강법 (gradient descent)이라고 한다 

 

$$ w := w - \eta \frac{\partial C}{\partial W} $$

 

여기서 \(\eta\) 은 학습률을 나타내며, \(\frac{\partial C}{\partial W}\)은 기울기를 말하고 있다. 

 

경사 하강 최적화 

기울기 정보를 사용하는 가장 단순한 방법은 가중치 업데이트를 기울기의 음의 방향으로 조금씩 시행하는 것이다 

$$ w^{(\tau + 1)} = w^{\tau} - \eta \triangledown E(w^{\tau}) $$

 

각각의 업데이트 이후 새 가중치 벡터를 바탕으로 기울기를 다시 계산하고, 해당 과정을 다시 반복한다. 오류 함수는 훈련 집합에 대해 정의 된다. 따라서 \(\triangledown E\) 를 계산하기 위해서는 전체 훈련 집합이 처리되어야 한다.

한번에 전체 데이터 집합을 사용하는 방식을 배치 (batch)방식이라고 한다. 각 단계에서 가중치 벡터는 오류 함숫값이 가장 크게 감소하는 방향으로 이동하게 된다. 이런 이유로 이 방식을 경사 하강법(gradient descent) 또는 최대 하강법 (steepes descent)이라고 한다. 이 방식은 직관적이기 일리가 있어 보이지만, 사실 그리 좋지 못한 결과를 내는 알고리즘이다. 이 이유에 대해서는 Bishop and Nabney(2008)를 참고하라 

 

배치 최적화의 경우 켤레 기울기(conjugate gradient)법과 준-뉴턴(quasi-Newton) 법 등의 더욱 효과적인 방식이 존재한다. 이들은 단순한 경사 하강버에 비해서 더 안적적이고 빠르다. 경사 하강법과 달리 이러한 알고리즘들은 오류 함수가 지역적 최솟값이나 전역적 최솟값이 있지 않은 경우를 제외하고는 각각의 반복에서 항상 오류 함숫값을 감소시킨다는 성질을 가졌다.

충분히 좋은 최솟값을 찾기 위해서는 기울기 기반의 알고리즘을 여러 번 시행하는 것이 필요할 수 있다. 각각의 시행에서 랜덤하게 시작점을 선택하고, 독립적인 검증 집합에서 결과 성능을 비교하는 것이다.

 

데이터 집합의 크기가 큰 경우의 뉴럴 네트워크를 훈련하는데 유용한 것으로 증명된 경사 하강법의 온라인 버전이 존재 한다. (Le Cun et al, 1989). 이 경우 독립적인 관측값들에 대한 최대 가능도를 바탕으로 한 오류 함수들은 각각의 데이터 포인트에 대한 다음 항을 합산해서 구성된다 

$$ E(w) = \sum_{n=1}^{N}E_n(w) $$

 

순차적 경사 하강법(sequential gradient descent)이나 확률적 경사 하강법 (stochastic gradient descent) 이라고 불리는 온라인 경사 하강법은 한 번에 데이터 포인트 하나에 대해 가중치 벡터를 업데이트 한다. 

$$w^{(\tau + 1)} = w^{\tau} - \eta \triangledown E_n(w^{\tau}) $$

 

이 업데이트는 데이터에 대해 순차적으로 순환적으로 시행하거나 포인트들을 (복원시키며) 랜덤하게 선택하여 시행한다. 물론, 한 번에 여러 데이터 포인트들에 대해서 업데이트를 시행하는 중간의 경우도 있다 

 

온라인 방법의 배치 방법에 비한 장점은 바로 데이터 상의 중복을 훨씬 더 효율적으로 처리한다는 것이다. 이를 확인하기 위해서 한 예시 데이터 집합을 취해 그 모든 데이터 포인트들을 중복시켜서 집합의 크기를 두 배로 늘려 보자. 이럴 경우 오류 함수에 2를 곱한 것과 같으므로 결과적으로 원 오류 함수와 같아 진다. 배치 방법의 경우 배치 오류 함수 기울기 구하기 위해서 두 배의 계산이 필요하게 될 것이지만, 온라인 방법은 영향을 받지 않는다. 온라인 경사 하강법의 다른 성질은 지역적 최솟값에서 탈출할 가능성이 더 높아진다는 것이다. 왜냐하면 전체 데이터 집합에 대한 오류 함수의 임계점은 보통 개별 데이터 포인트에 대해서는 임계점이 아닐 수도 있기 때문이다.

 

비선형 최적화 알고리즘과 이를 뉴럴 훈련에 실제적인 적용한 사례들은 Bishop and Nabney(2008)에 더 자세히 논의되어 있다.

Local minima global minima

경사 하강법을 진행할 때 지역 최솟값(local minimum) 문제가 생길 수 있다. 아래의 주변 지역에서는 최소이지만 전체에서는 최소가 아닌 부분을 만나면 전역 최솟값(global minimum)으로 갈 수 없게 된다

 

이때 지역 최소값을 지나 기울기를 역행한다면 언덕을 넘어 전역 최솟값으로 갈 수 있는데, 이는 기울기만이 아니라 내려가는 가속도를 함께 반영하는 방법을 사용할 수 있다. 가속도라는 뜻인 '모멘텀(momentum)'이 그 방법이며, 최근에는 더 다양한 상황에서 학습 실패가 적은 '아담(adam)' 등 방법이 많이 사용 된다. (확률적) 경사하강법, 모멘텀, 아담 등을 옵티마이저(optimizer)라고 부른다. 이 옵티마이저에 대한 자세한 내용은 블로그를 통해서 다시 정리 하도록 하겠다.  

 

참고자료 

1. 그림으로 이해하는 비전공자를 위한 딥러닝

2. 고려대 강성범 교수님 : Multiple Linear Regression

3. POSTECH : https://iai.postech.ac.kr/teaching/machine-learning

4. 패턴 인식과 머신러닝 

 

댓글