행렬의 그래디언트

우리는 행렬을 벡터(또는 다른 행렬)로 미분해야 하는 상황에 직면하게 될 것이며, 이는 다차원 텐서(multidimensional tensor)를 결과로 낳는다. 우리는 이 텐서를 편미분들을 모아 놓은 다차원 배열로 생각할 수 있다. 예를 들어, 만약 우리가 $m \times n$ 행렬 $A$ 를 $p \times q$ 행렬 $B$ 로 미분한 그라디언트를 계산한다면, 그 결과인 야코비안은 $(m \times n) \times (p \times q)$ , 즉 4차원 텐서 $J$ 가 되며, 그 성분들은 $J_{ijkl} = \frac{\partial A_{ij}}{\partial B_{kl}}$ 로 주어진다.
$\quad$ 행렬은 선형 사상(linear mappings)을 나타내므로, 우리는 $m \times n$ 행렬들의 공간 $\mathbb{R}^{m \times n}$ 과 $mn$ 길이의 벡터들의 공간 $\mathbb{R}^{mn}$ 사이에 벡터 공간 동형 사상(vector-space isomorphism, 선형적이고 역행렬이 존재하는 사상)이 존재한다는 사실을 이용할 수 있다. 따라서, 우리는 행렬들을 각각 길이가 $mn$ 과 $pq$ 인 벡터로 형태를 변환(re-shape)할 수 있다. 이 $mn$ 벡터들을 사용한 그라디언트는 크기가 $mn \times pq$ 인 야코비안 행렬을 결과로 산출한다.
그림 5.7은 이 두 가지 접근 방식을 모두 시각화한다. 실제 응용에서는 행렬을 벡터로 형태 변환하여 이 야코비안 행렬을 가지고 계속 작업하는 것이 종종 바람직하다. 야코비안 텐서의 경우 합산(sum out)해야 할 차원이 무엇인지에 더 많은 주의를 기울여야 하는 반면, 야코비안 행렬의 경우에는 연쇄 법칙 (5.48)이 단순한 행렬 곱셈으로 귀결되기 때문이다.
그림 5.7: 벡터에 대한 행렬의 그라디언트 계산 시각화. 우리는 벡터 $x \in \mathbb{R}^3$ 에 대한 행렬 $A \in \mathbb{R}^{4 \times 2}$ 의 그라디언트를 계산하는 데 관심이 있다. 우리는 그 그라디언트 $\frac{dA}{dx} \in \mathbb{R}^{4 \times 2 \times 3}$ 임을 알고 있다. 우리는 그곳에 도달하기 위해 두 가지 동등한 접근 방식을 따른다.
figure 5.7.1.png

  • (a) 접근법 1: 우리는 각각 $4 \times 2$ 행렬인 편미분 $\frac{\partial A}{\partial x_1}, \frac{\partial A}{\partial x_2}, \frac{\partial A}{\partial x_3}$ 를 계산하고, 이들을 모아(collate) $4 \times 2 \times 3$ 텐서로 만든다.
    figure 5.7.2.png
  • (b) 접근법 2: 우리는 행렬 $A \in \mathbb{R}^{4 \times 2}$ 를 벡터 $\tilde{A} \in \mathbb{R}^8$ 로 형태를 바꾼다(평탄화, flatten). 그런 다음, 우리는 그라디언트 $\frac{d\tilde{A}}{dx} \in \mathbb{R}^{8 \times 3}$ 을 계산한다. 위 그림과 같이 이 그라디언트를 형태 변환(re-shaping)함으로써 우리는 그라디언트 텐서를 얻는다.

예제 5.12 (행렬에 대한 벡터의 그라디언트)

다음과 같은 예제를 고려해 보자.

$$ f = Ax, \quad f \in \mathbb{R}^M, \quad A \in \mathbb{R}^{M \times N}, \quad x \in \mathbb{R}^N \quad (5.85) $$

여기서 우리는 그라디언트 $\frac{df}{dA}$ 를 구하고자 한다. 먼저 다음과 같이 그라디언트의 차원을 결정하는 것부터 다시 시작해 보자.

$$ \frac{df}{dA} \in \mathbb{R}^{M \times (M \times N)}. \quad (5.86) $$

정의에 따라, 그라디언트는 편미분들을 모아 놓은 것이다.

$$ \frac{df}{dA} = \begin{bmatrix} \frac{\partial f_1}{\partial A} \\ \vdots \\ \frac{\partial f_M}{\partial A} \end{bmatrix}, \quad \frac{\partial f_i}{\partial A} \in \mathbb{R}^{1 \times (M \times N)}. \quad (5.87) $$

편미분들을 계산하기 위해, 행렬-벡터 곱셈을 명시적으로 풀어서 쓰는 것이 도움이 될 것이다.

$$ f_i = \sum_{j=1}^N A_{ij}x_j, \quad i = 1, \dots, M, \quad (5.88) $$

( $\to$ $i$ 번째 출력( $f_i$ )은 $A$ 의 $i$ 번째 행( $A_{i1}, \dots , A_{ij}, \dots, A_{iN}$ )과 입력 $x_1, \dots, x_j, \dots, x_N$ 로만 계산된다. $f_i = A_{i1}x_1 + \dots + A_{iq}x_q + \dots + A_{iN}x_N$ . 이는 $A$ 의 $i$ 번째 행과 $x$ 의 내적으로도 볼 수 있다.)

그러면 편미분은 다음과 같이 주어진다.

$$ \frac{\partial f_i}{\partial A_{iq}} = x_q. \quad (5.89) $$

( $\to$ 이때 $A$ 의 $i$ 번째 행의 $q$ 번째 열 원소에 대해 $f_i$ 를 편미분하면 그에 대응되는 입력 $x_p$ 가 나온다.)

이를 통해 우리는 $f_i$ 를 $A$ 의 한 행(row)에 대해 편미분한 값을 계산할 수 있으며, 이는 다음과 같이 주어진다.

$$ \frac{\partial f_i}{\partial A_{i,:}} = x^\top \in \mathbb{R}^{1 \times 1 \times N}, \quad (5.90) $$

( $\to$ $f_i$ 를 $A$ 의 $i$ 번째 행 전체로 미분한 결과는 $x^{\top} = [x_1, \dots, x_N]$ 이 된다.)

$$ \frac{\partial f_i}{\partial A_{k \neq i,:}} = 0^\top \in \mathbb{R}^{1 \times 1 \times N} \quad (5.91) $$

( $\to$ $f_i$ 를 $A$ 의 $i$ 번째 행이 아닌 다른 행으로 편미분할 시 모두 상수 취급되므로 전부 0이 된다)

여기서 우리는 올바른 차원에 주의를 기울여야 한다. $f_i$ 는 $\mathbb{R}$ 로 매핑되고(스칼라이고) $A$ 의 각 행의 크기는 $1 \times N$ 이므로, 우리는 $f_i$ 를 $A$ 의 한 행으로 편미분한 결과로 $1 \times 1 \times N$ 크기의 텐서를 얻는다.

우리는 편미분 (5.91)을 쌓아 올려 식 (5.87)에서 원했던 그라디언트를 다음과 같이 얻는다.

$$ \frac{\partial f_i}{\partial A} = \begin{bmatrix} 0^\top \\ \vdots \\ 0^\top \\ x^\top \\ 0^\top \\ \vdots \\ 0^\top \end{bmatrix} \in \mathbb{R}^{1 \times (M \times N)}. \quad (5.92) $$

( $\to$ 예제 5.12은 추상적인 문자( $M, N$ )대신 구체적인 숫자(e.g., $M=2, N=3$ )를 대입해서 풀면 쉽다.)

$\to$ 저 0인 행들은 굳이 표시해야 하는지 생각해볼 수 있다. 뒷 레이어의 그래디언트를 앞쪽으로 전달하기 위해 행렬사이의 차원이 일치해야 하기 때문에 결과가 0인 것을 알아도, 함부로 제거할 수 없다. 그러나 실제 딥러닝 모델들은 이런 불필요한 연산결과를 아예 생성조차 하지 않는다. 뒷 레이어에서 내려온 오차 벡터( $\delta$ )와 현재 층의 입력 벡터( $x$ )를 외적( $\delta x^\top$ )하여 이 0 투성이의 행렬(또는 텐서)을 만들어서 곱하는 과정을 거치지 않는다. 이를 벡터-야코비안 곱(VJP, Vector-Jacobian Product)라고 한다.

$\to$ 그렇다면 오차 벡터와 입력 벡터의 외적( $\delta x^\top$ )이 어떤 (대수적, 기하학적)의미를 가지는가?

$\to$ 식 (5.92)을 모든 $f$ 에 대해 계산하면 아래와 같다:

$$ \frac{df}{dA} = \begin{bmatrix} x^\top & 0^\top & \dots & 0^\top \\ 0^\top & x^\top & \dots & 0^\top \\ \vdots & \vdots & \ddots & \vdots \\ 0^\top & 0^\top & \dots & x^\top \end{bmatrix} \in \mathbb{R}^{M \times (MN)} $$

형태를 보면 대각 원소에만 값이 존재하고, 나머지는 0으로 채워졌다. 다만, 그 대각선에 들어있는 값이 스칼라가 아닌 $x^{\top}$ 라는 $1 \times N$ 크기의 행 벡터이다. 이렇게 작은 행렬(블록)들을 대각 원소로 가지는 형태를 블록 대각 행렬(Block Diagonal Matrix)이라고 부른다.

$\to$ 위 형태가 대각 행렬이므로 대칭을 떠올릴 수 있지만 이 야코비안 행렬은 대칭행렬이 될 수 없다. 입력 벡터 $x$ 의 크기( $N$ )가 1인 특수한 경우(일변수)가 아니라면, 이 행렬은 가로로 긴 직사각형 형태가 된다. 때문에 전치 행렬의 정의인 $S=S^{\top}$ 도 성립하지 않는다.

$\to$ 위 야코비안 행렬( $\frac{df}{dA}$ )을 $J$ 라고 하자. 이때 $JJ^{\top}$ (또는 $J^{\top}J$ )는 대칭행렬이다. 이는 단순히 “야코비안 행렬의 제곱은 대칭이다”라는 사실을 넘어서 이 $J^{\top}J$ 형태는 복잡한 헤시안 행렬(Hessian, 2차 미분 행렬)의 좋은 근사이다(가우스-뉴턴 근사).

예제 5.13 (행렬에 대한 행렬의 그라디언트)

다음과 같은 행렬 $R \in \mathbb{R}^{M \times N}$ 과 함수 $f: \mathbb{R}^{M \times N} \rightarrow \mathbb{R}^{N \times N}$ 를 고려하자.

$$ f(R) = R^\top R =: K \in \mathbb{R}^{N \times N}, \quad (5.93) $$

여기서 우리는 그라디언트 $dK/dR$ 을 구하고자 한다.

$\quad$ 이 어려운 문제를 풀기 위해, 먼저 우리가 이미 알고 있는 것부터 적어보자: 그라디언트는 다음과 같은 차원을 가진다.

$$ \frac{dK}{dR} \in \mathbb{R}^{(N \times N) \times (M \times N)}, \quad (5.94) $$

이는 텐서이다. 나아가, 다음이 성립한다.

$$ \frac{dK_{pq}}{dR} \in \mathbb{R}^{1 \times M \times N} \quad (5.95) $$

여기서 $p, q = 1, \dots, N$ 이며, $K_{pq}$ 는 $K = f(R)$ 의 $(p, q)$ 번째 성분이다. $R$ 의 $i$ 번째 열(column)을 $r_i$ 로 표기하면, $K$ 의 모든 성분은 $R$ 의 두 열의 내적(dot product)으로 주어진다. 즉,

$$ K_{pq} = r_p^\top r_q = \sum_{m=1}^M R_{mp}R_{mq}. \quad (5.96) $$

이제 우리가 편미분 $\frac{\partial K_{pq}}{\partial R_{ij}}$ 를 계산하면 다음을 얻는다.

$$ \frac{\partial K_{pq}}{\partial R_{ij}} = \sum_{m=1}^M \frac{\partial}{\partial R_{ij}} R_{mp}R_{mq} = \partial_{pqij}, \quad (5.97) $$
$$ \partial_{pqij} = \begin{cases} R_{iq} & \text{if } j = p, p \neq q \\ R_{ip} & \text{if } j = q, p \neq q \\ 2R_{iq} & \text{if } j = p, p = q \\ 0 & \text{otherwise} \end{cases}. \quad (5.98) $$

식 (5.94)로부터, 우리는 구하고자 하는 그라디언트가 $(N \times N) \times (M \times N)$ 차원을 가진다는 것을 알고 있으며, 이 텐서의 모든 개별 성분은 식 (5.98)의 $\partial_{pqij}$ 로 주어진다 (여기서 $p, q, j = 1, \dots, N$ 이고 $i = 1, \dots, M$ 이다).