반응형

특잇값 분해(Singular value decomposition, SVD) - 행렬식으로 유도하기

 

0) 서론

SVD를 유도하는 방법은 크게 두 가지입니다.

그 중 하나가 지금까지 우리가 해왔던 벡터 기반 접근입니다.

즉, $v_i$라는 벡터 하나에서 출발해 $(A^TA)v_i = \lambda_i v_i$ 임을 발견하고, $u_i$를 계산해내는 작업이었죠.

그리고 이 벡터들을 모아서 행렬식을 구성한, 어떻게 보자면 상향식(Bottom-up) 방식이었습니다.

 

이번에 우리가 해 볼 방식은 두번째 방식이라고 볼 수 있습니다.

바로 행렬 기반 접근인데요.

그럼 바로 한 번 진행해 볼까요?

 

 

1) 행렬기반 접근으로 유도하기: 기본 설정

이전까지 우리가 논지를 전개하며 발견했던 것들을 여기서는 바로 써먹어 보겠습니다.

  • 사실 1: $A^TA$는 $n \times n$ 대칭 행렬(Symmetric Matrix)입니다.
  • 사실 2: 스펙트럼 정리에 따르면, 모든 대칭 행렬은 직교 대각화(Orthogonally Diagonalizable)가 가능합니다.

그리고 여기서 "직교 대각화가 가능하다"는 말은, $A^TA$를 다음과 같이 분해할 수 있음이 수학적으로 100% 보장된다는 뜻입니다.(여지없이 등장하는 피보나치 수열을 선형대수로 풀어보자 포스팅)

$$
A^TA = V \Lambda V^T
$$

  • $V$: $n \times n$ 직교 행렬(Orthogonal Matrix)입니다. (즉, $V^T V = I$ 이며, $V$의 열이 바로 우리가 찾던 '입력 직교축' $v_i$ 들입니다.)["이전엔 정규직교(Orthonormal)라며!" 라고 하신분들! 짝짝짝! 그러나 행렬에서는 정규직교 행렬이란 말 보다는 그냥 직교행렬이라고 한답니다!]
  • $\Lambda$ (람다): $n \times n$ 대각 행렬(Diagonal Matrix)입니다. (대각선에 $A^TA$의 고유값 $\lambda_i$들이 있습니다.)

 

 

2) 행렬기반 접근으로 유도하기: 행렬식 유도

이제 $A^TA = V \Lambda V^T$ 라는 보장된 사실에서부터 $A = U \Sigma V^T$ 를 건설해 봅시다.

 

1] $\Sigma$ (시그마) 정의하기

$A^TA$는 (수학적으로 'Positive Semidefinite'이므로) 모든 고유값 $\lambda_i$가 0보다 크거나 같습니다($\lambda_i \ge 0$).

이제 특이값(Singular Value) $\sigma_i$을 $\sigma_i = \sqrt{\lambda_i}$ 로 정의합니다.

 

그리고 $A$와 크기가 같은 $m \times n$ 대각 행렬 $\Sigma$를 만듭니다.

 

$$

\Sigma = \begin{bmatrix} \sigma_1 &0 &0 \\0 & \sigma_2 & 0\\0 &0 & \ddots \end{bmatrix}

$$

 

이렇게 정의하면, $\Lambda = \Sigma^T \Sigma$라는 관계가 성립합니다. (직접 $n \times m$ 행렬 $\Sigma^T$ 와 $m \times n$ 행렬 $\Sigma$를 곱해보면 $n \times n$ 대각 행렬 $\Lambda$가 나옵니다.)

 

2] 식에 대입하기

$A^TA = V \Lambda V^T$ 에 $\Lambda = \Sigma^T \Sigma$ 를 대입합니다.

 

$$

A^TA = V (\Sigma^T \Sigma) V^T

$$

 

3] $AV$ (출력결과) 확인하기

여기서 입력축 $V$를 $A$로 변환한 후 나오는 행렬 $AV$가 서로 직교하는지 한번 살펴봅시다.

$$(AV)^T(AV) = V^TA^TAV$$

이고, 여기서 중간에 $A^TA$를 위에서 찾은 $V(\Sigma^T \Sigma)V^T$로 치환해주면

\begin{align}
(AV)^T(AV) &= V^T(V(\Sigma^T \Sigma)V^T)V \\
&= I \Sigma^T \Sigma I \\
&= \Sigma^2
\end{align}

으로 정리가 됩니다.(여기서 $V^T V = I$죠)

 

즉, 이 결과가 의미하는 것은 i번째 열벡터와 j번째 열벡터를 서로 내적한 결과 i=j인 곳에서만 제곱이 발생했다는 것이므로,

행렬 $AV$의 열벡터들은 서로 직교하며, 그 크기가 $\Sigma$(특이값)라는 것입니다.

 

4] 출력축 $U$ 발견하기

따라서 $AV$를 크기($\Sigma$)로 나눠주기만 하면, 정규직교행렬 $U$를 얻을 수 있겠네요?($\sigma$가 0인 경우는 여러 다른 방법(그람-슈미트 라던가..)들로 극복이 가능하니 여기서는 살짝 덮어두고 지나가죠)

$$ U = (AV)\Sigma^{-1}$$

그리고 $U$는 수학적으로 정규직교 행렬이므로 $ U^T U = I$를 만족해야 합니다.

따라서 위 식을 $U^TU$에 넣고 정리를 하면,

$$U^T U = (\Sigma^{-1})^T (AV)^T (AV) \Sigma^{-1} = \Sigma^{-1} \Sigma^2 \Sigma^{-1} = I$$

위 식도 조건을 만족하게 되네요.

 

5] 수식정리하기

이제, $U = A V \Sigma^{-1}$ 식의 양변에 뒤쪽으로 $\Sigma$를 곱하고, $V^T$를 정리하면 끝입니다.

\begin{align}
U &= AV\Sigma^{-1} \\
U\Sigma &= AV \\
U\Sigma V^T &= A \quad \because V^T V = I \\
A &= U\Sigma V^T
\end{align}

 

이로써 행렬식 만으로 SVD를 유도해 내었습니다.

 

 

3) 더 나아가기

이제, 실제로 이 SVD(Full SVD)를 하면 행렬의 사이즈가 어떻게 되는지, 눈으로 한번 살펴볼까요?

그러나 실제적으로는 특이값이 0인 부분은 모두 버리고 Reduced SVD를 한다고 했잖아요?

그거는 위의 이미지에서

이렇게 사이즈를 바꿔서 진행한답니다.

 

그럼 여기서 특이값 행렬을 더 줄일 수 있을 것 같지 않나요?

네, 이렇게 Reduced SVD보다 더 Size를 줄인 것이 Truncated SVD입니다.

 

근데 잘 보면 위에서는 이미지가 A에 대한 건데, 이번엔 A'이 되었네요? 왤까요?

 

특이값은 값이 큰 순서대로 정렬이 되게 됩니다. 따라서 Reduced SVD보다 더 특이값 행렬의 사이즈를 줄이게 되면, 우선순위가 낮은 값이 '사라지게'되고, 정보의 손실이 발생하게 됩니다. 따라서 원래의 A값이 아니라 A' 즉 근사값이 나오게 되는거죠.

그리고 이것은 작은 특잇값(중요하지 않은 정보, 혹은 노이즈)을 버림으로써, 데이터의 핵심 특징만 남기는 압축의 효과를 가집니다.

(재밌게도, 푸리에 변환에서도 작은 계수(혹은 특정주파수의 계수)들을 버려서 신호를 압축했던 것 기억나시나요?)

 

그리고 여기서 PCA(주성분 분석)라는 것이 태동하게 됩니다.

 

 

4) 마무리

이로써 특이값 분해(SVD)의 모든 내용을 커버해 보았습니다.

마지막으로 고유값 분해(EVD)랑 같이 나란히 써보면, 두 방법의 차이가 명확하게 보입니다.

 

행렬식으로 쓰면 고유값분해는 입출력 축이 모두 같은 자기자신으로의 변화, 특이값분해는 입출력축이 서로 다른 변화를 한번에 볼 수 있습니다.

$A = V \Lambda V^T$

$A = U \Sigma V^T$

 

이로써 특이값 분해 관련 포스팅을 모두 마칩니다!

반응형
반응형

특잇값 분해(Singular value decomposition, SVD) - 뒤틀림 정도 찾기

 

0) 서론

저번 포스팅에서 직교 축 자체를 찾아보았습니다.

오늘은 이 찾은 직교 축(입력축)이 행렬 $A$에 의해 변환되었을 때 '어느 정도' 로 늘어나거나 줄어드는지, '어느 방향'의 출력축이 되는지 즉, 직교 축의 '뒤틀림 정도'를 찾아보겠습니다.(여기서 '뒤틀림'이란 방향과 크기 모두를 포함하고 있다는 것. 느낌적인 느낌으로 아시겠죠?)

 

 

1) 직교축 자체는 찾았지만...

직교하는 축 자체는 찾았습니다.
(일단 처음 찾은게 입력축($A^TA$의 EVD)이기도하니, 이젠 직교축을 입력축이라고 부르겠습니다.)

그러나 이 입력축이 행렬 $A$에 의해서 변환되었을 때 입력축이 변환된 출력축은 어떻게 뒤틀리는지 알지 못합니다.(물론 여기서는 뒤틀려도 직교이죠!)

뒤틀린다는건 방향도 바뀌고, 크기도 바뀐다는 말이죠.

그럼 이 입력축이 변환된 출력축이 어떻게 뒤틀리는지는 어떻게 알 수 있을까요?

일단, 모르겠으면 수식부터 찬찬히 살펴보는게 지름길입니다.

 

$Av_i = \lambda_i v_i$

바로 고유값 분해 식입니다.

 

자, 여기서 수식을 찬찬히 살펴보면, 고유값 분해는 당연히 양 변의 두 벡터가 같아야 하지만, 특이값 분해로 넘어오면서 축을 두개로 나누기로 했었죠?

그렇다면, 이제 양 변의 벡터도, 계수도 이름을 바꾸면

$Av_i = \sigma_i u_i$

이렇게 정리할 수 있겠죠?

(물론 수학에서 이름이 바뀌면 애초에 아예 다른 대상을 지칭하게 되는건 당연히 아시죠? 즉, $\sigma_i$와 $u_i$는 이제 완전히 다른 대상입니다.)

 

그리고 진짜 재밌게도 $A^TA$의 EVD가 입력축을 결정했잖아요? 근데, 스펙트럼 정리에 의해서 대칭 행렬의 고유값 분해 결과는 항상 정규직교 고유벡터를 가진다는 겁니다.

따라서 입력축은 무조건 정규직교 고유벡터이죠!

그렇다면 출력축은요?

출력축도 $AA^T$의 EVD 결과이므로 너무나도 당연히 정규직교 고유벡터입니다!

(여기서 용어 혼동이 올 수 있는데, 우리가 현재 포스팅에서 찾으려고 하는건 '입력축이 변환된 출력축'이고, 여기서 말하는 '출력축'은 출력축 자체를 의미하는 말이라 서로 완전히 다른 용어입니다. '입력축이 변환된 출력축'은 직교 기저이고, '출력축'은 정규 직교 기저입니다.)

 

어? 그러면 수식이 있고, 상수(정규 직교 벡터는 항상 크기가 1)가 정해졌으니까 뭔가 미지수를 구할 수 있을 것 같지 않나요!?

 

 

2) $\sigma_i$를 구해보자

이제 바로 σᵢ (시그마)의 정체를 밝히러 떠나봅시다.

 

$Av_i = \sigma_i u_i$

σᵢ는 변환 후 벡터의 '크기(길이)'를 나타냅니다. 따라서 위 방정식의 양변에 길이를 재는 연산(Norm, ||...||)을 적용하면 σᵢ를 구할 수 있습니다.

 

$ \|Av_i\| = \|\sigma_iu_i\| $

 

우변에서 σᵢ는 음이 아닌 스칼라이고, uᵢ는 길이가 1인 단위 벡터입니다. 따라서 ||σᵢuᵢ|| = σᵢ * ||uᵢ|| = σᵢ * 1 = σᵢ 입니다.

따라서

$ \sigma_i = \|Av_i\| $

 

즉, σᵢ의 정체는 우리가 찾은 특별한 입력축 vᵢ를 A로 변환시킨 결과물 벡터(입력축이 변환된 출력축)의 '길이' 입니다.

 

$\sigma_i$가 음이 아닌 스칼라인 이유는..

더보기

$\sigma_i$는 $\lambda_i$에서 온 거잖아요?

 

근데 $A^TA$행렬의 고유값인 $\lambda_i$가 0보다 크거나 같기 때문에 $\sigma_i$도 음이 아닌 스칼라인 거죠.

 

수식으로 보면

\begin{align}

(A^TA)v_i &= \lambda_i v_i \\

v_i^T(A^TA)v_i &= v_i^T(\lambda_i v_i) \\

(Av_i)^T(Av_i) &= \lambda_i (v_i^Tv_i) \\

\|A v_i\|^2 &= \lambda_i \\

\end{align}

 

따라서 $\lambda_i$는 무조건 0보다 크거나 같을 수밖에 없습니다.

 

 

그런데 이 길이는 우리가 이미 아는 값과 연결됩니다.

길이의 '제곱'을 계산해 봅시다.

 

$ \sigma_i^2 = \|Av_i\|^2 = (Av_i)^T(Av_i) = v_i^T(A^TA)v_i $

 

그런데 vᵢ는 $A^TA$의 고유벡터이므로, (AᵀA)vᵢ = λᵢvᵢ 입니다.

 

위 식에 대입하면: vᵢᵀ(λᵢvᵢ) = λᵢ(vᵢᵀvᵢ)

 

vᵢ는 길이가 1인 단위 벡터이므로, vᵢᵀvᵢ = 1 입니다.

 

최종적으로 $\sigma_i^2 = \lambda_i$, 즉 $\sigma_i = \sqrt{\lambda_i}$ 라는 사실을 알 수 있습니다.

 

따라서 σᵢ는 쉽게 $A^TA$의 고유값 λᵢ에 루트(√)를 씌우면 됩니다.

 

 

3) $u_i$를 구해보자

 

Avᵢ = σᵢuᵢ

여기서 uᵢ에 대해 정리하면 됩니다. σᵢ는 스칼라이므로 양변을 나눌 수 있습니다.

 

$ u_i = \frac{1}{\sigma_i}Av_i $

 

즉, 입력축이 변환된 출력축(Av_i)에서 그 값($\sigma_i$)을 나눠주면, 정규직교기저인 출력축 그 자체가 유도된다는 말입니다.

[더 자세하게는,
Full SVD의 경우 $U$행렬($u_i$가 모인 행렬)이 m x m이고, 따라서 0인 값들이 생겨 위의 식으로는 정의가 되지 않고 그람-슈미트 직교화 등의 방법을 쓰게 되지만(좌측 영공간의 직교 기저를 찾기 위해),
일반적인 Reduced SVD의 경우 $U$행렬을 m x n으로 만들고 $\sigma$값 자체가 0인 경우는 무시해 버립니다.(따라서 위 식은 100% 작동합니다.)
개념상으로는 Full SVD를 배우고, 이후의 행렬식 자체도 Full SVD를 기준으로 설명 하지만, 실제로 값을 계산하는 부분으로 가면 Reduced SVD를 쓸 것이므로 실제 $u_i$의 값이 정의되지 않는 상황은 오지 않을 것입니다.]

 

 

4) 마무리

오늘은 입력축이 출력축으로 변환될 때 얼마나 뒤틀리는지, 그 방향과 정도를 찾아보는 시간을 가졌습니다.

제일 앞서 선형 변환은 가장 크게 나눠 '회전'과 '확대/축소(스케일링)'가 있다고 했는데요

 

여기서 입력축이 출력축으로 변환될 때

방향은 A라는 선형 변환의 '회전'만큼 돌아가고

스케일링은 $sigma$값 만큼 된다는 걸 알 수 있었습니다.

반응형

+ Recent posts