본문 바로가기
AI

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

by HYEBINess 2022. 9. 2.

# 차원의 저주(Curse of Dimensionality) & 차원 축소(Dimensionality Reduction)

차원의 저주란 불필요한 샘플의 수가 증가함에 따라 모델의 성능 저하를 가져오는 현상을 말합니다. 일반적으로 데이터의 수가 많으면 모델에 긍정적인 영향을 미치지만, 샘플이 지나치게 많으면 복잡성이 가중이 됩니다. 이렇게 과도한 정보를 훈련시킬 경우 오히려 부정확한 모델이 만들어지게 됩니다. 

차원의 저주에서 말하는 '차원'이란 머신러닝 모델 구축 시 각 샘플들을 정의하는 정보입니다. 모델 학습에 필요한 데이터 프레임에서 feature(컬럼)에 해당하는 것이 곧 차원입니다. 결국 '차원이 많다'는 것은 'feature의 수가 많다'는 것과 같습니다.

 

차원의 수가 많아 차원의 저주에 빠진 경우 차원 축소를 통해 모델의 성능을 높일 수 있습니다. 차원 축소를 하기 위한 방법은 feature selection(특징 선택), PCA(주성분 분석), SVD(특이값 분해), MF(Matrix Factorization) 등 여러 가지가 있습니다.

 

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

SVD는 행렬 분해(decomposition) 방법 중 하나로 매우 많은 feature를 가진 고차원 행렬을 저차원 행렬로 분리하는 기법입니다. 특히 이런 행렬 분해를 수행하면서 원본 행렬에서 잠재된 요소를 추출하기 때문에 토픽 모델링이나 추천 시스템에 활발하게 사용됩니다.

 

SVD는 m×n 차원의 A행렬을 아래과 같이 U, Σ, V의 3개의 행렬로 분해하는 방법론입니다. 

여기서 행렬(U, Σ, V)의 크기(혹은 차원)와 성질은 아래와 같습니다.

  •  : (m×n)차원의 직교 행렬(orthogonal matrix)
  •  : (m×n) 직사각 대각 행렬 (diagonal matrix)
  •  : (n×n)차원의 직교 행렬(orthogonal matrix)

여기서 직교행렬(orthogonal matrix)이란 자신과 자신의 전치 행렬(transposed matrix)의 곱 또는 이를 반대로 곱한 결과가 단위행렬(identity matrix)이 되는 행렬을 말합니다. 실수 n×n행렬 A에 대해서 A × AT=I(단위행렬) 를 만족하면서 AT × A=I을 만족하는 행렬 A를 직교 행렬이라고 합니다. 결국 위 그림의 VT는 V의 역행렬과 같습니다.

 

또한 대각 행렬(diagonal matrix)이란 대각 성분을 제외한 곳의 원소가 모두 0인 행렬을 의미합니다. 만약 대각 행렬 Σ가 m × n의 직사각 행렬인 경우 아래와 같은 모양을 가집니다. 이때 SVD로 나온 대각 행렬의 대각 원소(a)의 값을 행렬 A의 특이값(singular value)라고 합니다.

m > n 인 경우
m < n 인 경우

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

위 수식의 'A를 선형 변환한다'는 것은 'VT로 회전 변환(Rotate) -> Σ로 스케일 변환(Stretch) -> U로 회전 변환(Rotate)'하는 것입니다. 결국 V는 선형 변환 전 행렬, U는 선형변환 후 행렬, Σ는 특이값을 가진 행렬입니다. 이때  Σ의 대각성분인 특이값은 A가 가지고 있는 행렬의 정보량을 결정해주는 Scailing factor입니다. 따라서 특이값이 크다면 정보량이 많은 것이고 특이값이 작다면 정보량이 작은 것입니다.

 

즉, 우리는 SVD라는 방법을 이용해 A라는 임의의 행렬을 여러 개의 A 행렬과 동일한 크기를 갖는 여러 개의 행렬로 분해해서 생각할 수 있는데, 분해된 각 행렬의 원소의 값의 크기는 특이값(a)의 크기에 의해 결정됩니다. 다시 말해, SVD를 이용해 임의의 행렬 A를 정보량에 따라 여러 layer로 쪼개서 생각할 수 있게 해 줍니다.

 

# Truncated SVD(절단된 특이값 분해)

위의 SVD와 같이 모든 정보를 이용한 것을 Full SVD라고 합니다. 하지만 Full SVD를 사용하는 경우는 드뭅니다. 실제로는 ∑의 비대각 부분과 대각 원소 중 0인 부분을 모두 제거하고, 제거된 ∑의 정보만큼 U와 V 원소도 함께 제거해 SVD를 적용합니다. 이렇게 일부 벡터들을 삭제하는 것을 데이터의 차원을 줄인다고 말하는데, 데이터의 차원을 줄이게 되면 당연히 Full SVD를 하였을 때보다 직관적으로 계산 비용이 낮아지는 효과를 얻을 수 있습니다. 

 

이런 방식을 Truncated SVD라고 합니다. Truncated SVD는 ∑의 대각 원소 중 상위 몇 개만 추출하고 여기에 대응하는 U와 V의 원소도 함께 제거해 차원을 줄인 것입니다. ∑의 대각 원소 중 상위 p개만 추출한다고 하면 아래와 같이 분해됩니다. 모든 행렬은 p까지만 남게 됩니다. 여기서 p는 하이퍼파라미터입니다.

Truncated SVD를 수행하면 원본 값의 손실이 일어나므로 기존의 행렬 A를 복구할 수 없습니다.  p를 크게 잡으면 기존의 행렬 A로부터 다양한 정보를 가져갈 수 있지만, p를 작게 잡아야만 노이즈를 제거하고 차원의 저주에 빠지지 않습니다.

 

p를 적절히 설정하여 p개까지만 추출하여 SVD를 적용한다면 기존의 행렬에서는 드러나지 않았던 심층적인 의미를 확인할 수 있습니다. 일례로 영상 처리 분야에서는 노이즈를 제거할 수 있고, 자연어 처리 분야에서는 설명력이 낮은 정보를 삭제하고 설명력이 높은 정보만 남길 수 있게 됩니다. 

 

# SVD의 활용

SVD는 분해된 행렬을 다시 조합하는 방법으로 응용할 수 있습니다. 기존의 U,  ∑, VT로 분해되어 있던 A행렬을 특이값 p개만을 이용해 A'이라는 행렬로 부분 복원할 수 있습니다. 위에서 언급했던 것처럼 특이값의 크기에 따라 A의 정보량이 결정되기 때문에 값이 큰 몇 개의 특이값들을 가지고도 충분히 유용한 정보를 유지할 수 있게 됩니다. 아래 사진의 경우 특이값이 커서 정보량이 많아 사진의 선명도는 떨어지지만 인물의 윤곽은 확인할 수 있습니다.

특이값(Singular Value)이 큰 경우
특이값(Singular Value)이 작은 경우

특이값의 크기에 따른 선명도 차이가 보이시나요? 특이값이 큰 값부터 조금씩 더해주면 대략적인 윤곽이 표현되고 layer 수가 늘어날 수록 이미지가 선명해집니다. 용량을 줄이기 위해 고화질 이미지를 저화질로 바꾸고 싶다면 layer를 적게 쌓은 부분까지만 저장하면 저화질 이미지가 되는 것입니다. 
이처럼 SVD는 차원을 축소시켜 잠재적인 의미를 이끌어낸다는 아이디어를 갖고 있습니다. 이는 자연어 처리의 잠재 의미 분석(Latent Semantic Analysis, LSA)에도 많이 활용됩니다.
 

지금까지 차원 축소 방법 중의 하나인 SVD에 대해 알아보았습니다:D

 

 

 

reference

https://wikidocs.net/24949 

https://velog.io/@vvakki_/Matrix-Factorization-2 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

'AI' 카테고리의 다른 글

Gradient boost  (0) 2022.08.29
SVM(Support Vector Machine)  (0) 2022.08.14
L1 Regularization & L2 Regularization  (0) 2022.08.12
Generalization, Normalization, Standardization  (0) 2022.08.12
binary & multinomial  (0) 2022.08.08

댓글