Search
Duplicate

수학/ 행렬 곱, 행-열간 합과 스케일링, Quadratic form, Kronecker 곱, Einsum

행렬 곱

두 행렬 A,B\bold{A, B}의 곱은 앞에 있는 A\bold{A}의 행벡터와 뒤에 있는 B\bold{B}의 열벡터간의 내적을 나열한 것으로 이해하는게 가장 일반적이다.
C=AB=[a1a2am][b1b2...bp]=[a1b1a1b2...a1bpa2b1a2b2...a2bpamb1amb2...ambp]\bold{C = AB} = \left[ \begin{matrix} - & \bold{a}_1^\top & - \\ - & \bold{a}_2^\top & - \\ & \vdots & \\ - & \bold{a}_m^\top & - \end{matrix} \right] \left[ \begin{matrix} \vert & \vert & & \vert \\ \bold{b}_1 & \bold{b}_2 & ... & \bold{b}_p \\ \vert & \vert & & \vert \end{matrix} \right] = \left[ \begin{matrix} \bold{a}_1^\top \bold{b}_1 & \bold{a}_1^\top \bold{b}_2 & ... & \bold{a}_1^\top \bold{b}_p \\ \bold{a}_2^\top \bold{b}_1 & \bold{a}_2^\top \bold{b}_2 & ... & \bold{a}_2^\top \bold{b}_p \\ \vdots & \vdots & \ddots & \vdots \\ \bold{a}_m^\top \bold{b}_1 & \bold{a}_m^\top \bold{b}_2 & ... & \bold{a}_m^\top \bold{b}_p \end{matrix} \right] \\
이는 다음과 같은 몇 가지 다른 방법으로도 해석이 가능하고, 모두 동등하다.
1.
앞에 있는 A\bold{A}의 열벡터와 뒤에 있는 B\bold{B}의 행벡터 간의 외적의 합으로 해석.
2.
앞에 있는 행렬 A\bold{A}와 뒤에 있는 B\bold{B}의 열벡터 간의 행렬-벡터 곱으로 해석
3.
앞에 있는 A\bold{A}의 행과 뒤에 있는 행렬 B\bold{B}의 벡터-행렬 곱으로 해석
행렬과 벡터의 곱을 별도로 정의할 수도 있지만 벡터를 열이나 행이 1인 행렬로 이해하면 벡터와 행렬의 곱도 두 행렬 간의 곱으로 이해할 수 있다.
행렬의 곱은 두 행렬의 안쪽의 크기가 맞아야 가능하며, 그 결과의 크기는 바깥쪽이 된다.
m×nm \times n 행렬과 n×qn \times q 행렬을 곱하면 결과의 크기는 m×qm \times q가 된다.

행렬의 행이나 열간의 합

m×nm \times n 행렬 A\bold{A}에 대해 열의 합을 구하려면 다음과 같은 2가지 방법을 사용할 수 있다.
1.
모든 요소가 1인 mm차원 벡터 1m\bold{1}_m를 행렬의 앞에 곱하여(pre-multiplying) 구할 수 있다. 이 경우 결과의 크기는 1×n1 \times n이 된다.
열벡터이므로 전치해서 1×m1 \times m 형태로 곱한다.
1mX=(mxm1...mxmn)\bold{1}_m^\top \bold{X} = (\begin{matrix} \sum_m x_{m1} & ... & \sum_m x_{mn} \end{matrix})
2.
또는 모든 요소가 1인 nn차원 벡터 1n\bold{1}_n를 행렬의 뒤에 곱하여(pre-multiplying) 구할 수 있다. 이 경우 결과의 크기는 m×1m \times 1이 된다.
X1n=(nx1nnxmn)\bold{X}\bold{1}_n = \left( \begin{matrix} \sum_n x_{1n} \\ \vdots \\ \sum_n x_{mn} \end{matrix} \right)
같은 식으로 행렬의 행의 합도 구할 수 있다.

행렬의 행이나 열간의 크기 조정

표준화 등을 위해 행렬의 행이나 열의 크기를 조정하고 싶을 수 있다.
m×nm \times n 행렬 A\bold{A}에 대해 행 별로 크기를 조정하고 싶다면 mm차원 벡터를 갖는 대각 행렬 S=diag(s)\bold{S} = \text{diag}(\bold{s})를 행렬의 앞에 곱하여 (pre-multiply) 구할 수 있다.
diag(s)X=(s1...00...sm)(x1,1...x1,nxm,1...xm,n)=(s1x1,1...s1x1,nsmxm,1...smxm,n)\begin{aligned} \text{diag}(\bold{s})\bold{X} &= \left( \begin{matrix} s_1 & ... & 0 \\ & \ddots & \\ 0 & ... & s_m\end{matrix} \right) \left( \begin{matrix} x_{1,1} & ... & x_{1,n} \\ & \ddots & \\ x_{m,1} & ... & x_{m,n} \end{matrix} \right) \\ &= \left( \begin{matrix} s_1 x_{1,1} & ... & s_1 x_{1,n} \\ & \ddots & \\ s_m x_{m,1} & ... & s_m x_{m,n} \end{matrix} \right) \end{aligned}
비슷하게 m×nm \times n 행렬 A\bold{A}에 대해 열 별로 크기를 조정하고 싶다면 nn차원 벡터를 갖는 대각 행렬 S=diag(s)\bold{S} = \text{diag}(\bold{s})를 행렬의 뒤에 곱하여 (post-multiply) 구할 수 있다.
Xdiag(s)=(x1,1...x1,nxm,1...xm,n)(s1...00...sn)=(s1x1,1...snx1,ns1xm,1...snxm,n)\begin{aligned} \bold{X}\text{diag}(\bold{s}) &= \left( \begin{matrix} x_{1,1} & ... & x_{1,n} \\ & \ddots & \\ x_{m,1} & ... & x_{m,n} \end{matrix} \right) \left( \begin{matrix} s_1 & ... & 0 \\ & \ddots & \\ 0 & ... & s_n\end{matrix} \right) \\ &= \left( \begin{matrix} s_1 x_{1,1} & ... & s_n x_{1,n} \\ & \ddots & \\ s_1 x_{m,1} & ... & s_n x_{m,n} \end{matrix} \right) \end{aligned}

2차 형식(Quadratic Form)

벡터의 이차 형식(quadratic form)은 다음과 같이 어떤 벡터와 정사각행렬이 ‘행벡터 x 정사각행렬 x 열벡터’ 형식으로 되어 있는 것을 말한다.
f(x)=xAxf(\bold{x}) = \bold{x}^\top\bold{A}\bold{x}

Kronecker products

Kronecker 곱 AB\bold{A} \otimes \bold{B}A\bold{A}m×nm \times n 행렬이고 B\bold{B}p×qp \times q 행렬일 때, mp×nqmp \times nq 블록 행렬이 된다.
AB=[a11B...a1nBam1B...amnB]\bold{A} \otimes \bold{B} = \left[ \begin{matrix} a_{11}\bold{B} & ... & a_{1n}\bold{B} \\ & \ddots & \\ a_{m1}\bold{B} & ... & a_{mn}\bold{B} \end{matrix} \right]
예컨대
[a11a12a21a22a31a32][b11b12b13b21b22b23]=[a11b11a11b12a11b13a12b11a12b12a12b13a11b21a11b22a11b23a12b21a12b22a12b23a21b11a21b12a21b13a22b11a22b12a22b13a21b21a21b22a21b23a22b21a22b22a22b23a31b11a31b12a31b13a32b11a32b12a32b13a31b21a31b22a31b23a32b21a32b22a32b23]\left[ \begin{matrix} a_{11} & a_{12} \\ a_{21} & a_{22} \\ a_{31} & a_{32} \end{matrix} \right] \otimes \left[ \begin{matrix} b_{11} & b_{12} & b_{13} \\ b_{21} & b_{22} & b_{23} \end{matrix} \right] = \left[ \begin{matrix} a_{11} b_{11} & a_{11} b_{12} & a_{11} b_{13} & a_{12} b_{11} & a_{12} b_{12} & a_{12} b_{13} \\ a_{11} b_{21} & a_{11} b_{22} & a_{11} b_{23} & a_{12} b_{21} & a_{12} b_{22} & a_{12} b_{23} \\ a_{21} b_{11} & a_{21} b_{12} & a_{21} b_{13} & a_{22} b_{11} & a_{22} b_{12} & a_{22} b_{13} \\ a_{21} b_{21} & a_{21} b_{22} & a_{21} b_{23} & a_{22} b_{21} & a_{22} b_{22} & a_{22} b_{23} \\ a_{31} b_{11} & a_{31} b_{12} & a_{31} b_{13} & a_{32} b_{11} & a_{32} b_{12} & a_{32} b_{13} \\ a_{31} b_{21} & a_{31} b_{22} & a_{31} b_{23} & a_{32} b_{21} & a_{32} b_{22} & a_{32} b_{23} \end{matrix} \right]
여기 유용한 항등식이 있다.
여기서 vec(M)\text{vec}(\bold{M})M\bold{M}럼 의 열을 쌓은 것이다. (만일 행을 따라 쌓으면 (AB)vec(C)=vec(ACB)(\bold{A} \otimes \bold{B})\text{vec}(\bold{C}) = \text{vec}(\bold{ACB}^\top)을 얻을 수 있다.)
(AB)1=A1B1(AB)vec(C)=vec(BCA)\begin{aligned} (\bold{A} \otimes \bold{B})^{-1} &= \bold{A}^{-1} \otimes \bold{B}^{-1} \\ (\bold{A} \otimes \bold{B}) \text{vec}(\bold{C}) &= \text{vec}(\bold{BCA}^\top) \end{aligned}

Einstein summation

아인슈타인 요약 또는 줄여서 einsum은 텐서와 함께 작업할 때 쓰는 줄임 표기이다. 예컨대 아래의 행렬 곱셈에서 k\sum_k을 제외하여 간단하게 오른쪽 처럼 쓸 수 있다.
Cij=kAikBkjCij=AikBkjC_{ij} = \sum_k A_{ik} B_{kj} \Rightarrow C_{ij} = A_{ik} B_{kj}

선형 변환의 관점에서 행렬 곱

위의 정리된 내용들은 행렬곱에 대한 다소 계산적인 관점의 내용이었고, 행렬을 선형 변환의 관점에서 볼 때 다음과 같이 이해할 수 있다. 우선 쉬운 예로 행렬-벡터 곱을 보자. 다음과 같은 벡터 v\bold{v}와 행렬 A\bold{A}가 있다고 하면
A=[abcd],v=[xy]\bold{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix}, \bold{v} = \begin{bmatrix} x \\ y \end{bmatrix}
행렬과 벡터의 곱은 벡터 v\bold{v}에 대해 선형 변환 A\bold{A}를 하는 것과 같다. 이 선형변환을 위해 벡터의 첫 번째 요소 xx는 행렬 A\bold{A}의 첫 번째 열과 곱해지고, 벡터의 두 번째 요소 yy는 행렬 A\bold{A}의 두 번째 열과 곱해지게 된다.
이는 엄밀히 말해 행렬 A\bold{A}의 각 열은 변환 전 벡터 공간의 순서 기저에 대한 변환된 벡터 공간의 순서 기저의 선형 결합을 의미하기 때문이다. 자세한 내용은 아래 페이지 참조
Av=[abcd][xy]=[ac]x+[bd]y=[ax+bycx+dy]\bold{Av} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix} = \begin{bmatrix} a \\ c \end{bmatrix} x + \begin{bmatrix} b \\ d \end{bmatrix} y = \begin{bmatrix} ax + by \\ cx + dy \end{bmatrix}
(일반적인 표기는 스칼라와 벡터를 곱할 때 스칼라를 앞에 쓰지만, 이해의 편의를 위해 뒤에 썼음)
이는 행렬-벡터 곱을 행렬의 1행을 뒤의 벡터와 곱해서 얻는 계산 결과와 같다. 이는 행렬과 벡터의 차원이 다음과 같이 늘어나도 동일하게 적용 가능하다.
Av=[abcdefghi][xyz]=[adg]x+[beh]y+[cfi]z=[ax+by+czdx+ey+fzgx+hy+iz]\bold{Av} = \begin{bmatrix} a & b & c \\ d & e & f \\ g & h & i \end{bmatrix} \begin{bmatrix} x \\ y \\ z\end{bmatrix} = \begin{bmatrix} a \\ d \\ g \end{bmatrix} x + \begin{bmatrix} b \\ e \\ h \end{bmatrix} y + \begin{bmatrix} c \\ f \\ i \end{bmatrix} z = \begin{bmatrix} ax + by + cz \\ dx + ey + fz \\ gx + hy + iz \end{bmatrix}
이를 행렬-행렬 곱으로 확장할 수 있다. 다음과 같은 행렬 A,B\bold{A}, \bold{B}가 있다고 하자.
A=[abcd],B=[xzyw]\bold{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix}, \bold{B} = \begin{bmatrix} x & z \\ y & w \end{bmatrix}
위의 행렬-벡터 곱을 이용하여 두 행렬 곱을 표현하면 다음과 같다.
AB=[abcd][xzyw][ac]x+[bd]y[ac]z+[bd]w[ax+byaz+bwcx+dycz+dw]\begin{aligned} \bold{AB} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x & z \\ y & w \end{bmatrix} &\Rightarrow \begin{bmatrix} a \\ c \end{bmatrix} x + \begin{bmatrix} b \\ d \end{bmatrix} y \\ &\Rightarrow \begin{bmatrix} a \\ c \end{bmatrix} z + \begin{bmatrix} b \\ d \end{bmatrix} w \\ &\Rightarrow \begin{bmatrix} ax + by & az + bw \\ cx + dy & cz + dw \end{bmatrix} \end{aligned}
이는 행렬-행렬 곱에서 앞 행렬의 행을 뒤 행렬의 열과 곱해서 얻는 계산 결과와 같다.
행렬 B\bold{B}[xy],[zw]\begin{bmatrix} x \\ y \end{bmatrix}, \begin{bmatrix} z \\ w \end{bmatrix}는 서로 다른 열벡터이므로 바로 더해지지 않고, 분리하여 각각 곱한 후 최종적으로 다시 행렬 표현으로 열을 합치는(concatenate) 식으로 정리된다.
이 행렬-행렬 곱은 당연히 더 높은 차원에 대해서도 동일하게 적용된다.
행렬 곱에 대한 시각적 표현은 아래 영상 참조

참조