Processing math: 100%
본문 바로가기
ML/ML-수학, 확률과 통계

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

by lucian 2021. 6. 3.

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

 

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

 

Transformer의 attention matrix :

 

Att(Q,K,V)=D1AV, A=exp(QKT/d), D=diag(A1L)(뭔소리야)

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

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

 


기본 표기법(Basic Notation)

  • ARm×n mxn의 행렬이란 의미. 행렬은 주로 대문자를 사용
  • xRn : n개의 벡터는 주로 소문자로 표시한다. 또한 n차원 벡터는 n개의 행과 1개의 열을 가진 행렬로 생각하고 이것을 열벡터(column vector)라 부르기도 함. xT(T는 transpose를 의미)는 행벡터를 표현
  • 벡터 xi번째 원소는 xi로 표시한다. x=[x1x2xn]
  • aij(또는 Aij,Ai,j) : 행렬 Ai번째 행, j번째 열에 있는 원소A=[a11a12a1na21a22a2nam1am2amn]
  • Aj번째 열을 aj or A:,j로 표시 
    A=[|||a1a2an|||]
  • Ai번째 행을 aTi or Ai,:로 표시(여기서 이건 첨봤음 신기하네)
    A=[aT1aT2aTm]

행렬의 곱셈(Matrix Multiplication)

두 개의 행렬 ARm×nBRn×p의 곱 C=ABRm×p는 다음과 같이 정의된다.

Cij=nk=1AikBkj

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

 

내적 - x.dot(y)

 

두 개의 벡터 x,yRn이 주어졌을 때 내적(inner product 또는 dot product) xTy는 다음과 같이 정의된다.

xTyR=[ x1 x2  xn ][y1y2yn]=ni=1xiyi

xTy=yTx

 

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

 

외적 - np.matmul(x,y)


두 개의 벡터 xRm,yRn이 주어졌을 때 외적(outer product) xyTRm×n는 다음과 같이 정의된다.

xyTRm×n=[x1x2xm][ y1 y2  yn ]=[x1y1x1y2x1ynx2y1x2y2x2ynxmy1xmy2xmyn]

 

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

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

ab=|a||b|cosθ



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

|u×v|=|u||v|sinθ




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

 


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

정방행렬(Square matrix) 

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

[492357816]

상삼각행렬(Upper triangular matrix)

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

[492057006] 

 

하삼각행렬(Lower triangular matrix)

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

[400350816]

 

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

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

[400050006]

코드 : 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로 표시한다.

[100010001]

 


전치(Transpose) - 행렬.T

행렬을 전치하는 것은 행렬을 뒤집는 것이다. 행렬  ARm×n 일 때, 이것의 전치행렬은 ATRn×m 표시한다.

 

(AT)ij=Aji

 

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

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

$ A^T =
[123456]^T =
[142536]$

 

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

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가 AT와 동일할 때 대칭행렬이라고 부른다. A=AT일 때는 반대칭(anti-symmetric)행렬이라고 부른다.

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

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

A=12(A+AT)+12(AAT)

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)

정방행렬 ARn×n의 대각합은 tr(A)로 표시(또는 trA)하고 그 값은 ni=1Aii이다. 대각합은 다음과 같은 성질을 가진다.

- For ARn×ntrA=trAT : 행렬 A와 전치 A행렬의 대각합은 같다. 당연한것.
- For A,BRn×ntr(A+B)=trA+trB : 두개의 같은 차원의 행렬이 있을 때, 합한 행렬의 대각합은 각각의 대각합의 더한 것과 같다. 당연하지.
- For ARn×n,tRtr(tA)=ttrA : 실수값 t를 곱했을때.
- For A,B such that AB is square, trAB=trBA : A,B두개를 곱한 행렬이 정방행렬이 되는 경우에 AB의 대각합과 BA의 대각합이 같다.
- For A,B,C such that ABC is square, trABC=trBCA=trCAB, 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은 **벡터의 길이**로 이해할 수 있다. l2 norm (Euclidean norm)은 다음과 같이 정의된다.
x2=ni=1xi2
x22=xTx임을 기억하라.

 

lp norm

xp=(ni=1|xi|p)1/p

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

AF=mi=1nj=1A2ij=tr(ATA)

 

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

 

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

 

ATA=[a1b1c1a2b2c2a3b3c3][a1a2a3b1b2b3c1c2c3]=[a12+b12+c12a1a2+b1b2+c1c2a1a3+b1b3+c1c3a2a1+b2b1+c2c1a22+b22+c22a2a3+b2b3+c2c3a3a1+b3b1+c3c1a3a2+b3b2+c3c2a32+b32+c32]

 

결국 대각합을 하면 a12+b12+c12+a22+b22+c22+a32+b32+c32 가 된다.