Skip to content

선형대수 · 텐서와 행렬

기말 범위 9–10주차 요약. 데이터를 담는 그릇인 텐서부터, 벡터의 크기·내적·사영·외적, 그리고 정방행렬의 행렬식·역행렬·고윳값까지 정리한다.

스칼라, 벡터, 행렬, 텐서

  • 스칼라scalar는 하나의 성분component만을 가진 수치이다. 7, 3, π 등이 스칼라이며, 관습적으로 x처럼 표기한다.
  • 벡터vector는 여러 성분으로 이루어진 배열array이다. 명시하지 않는 한 벡터는 열벡터column vector를 의미하며 x로 표기하고, i번째 성분을 xi로 쓴다. 행과 열을 바꾸는 연산()을 전치transpose라 한다.
x=[x0x1x2]x=[x0x1x2]
  • 기하적으로 벡터의 각 성분은 좌표축을 따라 나아간 거리로 해석된다. 기계학습에서는 각 성분이 데이터의 특징feature을 나타내며, 이런 벡터를 특징 벡터feature vector라 한다. 가능한 특징들이 모인 집합을 특징 공간feature space이라 한다.
  • 행렬matrix은 수치들의 2차원 배열이다. X로 표기하고, i번째 행·j번째 열의 원소를 xi,j로 쓴다. 열벡터는 열이 하나, 행벡터는 행이 하나인 행렬로 볼 수 있다.
  • 랭크rank가 셋 이상인 수학적 객체를 텐서tensor라 한다.

텐서의 랭크

스칼라는 랭크 0-텐서, 벡터는 랭크 1-텐서, 행렬은 랭크 2-텐서이다. 즉 텐서는 스칼라·벡터·행렬을 일반화한 개념이다.

텐서 산술 연산

크기와 단위 벡터

  • 기하적으로 벡터는 방향과 길이를 가지며, 그 길이를 크기magnitude라 한다. n개의 성분을 가진 벡터의 크기는 피타고라스의 정리와 연관되며 다음과 같다.
x=x02+x12++xn12
  • 벡터를 그 크기로 나누면 방향은 같고 크기가 1단위 벡터unit vector가 된다.
x^=xx

내적과 사영

  • 두 벡터 x, y내적inner product, dot product은 다음과 같이 정의된다(θ는 두 벡터 사이의 각).
xy=x,y=xy=k=0n1xkyk=xycosθ
  • 각도가 π/2이면 내적은 0이고, 이때 두 벡터가 직교orthogonal한다고 한다. 내적은 교환법칙·분배법칙은 성립하나 결합법칙은 성립하지 않는다.
  • 사영projection은 한 벡터가 다른 벡터 방향으로 얼마나 나아가는지를 계산한다. y에 대한 x의 사영은 다음과 같으며, 직교인 벡터들의 사영은 항상 0이다.
projyx=xyy2y

외적과 성분별 곱

  • 내적은 스칼라지만 외적outer product은 행렬이 되며, 두 벡터의 차원이 달라도 정의된다. 성분이 m개인 xn개인 y의 외적(xy)은 다음과 같다.
xy=[x0y0x0y1x0yn1x1y0x1y1x1yn1xm1y0xm1y1xm1yn1]
  • 차원이 같은 두 행렬 X, Y에 대해 성분별 곱인 아다마르 곱Hadamard product Z=XYzij=xijyij로 정의된다.
python
import numpy as np

x = np.array([4.0, 1.0])
y = np.array([3.0, 4.0])

dot = x @ y                              # 내적 x·y
mag_x, mag_y = np.linalg.norm(x), np.linalg.norm(y)
cos_t = dot / (mag_x * mag_y)            # cosθ = x·y / (||x|| ||y||)
proj = (dot / (y @ y)) * y               # y에 대한 x의 사영
outer = np.outer(x, y)                   # 외적 xy^T (행렬)

print(f"내적  x·y      = {dot:.1f}")
print(f"||x||={mag_x:.3f}, ||y||={mag_y:.3f}, cosθ={cos_t:.3f}")
print(f"사영  proj_y x = {proj}")
print("외적  x y^T =")
print(outer)

행렬곱과 정방행렬

  • 행렬곱 XY는 왼쪽 행렬의 열 수와 오른쪽 행렬의 행 수가 같아야 하며, X의 행벡터를 Y의 열벡터와 내적한 것이다. 결과 Z=XYzi,j=kxi,kyk,j이다. 행렬곱은 결합·분배법칙은 만족하나 교환법칙은 성립하지 않는다(XYYX).
  • 행렬에 열벡터를 곱하면 또 다른 열벡터가 나온다. 즉 행렬은 한 공간의 점을 다른 공간으로 사상mapping하는 수단이다. 행과 열의 크기가 n으로 같은 정방행렬square matrixRn에서 Rn으로의 사상이다.
  • 행렬 변환 W와 이동translation b로 직선을 직선으로 보내는 상관변환affine transformation y=Wx+b를 정의할 수 있다. 뉴럴 네트워크의 각 층이 바로 상관변환이다.
  • 정방행렬에서는 대각합trace tr(A)=iai,i과 거듭제곱 An이 정의된다. 대각 성분이 1이고 나머지가 0단위행렬identity matrix In은 행렬 곱셈의 항등원이다.

행렬식과 역행렬

  • 정방행렬의 행렬식determinant은 행렬을 하나의 스칼라로 사상하는 함수 det(A)R이다. 주요 성질은 다음과 같다.
    • 모두 0인 행/열이 있거나 동일한 두 행이 있으면 det(A)=0.
    • 삼각행렬·대각행렬이면 det(A)=iai,i이고, 단위행렬은 det(I)=1.
    • det(AB)=det(A)det(B), det(A)=det(A).
  • 소행렬minor matrix Aij(i행·j열 제거)와 여인수cofactor Cij=(1)i+jdet(Aij)를 이용한 여인수 전개cofactor expansion로 행렬식을 구한다.
det(A)=j=0n1a0,jC0j,det[abcd]=adbc

역행렬과 특이행렬

행렬식의 주요 용도는 역행렬inverse matrix의 존재 판정이다. 역행렬 A1AA1=A1A=I를 만족하며, 존재하면 det(A1)=1/det(A), (AB)1=B1A1이 성립한다. 역행렬이 없는 행렬(즉 det(A)=0)을 특이행렬singular matrix이라 한다.

python
import numpy as np

A = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0],
              [7.0, 8.0, 10.0]])       # det≠0 이 되도록 (7,8,10)

det = np.linalg.det(A)
inv = np.linalg.inv(A)

print(f"det(A) = {det:.4f}  (0이 아니므로 비특이 → 역행렬 존재)")
print("A^-1 =")
print(np.round(inv, 4))
print("A·A^-1 = I 확인:", np.allclose(A @ inv, np.eye(3)))
print(f"det(A^-1) = {np.linalg.det(inv):.4f}  vs  1/det(A) = {1/det:.4f}")

특수 정방행렬과 부호

  • A=A이면 대칭행렬symmetric matrix, AA=AA=I이면 직교행렬orthogonal matrix이다. 직교행렬은 A1=A이고 det(A)=±1이다.
  • 임의의 x0에 대해 대칭행렬 AxAx>0이면 양의 정부호positive definite, 0이면 양의 준정부호positive semidefinite이다. 부등호를 뒤집으면 음의 (준)정부호가 된다.

고윳값과 고유벡터

  • 정방행렬 A는 벡터를 같은 공간의 다른 벡터로 사상한다. 영벡터가 아닌 v와 스칼라 λ
Av=λv

를 만족하면, vA고유벡터eigenvector, λ를 그 고윳값eigenvalue이라 한다. 기하적으로 A는 고유벡터의 방향을 바꾸지 않고 확대·축소만 한다.

특성 방정식

Av=λv를 정리하면 (AλI)v=0이다. v0이려면 AλI가 특이행렬이어야 하므로 다음 특성 방정식characteristic equation이 성립한다.

det(AλI)=0

n×n 행렬의 특성 다항식은 n차 다항식이므로 고윳값은 (중복 포함) 최대 n개다.

python
import numpy as np

A = np.array([[2.0, 0.0],
              [0.0, 3.0]])            # 대각행렬: 고윳값이 대각 성분 2, 3
vals, vecs = np.linalg.eig(A)

print("고윳값 :", np.round(vals, 4))
print("고유벡터(열):")
print(np.round(vecs, 4))

for i in range(len(vals)):
    v = vecs[:, i]
    lhs, rhs = A @ v, vals[i] * v      # Av 와 λv 비교
    print(f"λ={vals[i]:.1f}:  Av={np.round(lhs,3)}  λv={np.round(rhs,3)}  ->",
          np.allclose(lhs, rhs))

벡터 노름과 거리

  • 벡터 노름vector norm은 벡터를 0 이상의 실수로 사상한다. Lp-노름은 xp(i|xi|p)1/p로 정의된다.
    • 벡터의 크기는 L2-노름 x2=xx이며, 그 밖에 x1=i|xi|, x=maxi|xi|가 있다.
    • xxy로 대체하면 거리가 된다. L2는 유클리드 거리Euclidean distance, L1은 맨해튼 거리Manhattan distance, L는 체비셰프 거리Chebyshev distance이다. L1·L2 노름은 딥러닝의 정칙화regularizer로 자주 쓰인다.
  • 여러 특징의 상호 변동은 공분산covariance으로 본다. 데이터 행렬 X(행=샘플, 열=특징)의 공분산 행렬 Σ는 다음과 같다.
Σi,j=1n1k=0n1(xk,ix¯i)(xk,jx¯j)
  • 공분산으로 마할라노비스 거리Mahalanobis distance DM=(xy)Σ1(xy)를 정의한다. 두 확률 분포의 거리로는 쿨백-라이블러 발산Kullback-Leibler divergence DKL(PQ)=xP(x)logP(x)Q(x)을 쓰며, 대칭적이지 않다.
PDF