머신러닝에서 경사하강법(gradient descent) 알고리즘은 빼놓을 수 없는 핵심 알고리즘 중 하나이다. 딥러닝을 한번쯤 공부해본 사람이라면 SGD, Adam 등 옵티마이저(optimizer)를 본 적이 있을 것이다. 이번 포스트의 주제는 바로 최적화 과정에서 사용되는 경사하강법 알고리즘이다. 앞서 머신러닝은 목적함수(loss function)를 최소화하는 최적화 과정이라고 설명하였다. 자세한 내용은 최적화 포스트에 다루었으니 목적함수가 뭔지 모른다면 보고 오도록 하자.
간단한 함수에서의 경사하강법
경사하강법의 목적은 목적함수를 최소화하는 매개변수(parameter)를 찾는 알고리즘이다. 다음 아래의 함수를 보자.
위의 함수는 $y=x^2-6x+12$로 아주 간단한 형태의 함수이다. 함수의 최솟값을 구하려고 한다면 우선 미분을 진행한 후 ${dy\over dx} =2x-6= 0$이 되는 지점을 찾을 것이다($x=3$). 이렇게 직접 미분을 하여 최솟값을 구하는 방법을 분석적 방법이라고 한다. 하지만 기계학습의 일반적인 상황에서는 직접 미분을 할 수 없는 경우가 많다(가능하다고 하더라도 많은 비용이 발생할 가능성이 높다). 따라서 분석적 방법이 아닌 수치적 방법을 사용하는데 수치적 방법은 $x$ 값을 점점 변화시키면서 ${dy\over dx}=0$을 만족하는 점을 찾는 방법이다.
$$x_i = x_{i-1}+\Delta x, \; i \geq 1$$
그럼 $\Delta x$를 어떻게 정의해야 $y$가 감소하는 방향으로 $x$를 갱신할 수 있을까? 기울기의 의미를 생각해보면 $x$가 양의 방향으로 변화할 때 $y$의 변화량이다. 이 의미를 거꾸로 생각하면 $x$에서 기울기의 반대 만큼 움직인다는 의미는 $y$의 값을 낮추는 방향으로 움직인다는 의미와 비슷한 맥락으로 작용한다. 따라서 경사하강법의 수식은 다음 아래와 같이 표현된다.
$$x_i = x_{i-1}+\rho f'(x_{i-1})$$
즉, $\Delta x = \rho f'(x_{i-1})$인 것이고 이때 $\rho$는 학습률(learning rate, lr)이라고 부르고 $x$의 변화 폭을 결정하는 변수이다. 이는 하이퍼파라미터(hyper parameter) 중 하나로 모델 성능에 매우 중요하게 작용하는 파라미터 중 하나이다.
그래디언트(Gradient)
위의 예시에서는 함수 $f$가 스칼라 변수 $x$에 대한 함수였다. 일반적으로 스칼라변수가 아닌 벡터변수가 들어가는데 이때 기울기를 그래디언트라고 부른다. 각 변수에 대해 독립적으로 미분한 형태의 기울기인 야코비안(Jacobian) 행렬로 다음 아래와 같이 표현한다.
$$ J=\nabla f=\begin{pmatrix} {\partial f_1 \over \partial x_1} && {\partial f_1 \over \partial x_2} && \cdots && {\partial f_1 \over \partial x_d} \\ {\partial f_2 \over \partial x_1} && {\partial f_2 \over \partial x_2} && \cdots && {\partial f_2 \over \partial x_d} \\ \vdots && \vdots && \vdots && \vdots \\ {\partial f_m \over \partial x_1} && {\partial f_m \over \partial x_2} && \cdots && {\partial f_m \over \partial x_d} \end{pmatrix} $$
이때 $f$와 $x$는 각각 벡터이며 $f(\mathbf{x})=(f(\mathbf{x_1}),f(\mathbf{x_2}),\cdots ,f(\mathbf{x_m}))^T$이고 $\mathbf{x}=(x_1,x_2,\cdots,x_d)^T$이다. 이 행렬을 이용하여 경사하강법의 식은,
$$\mathbf{x_i} = \mathbf{x_{i-1}}+\rho f'(\mathbf{x_{i-1}}) = \mathbf{x_{i-1}}+\rho \nabla f$$
로 확장된다. 이렇게 보면 매우 복잡해 보이지만 어차피 복잡한 계산은 컴퓨터가 할 것이니 너무 걱정하지 말자. 여기서는 간단한 예시를 통해 원리만 익히고 컴퓨터에게 일을 맡기면 된다. 아래의 예시를 보자.
ex) 아래의 식에서 초깃값 $\mathbf{x_0}=(1.0,0.9)^T$를 얻었다고 가정하자. 이때 경사하강법을 이용하여 $\mathbf{x_1},\mathbf{x_2},\mathbf{x_3}$을 구해보자. 학습률($\rho$)은 0.1로 설정한다고 가정하자.
$$f(x_1, x_2)=2x_1^2+3x_1x_2+2x_2^2-4x_1+2x_2-24$$
1. 야코비안행렬 계산
$$\nabla f(\mathbf{x})=(4x_1+3x_2-4,3x_1+4x_2+2)^T$$
2. 경사하강법 진행
$\nabla f(\mathbf{x_0})=(2.7,8.6)^T$이므로 $\mathbf{x_1}=\mathbf{x_0}-\rho \nabla f(\mathbf{x_0}) = (0.73,0.04)^T$
동일한 방법으로 $\mathbf{x_2},\mathbf{x_3}$을 계산하면,
$$\nabla f(\mathbf{x_1})=(-0.96,4.35)^T \; \mathbf{x_2}=\mathbf{x_1}-\rho \nabla f(\mathbf{x_1}) = (0.826,-0.395)^T \\ \nabla f(\mathbf{x_2})=(-1.881,2.898)^T\;\mathbf{x_3}=\mathbf{x_2}-\rho \nabla f(\mathbf{x_2}) = (1.014,-0.685)^T$$
이제 감이 잡혔을 것이라고 생각한다. 물론 사람이 이렇게 직접 계산할 일은 없지만 한번쯤 직접 계산하여 직접 작동하는 것을 눈으로 확인해보길 바란다.
경사하강법의 문제점
경사하강법이 만능 알고리즘은 아니다. 경사하강법은 매우 탐욕적(greedy)인 알고리즘이다. 탐욕적 알고리즘, 흔히 말하는 그리디 알고리즘은 눈앞의 이익을 극대화하는 것을 목표로 하는 알고리즘으로 최적의 해를 보장하지 않는다. 경사하강법도 마찬가지로 찾은 해가 함수의 최솟값을 보장하지는 않는다(고등학교 수학에서 극솟값이 최솟값은 아니었던 것을 생각해보자). 함수의 전체 최솟값을 gobal minimum이라고 부르고 이 값이 아닌 다른 해들을 local minimum이라고 부른다. 경사하강법은 이 local minimum에 빠지는 것이 치명적인 단점이지만 계산이 빠르고 함수 모양을 모르는 상태에서도 목표함수를 줄일 수 있다는 점에서 아주 중요하게 사용되는 방법이다. 추후 local minimum 문제를 완화해주는 규제 방법들이 나왔다.
마무리
정리하자면, 기계학습에서는 목적함수를 줄이는 것이 목표인데 그 방법으로 경사하강법을 사용한다. 경사하강법은 랜덤으로 초기값을 생성한 후 기울기와 학습률을 곱한 값을 빼서 값을 갱신한다. 벡터공간에서는 기울기를 그래디언트라고 부르고 야코비안 행렬을 사용하여 기울기를 계산한다. 이 경사하강법 알고리즘은 추후 다룰 오류 역전파(error back-propagation) 알고리즘의 핵심이다. 딥러닝의 기본 단위 구조인 다층 퍼셉트론(multilayer perceptron, MLP)이 오류 역전파 알고리즘 위에서 동작하기 때문에 경사하강법과 오류 역전파는 매우 중요한 알고리즘이다. 이번 포스트에서는 경사하강법에 대해 이야기했고 다음 포스트에서는 오류 역전파를 다룰 예정이다.
이미지 출처: Visualizing the Loss Landscape of Neural Nets
이 포스트는 "기계 학습(오일석 지음)"을 바탕으로 작성되었습니다.
'Data Science > Deep Learning' 카테고리의 다른 글
딥러닝: 다층 퍼셉트론(Multi-layer perceptron) (0) | 2022.10.18 |
---|---|
딥러닝: 퍼셉트론 (1) | 2022.10.07 |
딥러닝 기초 수학: 최적화 (0) | 2022.10.04 |
딥러닝 기초 수학: 정보이론 (2) | 2022.10.03 |
딥러닝 기초 수학: 선형대수 (0) | 2022.09.30 |