머신러닝

[선형 대수] SVD (Singular Value Decomposition)

MINAIR 2025. 1. 20. 15:44

SVD (Singular Value Decomposition)은 고유값 분해와 다르게 m != n인 (m, n)인 행렬에 대해서도 비대칭 행렬에 대해서도 모두 적용 가능한 행렬 분해법이다. 

 

SVD는 임의의 (m, n) 행렬 A = \(U \sum V^T\)로 분해한다.

  • A: (m, n) rectangular matrix
  • U: (m, m) orthogonal matrix
  • \(\sum\): (m, n) diagonal matrix
  • \(V^T\): (n, n) orthogonal matrix

orthogonal matrix란 \(U U^T = I\)가 되는 행렬, 즉 \(U^T = U^{-1}\)인 행렬이다. diagonal matrix는 주대각성분을 제외한 나머지 성분이 모두 0인 행렬이다. 

 

SVD는 "직교하는 벡터 집합에 대해, 선형 변환 후 그 크기는 변하지만 여전히 직교할 수 있는 직교 집합은 무엇인가? 그리고 선형 변환 후의 결과는 무엇인가?"와 같은 기하학적 의미를 지닌다. 

 

어떤 행렬 A가 (2, 2)인 경우, 직교하는 두 벡터 x와 y를 A를 이용해 선형 변환한 결과 Ax, Ay가 직교하게 되는 경우는 여러 번 존재한다. 선형 변환 후 벡터 x와 y의 크기는 조금씩 커지거나 작아지는데 이 값을 scaling factor 또는 singular value라고 한다. singular value는 크기가 큰 것부터 \(\sigma_1, \sigma_2...\)라고 표기한다. 

 

직교하는 벡터 x, y는 열벡터의 집합이라고 놓자.

선형 변환한 Ax, Ay의 크기를 각각 1로 정규화한 벡터를 u1, u2라고 하면 아래와 같다. 

여기에서 singular value는 \(\sum\)과 같이 생각하며 U가 크기가 1로 정규화된 벡터들의 집합이므로 \(\sigma\)는 scaling factor가 된다. 즉, 선형 변환을 해도 직교하는 벡터들의 크기가 변하는 크기를 의미한다. 

직교하는 벡터 집합 V에 행렬 A를 통해 선형 변환을 해준 것은 \(AV\)이다. U는 선형 변환 후 크기를 1로 정규화해준 벡터들의 집합이고 singular value는 여전히 직교하는 벡터들을 scaling하는 값이므로 \(AV = U \sum\)이라고 나타낼 수 있다. V는 orthogonal matrix이므로 \(V^T = V^{-1}\), \(VV^T = I\)이다. 따라서 양변에 \(V^T\)를 곱해주면 \(A = U \sum V^T\)이다. 

 

정리하자면 V라는 서로 직교하는 벡터들 (x, y)이 있을 때, 그 벡터들에 선형 변환 A를 해줬을 때 여전히 직교하는 벡터들 (Ax, Ay)들을 각각 크기가 1이 되도록 정규화해준 벡터들의 행렬을 U라고 하며, \(\sum\)의 주대각성분은 벡터 (x, y)가 선형 변환 A를 거친 후 바뀐 크기를 의미한다. 

 

예시를 들어 생각해보자. 만약 아래와 같은 행렬 A를 \(U, \sum, V^T\)로 분해하고 싶다고 하자.

V는 \(A^T A\) 행렬의 정규화한 eigen vector의 집합이다. U는 \(A A^T\) 행렬의 정규화한 eigen vector의 집합이다. \(sum\)은 \(A A^T\), \(A^T A\) 행렬의 eigenvalues들의 양의 제곱근을 크기순으로 diagonal로 갖는 matrix이다. 크기를 맞춰야 한다면 행렬의 남은 요소를 0으로 채워준다. 이때 \(A A^T\), \(A^T A\) 행렬은 square & symmetric이다. 

 

왜 V가 \(A^T A\) 행렬의, U가 \(A A^T\) 행렬의 eigen vector의 집합일까? 아래 증명을 통해 알아보자. 양변에 \(A^T\)를 곱해주면 V는 orthogonal matrix이므로 \(V^T V = I\)이다. 따라서 지워지고 U 역시 orthogonal matrix이기 때문에 \(U^T = U^{-1}\)이다. 이때 양변에 U를 곱해주면 \(AA^TU = U \sum \sum^T\)가 된다. 이 꼴, 어딘가 익숙하다. 바로 고유값 & 고유 벡터를 구할 때의 식 \(Ax = \lambda x\)와 꼴이 같다. 위 식에서 A는 feature 벡터들의 행렬의 covariance matrix (symmetric & square)이기 때문에 원래 SVD에서의 A는 (m, n)꼴로 square matrix가 아니지만 A를 \(A^T\)와 곱해주면 square & symmetric이 되기 때문에 특이값 분해 식에서의 A와 SVD에서의 \(A A^T\)는 같은 꼴이다. \(\sum \sum^T\)는 둘 다 diagonal matrix이기 때문에 곱해도 diagonal matrix이다. 고유값 & 고유벡터를 구할 때의 식에서 \(\lambda\)는 상수이지만 사실 \(\lambda I\)라는 diagonal matrix의 꼴로 행렬 A의 주대각성분에서 뺄셈을 진행한다. 따라서 U가 위의 식에서 x, 즉 \(AA^T\)의 고유 벡터라고 볼 수 있는 것이다. 그렇다면 \(\sum \sum^T\)가 \(\lambda\)의 역할, 즉 고유값의 역할을 하므로 \(\sum\)의 원래 원소 \(\sigma\)는 위의 식에서 구한 고유값의 양의 제곱근으로 구할 수 있다. 

 

지금까지 (m, n) 차원의 임의의 행렬 A를 U, \(\sum\), \(V^T\)로 분해하는 방법과 각각의 분해된 요소들이 무엇을 의미하는지 알아보았다. 마지막으로 정리하자면...

  • 서로 직교하는 벡터에게 행렬 A로 선형 변환을 해주었을 때에도 (Ax, Ay) 직교하는 벡터들 (x, y)의 집합을 행렬 V라고 한다. 
  • U는 Ax, Ay를 각각 크기가 1이 되도록 정규화한 벡터들의 집합이고, \(\sum\)의 주대각성분은 A로 선형 변환을 하고 난 뒤 벡터 x, y의 크기값이다. 
  • 유도식에 따르면 U는 \(AA^T\)의 eigen vector의 집합으로, V는 \(A^T A\)의 eigen vector의 집합으로, \(\sum\)의 주대각성분은 \(AA^T\)의 eigen values의 양의 제곱근으로 구할 수 있다. (\(\sum\)의 차원을 맞춰야 한다면 0으로 맞춰준다.)
  • 즉, \(V^T\)는 원래 벡터 (데이터)를 정렬한 것, \(\sum\)은 특정 크기로 벡터들을 스케일링하는 것, U는 스케일링 후 벡터들을 의미한다. 

 

그렇다면 SVD를 통해 우리가 얻을 수 있는 것, 알고자 하는 것은 무엇일까?

  • rank(A) =  \(\sum\)의 0이 아닌 singular value (\(\sigma\))의 개수
    • rank(A)는 행렬 A에서 독립적인 정보, 즉 사용 가능한 유의미한 정보의 양을 의미한다. 
    • rank(A) = r이라면 행렬 A를 r-차원으로 나타내어도 원본 행렬 A의 유의미한 정보를 표현할 수 있다. 
  • top-k singular values를 이용해 행렬 A를 근사할 수 있다. (Low-rank approximation)
    • 큰 singular value일수록 중요한 정보를 나타낸다. singular value가 작을수록 덜 중요한 노이즈 정보이다. 

GPT-4o

 


Reference


https://ys-cs17.tistory.com/52