* 이 공부노트는 프로그래머스 인공지능 데브코스 강창성 교수님의 강의를 바탕으로 제작되었습니다.
이제 배울 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)
결과 : 123Norms - 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 $ 가 된다.
'ML > ML-수학, 확률과 통계' 카테고리의 다른 글
| 정규화(Normalization)와 표준화(Standardization)를 하는 이유 (0) | 2022.01.05 | 
|---|---|
| 평균, 분산, 표준편차의 이야기 (0) | 2022.01.04 | 
| 확률분포(Probability Disstributions)- 이산확률분표(이항분포만) (0) | 2021.06.07 | 
| 선형대수(Linear algebra)-행렬, 행렬의 곱, 성질(2) (0) | 2021.06.03 | 
| 확률과 통계 - 베이즈 정리 (0) | 2021.06.02 | 
 
										
									 
										
									
댓글