딥러닝에서는 backpropagation을 통해 가중치를 갱신하여 cost function을 최소화 하는 방향으로 접근한다. 우리는 backpropagation을 수행할 때 미분을 통해 신호를 전달하는 것을 알고 있다. 선형 모델을 미분할 경우 다음과 같은 가중치 벡터($w$)가 산출된다.
\[ \frac{\partial w^Tx}{\partial x} = = \frac{\partial x^Tw}{\partial x} = w \]
이차 모델을 미분할 경우 행렬($A, A^T$)과 벡터($x$)의 곱으로 산출된다.
\[ \frac{\partial x^TAx}{\partial x} = (A + A^T)x \]
벡터를 스칼라로 미분할 경우 아래와 같은 결과가 도출된다.
\[ \frac{\partial \boldsymbol{y}}{\partial x} = \begin{bmatrix} \frac{\partial y_1}{\partial x}, \frac{\partial y_2}{\partial x}, \cdots \frac{\partial y_n}{\partial x} \end{bmatrix} \]
이때 $\boldsymbol{y}$는 벡터를 의미하고 $x$는 스칼라를 의미한다. 만약 스칼라를 벡터로 미분하게 될 경우 행 벡터가 아닌 열 벡터가 산출되며, 이때 미분된 행 벡터를 gradient vector라 부르며 $\nabla y$로 표기한다.
딥러닝에서는 독립 변수(independent variable) $\boldsymbol{x}$를 통해 종속 변수(dependent variable) $y$를 구한다. 퍼셉트론 간 Layer의 node는 일반적으로 하나가 아닌 여러개의 node로 구성되어 있으며, 이때 각 node는 vector 형태로 구성되어 있다. 그렇기에 벡터와 벡터간 연산이 필요한데 이때 각 변수의 미분값으로 구성된 행렬이 바로 자코비안(Jacobian Matrix)라고 한다.
\[ \boldsymbol{J} = \frac{dy}{dx} = \begin{bmatrix} \frac{\partial y_1}{\partial x}^T \\ \frac{\partial y_2}{\partial x}^T \\ \vdots \\ \frac{\partial y_m}{\partial x}^T \end{bmatrix} = \begin{bmatrix} \nabla y_1^T \\ \nabla y_2^T \\ \vdots \\ \nabla y_m^T \end{bmatrix} = \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \cdots & \frac{\partial y_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial y_m}{\partial x_1} & \cdots & \frac{\partial y_m}{\partial x_n} \end{bmatrix} \]
그렇다면 자코비안 행렬의 이해를 돕기위해 다음과 같은 예를 생각해보자. 함수 $f : \mathbb{R}^d \mapsto \mathbb{R}^m$ 즉, d차원의 벡터를 m차원으로 사상시키는 함수 $f$가 있다고 가정하자. 그렇다면 이 함수를 미분하여 얻은 행렬이 바로 자코비안 행렬이다.
$f:\ \mathbb{R}^2 \mapsto \mathbb{R}^3, f(x) = (2x_1 + x_2^2, -x^2_1+3x_2, 4x_1x_2)^T$라고 하면 자코비안 행렬은 다음과 같다.
\[ \boldsymbol{J} = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_1} & \cdots & \frac{\partial f_1}{\partial x_d} \\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \cdots & \frac{\partial f_2}{\partial x_d} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_m}{\partial x_1} & \frac{\partial f_m}{\partial x_2} & \cdots & \frac{\partial f_m}{\partial x_d} \end{bmatrix}, \ \ \ \boldsymbol{J} = \begin{bmatrix} 2 & 2x_2 \\ -2x_2 & 3 \\ 4x_2 & 4x_1 \end{bmatrix}, \ \ \ \boldsymbol{J}|_{(2,1)^T} = \begin{bmatrix} 2 & 2 \\ -4 & 3 \\ 4 & 8 \end{bmatrix} \]
$J|_{(2,1)^T}$는 $x_1=2, x_2=1$을 의미한다. 자코비안 행렬 내부의 값은 $f$를 미분한 값들로 구성되어 있다.
우리가 기계학습, 딥러닝에서 사용하는 SGD, Momentum, Adam, AdamW 등은 모두 자코비안에만 의존하여 계산된다. 2차 편미분을 고려하는 헤시안 행렬(Hesian Matrix)도 존재하지만, 매 출력마다 $n^2$개의 2차 편미분을 계산하여야 하기 때문에 딥러닝에는 적용하기 힘들다. 헤시안 행렬도 자코비안 행렬처럼 간단한 예를 통해 살펴보기만 하자.
함수 $f$를 $x_j$로 편미분한 결과를 $x_i$로 다시 편미분한 2차 편도함수이며, 이러한 편도함수는 $n^2$개가 존재한다. 이를 행렬로 배치한 것이 바로 해시안 행렬이다. 일반적으로 헤시안 행렬의 경우 $ H \in \mathbb{R}^{n \times n} $으로 정방행렬(Square matrix)를 가진다.
\[ \frac{\partial^2 f}{\partial x_i x_j} = \frac{\partial}{\partial x_i} (\frac{\partial f}{\partial x_j} ) \]
\[ f(x) = f(x_1, x_2) = (4 - 2.1x_1^2 + \frac{x_1^4}{3})x^2_1 + x_1x_2 + (-4 + 4x^2_2)x_2^2 \]
\[ \boldsymbol{H} = \begin{bmatrix} \frac{\partial^2 f}{\partial x_1x_1} & \frac{\partial^2 f}{\partial x_1x_2} & \cdots & \frac{\partial^2 f}{\partial x_1x_n} \\ \frac{\partial^2 f}{\partial x_2x_1} & \frac{\partial^2 f}{\partial x_2x_2} & \cdots & \frac{\partial f}{\partial x_2x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2 f}{\partial x_nx_1} & \frac{\partial^2 f}{\partial x_nx_2} & \cdots & \frac{\partial^2 f}{\partial x_nx_n} \end{bmatrix} \]
\[ \boldsymbol{H} = \begin{bmatrix} 10x_1^4-25.2x^2_1+8 & 1 \\ 1 & 3 \\ 48x^2_2-8 \end{bmatrix}, \ \ \ \boldsymbol{H}|_{(0,1)^T} = \begin{bmatrix} 8 & 1 \\ 1 & 40 \end{bmatrix} \]
헤시안 행렬을 구하기 위해 $f(x)$를 위와 같이 정의하면 자코비안 행렬에서의 방식과 유사한 방식으로 결과를 도출할 수 있다.
'Mathematics > Calculus' 카테고리의 다른 글
상미분 방정식의 종류와 근사해법 (0) | 2023.05.30 |
---|---|
[Calculus] Sigmoid 함수 미분하기 (0) | 2022.03.17 |
[Calculus] 라플라스 변환(Laplace Transform) (0) | 2022.03.14 |
[Calculus] Taylor series 는 무엇일까? (0) | 2022.03.11 |
[Calculus] 수치 미분(numerical differential) (0) | 2022.03.11 |