ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 머신러닝에 필요한 벡터, 행렬 미분 개념정리
    Math 2022. 7. 26. 12:12

    머신러닝을 공부하면서 벡터의 미분과 행렬의 미분이 많이 나와서 핵심적인 내용만 정리해보았습니다.

    본 글에서는 분자표기법(Numerator-layout notation)을 사용합니다.

    numerator : 분자

    denominator : 분모

     

    $A^ \prime$


    스칼라 함수의 미분

    • 입력이 스칼라이고 출력이 스칼라인 함수

    정의역 $X \in \mathbb R$ 에 속하는 스칼라 원소를 공역 $Y \in \mathbb R$ 에 속하는 스칼라로 대응시키는 함수를 $f : \mathbb R \rightarrow \mathbb R$ 이라고 하자. 이 함수에 대한 미분은 다음과 같이 정의된다.

    $$ {dy \over dx} = \lim_{h \rightarrow 0} {f(x+h) - f(x) \over h} = f^\prime(x) $$

     

     

    다변수 스칼라 함수의 미분

    • 입력이 벡터이고 출력이 스칼라인 함수

    정의역 $X \in \mathbb R^n$ 에 속하는 벡터 원소를 $Y \in \mathbb R$ 에 속하는 스칼라로 대응시키는 함수를 $f : \mathbb R^n \rightarrow \mathbb R$ 라고 하자. 이 함수에 대한 편미분은 다음과 같다. ($\mathbf x$로 바뀐 것에 주의하자.) $\mathbf e$는 단위벡터이다.

    $$ {\partial y \over \partial \mathbf x} = \lim_{h \rightarrow 0} {f(\mathbf x+\mathbf e h) - f(\mathbf x) \over h} = f^\prime(\mathbf x) $$

    여기서 $f^\prime(\mathbf x)$는 $f^\prime : \mathbb R^n \rightarrow \mathbb R^n$로 출력이 벡터인 벡터함수가 된다. 만약 $\mathbf x$가 열벡터라면 미분한 결과는 자코비안 행렬의 분자기준 표기법에 따라 행벡터로 표기한다.

    즉, 스칼라를 열벡터로 미분하면 행벡터로 표기한다.

    $$ \mathbf x = \begin {bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \\\end {bmatrix}, \ f(\mathbf x) = y , \ f^\prime(\mathbf x) = \begin {bmatrix} {\partial y \over \partial x_1}, {\partial y \over \partial x_2}, \cdots, {\partial y \over \partial x_n} \end {bmatrix} $$

     

     


    벡터함수의 미분

    • 입력이 스칼라이고 출력이 벡터인 함수

    정의역 $X \in \mathbb R$에 속하는 스칼라 원소를 공역 $Y \in \mathbb R^m$에 속하는 벡터로 대응시키는 함수를 $f : \mathbb R \rightarrow \mathbb R^m$이라고 하자. 벡터 함수에 대한 편미분은 다음과 같다. 여기서 분자의 연산은 벡터간 연산이다.

    $$ {\partial \mathbf y \over \partial x} = \lim_{h \rightarrow 0} {\mathbf f(x+h) - \mathbf f(x) \over h} = \mathbf f^\prime(x) ,\ \ \ \mathbf f(x) = \begin {bmatrix} f_1(x) \\ f_2(x) \\ \vdots \\ f_m(x) \end {bmatrix} $$

    $\mathbf f^\prime(x)$ 는 $\mathbf f^\prime : \mathbb R \rightarrow \mathbb R^m$으로 출력이 벡터인 벡터함수다.

    분자기준으로 벡터를 스칼라로 미분하면 열벡터로 표기한다

    $$ {\partial \mathbf y \over \partial x} = \mathbf f^\prime(x) = \begin {bmatrix} \partial y_1 \over \partial x \\ \partial y_2 \over \partial x \\ \vdots \\ \partial y_m \over \partial x \\\end {bmatrix} $$

     

     

    다변수 벡터함수의 미분(자코비안 행렬)

    • 입력도 벡터이고 출력도 벡터인 함수

    정의역 $X \in \mathbb R^n$에 속하는 스칼라 원소를 공역 $Y \in \mathbb R^m$에 속하는 벡터로 대응시키는 함수를 $F : \mathbb R^n \rightarrow \mathbb R^m$ 이라고 하자. 그러면 함수 $F$는 $F \in \mathbb R^{n\times m}$의 행렬공간에 속하게 된다. 여기서 보통 벡터를 다른 벡터로 변환시키게 되므로 함수 $F$를 선형변환이라고도 부른다. https://proofwiki.org/wiki/Definition:Matrix_Space

    $$ \mathbf x = \begin {bmatrix} x_1 \\ x_2 \\ x_3\\ \vdots \\ x_n \\\end {bmatrix}, \ \mathbf y = \begin {bmatrix} y_1 \\ y_2 \\ \vdots \\ y_m \\\end {bmatrix} \ F = \begin {bmatrix} F_{11} & F_{12} & \cdots & F_{1m} \\ F_{21} & F_{22} \\ \vdots & & \ddots & \vdots \\ F_{n1} & & \cdots & F_{nm} \\\end {bmatrix} $$

    $$ F = \begin {bmatrix} F_{1} \\ F_{2} \\ \vdots \\ F_{n} \end {bmatrix} (F_i=[F_{i1},F_{i2}, \dots, F_{m1}]) $$

    $$ \mathbf y = F(\mathbf x) = F^T \mathbf x $$

    여기서 $F^T$는 $F$ 행렬의 전치행렬이다. 함수 F의 미분은 다음과 같다.

     

    $$ {\partial \mathbf y \over \partial \mathbf x} = \begin {bmatrix} {\partial y_1 \over \partial x_1} & {\partial y_1 \over \partial x_2}& \cdots & {\partial y_1 \over \partial x_n} \\ {\partial y_2 \over \partial x_1}& {\partial y_2 \over \partial x_2} & \cdots & {\partial y_2 \over \partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ {\partial y_m \over \partial x_1} & {\partial y_m \over \partial x_2} & \cdots & {\partial y_m \over \partial x_n}\\\end {bmatrix} = F^T \ (m \times n) $$

    $$ = \bigg [{\partial \mathbf f \over \partial x_1}, \dots, {\partial \mathbf f \over \partial x_n} \bigg ] $$

    $$ = \begin {bmatrix} {\nabla f_1(\mathbf x)^T} \\ \vdots \\ \nabla f_m(\mathbf x)^T\end {bmatrix} $$

    벡터를 벡터로 미분한 결과 행렬이 나왔다. 위 행렬을 자코비안 행렬이라고 한다.

    정리를 하자면 아래 그림에서 우리는 네 가지 경우의 벡터 미분에 대해서 다루었다. 이제 나머지 부분의 행렬 미분을 생각해보자.

     

     


    행렬함수의 미분

    • 입력이 행렬이고 출력이 스칼라인 함수

    정의역 $X \in \mathbb R^{p\times q}$에 속하는 행렬 원소를 공역 $Y \in \mathbb R$에 속하는 스칼라로 대응시키는 함수를 $F : \mathbb R^{p\times q} \rightarrow \mathbb R$ 라고 하자.

    • 입력이 스칼라이고 출력이 행렬인 함수

    정의역 $X \in \mathbb R$에 속하는 스칼라 원소를 공역 $Y \in \mathbb R^{m\times n}$에 속하는 행렬로 대응시키는 함수를 $F : \mathbb R \rightarrow \mathbb R^{m\times n}$ 라고 하자.

     

     


    헤시안 행렬

    다변수 스칼라함수 $f(x, y, z ,...)$를 다차원 입력의 각 원소들로 미분한 이차미분값을 담은 행렬을 헤시안 행렬이라고 하고 $\mathbf H(f), \mathbf Hf, \mathbf H_f$등으로 표기한다.

    $$ \mathbf H(f) = \begin{bmatrix} \partial^2f \over \partial x^2 & \partial^2f \over \partial x \partial y & \partial^2f \over \partial x \partial z & \cdots~~ \\ \partial^2f \over \partial y \partial x & \partial^2f \over \partial y^2 & \partial^2f \over \partial y \partial z & \cdots~~ \\ \partial^2f \over \partial y \partial x & \partial^2f \over \partial y^2 & \partial^2f \over \partial y \partial z & \cdots~ \\ \vdots & \vdots & \vdots & \ddots \end{bmatrix} $$

    • 다변수함수가 연속이라면 헤시안 행렬은 대칭행렬이 된다.

    자코비안 행렬과의 차이점 :

    • 자코비안 행렬은 다변수 벡터함수를 벡터로 미분한 결과이다.
    • 따라서 헤시안 행렬은 스칼라함수의 그래디ㅡ언트에 대해서 자코비안 행렬을 구한 것과 같다.
    • 비선형변환을 미소구간에 대해 선형변환으로 근사시킬 때 사용한다.
    • 그러므로 Jacobian의 행렬의 행렬식의 의미는 원래 좌표계에서 변환된 좌표계로 변환될 때의 넓이의 변화 비율을 말해준다

     

     


    유용한 연산들

    1. Linear Form

    $\mathbf x$가 n차원 열벡터, $\mathbf w$도 n차원 열벡터라하면 두 백터의 내적은 스칼라이므로, 스칼라를 열벡터로 미분한 것이 되어서 그 결과는 행벡터가 나온다.

    $$ {\partial \mathbf w^T \mathbf x \over \partial \mathbf x} = {\partial \mathbf x^T \mathbf w \over \partial \mathbf x} = \mathbf w^T \tag {1} $$

    $$ {\partial \mathbf y^T \mathbf z \over \partial \mathbf x} = {\partial \mathbf z^T \mathbf y \over \partial \mathbf x} = \mathbf y^T {\partial \mathbf z \over \partial \mathbf x} + \mathbf z^T {\partial \mathbf y \over \partial \mathbf x} \tag {2} $$

    $$ {\partial \mathbf {AB} \over \partial x} = {\partial \mathbf A \over \partial x}\mathbf B + \mathbf A{\partial \mathbf B \over \partial x} \tag {3} $$

    $$ {\partial \mathbf A^{-1} \over \partial x} = -\mathbf A^{-1} {\partial \mathbf A \over \partial x}\mathbf A^{-1} \tag {4} $$

    2. Quadratic Form

    $\alpha = \mathbf x^T \mathbf A\mathbf x$ 알파가 quadratic form으로 스칼라로 계산될 때 아래와 같다. 마찬가지로 분자표기법을 따른다.

    Scalar by Vector

    $\mathbf x$가 n차원 열벡터라고 하면 스칼라에 대한 편미분은 n차원 행벡터가 나올 것이다. (nx1) → (1xn)

    (1xn) = (1xn) X (n x n)

    $$ {\partial \alpha \over \partial \mathbf x}= {\partial \mathbf x^T \mathbf A\mathbf x \over \partial \mathbf x} = \mathbf x^T (\mathbf A^T + \mathbf A) $$

    만약 A가 대칭행렬이라면 미분은 다음과 같다. 

    $$ {\partial \alpha \over \partial \mathbf x}= 2\mathbf x^T\mathbf A
    $$

    Scalar by Matrix

    $$ {\partial \alpha \over \partial \mathbf A}= \mathbf x \mathbf x^T $$

    Norm

    $$ {\partial ||\mathbf x ||^2 \over \mathbf x} = 2 \mathbf x^T $$

     

     


    Jacobian Vector Product(JVP) & Vector Jacobian Product(VJP)

    다변수 스칼라 함수를 $F : \mathbb R^n \rightarrow \mathbb R$ 라고 하자. 이 함수에 대한 그래디언트는 체인룰을 통해 계산할 수 있다. 하지만 체인룰 자체는 어떤 자코비안 행렬들을 먼저 연산해야할지 알려주지 않는다. 계산복잡도의 관점에서 자코비안을 곱하는 순서는 복잡도를 다르게 만든다.

    다변수 스칼라 함수를 $F = D \circ C \circ B \circ A$ 로 여러 개의 함수들이 합성된 함수로 정의하자. 그러면 함수 $F$를 다음과 같이 여러 중간 값으로 분리해서 기술할 수 있다.

    $F$에 대한 그래디언트 또는 자코비안은 다음과 같이 주어진다.

    여기서 $A^\prime$, $B^\prime$, $C^\prime$, $D^\prime$ 들은 $A, B, C, D$에 대해 자코비안을 계산하는 함수다. 여기서 입력 $x$는 벡터이고 $y$는 스칼라 출력임을 기억하자.

     

     

     

    행렬의 곱셈은 결합법칙이 성립하기 때문에 식 2.15의 자코비안들을 어떤 순서로 곱해도 결과는 같다.

    위 그림에서 오른쪽부터 계산을 시작하는 것을 “forward accumulation mode”라고 하고, 왼쪽부터 계산하는 것을 “Reverse accumulation mode”라고 한다.

    forward mode의 경우 행렬 곱을 수행하면서 기존 데이터를 삭제해도 상관없기에 메모리 효율적이다.

    반면, reverse mode의 경우 벡터 행렬 곱을 왼쪽에서 오른쪽으로 수행하기 때문에 이전에 Forward연산에서 수행한 중간 값들을 저장하고 있어야 한다. 이는 레이어의 깊이가 매우 깊거나 RNN 같은 순환 신경망 모델들의 학습에서 OOM을 일으키는 원인 중 하나다.

    계산되는 중간 값들의 크기가 얼마나 극적으로 바뀌는지 확인해보자.

    forward mode에서 자코비안은 다음과 같다. $\partial \mathbf b \over \partial \mathbf x$ $\mathbf x$의 경우 벡터이기에 $\mathbf b$에 있는 원소들의 개수만큼 D 번 계산을 수행한다. 즉, D x N번 만큼 계산을 수행해야 한다.

    반면 reverse mode에서는 함수에 대한 그래디언트를 더욱 효율적으로 계산할 수 있다. $y$를 열벡터 $\mathbf b$에 대해서 그래디언트를 취하면 행벡터를 얻을 수 있다.

    자코비안들은 보통 매우 sparse하기에 우리는 행렬곱에서 일부만을 사용하게 된다. 따라서 우리는 $A^\prime(\mathbf x), B^\prime(\mathbf a), C^\prime(\mathbf b), D^\prime(\mathbf c)$ 자코비안들을 일일히 계산할 필요가 없다!

    행렬들은 그저 linear maps의 표현들이기에 행렬을 직접 메모리에 할당하는 것보다는 linear maps을 적용하는 함수를 직접 구현할 수 있다.

    즉, 각각의 중간층의 함수 $A : \mathbb R^M \rightarrow \mathbb R^N$와 자코비안 $A^\prime : \mathbb R^M \rightarrow \mathbb R^{N\times M}$에 대해서 left-multiplying Jacobian-vector product function (JVP) 을 다음과 같이 정의할 수 있다.

    $(\text {JVP}), J_A : \mathbb R^M \rightarrow (\mathbb R^M \rightarrow \mathbb R^N)$

    $$ J_A(\mathbf x, \mathbf g) = A^\prime(\mathbf x) \mathbf g \tag {2.19} $$

    그리고 right-multiplying vector-Jacobian product function (VJP) 을 다음과 같이 정의할 수 있다.

    $(\text {VJP}), J_A^T : \mathbb R^M \rightarrow (\mathbb R^N \rightarrow \mathbb R^M)$

    $$ J_A^T(\mathbf x, \mathbf g) = \mathbf g A^\prime(\mathbf x) \tag {2.20} $$

    위에서 $\mathbf g$는 임의의 벡터이고 $J_A$ 또는 $J_A^T$ 또한 벡터이다. (자코비안 행렬과 벡터를 곱하면 벡터가 되기 때문)

    예를 들어, 벡터 간 원소곱을 수행하는 함수를 고려해보자

    $$ F(\mathbf x) = \text {ElemSquare} (\mathbf x) = \mathbf x \odot \mathbf x \tag {2.21} $$

    이 함수의 자코비안은 매우 sparse한 행렬이 된다. $2x$를 대각성분으로 하고 나머지는 0이다.

    $$ F^\prime(\mathbf x) = \begin {bmatrix} 2x & 0 &\cdots& 0 \\ 0 & 2x &\cdots& 0 \\ \vdots & \vdots &\ddots& \vdots \\ 0 & 0 &\cdots& 2x \\ \end {bmatrix} $$

    위 함수에 대해서 VJP function은 다음과 같이주어진다.

    $$ J_{\text {Elem}}^T(\mathbf x, \mathbf g) = 2 \mathbf g \odot \mathbf x \tag {2.22} $$

    자코비안은 대칭행렬이기 때문에 JVP 함수도 똑같이 구해진다.

     

     

    Forward vs Reverse

    이제 forward mode와 reversemode의 차이점을 그림을 통해 이해해보자.

    forward mode의 경우 중간 변수들의 인풋 $\mathbf x$에 대한 자코비안 $\partial \mathbf a \over \partial \mathbf x$ $\partial \mathbf b \over \partial \mathbf x$ 같은 값들을 누적해나간다. 이는 이전 단계의 자코비안을 현재 primitive 자코비안에 곱하면서 수행된다. 그림을 잘 살펴보면 D차원 단위기저벡터를 자코비안 행렬과 먼저 곱하고 나온 벡터를 다시 자코비안 행렬에 곱하는 방식이다.

    $J_C$의 경우 행의 길이가 1인 자코비안 행렬 즉, 벡터이기에 출력이 두 벡터의 내적이므로 스칼라가 나온다. 마지막에 $\partial y \over \partial \mathbf x$로 향하는 여러 개의 화살표들은 스칼라들을 모아서 만든 벡터이다. 결과적으로 우리는 행렬과 행렬의 곱을 수행하는 것이 아니라 행렬과 벡터의 곱을 반복적으로 수행해서 최종적인 그래디언트를 얻을 수 있는 것이다.

    reverse mode의 경우 반대 방향으로 이루어진다. 출력 y를 중간 변수들에 대해 얻은 자코비안 $\partial y \over \partial \mathbf a$, $\partial y \over \partial \mathbf b$ 같은 값들을 누적해나간다. forward mode 미분은 따라서 reverse mode보다 D배 느리다.

     

     

    forward mode와 reverse mode의 차이를 정리하면 위와 같다.

     

     

    [출처]

    1. https://ko.wikipedia.org/wiki/함수
    2. https://en.wikipedia.org/wiki/Matrix_calculus
    3. https://darkpgmr.tistory.com/141
    4. https://datascienceschool.net/02 mathematics/04.04 행렬의 미분.html
    5. Matrix Differentiation, Randal J. Barness
    6. https://m.blog.naver.com/enewltlr/220918689039
    7. Modeling, Inference and Optimization with Composable Differentiable Procedures, 2016, Dougal, Maclaurin

    'Math' 카테고리의 다른 글

    Variational Inference 관련 내용 정리  (1) 2022.09.26
    최적화 관련 내용 정리  (0) 2022.09.02
    정준연결함수(Canonical Function)  (0) 2021.07.25
    머신러닝에서 선형과 비선형  (0) 2021.07.25

    댓글

Designed by Tistory.