[선형대수 시리즈 20편] 특이값 분해(SVD)와 차원축소 입문

English version

이번 글에서 다룰 내용

이 글에서는 특이값 분해 (SVD)와 차원축소(dimensionality reduction)를 다룹니다.

  • 특이값 분해(SVD)가 행렬을 어떻게 분해하는지 큰 그림을 설명합니다.
  • 특이값 (singular value)이 무엇을 뜻하는지 정리합니다.
  • 저랭크(low-rank) 근사가 왜 가능한지 설명합니다.
  • 압축, 추천 시스템, 임베딩 축소 같은 실무 예시로 연결합니다.

이번 글에서 새로 나오는 용어

  • 특이값 분해 (SVD): 행렬을 직교축과 스케일 구조로 나누는 분해입니다.
  • 특이값 (singular value): 각 축이 얼마나 늘어나거나 줄어드는지를 나타내는 값입니다.
  • 저랭크(low-rank) 근사: 중요한 축만 남겨 행렬을 더 작게 근사하는 방법입니다.
  • 차원축소 (dimensionality reduction): 중요 구조를 유지하며 표현 차원을 줄이는 과정입니다.

핵심 아이디어

특이값 분해 (SVD)는 임의의 행렬을 세 부분으로 나누어 읽는 방법입니다.

A = U Σ V^T

행렬 크기까지 적어 보면

A (m x n) = U (m x m) Σ (m x n) V^T (n x n)

입니다.

각 부분은 다음처럼 읽을 수 있습니다.

  • V^T: 입력 공간 R^n의 좋은 직교기저(orthonormal basis)
  • Σ: 각 축을 얼마나 늘리거나 줄일지 담은 대각형 스케일 구조
  • U: 출력 공간 R^m의 좋은 직교기저

즉 특이값 분해(SVD)는 행렬이 어떤 방향을 얼마나 강하게 늘리고, 어떤 방향은 거의 무시하는지를 가장 잘 드러내는 분해라고 볼 수 있습니다.

특이값 σ_iA^T A의 고유값(eigenvalue) λ_i에 대해

σ_i = sqrt(λ_i)

로 이해할 수 있습니다. 또한 대응하는 특이벡터(singular vector)는

A v_i = σ_i u_i

관계를 만족합니다.

왜 특이값 분해(SVD)가 중요한가

고유값 분해(eigendecomposition)는 정사각행렬(square matrix)에 대해서만 직접 다루고, 모든 행렬에서 깔끔한 직교 분해가 보장되는 것은 아닙니다. 반면 특이값 분해(SVD)는 모든 실수 또는 복소수 행렬(직사각행렬 포함)에 존재합니다.

그래서 이미지 압축, 추천 시스템, 잠재 요인 분석, 노이즈 제거, 검색 임베딩 처리 등에서 매우 널리 쓰입니다. 다만 큰 행렬에서는 계산 비용, 수치 안정성, 희소성 보존 문제를 함께 고려해야 합니다.

또 특이값 분해(SVD)는 "중요한 축 몇 개만 남기면 원래 행렬을 꽤 잘 근사할 수 있다"는 사실을 보여 줍니다. 상위 k개 특이값만 남긴 절단 특이값 분해(truncated SVD)는 Frobenius 노름 기준으로 최적의 저랭크(rank-k) 근사를 제공합니다.

단계별 예시

예시 1) 이미지 압축

이미지 한 장을 행렬로 보고 특이값 분해(SVD)를 적용하면, 큰 특이값 (singular value) 몇 개만 남겨도 원본과 비슷한 이미지를 재구성할 수 있습니다.

예를 들어 512 x 512 이미지에 대해 상위 50개 축만 남긴다고 생각해 봅시다. 전체 픽셀을 모두 저장하는 대신, 중요한 축과 계수만 저장해도 시각적으로 비슷한 결과를 얻을 수 있습니다. 이는 중요한 구조는 유지하면서 세부 노이즈나 덜 중요한 변화를 버리는 효과와 연결됩니다.

예시 2) 추천 시스템

사용자-아이템 행렬(user-item matrix)은 매우 크고 희소(sparse)할 수 있습니다. 하지만 실제로는 몇 개 잠재 요인(latent factor)으로 대부분 설명되는 경우가 많습니다. 이때 저랭크(low-rank) 근사를 이용하면 더 작은 차원에서 구조를 요약할 수 있습니다.

다만 표준 SVD는 희소 행렬을 조밀한(dense) 형태로 다루게 되기 쉬우므로, 실무에서는 truncated SVD, randomized SVD, 또는 다른 행렬 분해 기법을 함께 고려합니다.

예시 3) 문서와 임베딩

문서-단어 행렬이나 임베딩 행렬도 고차원 구조를 가질 수 있습니다. 특이값 분해(SVD)를 통해 중요한 축만 남기면 검색 속도와 메모리 사용량을 줄이면서도 핵심 의미 구조를 어느 정도 유지할 수 있습니다.

수학 주석

  • 특이값 (singular value)은 행렬이 어떤 방향을 얼마나 강하게 늘리는지 보여 줍니다.
  • 큰 특이값에 대응하는 축은 중요한 구조를 담고, 작은 특이값은 상대적으로 덜 중요한 변화나 노이즈와 연결될 수 있습니다.
  • 절단 특이값 분해(truncated SVD)는 주어진 계수(rank) 제한 아래 Frobenius 노름 기준으로 최적 근사를 제공합니다.
  • 주성분 분석 (PCA)은 중심화(centering)된 데이터 행렬의 SVD로 구현할 수도 있고, 공분산 행렬의 고유값 분해로 볼 수도 있습니다. 두 관점은 서로 연결됩니다.

즉 특이값 분해(SVD)는 단순 분해 기술이 아니라, "무엇을 남기고 무엇을 버릴 것인가"를 수학적으로 정당화해 주는 도구입니다.

자주 하는 오해

특이값 분해(SVD)는 라이브러리 함수 이름 정도라고 생각하기

실제로는 행렬 구조를 읽고 압축하는 매우 강력한 사고방식입니다. 호출법만 알면 응용은 해도 해석이 남지 않습니다.

고유값 분해와 특이값 분해(SVD)를 같은 것으로 생각하기

연결은 있지만 다릅니다. 특이값 분해(SVD)는 직사각행렬에도 적용할 수 있고, 더 일반적인 상황을 다룹니다.

작은 특이값은 무조건 쓸모없다고 생각하기

문제에 따라 작은 변화가 중요할 수도 있습니다. 어떤 정보를 버릴지는 항상 목적과 데이터 해석에 따라 결정해야 합니다.

연습 또는 확장

다음 질문을 생각해 보세요.

  1. 왜 큰 특이값만 남겨도 원래 구조를 꽤 잘 보존할 수 있을까?
  2. 추천 시스템에서 저랭크(low-rank) 근사는 어떤 장점을 줄까?
  3. 특이값이 [10, 5, 1, 0.1]일 때 상위 2개만 남기면 얼마나 많은 에너지를 보존한다고 볼 수 있을까? 힌트: 특이값 제곱합 비율을 생각해 보세요.

마무리

이번 글에서는 특이값 분해(SVD)와 차원축소(dimensionality reduction)를 정리했습니다.

  • 특이값 분해(SVD)는 행렬을 중요한 축과 스케일 구조로 분해합니다.
  • 특이값 (singular value)은 중요한 방향을 드러냅니다.
  • 상위 축만 남기면 압축과 저랭크(low-rank) 근사가 가능합니다.
  • 이미지, 추천 시스템, 검색, 임베딩 처리에서 매우 널리 쓰입니다.

이로써 선형대수 시리즈의 큰 줄기를 모두 한 바퀴 돌았습니다. 다음 단계로는 넘파이(NumPy) 실습, 주성분 분석 (PCA) 구현, 추천 시스템 예제로 이어 가면 좋습니다.

💬 댓글

이 글에 대한 의견을 남겨주세요