대부분의 딥러닝 학습 알고리즘은 손실함수나 목적함수를 만드는 것으로 시작한다. 그리고 손실함수를 최소화하거나 목적함수를 최대화하기 위해 최적화 방법을 사용한다.
손실함수나 목적함수는 신경망 연결값을 변수로 갖는 스칼라 함수다. 이러한 연결값의 갯수는 신경망의 크기에 따라서 수 십 개에서 수 십억 개가 될 수도 있다. 따라서 손실함수나 목적함수는 다변수 스칼라 함수다.
손실함수나 목적함수를 최소화하거나 최대화할 때 필요한 것이 미분이다.
벡터 \( {\bf x} = \begin{bmatrix} x_1 & x_2 & ... & x_n \end{bmatrix} ^T \) 의 구성요소를 변수로 하는 다변수 스칼라 함수 \(f (x_1, x_2, …, x_n ) \) 을 간단히 \( f( {\bf x}) \) 로 표기한다. 이렇게 표기하면 다변수 함수가 마치 변수가 한 개인 단변수 함수인 것처럼 간단해지기 때문에 보기가 편해진다.
또한 함수 \( f \) 를 벡터 \( \bf x \) 에 대해 미분한다는 표기인 \( \frac{d f}{d {\bf x} } \) 를 다음과 같이 정의한다.
\[ \frac{d f}{d {\bf x} } = \begin{bmatrix} \frac{\partial f}{\partial x_1 } \\ \frac{\partial f}{\partial x_2 } \\ \vdots \\ \frac{\partial f}{\partial x_n } \end{bmatrix} \]
표기만 보면 마치 함수를 스칼라 변수로 미분하는 것처럼 간단해 보인다. 스칼라 함수의 벡터 미분인 \( \frac{d f}{d {\bf x} } \) 를 그래디언트(gradient)라고 한다. 그래디언트는 벡터 \( {\bf x} \) 와 동일한 차원을 갖는 벡터다.
정의에 의하면 그래디언트는 스칼라 함수를 벡터 \( {\bf x} \) 의 구성요소별로 편미분하는 것이다. 미분은 기울기를 나타내므로 그래디언트는 벡터 \( {\bf x} \) 의 구성요소별 기울기를 나타내는 기울기 벡터가 된다.
예를 들어 보자. 다음과 같은 스칼라 함수가 있을 때,
\[ f(r, \theta) = r \cos \theta \]
그래디언트 \( \frac{d f}{d {\bf x} } \) 는 다음과 같이 계산된다. 여기서 \( {\bf x} = \begin{bmatrix} r \\ \theta \end{bmatrix} \) 이다.
\[ \frac{d f}{d {\bf x} } = \begin{bmatrix} \frac{\partial f}{\partial r } \\ \frac{\partial f}{\partial \theta } \end{bmatrix} = \begin{bmatrix} \cos \theta \\ - r \sin \theta \end{bmatrix} \]
다른 예를 들어 보자. 다음과 같이 스칼라 함수 \( f ({\bf x}) \) 가 두 벡터 \( {\bf x} = \begin{bmatrix} x_1 & x_2 & ... & x_n \end{bmatrix} ^T \) 와 \( {\bf w} = \begin{bmatrix} w_1 & w_2 & ... & w_n \end{bmatrix} ^T \) 의 내적으로 주어졌을 때,
\[ f( {\bf x}) = {\bf w}^T {\bf x} = w_1 x_1 + w_2 x_2 + ... + w_n x_n \]
그래디언트 \( \frac{d f}{d {\bf x} } \) 는 다음과 같이 계산된다.
\[ \frac{d f}{d {\bf x} } = \begin{bmatrix} \frac{\partial f}{\partial x_1 } \\ \frac{\partial f}{\partial x_2 } \\ \vdots \\ \frac{\partial f}{\partial x_n } \end{bmatrix} = \begin{bmatrix} w_1 \\ w_2 \\ \vdots \\ w_n \end{bmatrix} = {\bf w} \]
'AI 수학 > 최적화' 카테고리의 다른 글
라그랑지 곱수법 (0) | 2020.10.01 |
---|---|
경사하강법 (0) | 2020.09.30 |
최적화 문제의 분류 (0) | 2020.09.30 |
스칼라 함수를 벡터로 두번 미분하기 : 헤시안 (1) | 2020.07.17 |
벡터 함수를 벡터로 미분하기 : 자코비안 (0) | 2020.07.16 |
댓글