Mathematics/Calculus

[Calculus] Jacobian matrix

언킴 2022. 3. 11. 14:37
반응형

 

 

딥러닝에서는 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)$를 위와 같이 정의하면 자코비안 행렬에서의 방식과 유사한 방식으로 결과를 도출할 수 있다.