본문 바로가기
ML/ML-수학, 확률과 통계

선형대수(Linear algebra)-행렬, 행렬의 곱, 성질(1)

by lucian 2021. 6. 3.

* 이 공부노트는 프로그래머스 인공지능 데브코스 강창성 교수님의 강의를 바탕으로 제작되었습니다.

 

이제 배울 Deep learning을 이해할려면 반드시 선형대수, 행렬미분, 확률의 탄탄한 기초가 필요하다 하셨다.

 

Transformer의 attention matrix :

 

$$\mathrm{Att}_{\leftrightarrow}(Q, K, V) = D^{-1}AV, ~A = \exp(QK^T/\sqrt{d}), ~D = \mathrm{diag}(A1_L)$$(뭔소리야)

처럼 핵심 아이디어가 행렬에 관한 식으로 표현되는 경우가 많다.

그래서 선형대수와 행렬미분의 기초를 배운다음 PCA를 유도해보고자 한다.

 


기본 표기법(Basic Notation)

  • $A\in \mathbb{R}^{m\times n}$ mxn의 행렬이란 의미. 행렬은 주로 대문자를 사용
  • $x \in \mathbb{R}^n$ : n개의 벡터는 주로 소문자로 표시한다. 또한 n차원 벡터는 n개의 행과 1개의 열을 가진 행렬로 생각하고 이것을 열벡터(column vector)라 부르기도 함. $x^T$($T$는 transpose를 의미)는 행벡터를 표현
  • 벡터 $x$의 $i$번째 원소는 $x_i$로 표시한다. \begin{align*}
    x = \begin{bmatrix}
        x_1\\
        x_2\\
        \vdots\\
        x_n
    \end{bmatrix}
    \end{align*}
  • $a_{ij}$(또는 $A_{ij}, A_{i,j}$) : 행렬 $A$의 $i$번째 행, $j$번째 열에 있는 원소\begin{align*}
    A = \begin{bmatrix}
        a_{11} & a_{12} & \cdots & a_{1n}\\
        a_{21} & a_{22} & \cdots & a_{2n}\\
        \vdots & \vdots & \ddots & \vdots\\
        a_{m1} & a_{m2} & \cdots & a_{mn}
    \end{bmatrix}
    \end{align*}
  • $A$의 $j$번째 열을 $a_j$ or $A_{:,j}$로 표시 
    \begin{align*}
    A = \begin{bmatrix}
        \vert & \vert & & \vert\\
        a_1 & a_2 & \cdots & a_n\\
        \vert & \vert & & \vert
    \end{bmatrix}
    \end{align*}
  • $A$의 $i$번째 행을 $a_i^T$ or $A_{i,:}$로 표시(여기서 이건 첨봤음 신기하네)
    \begin{align*}
    A = \begin{bmatrix}
         \rule[.5ex]{1.7ex}{0.5pt} & a_1^T & \rule[.5ex]{1.7ex}{0.5pt}\\
         \rule[.5ex]{1.7ex}{0.5pt} & a_2^T & \rule[.5ex]{1.7ex}{0.5pt}\\
         & \vdots &\\
         \rule[.5ex]{1.7ex}{0.5pt} & a_m^T & \rule[.5ex]{1.7ex}{0.5pt}
    \end{bmatrix}
    \end{align*}

행렬의 곱셈(Matrix Multiplication)

두 개의 행렬 $A\in \mathbb{R}^{m\times n}$, $B\in \mathbb{R}^{n\times p}$의 곱 $C = AB \in \mathbb{R}^{m\times p}$는 다음과 같이 정의된다.

$$C_{ij} = \sum_{k=1}^n A_{ik}B_{kj}$$

행렬의 곱셈을 이해하는 몇 가지 방식들
- 벡터 $\times$ 벡터
- 행렬 $\times$ 벡터
- 행렬 $\times$ 행렬

 

내적 - x.dot(y)

 

두 개의 벡터 $x, y\in \mathbb{R}^n$이 주어졌을 때 내적(inner product 또는 dot product) $x^Ty$는 다음과 같이 정의된다.

\begin{align*}
x^Ty \in \mathbb{R} = [\mbox{ }x_1\mbox{ }x_2\mbox{ }\cdots \mbox{ }x_n\mbox{ }] \begin{bmatrix}
    y_1\\
    y_2\\
    \vdots\\
    y_n
\end{bmatrix}
= \sum_{i=1}^n x_i y_i
\end{align*}

$$x^Ty = y^Tx$$

 

*내적은 두 벡터의 차원이 같아야 할 수 있다.  - 왜? 스칼라 값을 만드니깐
 외적일 경우에는 두 벡터의 차원이 달라도 가능하다! - 외적의 결과는 벡터니깐! 대신  mxn X nxk로  처럼 앞 행렬의 열과 뒤 행렬의 행이 같아야 쓸 수 있어! 결과값이 mxk로 나오니깐!

 

외적 - np.matmul(x,y)


두 개의 벡터 $x\in \mathbb{R}^m, y\in \mathbb{R}^n$이 주어졌을 때 외적(outer product) $xy^T\in \mathbb{R}^{m\times n}$는 다음과 같이 정의된다.

\begin{align*}
xy^T \in \mathbb{R}^{m\times n} = \begin{bmatrix}
    x_1\\
    x_2\\
    \vdots\\
    x_m
\end{bmatrix}
[\mbox{ }y_1\mbox{ }y_2\mbox{ }\cdots \mbox{ }y_n\mbox{ }]
= \begin{bmatrix}
    x_1y_1 & x_1y_2 & \cdots & x_1y_n\\
    x_2y_1 & x_2y_2 & \cdots & x_2y_n\\
    \vdots & \vdots & \ddots & \vdots\\
    x_my_1 & x_my_2 & \cdots & x_my_n
\end{bmatrix}
\end{align*}

 

자 여기서 수학적으로 궁금한 점이 내적(inner product)과 외적(outer product)의 차이가 뭔가?

내적 : 마치수처럼 곱하는 개념이라 한다. 벡터는 방향이 있으니깐 방향이 맞는 만큼만 곱한다는 뜻이다. 즉 a와 b란 벡터를 곱하는데, a의 방향과 b의 방향이 일치하면 기냥 곱해주면 되고, 만약 90도라면 0이 된다.   

$$\vec{a} \cdot \vec{b} = |\vec{a}| |\vec{b}| cos \, \theta$$



외적 : 외적의 결과값은 또 벡터란다. 방향은 곱하는 두 벡터의 cross이고 두 크기는 두벡터가 이루는 사각형의 넓이이다. 외적의 연산 기호는 cross ($\vec{u} \times \vec{v}$). 외적의 크기만 보면 

$$| \vec{u} \times \vec{v} | = | \vec{u} | | \vec{v} | sin \, \theta$$




다시 한번 말하지만, 내적의 결과값은 스칼라이고, 외적의 결과값은 벡터란 소리!

 


중요 연산과 성질들 (Operations and Properties)

정방행렬(Square matrix) 

: 행과 열의 개수가 동일한 행렬

\begin{bmatrix}
  4 & 9 & 2 \\
  3 & 5 & 7 \\
  8 & 1 & 6
\end{bmatrix}

상삼각행렬(Upper triangular matrix)

: 정방행렬이지만 주 대각선 아래 원소들이 모두 0인 행렬

\begin{bmatrix}
  4 & 9 & 2 \\
  0 & 5 & 7 \\
  0 & 0 & 6
\end{bmatrix} 

 

하삼각행렬(Lower triangular matrix)

: 정방행렬이지만 주 대각선 위 원소들이 모두 0인 행렬

\begin{bmatrix}
  4 & 0 & 0 \\
  3 & 5 & 0 \\
  8 & 1 & 6
\end{bmatrix}

 

대각행렬(Diagonal matrix) - np.diag([4, 5, 6])

: 정방행렬이며 주 대각선 제외 모든 원소가 0인 행렬

\begin{bmatrix}
  4 & 0 & 0 \\
  0 & 5 & 0 \\
  0 & 0 & 6
\end{bmatrix}

코드 : np.diag([4, 5, 6])
결과 : array([[4, 0, 0],
              [0, 5, 0],
              [0, 0, 6]])


코드 : np.diag(D) #D는 [[1,2,3],[4,5,6],[7,8,9],] 행렬
결과 : array([1,5,9]) #대각선의 값들만 추출

 

단위행렬(identity matrix) - np.eye(3)

: 대각행렬이며 주대각선 원소들이 모두 1인 행렬. $I$로 표시한다.

\begin{bmatrix}
  1 & 0 & 0 \\
  0 & 1 & 0 \\
  0 & 0 & 1
\end{bmatrix}

 


전치(Transpose) - 행렬.T

행렬을 전치하는 것은 행렬을 뒤집는 것이다. 행렬  $A\in \mathbb{R}^{m\times n}$ 일 때, 이것의 전치행렬은 $A^T \in \mathbb{R}^{n\times m}$ 표시한다.

 

$$\left( A^T \right)_{ij} = A_{ji}$$

 

또한 다음의 성질들을 성립한다.

  • $(A^T)^T = A$ : 뒤집었다가 다시 뒤집으니 원상태로 돌아옴.
  • $\left(AB\right)^T = B^TA^T$ : 곱의 Transpose를 씌우게 되면, 순서가 바뀐다.
  • $(A + B)^T = A^T + B^T$ : 더하기는 그대로~

$ A^T =
\begin{bmatrix}
  1 & 2 & 3 \\
  4 & 5 & 6
\end{bmatrix}^T =
\begin{bmatrix}
  1 & 4 \\
  2 & 5 \\
  3 & 6
\end{bmatrix}$

 

위의 공식과 동일한지 예제를 통해 확인.

A= np.array([[1,2,3],[4,5,6]])
코드 : A.T
결과 : array([[1, 4],
             [2, 5],
             [3, 6]])
             

B = np.array([[1,2], [4, 5], [6, 7]])
코드 : np.matmul(A, B).T
결과 : array([[27, 60],
             [33, 75]])
             
             
코드 : np.matmul(B.T, A.T)
결과 : array([[27, 60],
             [33, 75]])

 


 

대칭행렬 (Symmetic Matrices)

주대각선을 기준으로 해서 양방향에 있는 값들이 같으면 대칭행렬이다.
그러면 전치를 해도 똑같다.
정방행렬 $A$가 $A^T$와 동일할 때 대칭행렬이라고 부른다. $A = -A^T$일 때는 반대칭(anti-symmetric)행렬이라고 부른다.

$BB^T$는 항상 대칭행렬  :  $(BB^T)^T=(B^T)^TB^T=BB^T$ 이므로 $BB^T$란 행렬 또한 대칭행렬이다. (여기서 B는 대칭행렬, 정방행렬일 필요는 없다.)

$C + C^T$는 대칭, $C - C^T$는 반대칭이다. (여기서 C는 대칭행렬일 필욘없지만 정방행렬이여야한다.)

$$A = \frac{1}{2}(A+A^T)+\frac{1}{2}(A-A^T)$$

A = np.array([[1,2,3],[4,5,6]])
B = np.array([[1, 2], [4, 5], [6, 7]])            
C = np.array([[1,4,6],[3,5,7],[6,9,2]])
    
    
코드 : np.matmul(A, A.T)
결과 : array([[14, 32],
       		  [32, 77]])
              
코드 : np.matmul(B, B.T)
결과 : array([[17, 22, 27],
      		 [22, 29, 36],
     	     [27, 36, 45]])
             
             
             
코드 : C+C.T
결과 : array([[ 2,  7, 12],
      		  [ 7, 10, 16],
     		  [12, 16,  4]])
코드 : C-C.T
결과 : array([[ 0,  1,  0],
              [-1,  0, -2],
              [ 0,  2,  0]])

 


대각합 (Trace) - np.trace(A)

정방행렬 $A\in \mathbb{R}^{n\times n}$의 대각합은 $\mathrm{tr}(A)$로 표시(또는 $\mathrm{tr}A$)하고 그 값은 $\sum_{i=1}^n A_{ii}$이다. 대각합은 다음과 같은 성질을 가진다.

- For $A\in \mathbb{R}^{n\times n}$, $\mathrm{tr}A = \mathrm{tr}A^T$ : 행렬 A와 전치 A행렬의 대각합은 같다. 당연한것.
- For $A,B\in \mathbb{R}^{n\times n}$, $\mathrm{tr}(A+B) = \mathrm{tr}A + \mathrm{tr}B$ : 두개의 같은 차원의 행렬이 있을 때, 합한 행렬의 대각합은 각각의 대각합의 더한 것과 같다. 당연하지.
- For $A\in \mathbb{R}^{n\times n}, t\in\mathbb{R}$, $\mathrm{tr}(tA) = t\,\mathrm{tr}A$ : 실수값 t를 곱했을때.
- For $A, B$ such that $AB$ is square, $\mathrm{tr}AB = \mathrm{tr}BA$ : A,B두개를 곱한 행렬이 정방행렬이 되는 경우에 AB의 대각합과 BA의 대각합이 같다.
- For $A, B, C$ such that $ABC$ is square, $\mathrm{tr}ABC = \mathrm{tr}BCA = \mathrm{tr}CAB$, and so on for the product of more matrices : 여러개의 행렬이 있을 때, 그 전체 곱이 정방행렬인 경우에 ABC의 대각합=BCA의 대각합=CAB의 대각합은 같다.

A = np.array([
        [100, 200, 300],
        [ 10,  20,  30],
        [  1,   2,   3],
    ])
코드 : np.trace(A)
결과 : 123

Norms - LA.norm(np.array([3,4])

import numpy.linalg as LA

벡터의 norm은 **벡터의 길이**로 이해할 수 있다. $l_2$ norm (Euclidean norm)은 다음과 같이 정의된다.
$$\left \Vert x \right \|_2 = \sqrt{\sum_{i=1}^n{x_i}^2}$$
$\left \Vert x \right \|_2^2 = x^Tx$임을 기억하라.

 

$l_p$ norm

$$\left \Vert x \right \|_p = \left(\sum_{i=1}^n|{x_i}|^p\right)^{1/p}$$

Frobenius norm (행렬에 대해서) :행렬에 대한 norm

$$\left \Vert A \right \|_F = \sqrt{\sum_{i=1}^m\sum_{j=1}^n A_{ij}^2} = \sqrt{\mathrm{tr}(A^TA)}$$

 

A = np.array([
        [100, 200, 300],
        [ 10,  20,  30],
        [  1,   2,   3],
    ])
    
  코드 : LA.norm(A)
  결과 : 376.0505285197722
  코드 : np.trace(A.T.dot(A))**0.5
  결과 : 376.0505285197722

 

뭔소린지 몰라서 한번 해봤다.

 

\begin{align*}
A^TA = \begin{bmatrix}
     a1 & b1 & c1\\
     a2 & b2 & c2\\
     a3 & b3 & c3\\
    \end{bmatrix}
    \begin{bmatrix}
    a1 & a2 & a3\\
    b1 & b2 & b3\\
    c1 & c2 & c3\\
    \end{bmatrix}
= \begin{bmatrix}
    a1^2+b1^2+c1^2 & a1a2+b1b2+c1c2 & a1a3+b1b3+c1c3\\
    a2a1+b2b1+c2c1 & a2^2+b2^2+c2^2 & a2a3+b2b3+c2c3\\
    a3a1+b3b1+c3c1 & a3a2+b3b2+c3c2  & a3^2+b3^2+c3^2\\
\end{bmatrix}
\end{align*}

 

결국 대각합을 하면 $a1^2+b1^2+c1^2 + a2^2+b2^2+c2^2 +  a3^2+b3^2+c3^2 $ 가 된다.

댓글