특이값 분해(Singular Value Decomposition)

•
2026년 11월 08일 발행•2026년 11월 08일 수정
요약

임의의 행렬을 두 직교 행렬과 특이값을 담은 대각 행렬의 곱으로 분해하는 행렬 분해 기법

중급
선형대수의 행렬 곱, 직교 행렬, 고유값 분해 개념을 이해하고, 저랭크 근사를 데이터 분석과 모델링에 적용할 수 있어야 한다.

#개념

특이값 분해(Singular Value Decomposition, SVD)는 임의의 실수 또는 복소수 행렬을 두 개의 직교 행렬과 하나의 대각 행렬의 곱으로 분해하는 행렬 분해 기법이다. 정방 행렬에만 적용되는 고유값 분해와 달리 모든 크기의 행렬에 적용할 수 있으며, 행렬이 담고 있는 구조를 중요도 순으로 드러낸다는 점에서 선형대수와 머신러닝 전반의 기반 도구로 쓰인다.
크기가 $m \times n$인 행렬 $A$의 특이값 분해는 $A = U\Sigma V^\top$로 표현된다. 여기서 $U$는 $m \times m$ 직교 행렬, $V$는 $n \times n$ 직교 행렬, $\Sigma$는 대각 성분에만 0 이상의 값을 갖는 $m \times n$ 행렬이다. 대각 성분은 관례상 $\sigma_1 \ge \sigma_2 \ge \cdots \ge 0$처럼 내림차순으로 정렬하며, 0이 아닌 특이값의 개수가 곧 행렬의 랭크(rank)이다. 특이값 분해를 구성하는 요소는 다음과 같다.
특이값 분해의 구성 요소
  • 좌특이벡터(Left Singular Vector): $U$의 열벡터 $u_i$로, $AA^\top$의 고유벡터이며 행렬의 열 공간을 이루는 정규직교 기저다.
  • 특이값(Singular Value): $\Sigma$의 대각 성분 $\sigma_i$로, 각 방향이 행렬에서 차지하는 크기(에너지)를 나타낸다.
  • 우특이벡터(Right Singular Vector): $V$의 열벡터 $v_i$로, $A^\top A$의 고유벡터이며 행렬의 행 공간을 이루는 정규직교 기저다.
  • 랭크-1 합 표현: $A = \sum_{i=1}^{r} \sigma_i u_i v_i^\top$처럼 특이값으로 가중된 랭크-1 행렬들의 합으로 다시 쓸 수 있다.
특이값 분해는 기하학적으로 선형 변환을 세 단계로 나누어 해석할 수 있다. 벡터 $x$에 $A$를 곱하는 과정은 먼저 $V^\top$로 좌표계를 회전(또는 반사)하고, $\Sigma$로 각 축 방향을 특이값만큼 늘이거나 줄인 뒤, 마지막으로 $U$로 다시 회전하는 것과 같다. 따라서 단위 구는 $A$에 의해 반축 길이가 특이값이고 방향이 좌특이벡터인 타원체로 사상된다.
특이값 분해는 고유값 분해와 밀접하게 연결되어 있다. $A^\top A = V\Sigma^\top\Sigma V^\top$, $AA^\top = U\Sigma\Sigma^\top U^\top$가 성립하므로, 특이값은 $A^\top A$의 고윳값의 제곱근이다. 대칭 양의 준정부호 행렬에서는 두 분해가 일치하지만, 일반 행렬의 고유벡터는 직교하지 않거나 복소수가 될 수 있는 반면 특이벡터는 항상 실수 정규직교 기저를 이룬다는 차이가 있다.
실무에서는 전체 분해 대신 축약된 형태를 주로 쓴다. 얇은 특이값 분해(Thin SVD)는 $U$와 $\Sigma$에서 $\min(m, n)$개의 열만 남긴 형태이고, 절단 특이값 분해(Truncated SVD)는 상위 $k$개의 특이값과 그에 대응하는 특이벡터만 남겨 $A_k = U_k \Sigma_k V_k^\top$를 만든다. 절단 특이값 분해는 저장 공간을 $mn$에서 $k(m+n+1)$ 수준으로 줄이면서 행렬의 핵심 구조를 보존한다.
절단 특이값 분해가 널리 쓰이는 이론적 근거는 에카르트-영 정리(Eckart-Young Theorem)이다. 1936년 Eckart와 Young은 랭크가 $k$ 이하인 모든 행렬 가운데 프로베니우스 노름 기준으로 $A$와 가장 가까운 행렬이 $A_k$임을 보였고, 이후 스펙트럼 노름에서도 같은 결과가 성립함이 알려졌다. 이때 근사 오차는 $\|A - A_k\|_F = \sqrt{\sigma_{k+1}^2 + \cdots + \sigma_r^2}$로, 버린 특이값만으로 정확히 계산된다.
고전적인 계산은 골럽-카한(Golub-Kahan) 이중대각화로 행렬을 이중대각 형태로 바꾼 뒤 반복 연산으로 특이값을 구하는 방식이며, 밀집 행렬 기준 계산량은 $O(mn \min(m, n))$이다. 행렬이 매우 크거나 희소하면 전체 분해 대신 상위 몇 개의 특이값만 구하는 부분 분해가 필요하며, 란초스(Lanczos) 계열 반복법을 구현한 ARPACK이 대표적이다.
무작위 특이값 분해(Randomized SVD)는 대규모 행렬에서 저랭크 근사를 빠르게 얻기 위한 확률적 알고리즘이다. Halko, Martinsson, Tropp(2011)이 정리한 방식에서는 가우스 무작위 행렬 $\Omega$를 곱해 $Y = A\Omega$를 만들고, $Y$의 QR 분해로 얻은 정규직교 기저 $Q$에 $A$를 투영한 작은 행렬 $B = Q^\top A$만 정확히 분해한다. 목표 랭크보다 조금 더 많은 열을 뽑는 오버샘플링과 $(AA^\top)^q A$를 이용한 거듭제곱 반복을 더하면, 특이값이 천천히 감소하는 행렬에서도 정확도가 크게 높아진다.
특이값 분해는 데이터의 핵심 구조를 추출하는 거의 모든 작업에 등장한다. 대표적인 응용은 다음과 같다.
특이값 분해의 주요 응용
  • 주성분 분석(PCA): 평균을 뺀 데이터 행렬의 우특이벡터가 주성분 방향이고, $\sigma_i^2/(n-1)$이 각 주성분의 분산이다. 공분산 행렬을 직접 만드는 것보다 수치적으로 안정적이다.
  • 잠재 의미 분석(Latent Semantic Analysis, LSA): 단어-문서 행렬에 절단 특이값 분해를 적용해 동의어·다의어 문제를 완화한 저차원 의미 공간을 만든다.
  • 추천 시스템의 행렬 분해: 사용자-아이템 평점 행렬을 저랭크 요인으로 근사해 잠재 요인을 학습한다.
  • 이미지 압축과 잡음 제거: 상위 특이값만 남겨 이미지 정보를 적은 저장 공간으로 표현하고 작은 특이값에 몰린 잡음을 제거한다.
  • 의사역행렬과 최소제곱: $A^+ = V\Sigma^+ U^\top$로 무어-펜로즈 의사역행렬을 구해 과결정·부족결정 선형 시스템의 최소제곱 해와 최소 노름 해를 얻는다.
추천 시스템 분야에서 흔히 "SVD"라고 부르는 모델은 엄밀한 의미의 특이값 분해와 구분해야 한다. 실제 평점 행렬은 대부분의 값이 관측되지 않은 결측치이므로 고전적 특이값 분해를 바로 적용할 수 없고, 넷플릭스 프라이즈 이후 확산된 Funk SVD 계열 모델은 관측된 값에 대해서만 정칙화된 손실을 최소화하는 경사 하강 기반 행렬 분해다. 결측치를 0으로 채운 뒤 절단 특이값 분해를 적용하는 방식은 암묵적 피드백 행렬의 기준선이나 초기화 용도로 쓰인다.
수치 안정성 측면에서 특이값 분해는 가장 신뢰할 수 있는 분해 방법 중 하나다. 가장 큰 특이값과 가장 작은 0이 아닌 특이값의 비 $\kappa = \sigma_1/\sigma_r$이 행렬의 조건수이며, 이 값이 크면 선형 시스템의 해가 입력 오차에 민감해진다. 의사역행렬을 계산할 때는 일정 임계값보다 작은 특이값을 0으로 처리해 불안정성을 줄이며, 정규방정식 $A^\top A x = A^\top b$를 직접 푸는 방식은 조건수를 제곱으로 키우므로 특이값 분해나 QR 분해 기반 풀이가 권장된다.
특이값 분해의 결과에는 부호 비결정성이 있다는 점도 유의해야 한다. $u_i$와 $v_i$의 부호를 동시에 바꾸어도 같은 분해가 되므로, 라이브러리나 난수 시드에 따라 특이벡터의 부호가 달라질 수 있다. 같은 특이값이 반복되는 경우에는 해당 부분 공간 안에서 기저 선택 자체가 유일하지 않으므로, 특이벡터를 피처로 저장해 재사용할 때는 한 번 학습한 분해 결과를 고정해 사용해야 한다.
주요 파이썬 라이브러리는 용도에 따라 다음과 같이 나뉜다.
특이값 분해 구현 도구
  • NumPy numpy.linalg.svd: 밀집 행렬의 전체 분해를 제공하며, full_matrices=False로 얇은 분해를 얻는다.
  • SciPy scipy.linalg.svd와 scipy.sparse.linalg.svds: 전자는 LAPACK 드라이버를 선택할 수 있는 밀집 분해이고, 후자는 희소 행렬에서 상위 $k$개의 특이값만 구하는 부분 분해다.
  • scikit-learn TruncatedSVD: randomized와 arpack 두 가지 풀이 방식을 지원하며, PCA와 달리 데이터를 중심화하지 않아 TF-IDF 같은 희소 행렬에 바로 적용할 수 있다.
  • scikit-learn randomized_svd: 무작위 특이값 분해를 함수 형태로 제공하며 오버샘플링 수와 거듭제곱 반복 횟수를 조절할 수 있다.
실무에서 특이값 분해를 적용할 때는 먼저 중심화 여부를 결정해야 한다. 중심화하지 않은 데이터에 적용하면 첫 번째 성분이 평균 방향을 주로 설명하게 되며, 이는 PCA와 TruncatedSVD의 결과가 달라지는 주된 이유다. 또한 변수 간 단위 차이가 크면 표준화가 필요하고, 남길 랭크 $k$는 누적 에너지 비율 $\sum_{i \le k} \sigma_i^2 / \sum_i \sigma_i^2$이나 특이값 감소 곡선의 꺾이는 지점을 기준으로 정한다.
특이값 분해는 차원 축소, 잠재 요인 추출, 압축, 선형 시스템 풀이를 하나의 틀로 설명하는 기본 도구다. 최근에는 대규모 언어 모델의 가중치 행렬이 저랭크 구조를 갖는다는 관찰을 바탕으로 저랭크 적응(LoRA)의 초기화나 모델 압축에도 특이값 분해가 활용되고 있어, 데이터 과학자와 엔지니어 모두에게 원리를 이해해 둘 가치가 큰 개념이다.

#관련 용어

고유값 분해
정방 행렬을 고유벡터 행렬과 고윳값 대각 행렬로 분해하는 방법
절단 특이값 분해
상위 k개의 특이값과 특이벡터만 남겨 행렬을 저랭크로 근사하는 방법
주성분 분석(PCA)
중심화된 데이터의 분산이 큰 방향을 찾아 차원을 축소하는 기법
행렬 분해
사용자-아이템 행렬을 저차원 잠재 요인 행렬의 곱으로 근사하는 추천 기법
차원 축소
데이터의 핵심 정보를 유지하면서 변수의 수를 줄이는 과정

#직무 연관도

DA
Data Analyst
보통
텍스트·설문 데이터의 잠재 구조 파악과 시각화를 위한 차원 축소에 활용
DS
Data Scientist
밀접
차원 축소, 잠재 요인 모델, 모델 압축 등 다양한 알고리즘의 수학적 기반으로 활용
DE
Data Engineer
보통
대규모 희소 행렬의 저랭크 근사와 임베딩 압축을 효율적으로 구현

#사용 사례

전자상거래인터넷 서비스미디어금융의료
개요
특이값 분해는 대규모 행렬에서 핵심 구조를 추출하는 데 쓰인다. 전자상거래와 미디어 분야에서는 추천을 위한 잠재 요인 추출에, 인터넷 서비스에서는 문서 검색을 위한 잠재 의미 분석에, 금융 분야에서는 수익률 행렬의 요인 분석과 잡음 제거에, 의료 분야에서는 유전자 발현 데이터와 의료 영상의 차원 축소에 활용된다.
사례
전자상거래 서비스에서 사용자-상품 상호작용 행렬에 절단 특이값 분해를 적용해 상품 잠재 벡터를 만들고, 이를 유사 상품 추천과 추천 후보 생성의 기준선으로 활용

#참고 자료

#추천 포스트

© 2024 diki All rights reserved.