Gradient Descent

지원·2021년 1월 26일
0

미분 이야기

미분은 임의의 점에서 함수값의 변화 방향으로 생각할 수 있다. 이는 좌표평면으로 나타내는 일변수 함수 뿐만 아니라, nn변수 함수에서도 같은 의미를 갖는다. 다만, 변수가 여러 개일 경우에는 그레디언트(gradient) 벡터를 이용한다. 그레디언트는 함수를 각 변수로 편미분한 결과를 성분으로 가지며, nn변수 함수 ff의 그레디언트를 다음과 같이 정의할 수 있다.

f=(x1f,x2f,...,xnf)\nabla f = (\partial_{x_1}f,\,\partial_{x_2}f,\,...,\,\partial_{x_n}f)

파이썬에서는 sympy 라이브러리를 이용해서 미분을 계산할 수 있다.

import sympy as sym
from sympy.abc import x

f = sym.poly(x ** 2 + 2 * x + 3)
df = sym.diff(f, x)

경사 하강법

경사 하강법에서는 그레디언트 벡터가 함수값을 가장 빠르게 증가시키는 방향이라는 것을 이용한다. 즉, 각 점에서 그레디언트 값을 반복해서 빼는 방식으로 최솟값을 구하는 것이다. 참고로 그레디언트를 더해가며 최댓값을 구하는 것을 경사 상승법(gradient ascent)라고 부른다.

이상적으로는 그레디언트에 변수 벡터의 미소 변화량을 곱해 누적한다면 해당 점에서 함수의 변화량과 같겠지만, 이를 컴퓨터 연산으로 구현하기는 불가능하다. 따라서 '미소 변화량'을 적당한 학습률(learning rate)로 대체하여 계산한다.
마찬가지 이유로 그레디언트 크기가 0이 될 때까지 계산하는 것이 어렵기 때문에, 다음과 같은 종료 조건을 설정한다.

두 가지 종료 조건

0을 대체하는 값 정하기

그레디언트가 적당한 크기 이하일 때를 종료 조건으로 정하는 방법이다. 즉, 그레디언트 크기가 종료 조건에 해당하는 값 이하로 충분히 작아지면 0과 같다고 보는 것이다. 이때, 그레디언트 크기는 노름(norm)을 이용해 계산한다.

적당한 학습 횟수를 정하기

계산 결과를 예측하여 정해진 학습 횟수만을 수행하는 방법이다. 오늘날 머신 러닝에서는 일반적으로 학습 횟수를 종료 조건으로 사용하는 방법을 택하고 있다. 이 경우, 학습 횟수는 학습률과 함께 중요한 hyperparameter가 된다.

경사하강법 보완하기

경사하강법의 유효성

경사하강법이 유의미한 결과를 얻으려면, 계산 결과가 수렴해야 한다. 이론적으로 위와 같은 경사하강법은 볼록한(convex) 함수에 대해서만 수렴이 보장되어 있다.

선형회귀의 경우, 목적함수가 볼록하기 때문에 수렴이 보장되지만, 비선형회귀에서는 목적함수가 볼록하지 않을 수 있으므로 수렴이 보장되지 않는다. (딥러닝에서 대부분 목적함수는 볼록함수가 아니다.)

확률적 경사하강법

확률적 경사하강법(SGD; stochastic gradient descent)은 일부 데이터를 활용하여 업데이트하는 방법이다. 이 때, 각 연산의 '일부 데이터'를 미니베치(minibatch)라고 부르며, 이를 이용한 SGD를 minibatch SGD라고도 부른다.

미니베치를 이용해 추정한 목적함수의 그레디언트는 실제 그레디언트와 근사적으로 같으며, 이를 이용해 경사하강법을 수행한다. 미니베치는 확률적으로 선택하며, 따라서 매번 목적함수가 달라지게 된다.
이와 같은 방법으로 SGD는 볼록이 아닌 목적식에서도 사용이 가능하며, 경사하강법보다 더 효율적이라고 알려져 있다.
profile
섬마을 초보 개발자

0개의 댓글