* 이 공부노트는 프로그래머스 인공지능 데브코스 강창성 교수님의 강의를 바탕으로 제작되었습니다.
이제 배울 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 $ 가 된다.
'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 |
댓글