특이값 분해(SVD, Singular Value Decomposition)란?

1. SVD 개요 및 정의

특이값 분해(SVD)는 임의의 \(m \times n\) 행렬 \(A\)를 세 개의 특수한 행렬 \(U\), \(\Sigma\), \(V^T\)의 곱으로 분해하는 방법입니다.
이를 통해 행렬에 담긴 복잡한 구조를 간단한 ‘요소들의 결합’으로 해석할 수 있으며, 데이터의 주요 패턴을 파악하거나 노이즈를 제거하고, 차원을 축소하는 등 다양한 응용에 쓰입니다.

\[ \boxed{A = U \,\Sigma \,V^T} \]

  • \(A\): \(m \times n\) 크기의 원본 행렬
  • \(U\): \(m \times m\) 직교(orthogonal) 행렬
    (\(U^T U = UU^T = I\))
  • \(\Sigma\): \(m \times n\) 크기의 대각(diagonal) 행렬
    (주대각선에 특이값 \(\sigma_1 \ge \sigma_2 \ge \cdots \ge \sigma_r > 0\)을 배치)
  • \(V^T\): \(n \times n\) 직교행렬 \(V\)의 전치(transpose)

이때의 기하학적 해석은 “(1) 입력 공간에서의 회전(\(V^T\)) → (2) 축방향별 스케일링(\(\Sigma\)) → (3) 출력 공간에서의 회전(\(U\))” 라고 볼 수 있습니다. 즉, 한 번의 선형 변환 \(A\)가 사실은 회전–스케일링–회전이라는 세 단계 변환으로 이루어져 있다는 점이 SVD를 통해 명확히 드러나는 것이죠.

2. SVD의 수학적 표현: 행렬 분해의 공식

2.1 전체 구조

SVD를 수식으로 나타내면 다음과 같습니다.

\[ A_{m \times n} = U_{m \times m} \,\Sigma_{m \times n} \,V^T_{n \times n}. \]

예를 들어, \(3 \times 2\) 크기의 행렬 \(A\)를 생각해봅시다.

\[ A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{pmatrix}. \]

이 행렬 \(A\)에 대해 \(U\), \(\Sigma\), \(V^T\)는 각각 다음 차원을 가집니다.

  • \(U\): \(3 \times 3\) 직교행렬
  • \(\Sigma\): \(3 \times 2\) 대각행렬(주대각성분만 존재, 나머지는 0)
  • \(V^T\): \(2 \times 2\) 직교행렬의 전치

\[ \Sigma = \begin{pmatrix} \sigma_1 & 0 \\ 0 & \sigma_2 \\ 0 & 0 \end{pmatrix}, \quad V^T = \begin{pmatrix} v_{11} & v_{12} \\ v_{21} & v_{22} \end{pmatrix}. \]

이 때, \[ A = U\,\Sigma\,V^T \] 가 실제로 성립하도록 \(U\), \(\Sigma\), \(V\) (그리고 \(V^T\))가 결정됩니다.


2.2 랭크-1 행렬들의 합

조금 더 벡터 단위로 풀어서 표현하면,

\[ A = U \Sigma V^T = \begin{pmatrix} | & | & & | \\ \mathbf{u}_1 & \mathbf{u}_2 & \cdots & \mathbf{u}_m \\ | & | & & | \end{pmatrix} \begin{pmatrix} \sigma_1 & 0 & \cdots & 0 \\ 0 & \sigma_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \sigma_r \\ 0 & 0 & \cdots & 0 \end{pmatrix} \begin{pmatrix} - & \mathbf{v}_1^T & - \\ - & \mathbf{v}_2^T & - \\ & \vdots & \\ - & \mathbf{v}_n^T & - \end{pmatrix}. \]

이를 전개하면 (0이 아닌 특이값만 고려하면):

\[ A = \sigma_1 \mathbf{u}_1 \mathbf{v}_1^T + \sigma_2 \mathbf{u}_2 \mathbf{v}_2^T + \cdots + \sigma_r \mathbf{u}_r \mathbf{v}_r^T. \]

즉, 행렬 \(A\)가 여러 개의 랭크 1 행렬 \(\mathbf{u}_i \mathbf{v}_i^T\)들의 선형 결합으로 표현될 수 있음을 의미합니다.
각 \(\mathbf{u}_i \mathbf{v}_i^T\)는 벡터 \(\mathbf{u}_i\)와 \(\mathbf{v}_i\)의 외적(outer product) 형태이므로, 큰 특이값(\(\sigma_i\))을 갖는 항일수록 더 중요한 패턴을 반영하고, 작은 특이값에 해당하는 항은 상대적으로 덜 중요한 구조(또는 노이즈)에 해당합니다. 이러한 구분이 데이터 압축이나 노이즈 제거 등의 작업에서 매우 유용하게 활용됩니다.

3. SVD의 기하학적 의미: 선형 변환의 비밀

SVD는 단순한 행렬 분해를 넘어서, 선형 변환(linear transformation)을 기하학적으로 해석하는 강력한 도구입니다. 특히, SVD는 선형 변환을 회전(rotation), 크기 변환(scaling), 그리고 또 다른 회전이라는 세 가지 기본적인 변환으로 분해하여 설명합니다.

임의의 행렬 \(A\)를 벡터 공간에 대한 선형 변환으로 생각해 봅시다. 이 변환은 임의의 벡터 x를 다른 벡터 b로 변환하는 연산으로 볼 수 있습니다 (\(A\mathbf{x} = \mathbf{b}\)). SVD는 이 복잡해 보이는 변환 과정을 다음과 같이 세 단계로 나누어 설명합니다.

  1. \(V^T\): 첫 번째 회전 변환 (입력 공간의 좌표축을 회전)

    • \(V^T\)는 입력 벡터 x를 \(V\)의 열벡터를 기저(basis)로 하는 새로운 좌표계로 회전시킵니다. 즉, \(\mathbf{x'} = V^T\mathbf{x}\) 와 같이 표현할 수 있습니다.
    • 이유: \(V\)의 열벡터들은 서로 직교하는 단위벡터(orthonormal vectors)이기 때문에, 이 벡터들을 새로운 좌표축으로 사용하면, 원래 좌표계를 회전시키는 것과 같은 효과를 얻을 수 있습니다.
  2. \(\Sigma\): 크기 변환 (스케일링) (각 좌표축 방향으로 특이값만큼 확대/축소)

    • \(\Sigma\)는 회전된 벡터 \(\mathbf{x'}\)의 각 성분에 해당 특이값을 곱하여 크기를 조정합니다. 즉, \(\mathbf{x''} = \Sigma\mathbf{x'} = \Sigma V^T \mathbf{x}\) 와 같이 표현됩니다.
    • 이유: 대각행렬(\(\Sigma\))은 각 좌표축 방향으로만 스케일링(확대 또는 축소)을 수행하기 때문입니다.
  3. \(U\): 두 번째 회전 변환 (출력 공간의 좌표축을 회전)

    • \(U\)는 크기가 조정된 벡터 \(\mathbf{x''}\)를 최종 출력 벡터 b로 회전시킵니다. 즉, \(\mathbf{b} = U\mathbf{x''} = U \Sigma V^T \mathbf{x}\) 와 같이 표현됩니다.
    • 이유: \(U\)의 열벡터들도 서로 직교하는 단위벡터이기 때문에, 이들을 새로운 좌표축으로 사용하면, 이전 단계에서 스케일링된 공간을 다시 회전시키는 효과를 냅니다.

[아래 그림은 2차원 벡터 공간에서 SVD의 기하학적 의미를 나타냅니다. V^T, Σ(그림에서 S), U에 의한 순차적인 변환 과정을 보여줍니다.]

행렬 \( H_d \)를 특이값 분해(SVD)하여 직교 행렬 \( V^T \)로 회전, 대각 행렬 \( S \)로 스케일 조정, 마지막으로 \( U \)로 다시 회전하는 과정을 시각화한 도식이다.
SVD의 기하학적 해석 (source)

4. 특이값과 특이벡터: SVD의 핵심 요소

용어 기호 의미 계산 방법
특이값 (Singular values) \(\sigma_i\) 행렬 \(A\)에 의해 벡터의 크기가 변하는 비율. 항상 양수 또는 0, 내림차순 정렬. \(A^TA\)의 고윳값(\(\lambda_i\))의 제곱근 (\(\sigma_i = \sqrt{\lambda_i}\))
왼쪽 특이벡터 (Left singular vectors) \(\mathbf{u}_i\) 변환 후 공간의 직교 기저를 구성하는 단위벡터. \(AA^T\)의 고유벡터
오른쪽 특이벡터 (Right singular vectors) \(\mathbf{v}_i\) 변환 전 공간의 직교 기저를 구성하는 단위벡터. \(A^TA\)의 고유벡터

\(A^TA\)와 \(AA^T\)의 관계:

  • \(A^TA\)와 \(AA^T\)는 모두 대칭행렬(symmetric matrix)이며, 실수 고윳값(real eigenvalues)직교하는 고유벡터(orthogonal eigenvectors)를 가집니다.
  • \(A^TA\)와 \(AA^T\)는 동일한 0이 아닌 고윳값을 가집니다.
  • \(A\)의 특이값은 \(A^TA\) 또는 \(AA^T\)의 고윳값의 제곱근입니다.
  • \(A\)의 오른쪽 특이벡터는 \(A^TA\)의 고유벡터입니다.
  • \(A\)의 왼쪽 특이벡터는 \(AA^T\)의 고유벡터입니다.

\(AV = U\Sigma\) 유도:

SVD 정의 \(A = U \Sigma V^T\)의 양변에 \(V\)를 곱하면:

\[ AV = U \Sigma V^T V \]

\(V\)는 직교행렬이므로 \(V^T V = I\) (단위행렬)입니다. 따라서:

\[ AV = U \Sigma \]

이 식을 열벡터 형태로 표현하면:

\[ A \begin{pmatrix} | & | & & | \\ \mathbf{v}_1 & \mathbf{v}_2 & \cdots & \mathbf{v}_n \\ | & | & & | \end{pmatrix} = \begin{pmatrix} | & | & & | \\ \mathbf{u}_1 & \mathbf{u}_2 & \cdots & \mathbf{u}_m \\ | & | & & | \end{pmatrix} \begin{pmatrix} \sigma_1 & 0 & \cdots & 0 \\ 0 & \sigma_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \sigma_r \\ 0 & 0 & \cdots & 0 \end{pmatrix} \]

\[ \begin{pmatrix} | & | & & | \\ A\mathbf{v}_1 & A\mathbf{v}_2 & \cdots & A\mathbf{v}_n \\ | & | & & | \end{pmatrix} = \begin{pmatrix} | & | & & | \\ \sigma_1\mathbf{u}_1 & \sigma_2\mathbf{u}_2 & \cdots & \sigma_r\mathbf{u}_r & 0 & \cdots & 0\\ | & | & & | \end{pmatrix} \]

따라서, \(A\mathbf{v}_i = \sigma_i \mathbf{u}_i\) (i = 1, 2, ..., r) 관계가 성립합니다.

5. 예제로 살펴보는 SVD 계산

이제 실제 숫자를 통해 SVD가 어떻게 계산되는지 살짝 들여다봅시다. 예시로 위에서 든 작은 행렬:

\[ A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{pmatrix} \quad (3 \times 2 \text{ 행렬}) \]

에 대해 파이썬 numpy로 SVD를 구해본 결과는 다음과 같습니다.

import numpy as np

A = np.array([[1,2],
              [3,4],
              [5,6]])
U, S, Vt = np.linalg.svd(A, full_matrices=True)

print("U:\n", U)
print("S:\n", S)
print("V^T:\n", Vt)

출력 결과(대략 소수점 세 자리까지 반올림하면)

  • \(U\approx\begin{pmatrix} -0.230 & 0.883 & 0.408 \\ -0.525 & 0.241 & -0.816 \\ -0.820 & -0.402 & 0.408 \end{pmatrix}\)
  • \(S\approx\begin{pmatrix} 9.526 & 0 \\ 0 & 0.514 \\ 0 & 0 \end{pmatrix}\)
  • \(V^T \approx \begin{pmatrix} -0.620 & -0.785 \\ -0.785 & 0.620 \end{pmatrix}\)

물론 이 \(S\)는 보통 1차원 배열(특이값 리스트)로 반환되지만, 실제로는 위처럼 \(\Sigma\) 형태의 2차원 행렬로 확장되어야 합니다(주대각 외엔 0).
이제
\[ U \,\Sigma \,V^T \] 를 계산하면 다시 원래의 \(A\)가 복원되는 것을 확인할 수 있습니다.

6. SVD의 응용

SVD는 단순한 행렬 분해 기법 이상의 가치를 지니며, 데이터 과학, 신호 처리, 머신러닝 등 다양한 분야에서 활약합니다.

분야 예시
데이터 압축 이미지·영상·음성 데이터를 SVD로 근사(낮은 랭크)하여 파일 용량을 줄이고, 중요한 구조만 남길 수 있음.
노이즈 제거 작은 특이값(덜 중요한 모드)에 해당하는 부분을 잘라내면, 잡음이 제거된 신호나 이미지를 얻을 수 있음.
추천 시스템 넷플릭스나 아마존의 사용자–아이템 행렬을 SVD로 분해해, 사용자가 선호할 만한 아이템을 예측(행렬 완성)하는 데 쓰임.
차원 축소 / 데이터 분석 PCA(주성분 분석)는 사실상 데이터 행렬에 대한 SVD와 동일. 고차원 데이터를 저차원에 투사하여 시각화·분석에 활용.
자연어 처리 잠재 의미 분석(LSA)은 단어–문서 행렬을 SVD로 분해해, 문서 간 유사도 산출이나 핵심 토픽 추출 등에 활용.

7. 낮은 랭크 근사(부분 복원): 정보 압축의 핵심 원리

SVD가 강력한 이유 중 하나는, 모든 특이값을 사용하지 않고 상위 \(k\)개의 특이값만으로도 원본 행렬을 근사할 수 있다는 점입니다. 이를 낮은 랭크 근사(low-rank approximation) 혹은 부분 SVD라고 부르며, 실제로 많은 응용 분야에서 큰 효과를 발휘합니다.

\[ A \;\approx\; A_k \;=\; U_k \,\Sigma_k \,V_k^T, \]

  • \(U_k\): \(U\)에서 앞쪽 \(k\)개 열벡터(\(\mathbf{u}_1,\dots,\mathbf{u}_k\))만 뽑은 \(m \times k\) 행렬
  • \(\Sigma_k\): \(\Sigma\)에서 앞쪽 \(k\)개의 특이값만 남긴 \(k \times k\) 대각행렬
  • \(V_k^T\): \(V^T\)에서 앞쪽 \(k\)개 행(\(V\)에서는 앞쪽 \(k\)개 열)을 뽑은 \(k \times n\) 행렬

이를 통해,
\[ A_k = \sum_{i=1}^k \sigma_i \,\mathbf{u}_i\,\mathbf{v}_i^T \] 라 볼 수 있으며, \(k\)가 작을수록 정보가 크게 축소되지만(압축 효과), \(k\)가 커질수록 원본 \(A\)에 좀 더 근접하게 됩니다.

(참고)에카르트–영 정리(Eckart–Young Theorem)
“주어진 행렬에 대해 ‘랭크 \(k\)’로 근사하는 문제에서, SVD 기반의 위 공식을 사용하는 것이 가장 작은 노름(프로베니우스 노름 등) 오차를 가지는 최적 근사임이 증명된다.”


7.1 이미지로 살펴보는 부분 SVD

아래 그림은 낮은 랭크 근사 과정을 예시로 나타낸 것입니다.

행렬 \( A \)를 특이값 분해하여 \( U \), \( \Sigma \), \( V^T \)로 표현하고, 상위 \( k \)개의 특이값만 사용하는 방식으로 문장-단어 행렬을 효율적으로 축소 및 벡터화하는 과정을 보여준다.
SVD를 이용한 차원 축소 (source)
  • 왼쪽: 원본 행렬 \(A\) (크기 \(m \times n\))
  • 가운데: \(U\)와 \(\Sigma\). 그림에서는 상위 \(k\)개 특이값과 그에 대응하는 벡터들만 남긴 상태를 강조합니다.
  • 오른쪽: \(V^T\) 역시 앞쪽 \(k\)개 행(혹은 \(V\)에서 \(k\)개 열)을 사용합니다.

이렇게 “\(\mathbf{u}_1, \dots, \mathbf{u}_k\)”와 “\(\mathbf{v}_1, \dots, \mathbf{v}_k\)”로 이루어진 부분집합, 그리고 “\(\sigma_1, \dots, \sigma_k\)”만으로 구성된 \(\Sigma_k\)를 이용해, 랭크 \(k\)의 근사 행렬 \(A_k\)를 만들게 됩니다.

그림에서 어두운 부분이 실제로 남겨지는 행·열(또는 대각선 요소)을 나타내며, 밝은 부분은 잘려나가거나 무시되는 요소들을 시각화한 것입니다. 이 과정은 텍스트 분석(LSA)에서 “단어–문서 행렬”을 저차원 공간으로 투영하거나, 이미지에서 소수의 중요한 특이값만 써서 용량을 확 줄이는 이미지 압축 등의 상황에 그대로 적용할 수 있습니다.


7.2 핵심 요약

  1. 데이터 압축: 큰 특이값(중요 패턴)만 남겨서 저장 → 파일 용량 절감
  2. 노이즈 제거: 작은 특이값(잡음)만 제거 → 신호·이미지에서 잡음 성분 최소화
  3. 차원 축소: PCA와 사실상 동일 원리로, 고차원 데이터를 저차원에 매핑 가능
  4. ‘최적 근사’ 보장: 에카르트–영 정리를 통해, 랭크 \(k\) 근사 중 가장 좋은(가장 작은 오차) 방법임이 증명됨

결국, 낮은 랭크 근사를 이용하면 거대한 행렬에서 ‘정말 중요한 축’만 추려내어 쉽게 다룰 수 있게 되며, 이는 현대 데이터 과학에서 매우 중요한 원리이자 실용적인 기법이 됩니다.

8. 결론

정리하자면,

  1. 임의의 행렬 \(A\)를 회전(\(V^T\)) – 스케일링(\(\Sigma\)) – 회전(\(U\)) 으로 구조화해주는 기하학적 분해
  2. 특이값을 통해 행렬이 가진 축(패턴)의 ‘중요도’를 파악
  3. 상위 몇 개 특이값으로 낮은 랭크 근사를 수행함으로써 데이터 압축·노이즈 제거·차원 축소 등에서 큰 효과

위와 같은 특징을 지닌 SVD는 단순한 선형대수학 테크닉을 넘어, 오늘날의 머신러닝, 데이터 사이언스, 신호 처리, 컴퓨터 비전, 추천 시스템, 자연어 처리 등등 거의 모든 분야에서 핵심 알고리즘으로 활약 중입니다.

  • PCA는 사실상 SVD와 같은 계산 절차로 이루어지며,
  • LSA(잠재 의미 분석) 역시 SVD가 텍스트 데이터 행렬에 적용된 예시에 불과하고,
  • 추천 시스템에서의 행렬 복원, 이미지 필터링에서의 노이즈 제거에도 SVD가 중요한 기반 원리로 쓰입니다.

결국, SVD를 잘 이해하는 것은, 선형대수학현대 데이터 과학을 연결하는 중요한 다리를 마련하는 것과 같습니다. 그만큼 배워두면 두고두고 요긴하게 써먹게 될, 데이터 과학의 숨은 영웅이라고 할 수 있겠습니다.

부록: 추가 참고사항

  1. 계산 복잡도:
    • 일반적인 전체 SVD 계산은 \(O(\min(mn^2, nm^2))\) 정도.
    • 대규모 행렬에는 부분 SVD랜덤라이즈드 SVD 같은 근사 알고리즘을 많이 사용.
  2. 랭크(rank):
    • 0이 아닌 특이값의 개수 = 행렬의 랭크(\(\mathrm{rank}(A)\)).
  3. 정규 직교 벡터:
    • \(U\)와 \(V\)를 구성하는 특이벡터들은 서로 직교하고 노름이 1인 단위벡터들이라, 기하학적으로 해석하기 쉽고 계산에도 유리함.
  4. 에카르트–영 정리(Eckart–Young theorem):
    • 프로베니우스 노름 관점에서 최적의 랭크 \(k\) 근사가 바로 SVD의 부분 합이라는 정리.

마무리

이상으로 SVD(특이값 분해)의 전반적인 개념, 수학적 구조, 기하학적 해석, 그리고 다양한 응용 예시까지 살펴봤습니다.
SVD는 선형대수학의 고전이지만, 현대 데이터 사이언스 환경에서도 여전히 (혹은 더욱) 빛을 발하고 있습니다.

  • 추천 시스템, 이미지·영상 처리, 노이즈 제거, PCA(차원 축소), 텍스트 마이닝
  • “랭크 1 행렬들의 합”이라는 관점에서 데이터의 중요한 패턴을 뽑아내고,
  • 간단한 소프트웨어 라이브러리(Numpy, Scipy, PyTorch 등)를 통해 빠르게 계산 가능.

실제 데이터에 적용해보면서, 특이값을 잘라서 낮은 랭크 근사도 해보고, 노이즈가 어떻게 줄어드는지 혹은 정보가 어떻게 보존되는지를 직접 경험해보면 이해가 더 빠릅니다.