특이값 분해 (Singular Value Decomposition)은 수학, 공학 및 경제학 분야에서 많이 사용되는 행렬 분해 방법으로 행렬 연산 가속화나 데이터 압축에 적용되는 중요한 개념이므로 한번쯤 공부를 해두면 좋은 내용입니다.
SVD (Singular Value Decomposition) 이론
특이값 분해(Singular Value Decomposition, SVD)는 모든 실수 또는 복소수 행렬에 대해 적용 가능한 행렬 분해 기법입니다. 임의의 행렬 A (m×n)
는 다음과 같이 분해됩니다:
$A = U * Σ * V^T$
- U: 좌측 특이 벡터로 구성된 직교 행렬 (m × m)
- Σ: 특이값 (singular values)이 대각선에 있는 대각 행렬 (m × n)
- $V^T$: 전치된 우측 특이 벡터 (n × n)
특이값은 행렬 A의 에너지 혹은 정보량을 나타내며, 이를 기반으로 차원 축소나 잡음 제거가 가능합니다.
Truncated SVD (절단 특이값 분해)
Truncated SVD는 전체 특이값 중 상위 k
개의 특이값과 해당 특이 벡터만을 사용하여 원래 행렬을 근사합니다:
$A ≈ U_k * Σ_k * V_k^T$
이 기법은 정보의 대부분을 유지하면서 차원을 줄이기 위해 활용되며, 특히 희소행렬(sparse matrix), 텍스트 데이터, 이미지 처리에서 널리 사용됩니다.
Python으로 구현한 SVD 및 Truncated SVD
import numpy as np
def compute_svd(A):
AT_A = np.dot(A.T, A)
eigvals, V = np.linalg.eigh(AT_A)
idx = np.argsort(eigvals)[::-1]
eigvals = eigvals[idx]
V = V[:, idx]
singular_values = np.sqrt(eigvals)
Σ = np.diag(singular_values)
U = np.dot(A, V) / singular_values
return U, Σ, V.T
A = np.array([[3, 2], [2, 3]])
U, Σ, VT = compute_svd(A)
print("U:\n", U)
print("Σ:\n", Σ)
print("V^T:\n", VT)
출력결과:
U:
[[ 0.70710678 -0.70710678]
[ 0.70710678 0.70710678]]
Σ:
[[5. 0.]
[0. 1.]]
V^T:
[[ 0.70710678 0.70710678]
[-0.70710678 0.70710678]]
Scikit-learn을 이용한 Truncated SVD
from sklearn.decomposition import TruncatedSVD
import numpy as np
X = np.array([[3, 2, 2], [2, 3, -2]])
svd = TruncatedSVD(n_components=2)
X_reduced = svd.fit_transform(X)
print("Reduced X:\n", X_reduced)
print("Components:\n", svd.components_)
출력결과:
Reduced X:
[[ 3.53553391 2.12132034]
[ 3.53553391 -2.12132034]]
Components:
[[ 7.07106781e-01 7.07106781e-01 4.33680869e-18]
[ 2.35702260e-01 -2.35702260e-01 9.42809042e-01]]
Truncated SVD는 특히 희소 데이터 (예: TF-IDF 행렬, 사용자-아이템 행렬)에 적합하며 PCA와 달리 데이터 중심화를 요구하지 않습니다.
딥러닝/머신러닝에서의 Truncated SVD 활용
1. 차원 축소
고차원 데이터 (예: 텍스트, 이미지)를 저차원으로 압축하여 연산량을 줄이고 일반화 성능을 높이는 데 사용됩니다.
2. 자연어 처리 (NLP)
- LSA (Latent Semantic Analysis): 문서-단어 행렬에 Truncated SVD를 적용하여 단어의 의미적 관계를 추출합니다.
- Word Embedding 전처리: FastText, GloVe 벡터의 차원 축소에 사용되어 메모리 사용 최적화 가능
3. 추천 시스템
사용자-아이템 희소 행렬에 대해 Truncated SVD를 적용하여 잠재 요인 모델을 학습할 수 있으며, Netflix, YouTube 추천 엔진에서 사용됩니다.
4. 딥러닝 모델 압축 (Model Compression)
LoRA (Low-Rank Adaptation)는 대형 언어 모델(예: GPT, BERT)의 파라미터 효율적 튜닝을 위한 기법으로, 핵심 아이디어는 가중치 행렬을 저랭크 형태로 근사하는 것입니다:
W ≈ W0 + A * B # A, B는 낮은 랭크의 행렬
이때 A, B는 학습 가능하며, 전체 모델을 재학습하지 않고 빠르게 적응 가능하도록 도와줍니다. LoRA는 SVD 기반 아이디어를 응용한 대표적 사례입니다.
5. Vision 분야
Neural Network의 convolutional weight를 low-rank로 근사하여 메모리 사용량과 연산량을 줄이는 데 사용됩니다.
참고자료
- Golub, G. H., & Van Loan, C. F. (2013). Matrix Computations.
- NumPy 공식 문서
- Scikit-learn TruncatedSVD
- Wikipedia: Singular value decomposition
- LoRA 논문 (Hu et al., 2021)
- "Matrix Factorization Techniques for Recommender Systems", Koren et al. (2009)
- "Efficient Estimation of Word Representations in Vector Space", Mikolov et al. (2013)
'AI' 카테고리의 다른 글
이미지 분류 모델 가이드: ResNet18 파인튜닝 (0) | 2025.05.03 |
---|---|
PyTorch Transforms v2로 구현하는 컴퓨터 비전 이미지 증강 (1) | 2025.05.01 |
FixMatch 논문 완전 분석: 간결하면서 강력한 반지도 학습(Semi-Supervised) 알고리즘 (0) | 2025.04.30 |
컴퓨터 비전에서 준지도학습(Semi-Supervised Learning) 소개 및 최신 알고리즘 비교 분석 (0) | 2025.04.30 |
확률 분포 간 차이를 측정하는 KL Divergence 개념과 수식 정리 (0) | 2025.04.28 |