반응형

특잇값 분해(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) 서론

이전까지 특이값 분해의 아주 기본적이지만, 핵심적인 내용을 모두 살펴보았습니다.

  1. 방향이 바뀌지 않는 벡터를 고유값 분해로 찾을 수 있으니, 고유값 분해로 직교인 벡터도 찾을 수 있지 않을까?
  2. 특수한 경우에만 가능하네? 왤까? 아, 이런저런 문제로 행렬 자체의 본질적인 축으로는 절대 불가능 하구나
  3. 그럼 행렬 $A$가 선형 변환이니까, 변환 전과 변환 후로 나누어서 둘 다 동시에 직교성을 만족시키는 건 찾을 수 있나?
  4. 찾을 수 있네! 그리고 직교성을 유지하는 그 변환은 '회전'과 '스케일링'으로 나눌 수 있구나!

까지 살펴보았는데요, 결국 이 개념이 바로 특이값 분해의 핵심 개념인거죠!

이번 포스팅에서는 벡터단위로 전개한 논지를 행렬식으로 합쳐보도록 하죠!

 

 

1) 행렬로 만들기

이전 포스팅에서 우리는 '입력축'이라고 불렀던 직교하는 벡터 $v_i$, '출력축 자체(혹은 '입력축이 변환된 출력축의 방향')'라고 불렀던 직교하는 벡터 $u_i$, '입력축이 변환된 출력축의 크기'라고 불렀던 스칼라 값 $\sigma_i$를 정의했습니다.

그리고 이것을 한번에 쓰면 벡터에 대해서 정의된 특이값 분해 식이 나옵니다.

$ Av_i = \sigma_i u_i $

즉, 직교하는 입력 벡터중 하나를 $A$라는 행렬로 선형변환하면 이 벡터는 $\sigma_i$라는 크기를 가지고 $u_i$라는 방향으로 변환된다. 입니다.

그리고 모든 $v_i$와 $u_i$는 정규직교한다고 말씀드렸었죠.(대칭행렬을 EVD한 결과 벡터들은 스펙트럼 정리에 의해서 서로 정규직교한다고 했었으니까요)

그럼 이 벡터들을 한번 '쌓아서' 행렬을 만들어 볼까요?

 

  • 행렬 $V$: 고유벡터 $v_i$들을 열로 삼아서 모든 벡터를 쌓아 행렬 $V$를 만들 수 있겠죠?
    \begin{align}
    V &=
    \begin{bmatrix}
    | & | \\
    v_1 & v_2 & \cdots \\
    |& |
    \end{bmatrix}
    \end{align}

  • 행렬 $\Sigma$: 그리고 $\sigma_i$는 고유값 $\lambda_i$들에 루트를 씌워($\sigma_i = \sqrt{\lambda_i}$) 대각 행렬 $\Sigma$를 만듭니다.
    (여기서 $\lambda$를 모은 행렬 $\Lambda$는 주 대각 성분에 고유값들을 가지는 대각 행렬인데, 왜 주 대각 성분에 고유값들을 가지는 지에 대한 더욱 자세한 내용은 피보나치 수열을 선형대수로 풀어보자 중 대각화 포스팅에서 살펴보실 수 있습니다.)
    (간단히 짚어보자면, 고유값 분해 식을 행렬식 $AV=V\Lambda$으로 썼을 때, 고유벡터 $v_i$들을 열로 삼아서 쌓았기 때문에 각 고유벡터 $v_i$에 $\lambda_i$를 곱해주려면 너무나도 당연하게 $\Lambda$행렬은 주 대각 성분에 $\lambda_i$를 가질 수 밖에 없습니다.)
    \begin{align}
    \Sigma &=
    \begin{bmatrix}
    \sigma_1 & 0 & \cdots \\
    0 & \sigma_2 & \cdots \\
    \vdots & \vdots & \ddots
    \end{bmatrix}
    \end{align}

  • 행렬 $U$: $v_i$와 $\sigma_i$를 이용해, $u_i = \frac{1}{\sigma_i}Av_i$라는 공식으로 $u_i$들을 모두 계산하고, 이것들을 열로 삼아 행렬 $U$를 만듭니다.
    \begin{align}
    U &=
    \begin{bmatrix}
    | & | \\
    u_1 & u_2 & \cdots \\
    | & |
    \end{bmatrix}
    \end{align}

 

이렇게 행렬들을 전부 만들어보았습니다!

그런데... 이 행렬들을 어떤식으로 배치를 해야 우리가 생각한 대로 행렬식이 세워질까요?

 

 

2) 세 행렬을 어떻게 합치면 좋을까?

사실 원래 고민할 것도 없습니다.

원래 벡터 식이

$ Av_i = \sigma_i u_i $

였으니까, 행렬식으로 바꿔주면

$ AV = U\Sigma$

가 되겠죠!($\sigma u$에서 $U\Sigma$로 가 위치가 바뀌는 건, 행렬연산을 하게되면 연산 규칙에 따라 당연히 바뀌어야 하는 부분입니다. 실제로 계산이 올바로 되는 형태가 $U \Sigma$죠.)

그리고 보기 좋게 "$A$라는 행렬에 대해서(즉, 행렬을 분해)"한 형태로 쓰면

$ A = U\Sigma V^{-1} $

이렇게 나오겠죠! 근데, 정규직교 행렬에서는 역행렬과 전치행렬이 똑같다고 했으므로

$ A = U\Sigma V^T $

로 최종 정리 할 수 있겠습니다.

그리고 이 형태가 바로 특이값 분해 입니다.

용어도 한번 살펴보자면, '출력축'인 $U$는 Left Singular Vector라고 하고, '입력축'인 $V$는 Right Singular Vecoter라고 합니다. 그리고 가운데 특이값 행렬은 당연히 Singular Value죠.

 

 

3) 또 다르게 생각해 볼 수 없나? 기하학적 접근

위에서는 우리가 지금까지 구한 벡터식을 행렬식으로 변환시켜주면서 자명하게 유도되는 결과를 가지고 설명드렸는데요

이제 조금 다르게 기하학적으로 생각해보겠습니다.

 

$x$라는 벡터가 있습니다.

이 벡터를 $A$라는 행렬로 선형 변환을 할 때를 생각해 볼까요?

단순히 $x$벡터에 행렬$A$를 곱하면 수행되는 선형변환을 이제부터 낱낱히 뜯어보겠습니다.

 

출처: wikipedia.org

 

  1. 일단 $x$벡터는 행렬$A$의 공간에 들어오면서 행렬 $A$의 입력축에 맞게 회전합니다.(좌표축 변환, $V$)

  2. 그리고 행렬$A$의 '스케일링'효과를 받아 각 축 방향으로 길이가 늘어나거나 줄어들죠.(스케일링, $\Sigma)

  3. 이제 마지막으로 행렬$A$의 공간을 나가면서 출력축에 맞게 다시 회전하죠.(좌표축 변환, $U$)

 

이것이 바로 단순히 $x$벡터에 행렬$A$를 곱하면 나오는 값을 조각조각 나눠봤을 때 벌어지는 상황입니다.

 

자, 그럼 위 상황을 수식으로 써볼까요?

$ Ax = U (\Sigma (V (x) ) ) $

겠죠 일단 $x$를 $V$로 작업해야 하고, 그 결과를 $\Sigma$로 작업해야 하고, 그 결과를 $U$로 작업해야 하니까요?

 

그런데, 여기서 행렬 연산으로 바꾸면 벡터와 곱하기 위해서는 $V$행렬을 전치시켜주어야 합니다.

따라서 행렬식으로 다시써보면

$ Ax = U \Sigma V^T x $

모든 x에 대해서 성립하려면 행렬 자체가 같아야 하니까, 양변 소거되어

$ A = U \Sigma V^T $

즉, $A$라는 행렬이 임의의 선형변환을 할때 실제로는 어떤 자세한 과정을 거치는지 '분해'해 놓은 결과인겁니다.

그리고 바로 이것이 "특이값 분해"!!

 

 

4) 한 걸음 더

이전에  $A^TA$가 n x n이 되면서 '입력축'을 결정하는 행렬이 되고, 반대로 $AA^T$는 m x m으로 '출력축'을 결정하는 행렬이 된다고 말씀드렸던 것 기억하시나요?

 

행렬식까지 싹 다 정리를 해봤으니, 이번엔 $AA^T$가 '출력축'을 결정하는 행렬이 되는 과정을 한번 따라가 봅시다.

 

$ A = U \Sigma V^T $와 $Av_i = \sigma_i u_i$을 가지고 진행해보죠.

 

SVD의 행렬 정의: $ A = U \Sigma V^T $

SVD의 전치 정의: 위 식을 전치하면, $ A^T = (U \Sigma V^T)^T = V\Sigma^TU^T $(괄호 안에 전치를 적용하면 행렬 순서가 싹 뒤집어집니다)

U와 V의 성질: U와 V는 정규직교 행렬(Orthonormal Matrix)입니다.

이는 U의 열벡터들끼리, V의 열벡터들끼리 각각 서로 직교하고 크기가 1이라는 의미입니다.

따라서 다음 관계가 성립합니다: $U^TU = I, \ V^TV = I $ ($I$는 단위행렬)
(여기서 $V^{-1} = V^T$관계도 나옵니다.)

 

자 지금 '입력', '출력'이라는 단어로 두 공간을 설정했었잖아요?

그리고 지금까지 입력에서 출력으로 가는 식을 구한건데.. 그럼 반대도 가능하지 않을까요?

 

출력에서 입력으로!

$ A^TU = V\Sigma^T $

따라서 위의 행렬식을 보면 $A$의 전치행렬에 '출력축'을 곱하면 $\sigma$배가 된 입력축이 나오지 않겠습니까?

 

벡터식으로 보면 바로 $ A^T u_i = \sigma_i v_i $가 나옵니다!

이건 바로 출력에서 입력으로 가는 관계를 나타낸 건데요

 

여기서 처음에 $ v_i^T v_j = 0, \ (Av_i)^T (Av_j) = 0 $ 이렇게 계산했던거 기억나시나요?

 

서로 직교인 두 축을 찾으려고 한 건데요, 이미 우리는 출력축도 직교임을 알고 있습니다.

[$(A^Tu_i)^T (A^Tu_j) = (\sigma_i v_i)^T (\sigma_j v_j) = \sigma_i \sigma_j (v_i^T v_j)$
$V$의 벡터들은 서로 직교하므로, i ≠ j일 때 $v_i^T v_j = 0$ 입니다.
따라서 $(A^Tu_i)^T (A^Tu_j) = 0$ 은 항상 참입니다.]

 

그렇다면 $ (A^Tu_i)^T (A^Tu_j) = 0 $일 것이고 식을 정리하면

$ u_i^T(AA^T)u_j = 0 $

이 나오겠죠!

 

이전에 쭉 진행했었던 논리로 똑같이 $ AA^T $를 풀어내면 결국 $ AA^T $의 고윳값 분해 결과가 됩니다.

여기서 $ AA^T $가 바로 m x m 크기를 가지는 대칭행렬이고, 출력축에서의 변환이 되는 겁니다!

참고로 $ AA^T $의 0이 아닌 고윳값은 $ A^TA $의 0이 아닌 고윳값과 같고, $ AA^T $의 고유벡터는 $u_i$가 됩니다.

 

그리고 둘 중 무엇을 골라도 바로 다른 하나를 계산으로 구할 수 있기 때문에, 우리는 보통 $A^TA$나 $AA^T$ 중 크기가 작은 정방행렬을 골라서 고유값 분해를 하게 됩니다. 왜냐면 고유값 분해 자체가 굉장히 로드가 큰 계산작업이므로, 가능하면 작은 행렬로 수행하는게 이득이기 때문이죠.

 

 

5) 최종정리

다시한번 정리하자면,

  1. 특이값 분해하고 싶은 행렬 A를 고릅니다.
  2. 1) $ A^TA $ 혹은 2) $ AA^T $중 더 크기가 작은 친구를 골라서 고유값 분해를 합니다.
    1번을 골랐다면 여기서 나오는 고유벡터는 V입니다.
    2번을 골랐다면 여기서 나오는 고유벡터는 U입니다.
  3. 두 경우 모두 고윳값은 루트씌워서 크기대로 대각선 나열하면 $\Sigma$죠.
  4. 반대편 축을 계산합니다.
    1번을 골랐다면 $ U = AV\Sigma^{-1} $로 $U$를 구해줍니다.
    2번을 골랐다면 $ V = A^T U (\Sigma^T)^{-1} $로 $V$를 구해줍니다.
    ($\Sigma$ 행렬에 전치가 붙는 이유는 $U$와 $V$ 행렬의 크기가 다르기 때문입니다.)
    (Reduced SVD에서는 $\Sigma$행렬이 정방대각행렬이므로 전치행렬대신 그냥 $\Sigma$로 써도 됩니다.)
  5. $ A = U \Sigma V^T $ 형태로 정리합니다.
  6. 특이값 분해 끝!

 

 

6) 마무리

이제 특이값 분해도 행렬식까지 완성하며 끝을 향해 도달했습니다.

하지만, 다음 포스팅이 하나 남았는데요

지금까지는 벡터식으로 쌓아왔다면, 이제 행렬식을 알기 때문에, 반대로 행렬식으로 특이값 분해를 유도해볼까 합니다.

그리고 전반적으로 행렬의 크기를 시각적으로 보여드리고, 여기서 Full SVD와 Reduced(혹은 Truncated) SVD도 한번 더 살펴볼까 합니다.

반응형
반응형

특잇값 분해(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$값 만큼 된다는 걸 알 수 있었습니다.

반응형
반응형

특잇값 분해(Singular value decomposition, SVD) - 직교 축 찾기

 

0) 서론

저번 포스팅에서 SVD의 최종 목적, 그리고 그 시작점을 알게 되었습니다.

그리고 마지막으로 변환 전 직교축을 무엇으로 해야할 지 의문 속에서 포스팅이 끝났죠! 오늘은 바로 여기서부터 시작해 볼까 합니다!

 

 

1) 변환 전 직교 축은 대체 무엇?

변환 전 직교축을 대체 무엇으로 할 것인가…

정말 막막하면서도 어려운 문제입니다.

 

그냥 단순하게 일단 ‘표준 기저'로 할까요?

그러나 이것도 뭔가 아닌 것 같습니다.

선형 변환하면 원래 직교인 것도 뒤틀린다면서요..

 

EVD에서 인사이트를 한번 얻어볼 수 있지 않을까요?

"행렬A의 '고유값 분해'로 얻은 벡터들이 사실상 행렬 A를 가장 잘 설명해 주는 '축'이 되는걸 보면, '고유값 분해'로 축을 만들면 되겠다"는 생각이 파박 들지 않습니까!?

 

그러나… 고유값분해는 정방행렬에서만 정의가 됩니다.

더불어 우리는 ‘변환 전 직교하는 축'을 찾고 있는데, 이전에 살펴봤다시피 EVD를 했을 때 직교하는 축을 가지려면 대칭행렬이어야만 하죠..

이야.. 이거 문제가 너무 산적해 있습니다..

 

 

2) 문제를 해결하려면 초심의 마음으로

자, 일단 문제가 너무 산적해 있으니 초심으로 돌아가 보죠.

 

  1. 일단 EVD는 선형 변환 전 벡터와 선형 변환 후 벡터가 같은 벡터를 찾으려고 했던 것이고,

  2. 이게 대칭행렬이면 벡터들이 직교하여, 결국 선형 변환 전 직교축과 선형변환 후 직교축이 같아지는 건데,

  3. 일반 행렬(비대칭 행렬)에서는 위의 상황과 다르게 '같은 직교 축'이 불가능 해서 축을 두개로 나누려고 한거잖아요?

  4. 그러면 선형 변환 전 축(이후 '입력축'이라고 쉽게 부르겠습니다)과 선형 변환 후 축(이후 '출력축'이라고 부르겠습니다)이 둘 다 직교해야 된다는 당연한 결론에 이르고,

  5. 우리는 ‘그럼 입력 직교축'은 뭐여야 하는데? 라는 상황에 놓인겁니다.

 

그런데 시점을 조금만 옮겨보면!

입력축이든 출력축이든 일단 ‘직교'해야 한다는 사실을 알 수 있죠!

다시말해, 지금 '직교축이 뭔데?'를 먼저 설정하는 것보다 우선해서 '일단 확실하게 밝혀진 조건을 먼저 풀자!' 작전입니다.

 

그렇다면 입력단에서의 축은 서로 직교하려면 $ v_i \cdot v_j =0$이어야 하고(i 벡터(i 축)와 j 벡터(j 축)를 내적하면 0)

변환(행렬) A에 대해서 출력단에서의 축은 서로 직교하려면 $(Av_i)\cdot (Av_j) = 0$이면 되겠다(A 변환을 시킨 i 벡터와 A 변환을 시킨 j 벡터를 내적하면 0)는 결론에 이릅니다.(직교하면 벡터끼리 내적해서 0이 된답니다! $ \cos 90^{\circ} = 0$이니까요!)

 

오 관점을 옮겨서 확실한 조건을 먼저 풀기 시작하니까 뭔가 서서히 해결되어 나가는 것 같은데요??

 

 

3) 직교축 찾기

내적은 위에서 설명했던 것처럼 $\cos$을 사용해서 정의하는 방법($|a||b|\cos \theta$) 말고도 각 성분의 곱의 합으로도 표현할 수 있습니다.($a_xb_x + a_yb_y$)

따라서 행렬 연산에 대해서 내적은 $ A^TB $(A와 B 행렬은 같은 크기의 벡터)로 표현할 수 있습니다.(행렬 곱은 같은 index를 가지는 요소끼리 곱해서 전체 합이 되죠)

 

따라서 위에서 찾은 $(Av_i)\cdot (Av_j) = 0$을 단순 곱으로 풀면

$(Av_i)^T(Av_j) = v_i^T(A^TA)v_j = 0$이 됩니다.(행렬 곱에 대해서 전체 전치 연산은 각 행렬을 전치 후 자리를 바꿔준 것과 같죠)

 

그리고 이 식을 다시 보면 $v_i$ 벡터와 $(A^TA)v_j$벡터가 직교하는 걸 찾으면 된다는 결론에 이르죠!

 

근데 사실 $(A^TA)v_j$ 이 벡터도 어찌됐든 $v_j$벡터를 $(A^TA)$로 선형 변환 했으므로, 기저 벡터(직교 벡터)인 $v_i$벡터를 성분으로 가질 수밖에 없습니다.

그럼 $(A^TA)v_j$ 벡터의 $v_i$성분이 계수 $c_i$를 가지겠네요!

$ (A^TA)v_j = \sum_k c_kv_k$

따라서 $(A^TA)v_j$ 벡터에서 $v_i$를 제외한 다른 모든 벡터($v_j$)는 $v_i$하고 직교라고 했으니까 $v_i$를 내적하면 $c_i$를 알 수 있겠군요?

$ (A^TA)v_j = c_1v_1 + \cdots + c_iv_i + \cdots + c_jv_j + \cdots + c_nv_n $

다시쓰면 $c_i = v_i^T(A^TA)v_j$라고 표현할 수 있겠습니다.

 

여기서 i랑 j가 다르면 초기식 $v_i^T(A^TA)v_j = 0$에 의해서 모든 값이 0이되고, 결국 i=j일 때의 $c_j$만 살아남겠죠?

수식으로 다시 써보자면 $c_j = v_j^T(A^TA)v_j$입니다.

즉, $c_j$만 살아남았고, 그 계수의 값은 $v_j^T(A^TA)v_j$입니다. 상수죠.

그리고 이 결과를 다시 풀어 써보면 다음과 같습니다.

\begin{align}
(A^TA)v_j &= 0v_1 + \cdots + c_jv_j + \cdots + 0v_n\\
(A^TA)v_j &= c_jv_j
\end{align}

 

여기서 $c_j$는 상수니까 그냥 $\lambda_j$라고 써보면

$ (A^TA)v_j = \lambda_j v_j $이 됩니다.

 

음.... 어디서 많이 본 식 모양 같은데...? 어 뭐야! 고윳값분해네!

 

 

4) 깨달음

이로써 우리는 알게 되었습니다.

행렬 A라는 변환(행렬곱)은 사실 m x n일때 n차원의 입력을 받아서 m차원의 출력을 하는 역할을 합니다.(실제 행렬곱을 하는 방식을 떠올려 보세요)

근데 $A^TA$ 즉 자기자신의 전치와 행렬 곱을 수행하면 n x n이 되니까 다시 생각해보면, 입력에서의 변환을 의미하는 것을 알 수 있죠!

더불어 자기자신과 전치행렬의 곱은 항상 대칭행렬이니까 여기서 고윳값분해를 하면 직교축을 얻을 수 있겠네요!

 

그렇다면... 입력 직교축을 이렇게 찾게 되었다면, 출력 직교축도 아주 쉽게 찾을 수 있지 않겠어요?

위의 과정을 그대로 $AA^T$ 즉, m x m으로 만든 행렬에 대해서 수행하면 바로 출력 직교축을 찾을 수 있지 않겠어요?

 

와 이로써 입력 직교축과 출력 직교축 자체를 찾았습니다!

 

 

5) 마무리

오늘은 특이값 분해에서 직교가 변하지 않는 '입력축'과 '출력축'을 어떻게 찾는지 살펴보았습니다.

다음 번에는 이를 바탕으로 이 입력축이 행렬 $A$에 의해 변환되었을 때 '어느 정도' 로 늘어나거나 줄어드는지, '어느 방향' 의 출력축이 되는지를 알아보는 시간을 가져보겠습니다!

반응형
반응형

특잇값 분해(Singular value decomposition, SVD) - 개념2

 

0) 서론

저번 포스팅까지 해서 '도대체 왜 특잇값 분해라는 개념이 생겼나'에 대해서 살펴보았습니다.

정확히는 고윳값 분해(EVD)에서 조금 더 확장(n개의 축은 직교하니?)을 하고 싶었으나, 그 확장하고 싶은 개념이 EVD로 해결이 안되니까 이리저리 궁리를 시작한 그 시발점이죠!

저번 포스팅에서 '특잇값 분해가 태동'! 이라고 말했으나, 사실 '개념적 태동'이 여기서 시작된 거지, 아직 특잇값 분해의 개념에 가까이 가려면 아주 조금 더 나아가야 합니다.

그래서 마련한 '개념2'!

 

 

1) 비대칭 행렬에서는 왜 안되지...?

저번 포스팅에서 대칭 행렬에서는 EVD로 직교하는 축들을 찾을 수 있는데, 비대칭 행렬에서는 EVD로 직교하는 축들을 찾을 수가 없었다고 했습니다.

그 이유는 EVD는 행렬 자체의 본질적인 축들을 찾아주는 거라, 대칭 행렬에서는 본질적인 축들이 무조건 직교하지만, 비대칭 행렬에서는 본질적인 축들이 직교하지 않기 때문이죠.

그런데 비대칭 행렬에서는 왜 '본질적인 축들이 직교하지 않는지' 생각해 보신 적 있으신가요?

 

행렬에 의한 선형 변환에서는 가장 크게 나누어서 '확대/축소(scaling)'와 '회전(rotation)'의 두 가지 변환이 있습니다.

 

여기서 대칭 행렬은 본질적인 축은 직교한 채로 '확대/축소'의 성질만 가지고 있는 행렬이라 EVD시에 나오는 각 축(벡터)이 그대로 직교하게 되죠.

스펙트럼 정리(Spectral Theorem)라고 하는데, "스케일링 성질만 가진 행렬(즉, 대칭 행렬)은, 그 본질적인 축으로 이루어진 '직교하는 세트(Basis)'를 반드시 찾을 수 있다."는 정리죠.

 

그러나 비대칭 행렬은 '회전'의 성질까지 가지고 있어, 무조건 EVD시에 각 축(벡터)이 직교가 깨지게 됩니다.

쉽게 말해 좌표 축이 비틀리게 되는 거죠.(스케일링과 회전을 동시에 가하기때문에 어떤 특정한 방향으로 분포가 밀리게(shearing)됩니다.)

그리고 비틀린 좌표축은.. 당연히 직교가 깨지게 되겠죠.

 

따라서 EVD만으로는 절대로 비대칭 행렬에서의 직교 축들을 찾을 수 없습니다.

계속해서 '본질적인 축들'만을 찾으려고 하니까요.

 

그러면 개념을 바꿔야 합니다.

행렬 $A$가 어떤 선형 변환을 일으킨다고 했을 때, 선형 변환 후에 직교인 축(벡터)들을 찾고 싶다면, 그에 해당하는 선형 변환 전에도 직교인 축(벡터)들을 '같이' 찾아야 한다는 것이죠.

 

즉, 다시말해

특잇값 분해는 "'선형 변환 직교하는 축'을 찾는 것"이며, 이를 위해서는 '변환 직교하는 축'을 반드시 함께 찾아야 한다.

로 귀결됩니다!

 

 

2) 변환 전 직교 축은 대체 무엇?

일단 우리는 여기서 임의의 행렬 $A$로 변환한 후에도 직교인 축을 찾고 싶습니다. 그리고 이걸 찾으려면 변환 전에도 직교인 축을 찾아줘야한다는 것을 알았습니다.

그런데, 여기서 문제가 발생합니다.

변환 전에 직교 축을 대체 무엇으로 설정할 것인지?

에 대한 아주 큰 문제가 발생하죠.

 

 

3) 마무리

자, 여기서 오늘의 포스팅은 끊습니다!

왜냐구요? 바로 다음 장부터 아주 중요한, 말그대로 SVD의 핵심 내용이 시작되니까요!

'개념'파트로써는 여기서 마무리입니다.

 

뭔가 이제 막 이해가 된 것 같아서 두근두근 하지 않나요?

이제 진짜 왜 SVD가 필요한지 알 것 같지 않나요?

반응형
반응형

특잇값 분해(Singular value decomposition, SVD) - 개념

 

0) 서론

오늘은 특잇값 분해(SVD)에 대해서 포스팅을 해보려고 합니다.

보통은 '특이값 분해'라고 쓰는 경우도 많은데, 공식 명칭(이랄까.. 맞춤법 규정상?)은 사이시옷이 들어간 형태라고 하네요!

특잇값 분해는 고윳값 분해에서 한발 더 나아간 내용이므로, 먼저 고윳값 분해 관련 포스팅(피보나치 수열을 선형대수로 풀어보자)을 보고 오시면 좋을 것 같습니다.

위의 포스팅은 독립된 고윳값 분해에 관련된 포스팅은 아니지만, 피보나치 수열을 선형대수로 풀어보기 위해 꼭 거쳐야 하는 고윳값 분해에 대해서 설명하고 있어 개념 이해도 쉬울 뿐더러 '피보나치 수열'이라는 직접적인 예시도 들고 있어, 링크에서 바로 이동하는 '고윳값 분해'파트만 보셔도 좋고, 아예 포스팅 전체를 보셔도 좋을 것 같습니다!

어찌되었든, 특잇값 분해에 대해서 한번 알아볼까요?

 

 

1) 고유값 분해를 기억하시나요?

$ Av=\lambda v $로 정의되었는데요

여기서 '행렬곱'이란 특정 공간에서의 '선형변환'을 의미한다고 본다면 이 식은

 

벡터 $v$를 행렬 $A$로 변환($Av$)한 결과가 원래 벡터 $v$의 방향은 그대로 둔 채 크기만 λ배 한 것과 같은 벡터 $v$가 있니?

 

라고 물어보는 식이 됩니다.

그리고 "네 있어요!"하면서 벡터 $v$를 찾으면 등호 관계에 따라 $\lambda$도 결정되게 되죠.

우리는 이 과정에서 결정된 벡터 $v$를 '고유벡터' 그리고 스칼라 값인 $\lambda$를 '고유값'이라고 부릅니다.

 

다시 말해 이 고윳값 분해(EVD)의 가장 큰 목적은 바로

행렬의 변환을 거쳐도 변하지 않는 벡터(고유벡터(아이겐 벡터;아이젠 벡터;eigen vector))를 찾기

였습니다.

그리고 이 벡터에 상수배만큼 곱해주는 부분이 고윳값(eigen value)이었구요.

그리고 이것을 약간 다르게 표현해 보자면

행렬 $A$가 가하는 변환의 '본질적인 축'(characteristic axes)을 찾는 것

이라고 볼 수 있습니다.

그리고 n x n 행렬에서는 무조건 축이 n개가 나오죠.

 

 

2) 기하학적으로 다시 설명해볼까요?

행렬 A를 하나의 '공간 변환기'라고 상상해 봅시다. 이 변환기는 벡터들을 입력받아 새로운 위치로 이동시키는 역할을 합니다.

예를 들어, 2차원 평면의 모든 점(벡터)들을 어딘가로 옮기는 것이죠.

 

이 변환이 시작되면, 대부분의 벡터들은 원래와 다른 방향으로 휙 돌아가 버립니다.

그런데 이 혼란스러운 움직임 속에서도, 마치 폭풍의 눈처럼 고요하게 자신의 방향을 유지하는 특별한 벡터들(v)이 존재할 수 있습니다.

 

이 벡터들은 변환 A를 거치더라도 방향이 바뀌지 않고, 단지 그 자리에서 늘어나거나(λ>1), 줄어들거나(0<λ<1), 혹은 방향이 반대로 뒤집힐(λ<0) 뿐입니다.

 

바로 이 변환의 '숨겨진 축'과도 같은 특별한 벡터를 고유벡터(v)라고 부르고, 그 축 방향으로의 '변화율' 혹은 '힘의 크기'를 고윳값(λ)이라고 부릅니다.

 

결국 고유값 분해란, 어떤 복잡한 선형 변환(A)의 가장 본질적인 '축'과 '힘'을 찾아내는 과정이라고 할 수 있습니다.

 

자, 이렇게 고윳값 분해는 "A로 변환해도 자기 자신과 평행한 방향(v)이 존재하는가?"에 대한 질문이 그 시작이었습니다.

 

 

3) 특이값 분해?

자, 여기서 사람들이 생각합니다.

음? 그러면 행렬 $A$로 변환해도 방향이 동일한 벡터도 찾을 수 있으면, 행렬 $A$로 변환해도 동일하게 '직교'하는 축들도 찾을 수 있는거 아냐?

 

직교성(Orthogonality)에 관련된 건 직교성 관련 포스팅(푸리에 급수에서 나온 파트기는 하지만..)을 한번 보고 오시면 바로 이해가 되실 겁니다.(물론 가신 김에 푸리에 파트를 전부 보고 오셔도 참 좋습니다)

간단하게 말해서 서로 수직으로 만나는가(좀 더 어렵게 말해서 공간상 Mutually Exclusive, 상호 배타적인가)를 말하는 겁니다.

(추가적으로 직교기저(Orthogonal basis)라는 용어는 컨설팅 용어인 MECE(Mutually Exclusive Collectively Exhaustive)랑 정확하게 매치된답니다!(직교는 위에서 말했다 시피 ME, 기저는 각 축의 최소단위로 기저들을 조합하면 CE가 되죠!) 재미있지 않나요?)

 

그리고 다시 말해보자면,

고윳값 분해를 해서 '직교축'도 찾을 수 있나?

가 되겠죠?

 

그러나 위에서 우리가 살펴보았듯이, 고윳값 분해는 애초에 '행렬 $A$'에 내재되어 있는 '본질적인 축'을 찾아내는 겁니다.

따라서, 대칭 행렬(Symmetric matrix)에서는 이 '본질적인 축'이 직교하기 때문에 고윳값 분해 만으로도 직교축을 찾을 수 있습니다.

하지만 안타깝게도 비대칭 행렬(Asymmetric matrix)에서는 EVD만으로는 직교축을 찾을 수가 없었지요..

 

그래서 사람들은

현재 '직교축'을 나타내는 벡터를 어떤 행렬로 선형변환 하더라도 그 결과가 계속해서 '직교축'을 나타내 주는 벡터(와 그 값)를 찾고 싶어졌습니다.

그리고 여기서 태동한 것이 바로 '특잇값 분해(SVD)'랍니다!

(자세히 보면, '행렬의 본질적인 축' 만으로는 행렬 변환 이후의 '직교성'을 정의할 수가 없습니다. 그래서 여기서 우리는 '현재 직교축'을 나타내는 벡터를 추가해서 '행렬 변환 후에도 직교인 축'을 찾아내려고 하는 겁니다.)

 

 

4) 마무리

무조건 첫 포스팅은 '짧게' 가려고 노력하고 있습니다.

애초에 요 근래에 다루는 내용들이 포스팅 단 하나만으로는 절대로 다룰 수 없는 내용들이기도 하구요!

오늘은 이 특잇값 분해가 왜 발생했는지, 그리고 본질적으로 무엇인지 개념을 살펴보았습니다!

반응형

+ Recent posts