[AI Basic] 경사하강법(Gradient Descent)

Recorder·2021년 8월 6일
0

인공지능학습 과정에서 특정 함수의 최소값을 구해야하는 경우가 많다.
이때 사용되는 방법이 바로 경사하강법이다.

이 경사하강법의 필요성과 원리, 알고리즘 등에 대해 알아보자.

1. 경사하강법의 필요성

인공지능은 기본적으로 예측함수와 실측데이터의 오차를 최소화하는 방식으로 학습한다.

우리가 f(x)라는 함수(모델)로 계산해서 나오는 결과가 y^\hat{y}라고 두자.
이때 실제데이터 y과 계산결과 y^\hat{y} 사이에는 오차가 있기 마련이다.

그림으로 살펴보자.

빨간 점이 실측데이터(y)이고, 이 데이터를 표현하는 수식이 파란색 선(y^\hat{y})이다.
실제 우리가 다루는 데이터의 대부분은 완벽한 선형이나 곡선이 아니다. 따라서 위와 같이 실제 데이터와 수식 사이에 오차(yy^y-\hat{y})가 존재한다.

이때 이 오차를 최소화시킬수록 정확한 계측 모델(수식)이라고 볼 수 있다.

딥러닝 학습은 기본적으로 이 오차를 나타내는 수식인 loss function(손실함수)을 최소화하는 것으로 구현된다.

이를 위해 함수의 최소값을 구하는 방법을 알아야한다. 그 대표적인 방법이 바로 경사하강법이다.

2. 경사하강법의 기본원리

경사하강법은 미분값(접선의 기울기)을 이용하여, 극소값을 구하는 방법이다.

함수를 미분하면, 특정 지점의 접선의 기울기를 알 수 있다.
그리고 접선의 기울기는 증가함수에선 +, 감소함수에선 - 값을 가진다.
따라서 어느 한 점에서 미분값을 빼면, 결과값은 감소하게 된다.

이는 그림을 통해 쉽게 이해할 수 있다.

경사하강법은 위 과정을 계속 반복하는 것이다.

이를 반복하다가, 최소값에 도달하게 되면 움직임을 멈추게 된다. 극값의 미분값은 0이기 때문이다.

✌️ 똑같은 원리를 극대값을 찾기 위해 사용할 수도 있다.
위와는 반대로 미분값을 더하면된다. 이를 경사상승법이라고 부른다.

알고리즘 코드

위 원리를 python 코드로 작성해보면 아래와 같다.

var = init                                  #시작지점
grad = gradient(var)                        #미분값
while(abs(grad)>eps):                       #미분값이 eps보다 작아지면, 종료(극값도달)
     var = var - lr * grad                  #x에서 미분값*학습률 빼기(학습률 lr을 통해 업데이트 속도 조절)
     grad = gradient(var)                   #이동한 지점에서 미분값 새로 계산

예를 들어 f(x) = x2 + 2x + 3 함수에서 최소점을 찾는 코드를 작성해보면 아래와 같다.

2. 벡터(2D) 변수 경사하강법

위 방법은 1차원 변수의 경우이다. 하지만 실제 딥러닝을 할 땐 벡터가 입력인 경우(다변수 함수)가 많다.

이 경우 각 변수에 대해, 편미분을 해야한다. 이렇게 변수 별로 편미분한 것을 그레디언트 벡터라고 부른다.

f=(x1f,x1f,...,x1f)\nabla f = (\partial_{x_1} f,\partial_{x_1}f, ..., \partial_{x_1}f )

이때 극소점을 찾기 위해선
그래디언트 벡터에 -를 붙이면 된다. 그래디언트 벡터에 -를 붙이면 가장 빨리 감소하게 되는 방향을 가리킨다.

예를 들면, 아래와 같은 화살표 모양을 나타내게 된다.

알고리즘 코드

2차원 벡터에 대한 경사하강법도, 1차원에서와 같은 구조를 가진다.
다차원 결과을 eps와 비교하기 위해, 절대값(abs)대신 노름(norm)을 쓴다는 차이만 있다.

var = init
grad = gradient(var)
while(norm(grad) > eps):
     var = var - lr * grad
     grad = gradient(var)

예를 들어 f(x) = x2 + 2y2 함수에서 최소점을 찾는 코드를 작성해보면 아래와 같다.

3. 확률적 경사하강법 (SGD)

A. 경사하강법의 한계

경사하강법은 볼록함수(convex)에 대해선 수렴을 보장한다.

예를 들면, 앞서 설명한 선형회귀의 목적식 yXβ2||y-X\beta||_2는 볼록함수이므로, 수렴이 보장된다.

하지만 비선형회귀 문제의 경우, 목적식이 볼록하지 않을 수 있다. 이 경우 수렴이 보장되지는 않는다.
특히 딥러닝의 경우, 대부분의 목적식이 볼록함수가 아니다.

예를 들어, 아래 그림과 같은 함수가 있을 경우, 특정 지점에서 구한 극소점이 최소점이 아닐 수 있다.

B. 확률적 경사하강법(SGD, Stochastic Gradient Descent)

확률적 경사하강법은 전체 데이터 대신, 일부 데이터로 업데이트를 진행하는 방식이다.

이때 미니배치 연산을 이용한다.

배치(batch)란 데이터 입력을 하나씩 받는 것이 아니라, 큰 묶음으로 묶어 한 번에 받아 처리하는 방식을 의미한다. 그리고 미니배치(mini-batch)란 전체 데이터를 N분해서, 배치 방식으로 처리하는 것이다.
수식으로는 아래와 같이 표현할 수 있다.

D(b)=(X(b),y(b))DD_{(b)}=(X_{(b)}, y_{(b)}) \subset D

미니배치는 매변 확률적으로 선택하고, 따라서 목적식 모양도 계속 바뀐다.

이는 같은 장점으로 인해, 많이 사용된다.

  • 볼록이 아닌 목적식에도 사용 가능
    : 극점(local point)에 도달해도, 미니배치를 매번 바꾸면 기울기가 0이 아니다. 따라서 멈추기 않고 계속 진행 가능하다.
  • 머신러닝에 효육적이다.
    : 매번 일부 데이터만 사용하므로, 계산이 훨씬 빨라진다.(그림상으로 진행 방향은 좀 더 돌아가게 되지만, 실제 속도는 훨씬 빠르다.)
profile
기억은 나 대신 컴퓨터가

0개의 댓글