반응형

리만 가설(Riemann Hypothesis) 쉽게 이해하기2: 진짜 쉽게 이해하기

 

0) 서론

저번 시간에는 오일러 제타 함수와 오일러의 곱 공식 그리고 소수와의 접점을 살펴보았습니다.

이번에는 본격적으로 리만의 사고 과정으로 뛰어들어 볼까요?

 

 

1) 재앙의 소수

리만 이전의 수학계에서 소수(Prime Numbers)는 기존의 해석학적 방법론으로 접근하기 어려운 재앙과도 같은 대상이었습니다.

미분? 적분? 소수 앞에서는 아무 소용이 없었습니다.

미분과 적분을 포함한 해석학은 '연속성'을 전제로 하지만, 소수는 불연속적인 자연수 안에서도 '곱셈적 성질'을 띠는 이산적인 대상이었기 때문입니다.

 

이러한 난제 속에서 카를 프리드리히 가우스(Carl Friedrich Gauss)가 중요한 통찰을 제시합니다.

1792년경, 당시 15세였던 가우스는 소수표를 귀납적으로 분석하여 소수의 분포에 통계적인 경향성이 있음을 발견했습니다.

그는 $x$보다 작은 소수의 개수를 나타내는 함수 $\pi(x)$가 $x$가 증가함에 따라 로그 함수 $\frac{x}{\ln x}$에 점근적으로 수렴한다고 추측했습니다.

이를 수식으로 표현하면 다음과 같습니다.

$$\pi(x) \sim \frac{x}{\ln x}$$

가우스는 이후 이를 보정하여 로그 적분 함수($\text{Li}(x)$)가 더 정확한 근사값임을 제시하였으나, 이는 어디까지나 경험적 데이터에 기반한 '추측'이었을 뿐, 수학적으로 엄밀하게 증명된 '정리(Theorem)'는 아니었습니다.

그리고 여기서 이 가설을 수학적으로 증명하기 위해 해석학적 도구를 본격적으로 도입한 인물이 바로 가우스의 제자, 베른하르트 리만입니다.

 

 

2) 오일러 곱 공식을 보고 '가능!'을 외친 리만

당시 리만이 주목한 것은 선배 수학자 오일러가 남긴 오일러 곱 공식이었습니다. 이것은 소수 연구에 있어서 유일한 예외이자, 희망이었습니다.

$$\sum_{n=1}^{\infty} \frac{1}{n^s} = \prod_{p} \left( \frac{1}{1 - p^{-s}} \right)$$

리만은 이 식의 좌변과 우변이 가지는 본질적인 차이에 주목했습니다.

  • 좌변(무한급수): 자연수의 덧셈으로 이루어진, 미분과 적분이 가능한 '해석학(질서)의 세계'
  • 우변(무한곱): 소수의 곱셈으로만 이루어진, 불규칙하고 다루기 힘든 '정수론(혼돈)의 세계'

리만이 천재라고 불리는 이유는, 이 등식을 단순한 계산 결과로 보지 않고 서로 다른 두 세계를 잇는 통로로 인식했기 때문입니다. 그의 통찰을 글로 옮기면 다음과 같았을 것입니다.


"이것은 그냥 신기한 등식이 아니다. 수학 전체를 통틀어 질서의 세계와 혼돈의 세계를 연결하는 유일한 다리(bridge)다. 소수의 비밀을 파헤치려면, 우리는 반드시 이 다리를 건너야만 한다. 다른 길은 존재하지 않는다. 나라면 할수있다 나라면! 가능!!!!"


리만에게 제타 함수는 단순한 호기심의 대상이 아니었습니다. 소수라는 견고한 성을 무너뜨리기 위해 반드시 넘어야 할, 유일하고도 필연적인 공성 무기였던 셈입니다.

 

 

3) 리만, 오일러 제타 함수를 갈고 닦는다!

이 식의 본질을 깨달은 리만.

결국 우변의 '소수의 비밀'을 완벽히 파헤치기 위해선 좌변을 '완벽하게 분석'해야 함을 알게됩니다.

그리고 '완벽하게 분석'한다는 말인즉슨 현재 s>1인 상황에서만 정의된 오일러 제타함수가 아닌, s가 '모든 수'를 다 아우를 수 있는 '복소수'영역으로 확장되어야 한다는 말인 것이죠.

 

그리고 사실상 s>1인 영역은 그저 '실수'에서 '복소수'로 확장만 시켜주면 되니 매우 쉬웠습니다.

그러나 여기서 문제는 '복소수 전체 영역'으로 확장해야 한다는 점에 있었습니다.

 

현재 오일러 제타 함수에서는 s가 1보다 작거나 같은 경우 '무조건 발산'하여 아예 그쪽은 쳐다도 보지 않고 있었습니다.

그러나 리만은 이것을 넘어 '복소수 전체'로 확장해야 하는 필요성이 있었죠.

 

결국 리만은 s>1에서만 정의되는 오일러 제타 함수해석적 연속(혹은 해석적 확장, Analytic continuation)이라는 방법을 통해 s=1을 제외한(s=1에서는 발산) 복소수 전체로 확장시키고 리만 제타 함수라고 이름을 붙입니다.

 

해석적 연속(Analytic continuation)이란 "함수를 연속이면서 미분가능하게 확장시키는 것"으로 수학자들이 자주사용하는 테크닉입니다.(자연수에서만 정의된 팩토리얼도 감마함수라는 형태로 확장이 가능하죠.)

그리고 이 방법을 사용하면 유일한 형태의 확장된 함수를 얻을 수 있습니다.

 

일단, 해석적 연속의 기본 예시와 함께 리만이 어떻게 해석적 연속을 사용해서 오일러 제타 함수를 리만 제타 함수로 확장시켰는지 살펴보겠습니다.

 

1. 해석적 확장의 기본 예시 (등비급수)

가장 직관적인 예시는 무한 등비급수입니다. 하나의 함수가 정의된 영역에 따라 어떻게 확장되는지 보여줍니다.

$$\sum_{n=0}^{\infty} x^n = 1 + x + x^2 + \cdots = \frac{1}{1-x}$$

  • 좌변 (급수 형태): 오직 $|x| < 1$ (단위 원 내부)인 범위에서만 수렴하고 정의됩니다.
  • 우변 (분수 함수 형태): $x = 1$을 제외한 모든 복소 평면($\mathbb{C} \setminus \{1\}$)에서 정의됩니다.(여기서 역슬래시 표현은 '집합에서 제외한다'는 표현입니다)
  • 의미: $\frac{1}{1-x}$는 좁은 영역($|x|<1$)에서 정의된 급수를 더 넓은 영역으로 해석적으로 확장(Analytic Continuation)한 결과입니다.

바로 이것이 해석적 연속이죠.

 

리만도 똑같은 짓을 했습니다. $s>1$에서만 놀던 오일러의 식을 복소수 전체로 확장했더니, 전혀 새로운 모습의 식이 튀어나온 겁니다. 마치 $1+x+x^2...$가 $\frac{1}{1-x}$로 변신한 것처럼요.

그 결과물이 바로 아래의 무시무시해 보이는 함수 방정식입니다. (식은 복잡해 보이지만, 그냥 '확장된 버전'이라고 생각하고 넘어가세요!)

 

2. 리만 제타 함수의 함수 방정식 (Functional Equation)

리만은 해석적 확장을 통해 제타 함수를 $s=1$을 제외한 전 복소 평면으로 확장시켰고, 다음의 함수 방정식을 유도해냈습니다.

이 식은 $\zeta(s)$와 $\zeta(1-s)$ 사이의 관계를 보여줍니다.

$$\zeta(s) = 2^s \pi^{s-1} \sin\left(\frac{\pi s}{2}\right) \Gamma(1-s) \zeta(1-s)$$

  • 구성 요소:
  • $2^s, \pi^{s-1}$: 지수 및 파이 항
  • $\sin\left(\frac{\pi s}{2}\right)$: 삼각함수 항 (이 항 때문에 음의 짝수에서 자명한 근이 발생함)
  • $\Gamma(1-s)$: 감마 함수 (팩토리얼의 일반화)
  • $\zeta(1-s)$: 대칭되는 위치의 제타 함수 값
  • 대칭성 (Symmetry):
  • 이 방정식에 의해 제타 함수는 $s$와 $1-s$가 서로 연결됩니다. 이는 복소 평면 상에서 실수부 $Re(s) = \frac{1}{2}$인 직선(Critical Line)을 축으로 하여 대칭적인 구조를 가짐을 의미합니다.

 

 

4) 리만가설 용어 해설

자, 여기까지 약간 조금 깊게 살펴본 것 같으면, 다시 이제 '쉽게 알아보기' 수준으로 다시 올라오도록 하죠.

사실상 원래 이 포스팅의 집필의도가 '엄밀한 수학적 탐구' 보다는 먼저 '리만 가설이 뭔데?'를 쉽게 설명하기 위한 글이었으니까요!

따라서 더 깊게 들어가지는 않고, 이제 여기서 나오는 용어들만 해설하고 마무리 짓도록 하죠.

 

앞서 보여드린 그 복잡한 식에 $\sin$ 항($\sin(\frac{\pi s}{2})$)이 있었던 거 기억하시나요?

이 $\sin$ 항의 $s$에 음의 짝수($-2, -4, -6, \dots$)를 넣으면, 사인 함수 특성상 무조건 0이 되어버립니다.

곱셈식에서는 어느 한 놈만 0이 되어도 전체 결과가 0이 되죠? ($A \times B \times 0 = 0$ 이니까요!)

즉, 이 근들은 별다른 노력 없이도 식의 구조만 보면 "어? 여기 0 되네?" 하고 바로 찾아낼 수 있습니다.

수학자들은 이렇게 너무 뻔하고 싱겁게 구해지는 근들을 자명한 근(Trivial Zeros)이라고 부릅니다. "야, 이건 볼 것도 없어. 패스해." 하고 치워버리는 거죠.

 

그렇다면 비자명한 근(Non-trivial Zeros)이란?

바로 저 뻔한 곳(음의 짝수)이 아닌데도 불구하고, 기묘하게 함수값을 0으로 만드는 근들을 말합니다.

리만은 이 근들이야말로 소수의 비밀 정보를 담고 있는 진짜 보물이라고 생각했습니다.

 

그리고 바로 여기서 우리가 포스팅을 처음 시작하면서 쓴

"리만 제타 함수 $\zeta(s)$의 모든 비자명근(non-trivial zeros)은 실수부가 $\frac{1}{2}$인 직선 위에 있다."

이 말을 이해할 수 있게 됩니다!

 

즉, "소수의 비밀은 아무 데나 흩어져 있는, 무작위적인 게 아니라, 정확히 $\frac{1}{2}$ 라인에 일렬로 정렬해 있는 규칙이 있다"는 뜻이 됩니다!

 

 

5) 그래서 왜 리만가설이요?

재밌는 포인트는... 실제로 리만은 이 비자명근을 네 개까지만 구했습니다.

그리고 "내가 네 개 정도 구해봤는데, 다 실수부가 1/2이던데? 그러니까 앞으로 나오는 모든 근도 다 실수부가 1/2일껄?"하고 넘어갔다는 부분이죠.

이 쿨한(?) 추측이 바로 수학 역사상 가장 거대한 난제, "리만 가설"의 시작이었습니다.

 

현재 우리는 슈퍼컴퓨터를 돌려서 10조(10 trillion) 개가 넘는 비자명근을 찾아냈습니다.

결과는 어땠을까요? 놀랍게도 10조 개 모두 정확히 $\frac{1}{2}$ 직선 위에 있었습니다. 단 하나의 예외도 없이 말이죠.

또한, 앞서 살펴본 함수 방정식을 통해 근들이 대칭적($\frac{1}{2}$을 기준으로 좌우 대칭)이라는 사실도 이미 증명되었습니다.

"그럼 끝난 거 아니야?"라고 하실 수 있으시겠지만, 아닙니다.

수학에서는 10조 개가 맞아도, 무한대까지 가는 길 어딘가에 숨어 있는 단 하나의 반례(예외)만 있어도 가설은 즉시 거짓이 되어 폐기처분됩니다.

리만 가설은 아직 그 '단 하나'의 예외가 없다는 것을 수학적으로 완벽히 증명하지 못했기에, 여전히 '가설(Hypothesis)'이라는 꼬리표를 달고 있는 것입니다.

 

그리고 현대 정수론과 암호학의 수많은 정리들이 "리만 가설이 참이라면..."이라는 전제하에 지어져 있습니다.

만약 이 가설이 거짓으로 판명 난다면? 수학계는 그야말로 대혼란(Crisis)에 빠지게 될 겁니다. 수많은 논문이 휴지 조각이 될 테니까요.

 

 

6) 소수랑은 무슨 상관?

자, 이제 '리만 가설' 자체는 알아보았는데, '도대체 이 리만 제타함수의 비자명한 근이 소수랑 무슨 연관인데?'에 관해서 궁금하지 않으세요?

 

앞서 가우스가 소수의 분포를 예측하며 로그 적분 함수($\text{Li}(x)$)를 제안했다고 했었죠?

가우스의 예측은 전체적인 경향성(Trend)을 아주 잘 맞춥니다.

하지만 실제 소수는 이 매끄러운 함수를 따라 얌전하게 움직이지 않습니다.

함수는 '연속적'이지만, 소수는 '이산적'인 존재니까요.

 

바로 이 지점에서 리만 제타 함수가 등장합니다.

리만은 제타 함수의 비자명한 근($\frac{1}{2}+14.13i \dots$)들이 단순한 숫자가 아니라, 가우스의 예측값과 실제 소수 사이의 간극을 메워주는 '오차 보정항(Correction Term)' 역할을 한다는 것을 밝혀냈습니다.

이것을 우리가 아는 푸리에 변환의 관점에서 보면 소름 돋는 일이 벌어집니다.

제타 함수의 근들을 파동(Wave)으로 바꿔서(푸리에 역변환) 하나씩 더해나가면(중첩시키면), 처음에는 밋밋했던 곡선이 점점 구불구불해지더니...

파동을 10개, 100개, 1000개 더해갈수록 그 구불거림이 점점 날카로워집니다.

 

그러다 마침내, 정확히 소수가 존재하는 위치($2, 3, 5, 7 \dots$)에서만 그래프가 직각으로 꺾이며 '계단' 모양을 만들어냅니다.(누적 그래프처럼 말이죠!)

 

 

-더 나아가기

리만의 명시적 공식(Riemann's Explicit Formula)이라는 것이 있습니다.

더보기

개념만 살짝 주워담아 보자면,

 

1. "곱하기"를 "더하기"로 찢어발기기 (로그의 마법)

오일러의 곱 공식을 다시 봅시다.

$$\zeta(s) = \prod_{p} \frac{1}{1 - p^{-s}}$$

우변은 소수들의 곱(Product)입니다. 수학에서 곱셈 덩어리는 다루기가 까다롭습니다. 미분을 하기도 힘들고, 분석하기도 어렵죠.

그래서 리만은 양변에 자연로그($\ln$)를 취해버립니다. 로그의 성질($\ln(ab) = \ln a + \ln b$) 덕분에 곱셈이 덧셈으로 바뀝니다.

$$\ln \zeta(s) = \sum \text{(소수와 관련된 항들)}$$

이제 우변은 '소수들의 합' 형태가 되었습니다.

즉, 제타 함수($\zeta$)의 정보 = 소수($p$)들의 정보의 합이라는 등식이 성립합니다.

 

2. 소수의 개수를 '파동'으로 표현하다 (명시적 공식)

리만은 여기서 멈추지 않고, 복소해석학의 도구(유수 정리, 푸리에 역변환 등)를 총동원하여 역사적인 수식을 만들어냅니다.

이것이 바로 "소수의 개수 $\pi(x)$를 제타 함수의 해(Zero, 0이 되는 값)들로 표현하는 공식"입니다.

직관적으로 표현하면 다음과 같습니다.

$$\pi(x) \approx \underbrace{\text{Li}(x)}_{\text{가우스의 예측값}} - \underbrace{\sum_{\rho} \text{Li}(x^{\rho})}_{\text{제타 함수의 0점들에 의한 오차}}$$

  • $\pi(x)$: 실제 소수의 개수 (우리가 알고 싶은 것)
  • $\text{Li}(x)$: 가우스가 예측한 매끄러운 곡선 (평균)
  • $\sum \text{Li}(x^{\rho})$: 제타 함수가 0이 되는 지점($\rho$)들이 만들어내는 파동(오차)

이 식의 의미:

"실제 소수의 분포($\pi(x)$)는 가우스의 예측값에서, 제타 함수의 0점($\rho$)들이 만들어내는 파동들을 빼주면 정확하게 일치한다."

즉, 제타 함수의 0점(Zero)의 위치를 안다는 것은, 소수 분포 그래프가 평균에서 얼마나 출렁거리는지 그 '오차의 파동'을 완벽하게 안다는 뜻이 됩니다. 그러니 필연적으로 소수의 위치가 드러날 수밖에 없는 것이죠.

 

 

7) 마무리

자, 이렇게 리만가설을 쉽게 이해해 보았습니다.

이 포스팅은 "리만 가설이 뭔데?"에 초점을 맞춘 것이라 은근히 매우 간단하게 서술되었지만, 실제로 이 가설은 '소수의 근본'을 찾는 과정이라 파려고 들면 진짜 복잡하게 팔 수 있는 부분입니다.

나중에 조금 더 여력이 되면, 조금 더 파보도록 하겠습니다.

반응형
반응형

리만 가설(Riemann Hypothesis) 쉽게 이해하기1: 오일러 또또 당신이에요?

 

0) 서론

오늘은 리만가설을 한번 살펴보고자 합니다.

 

"리만 가설이 뭐지?"라고 한다면 무조건 나와야 하는 친구가 '소수'입니다. 1과 자기 자신으로만 나눠떨어지는 수죠.

근데 이 소수의 분포는 언뜻보기에 매우 불규칙하게 등장합니다.

 

그러나 인간은 '패턴화'를 좋아하는 동물.

이 불규칙을 규칙적으로 만들어 줄 수 있는 '법칙'이 없을까 엄청 고민하게 되는데요

바로 이 지점에서 탄생한 것이 바로 "리만 가설"입니다.

 

리만 가설을 한 마디로 써 보자면 다음과 같습니다.

"리만 제타 함수 $\zeta(s)$의 모든 비자명근(non-trivial zeros)은 실수부가 $\frac{1}{2}$인 직선 위에 있다."

 

뭔가 되게 어렵죠...? 그래서 이것을 좀 더 쉽게 풀어 써보면 그냥 '소수들이 얼마나 규칙적으로 분포하는가'입니다.(진짜로요!)

 

첫 시작부터 결론까지 다 내버리고 뭐하는거냐구요?

사실상, 이게 뭔지는 알아야 이후에 하는 모든 설명들이 재미있어지거든요!

 

근데 리만 가설을 들어가기 전 무조건 거쳐가야하는 사람이 있습니다.

바로바로 그 유명한 또또 오일러씨죠

 

 

1) 오일러 제타 함수(Euler Zeta Function)

오일러가 처음 명성을 떨치게 된 문제는 바로 "바젤 문제"라고 불리는 문제였습니다.

$$ \sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{1}{1^2} + \frac{1}{2^2} + \frac{1}{3^2} + \cdots = \frac{\pi^2}{6} $$

바로 이것인데요, 비록 오일러가 증명한 방법은 아니지만 이 식의 증명 과정이 궁금하시다면 위의 바젤 문제 링크를 클릭해서 한번 살펴보시는 것도 좋습니다.

 

근데 진짜 학자들은 뭘 하나 발견해도 거기서 만족을 하지 못하는 것 같습니다.

오일러는 바로 이것을 증명해 내고는,

"잠깐.. 지수가 2인 상황으로 볼 수 있지 않나? 그럼 지수를 $s$라고 놓고, 이 $s$가 1보다 큰 실수일 때는 어떻게 움직이지?"

(참고로 $s$가 1이면 이 급수는 발산합니다)

를 궁금해 하죠

 

수식으로 다시 써보자면,

$$ \zeta(s) = \sum_{n=1}^{\infty} \frac{1}{n^s} = 1 + \frac{1}{2^s} + \frac{1}{3^s} + \frac{1}{4^s} + \cdots \qquad (s>1) $$

이렇게 정리할 수 있습니다.

오일러는 순수하게 $s$가 커지면 이 급수가 어떤식으로 움직이는지(어떤 값들을 가지는지)가 궁금했던거죠.

그리고 이 급수를 함수로 정의하고는 "오일러 제타 함수"라고 이름을 붙여줍니다.

 

 

2) 오일러는 아직도 만족 못 함: 오일러의 곱 공식(Euler Product Formula)

근데 이렇게 만들어 놓기만 했다면 천하의 오일러가 아니겠죠?

이 식을 이리저리 변형해보기 시작합니다.

 

그 중 소수를 판별하는 방법 중에 '에라토스테네스의 체'라는 방법이 있습니다.

간단하게 설명하자면, 1 이상의 자연수에서 자기 자신을 남겨두고 자신으로 나눠 떨어지는 모든 수를 제거하는 방법입니다.

  1. 2를 처음 만나면 2를 남기고 나머지 2의 배수를 모두 지웁니다.
  2. 이후 3을 처음 만났으므로 3을 남기고 나머지 3의 배수를 모두 지웁니다.
  3. 그 다음에 만나는 4는 앞서 2의 배수를 모두 지울 때 지워졌으므로 넘어갑니다.
  4. 이후 5는 처음 만났으므로 5를 남기고 나머지 5의 배수를 모두 지웁니다.
  5. ...

이렇게 하면, 소수의 정의(1과 자기 자신만으로 나눠 떨어지는 수)를 만족하는 수 만을 '체'처럼 거를 수 있다는 개념입니다!

물론 이걸 알고리즘으로 만들면 속도는 무진장 느려서(게다가 무한대로 지울 수도 없는 노릇이고..) 알고리즘적으로는 쓰지는 않지만, 그래도 굉장히 중요한 개념이죠!

 

갑자기 이걸 왜 설명했냐구요?

우리 대단하신 오일러 선생님께서 이 오일러 제타 함수에 이 개념을 가지고 변형을 하셨거든요...

 

자, 그럼 이 변형을 따라가 볼까요?

 

[Step 1] 양변에 $\frac{1}{2^s}$를 곱합니다.

$$\frac{1}{2^s}\zeta(s) = \frac{1}{2^s} + \frac{1}{4^s} + \frac{1}{6^s} + \frac{1}{8^s} + \cdots$$

이렇게 곱하면 밑이 '짝수'인 친구들만 식에 나타나겠죠?

 

[Step 2] 원래 식에서 위 식을 뺍니다.

$$\left(1 - \frac{1}{2^s}\right)\zeta(s) = 1 + \frac{1}{3^s} + \frac{1}{5^s} + \frac{1}{7^s} + \cdots$$

이렇게 빼버리면 밑이 '짝수' 즉, 2의 배수인 모든 항이 깔끔하게 싹 다 사라져 버린답니다.

 

[Step 3] 남은 식에 다음 소수인 $\frac{1}{3^s}$를 곱하여 다시 뺍니다.

$$\left(1 - \frac{1}{3^s}\right)\left(1 - \frac{1}{2^s}\right)\zeta(s) = 1 + \frac{1}{5^s} + \frac{1}{7^s} + \cdots$$

자, 이제 대충 감이 오시나요? 이런식으로 '에라토스테네스의 체'처럼 '밑'이 배수인 항들을 싹싹 소거시켜 나가는 겁니다.

 

[Step 4] 이 과정을 모든 소수 $p$에 대해 반복하면 우변에는 1만 남게 됩니다.

$$\cdots \left(1 - \frac{1}{p^s}\right) \cdots \left(1 - \frac{1}{3^s}\right)\left(1 - \frac{1}{2^s}\right)\zeta(s) = 1$$

 

[Step 5] 이를 정리하면 오일러의 곱 공식이 탄생합니다.

\begin{align}
\prod_{p} \left(1 - \frac{1}{p^s}\right)\zeta(s) &= 1 \\
\prod_{p} \left(\frac{p^s-1}{p^s}\right)\zeta(s) &= 1 \\
\zeta(s) &= \prod_{p} \left(\frac{p^s}{p^s-1}\right) \\
\zeta(s) &= \prod_{p} \left(\frac{1}{1-\frac{1}{p^s}}\right) \\
\zeta(s) &= \prod_{p} \left( \frac{1}{1 - p^{-s}} \right)
\end{align}

여기서 $\prod$기호는 $\sum$과 완전히 같습니다. $\sum$이 '모두 더하라~'였으면, $\prod$는 '모두 곱하라~'죠.

 

자, 이렇게 길다면 길고 짧다면 짧은 과정을 거쳐서 곱 공식을 만들었는데... 오일러 선생님은 아직도 목이 마르신가봅니다.

이걸 한번 더 정리하는데, 따라가 볼까요?

 

 

3) 여기서 갑자기 등비급수가 나타났다

오일러 곱 공식의 우변(소수 부분)에 있는 각 항은 $\frac{1}{1 - p^{-s}}$ 형태입니다.

이 식은 수학에서 무한 등비급수의 합 공식 $S = \frac{a}{1-r}$의 구조와 정확히 일치합니다.

  • 첫째 항($a$) = 1
  • 공비($r$) = $p^{-s}$ ($=\frac{1}{p^s}$)

따라서, 이 분수 식을 다시 급수(더하기) 형태로 풀어서 쓰면 다음과 같이 전개됩니다.

$$\frac{1}{1 - p^{-s}} = 1 + \frac{1}{p^s} + \frac{1}{p^{2s}} + \frac{1}{p^{3s}} + \cdots$$

이 식의 의미는 "특정 소수 $p$를 0번, 1번, 2번... $k$번 사용하는 모든 경우를 더해 놓은 것"입니다.

 

여기서 이제 $\prod\limits_p$를 합쳐서 풀어봅시다. 이 기호는 인덱스 $p$ ($p=2, 3, 5, \dots$)에 대해서 모두 곱하라~ 라는 뜻이니까

$$\prod_{p} \left( \frac{1}{1 - p^{-s}} \right) = \underbrace{\left(1 + \frac{1}{2^s} + \frac{1}{2^{2s}} + \cdots \right)}_{p=2} \times \underbrace{\left(1 + \frac{1}{3^s} + \frac{1}{3^{2s}} + \cdots \right)}_{p=3} \times \underbrace{\left(1 + \frac{1}{5^s} + \cdots \right)}_{p=5} \times \cdots$$

이 무한한 괄호들을 전개(분배법칙 적용)한다는 것은, 각 괄호에서 항을 하나씩 골라 모두 곱한 뒤, 그 결과들을 다 더하는 것과 같습니다.

즉, 다시말해 오일러 제타함수의 정의로 돌아온겁니다.

$$\left(1 + \frac{1}{2^s} + \frac{1}{2^{2s}} + \cdots \right) \times \left(1 + \frac{1}{3^s} + \cdots \right) \times \left(1 + \frac{1}{5^s} + \cdots \right) \times \cdots = \zeta(s) = \frac{1}{1^s} + \frac{1}{2^s} + \frac{1}{3^s} + \frac{1}{4^s} + \cdots$$

 

결국 좌항의 분모(모든 소수의 곱의 조합)는 결국 우항에서 나타내듯이 모든 자연수 분모를 나타낼 수 있음을 시각적으로 확인할 수 있습니다.

 

그래도 이해가 잘 안가신다구요? 조금 더 자세히 설명해 볼까요?

 

 

4) 산술의 기본 정리(The Fundamental Theorem of Arithmetic)

"갑자기 설명하다 말고 산술의 기본 정리요?"라고 하실 수 있습니다만, 위에서 말했듯이 조금 더 자세히, 그리고 엄밀하게 설명하기 위해서 꼭 필요한 개념입니다.

근데, 사실 그렇게 어려운 내용은 아니에요.

딱 한 줄

"1보다 큰 모든 자연수는 소수들의 곱으로 표현할 수 있으며, 그 표현 방법은 오직 하나뿐이다."
(곱하는 순서는 무시)

로 정의되는 정리입니다.

"너무나도 당연한 걸 있어보이게 풀어놓은게 정리"라는 우스개 소리도 있는 만큼, 사실 소인수분해를 해봤던 분들이라면 너무나도 당연하게 들릴 소리입니다.

 

그럼 위에서 설명한거랑 어떤 연관성이 있길래 이걸 따로 설명한 걸까요? 뭐 물론 '소수'라는 연관성이 있으니까 그랬겠지만서도요?

 

$$\prod_{p} \left( \frac{1}{1 - p^{-s}} \right) = \underbrace{\left(1 + \frac{1}{2^s} + \frac{1}{2^{2s}} + \cdots \right)}_{p=2} \times \underbrace{\left(1 + \frac{1}{3^s} + \frac{1}{3^{2s}} + \cdots \right)}_{p=3} \times \underbrace{\left(1 + \frac{1}{5^s} + \cdots \right)}_{p=5} \times \cdots$$

자 그럼 다시 원래의 흐름으로 돌아와서, 시각적으로만 보여드렸던 부분에 대해서 이해를 돕기 위해 $s=1$이라고 가정하고, 소수가 2와 3만 있는 경우부터 보겠습니다.

$$\left(1 + \frac{1}{2} + \frac{1}{4} + \dots \right) \times \left(1 + \frac{1}{3} + \frac{1}{9} + \dots \right)$$

분배법칙에 따라 앞 괄호의 항과 뒤 괄호의 항을 하나씩 짝지어 곱합니다.

  • $1 \times 1 = \frac{1}{1}$$\frac{1}{2} \times 1 = \frac{1}{2}$
  • $1 \times \frac{1}{3} = \frac{1}{3}$$\frac{1}{4} \times 1 = \frac{1}{4}$
  • $\frac{1}{2} \times \frac{1}{3} = \frac{1}{2 \times 3} = \frac{1}{6}$
  • $\frac{1}{4} \times \frac{1}{3} = \frac{1}{2^2 \times 3} = \frac{1}{12}$
  • $\dots$

이렇게 곱해서 나온 결과들의 분모를 보면 $1, 2, 3, 4, 6, 12, \dots$ 가 됩니다. 이는 소인수가 2와 3뿐인 숫자들입니다.

 

이제 이 논리를 모든 소수($2, 3, 5, 7, \dots$)가 있는 무한한 괄호로 확장합니다. 각 괄호에서 하나의 항을 선택해 곱하면 다음과 같은 형태의 항이 하나 만들어집니다.

$$\frac{1}{2^{a s}} \times \frac{1}{3^{b s}} \times \frac{1}{5^{c s}} \times \cdots = \frac{1}{(2^a \times 3^b \times 5^c \times \cdots)^s}$$
($a, b, c \dots$는 각 소수를 몇 번 곱했는지를 나타내는 0 이상의 정수)

여기서 분모인 $n = 2^a \times 3^b \times 5^c \times \cdots$ 를 봅시다.

 

산술의 기본 정리에 따르면:

  • 유일성: 모든 자연수 $n$은 소인수분해의 결과가 유일합니다. 즉, $a, b, c \dots$의 조합이 결정되면 자연수 $n$도 딱 하나 결정됩니다.
  • 존재성: 모든 자연수는 소수들의 곱으로 표현 가능합니다.

따라서, 각 소수의 거듭제곱(괄호 안의 항들)을 조합하는 모든 경우의 수를 계산하면, 자연수 $1$부터 무한대까지의 모든 수 $n$이 빠짐없이, 그리고 중복 없이 한 번씩 분모에 등장하게 됩니다.

 

이 과정을 수식으로 요약하면 아래와 같습니다. 분모를 기준으로 소수들의 거듭제곱의 합을 모두 곱한 것은, 결과적으로 모든 자연수의 합과 같습니다.

$$\prod_{p} \left( \sum_{k=0}^{\infty} \frac{1}{p^{ks}} \right) = \sum_{n=1}^{\infty} \frac{1}{n^s}$$

 

 

5) 마무리

이야, 리만 가설을 시작하기도 전에 오일러 씨의 발견만으로도 벌써 한바닥 포스팅이 되어버렸네요!

왜 이렇게 오일러 씨의 업적을 길게 늘어놨냐면... 이게 진짜 불규칙 속의 규칙을 찾기위한 거의 유일한 키이기 때문이죠!

덧셈으로 이루어진, 해석학으로 다룰 수 있는 '질서의 세계'를 나타내는 한쪽 변소수와 곱셈으로 이루어진 '혼돈의 세계'를 나타내는 한쪽 변등호로 연결한 유일무이한 식이니까요!

다음 번엔 바로 진짜 리만의 사고로 뛰어들어 봅시다!

반응형
반응형

특잇값 분해(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) 마무리

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

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

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

반응형
반응형

푸리에 오디세이(Fourier Odyssey): 라플라스 변환(Laplace Transform)

 

📘 푸리에 오디세이(Fourier odyssey) 시리즈

 

 

0) 서론

딱 포스팅을 들어오시자마자 '엥?'하고 놀라신 분들 있으실거라 믿습니다.

 

"아니 푸리에 오디세이에 '푸리에'말고 '라플라스'가 등장한다고?"

(푸리에도 사람이름, 라플라스도 사람이름입니다.)

 

네, 바로 대망의 푸리에 오디세이 그 마지막 장의 주제는 '라플라스 변환'입니다.

 

왜 이 라플라스 변환이 푸리에 오디세이의 최종장이 되는지 이제부터 한번 살펴볼까요?

 

 

1) 라플라스 변환과의 연결!?

푸리에 오디세이의 최종장이 왜 '라플라스 변환'이냐 하면...

푸리에 변환이 라플라스 변환의 발전에 직접적인 영향을 주었다는 사실을 알고 계신가요?

라플라스 변환은 푸리에 변환을 일반화하고 특정 문제를 해결하기 위해 확장한 형태로 볼 수 있습니다.

즉, 이전에 말했던 '푸리에'라고 하는 산의 꼭대기에서 볼 수 있는 '그 너머의 세상' 바로 그것이죠!

 

 

2) 푸리에 변환의 한계

푸리에 변환은 신호 분석에 매우 강력한 도구이지만, 결정적인 한계가 하나 있었습니다.

바로 변환이 수렴(converge)하려면 함수(신호)가 특정 조건을 만족해야 한다는 점입니다.

가장 중요한 조건은 시간이 무한대로 갈 때 신호의 크기가 0에 가까워져, 신호의 전체 에너지(크기를 제곱해서 적분한 값)가 유한해야 한다는 것입니다.

 

하지만 현실의 많은 물리계나 공학 시스템에서는 시간이 지남에 따라 크기가 계속 커지는, 즉 발산(diverge)하는 함수가 자주 나타납니다.

예를 들어, 공진(resonance) 현상이나 불안정한 시스템의 반응이 그렇습니다. 푸리에 변환은 이런 함수들을 다룰 수 없었습니다.

 

 

3) 라플라스 변환의 해결책: 강제 수렴

라플라스 변환은 이 문제를 해결하기 위해 푸리에 변환에 '감쇠 인자(damping factor)'라는 개념을 도입했습니다.

 

아이디어는 간단합니다.

원래 발산해서 다룰 수 없었던 함수 $f(t)$에, 시간이 지날수록 급격히 작아지는 지수함수 $e^{-σt}$를 곱해버리는 것입니다.

이 σ(시그마)가 바로 감쇠 인자입니다.

 

이렇게 하면, 원래 발산하던 함수도 강제로 크기가 줄어들게 되어 푸리에 변환이 가능한 형태로 바뀝니다.

 

이것이 라플라스 변환의 핵심입니다.

 

- 푸리에 변환:

$ F(\omega) = \int_{-\infty}^{\infty} f(t)e^{-i \omega t} dt $

- 라플라스 변환:

$ L(s) = \int_{0}^{\infty} f(t)e^{-st} dt $

 

한가지 재밌는 사실은 라플라스 변환은 '시점(=0)'이 존재하는 문제를 풀기위해 고안되었다는 사실입니다.

그래서 적분 시점이 0부터이지요.

이론상 -∞부터도 계산할 수는 있어서 이렇게 계산하는 것을 양측 라플라스 변환, 0부터 시작하는걸 단측 라플라스변환이라고도 합니다.

 

여기서 라플라스 변환의 변수 s는 복소수, 즉 s=σ+iω입니다.

$e^{-i \omega t}$ 부분: 푸리에 변환과 마찬가지로 신호를 주파수 성분으로 분해하는 역할을 합니다.

$e^{-\sigma t}$ 부분: 신호를 강제로 수렴시키는 감쇠 인자 역할을 합니다.

 

결론적으로, 라플라스 변환은 푸리에 변환이 다루지 못했던 발산하는 함수까지 분석할 수 있도록 '강제 수렴'이라는 안전장치($e^{-\sigma t}$)를 추가한 확장판이라고 할 수 있습니다.

이 덕분에 제어 공학, 회로 이론 등 시스템의 안정성을 분석하는 분야에서 필수적인 도구가 되었습니다.

 

 

4) 라플라스 변환은 무슨 의미가 있는가?

1] 시스템 특성 분석

푸리에 변환이 주로 주어진 신호 자체의 주파수 구성을 분석하는 데 의미가 있다면, 라플라스 변환은 주로 시스템의 고유한 특성을 분석하는 데 강력한 의미가 있습니다.

 

라플라스 변환의 가장 중요한 결과물은 전달함수(Transfer Function)(H(s))입니다.

전달함수는 시스템의 '주민등록증'이나 'MBTI 성격 유형'과 같습니다.

어떤 입력 신호가 들어오기 전, 그 시스템이 근본적으로 어떻게 행동할지를 알려주는 고유 정보를 가지고 있죠.

 

예를 들어, 전달함수를 통해 s-평면 위에 '폴(Pole)'이라는 점들의 위치를 찍어보면, 그 시스템이 안정한지, 불안정한지, 얼마나 빠르게 반응하는지, 진동하는지 등의 모든 핵심적인 특성을 한눈에 파악할 수 있습니다.

 

조금 더 나아가 볼까요?

푸리에 변환의 결과인 '스펙트럼'은 2차원이었습니다.(주파수vs크기, 주파수vs위상)

그럼 전달함수의 결과는 몇 차원일까요?

 

전달함수의 결과는 3차원입니다.

  • 바닥 (2D 평면): 입력값인 s-평면 ($s = \sigma + i\omega$)이 바닥을 이룹니다. 가로축은 감쇠/성장을 나타내는 $\sigma$, 세로축은 주파수를 나타내는 $\omega$입니다.
  • 높이 (z축): s-평면의 각 점 $(s)$에 해당하는 라플라스 변환의 출력값 $F(s)$의 크기, 즉 $|F(s)|$를 높이로 표시합니다.

 

그러나 사실 이 전달함수를 3차원으로 다 그려보지는 않습니다.

 

보통 2차원으로 살펴보게 되는데,

여기서 제일 쉽게 전달함수를 보는 방법은 크게 두 가지가 있습니다.

  1. 폴-영점 지도(Pole-zero map)
    3차원 지형의 높낮이를 모두 무시하고, 하늘에서 s-평면을 내려다보며 가장 중요한 지형지물인 산봉우리(폴)와 호수(영점)의 위치만 지도에 표시하는 방식입니다.(산봉우리(Pole) 위치: X 로 표시, 호수(Zero) 위치: O 로 표시)

    이 2차원 지도 한 장만 있으면, 산봉우리(X)들의 위치를 보고 시스템의 안정성, 응답 속도 등 가장 근본적인 특성을 즉시 파악할 수 있습니다.


  2. 보드 선도 (Bode Plot)(특정 경로 탐사 보고서)
    3차원 지형 전체를 보는 대신, 우리가 가장 관심 있는 특정한 경로를 따라 걸어가면서 높이(크기)와 지형의 기울기(위상) 변화를 기록한 보고서입니다. 그리고 이 '특정한 경로'가 바로 푸리에 변환에 해당하는 허수축($\sigma=0$)입니다.

    즉, 보드 선도는 라플라스 변환이라는 거대한 3차원 세계에서 푸리에 변환에 해당하는 부분만 잘라내서 상세히 분석하는 것입니다.

    보드 선도는 두 개의 2차원 그래프로 구성됩니다.
    - 크기 선도 (Magnitude Plot): 주파수($\omega$)에 따라 신호의 크기를 얼마나 증폭시키거나 감소시키는지를 나타냅니다. (지도의 '고도' 정보)
    - 위상 선도 (Phase Plot): 주파수($\omega$)에 따라 신호의 위상(타이밍)을 얼마나 변화시키는지를 나타냅니다. (지도의 '경사' 정보)

    이 그래프는 특정 주파수의 입력에 시스템이 어떻게 반응하는지를 보여주기 때문에 필터나 제어기를 설계할 때 절대적으로 필요한, 가장 실용적인 지도입니다.

 

2] 미분을 곱셈으로

라플라스 변환이 '계산의 제왕'으로 불리는 이유는 단 하나, 미적분 방정식을 단순한 대수(사칙연산) 문제로 바꿔주기 때문입니다.

(과거 푸리에 변환이 함수간의 conv 연산을 주파수 영역에서 단순한 곱센 연산으로 처리할 수 있었다는 걸 기억하시나요?)

 

미분방정식은 풀기가 매우 까다롭습니다. 하지만 라플라스 변환을 이용하면 이 과정이 마법처럼 간단해집니다.

  • 미분 → 곱셈: 시간 영역에서의 미분($\frac{d}{dt}f(t)$)은 라플라스 변환을 거치면 단순히 s를 곱하는 것(sF(s))으로 바뀝니다.
  • 적분 → 나눗셈: 시간 영역에서의 적분(∫f(t)dt)은 s로 나누는 것($\frac{1}{s}F(s)$)으로 바뀝니다.

 

따라서 복잡한 미분방정식을 라플라스 변환하여 간단한 대수식으로 바꾼 뒤, F(s)에 대해 정리하고, 그 결과를 역변환(주로 표를 보고 찾음)하여 최종 답 f(t)를 구하는 방식을 사용합니다.

 

푸리에 변환으로도 미분을 곱셈(iω 곱하기)으로 바꿀 수 있지만, 라플라스 변환이 더 선호되는 이유는 다음과 같습니다.

  • 초기값 문제: 라플라스 변환은 시스템의 초기 조건(f(0))을 자연스럽게 수식에 포함시켜 주기 때문에 현실적인 문제 풀이에 훨씬 적합합니다.
  • 수렴 문제: 푸리에 변환은 발산하는 함수를 다룰 수 없지만, 라플라스 변환의 σ 성분이 발산하는 함수도 강제로 수렴시켜 분석할 수 있게 해줍니다. 이 때문에 불안정한 시스템도 다룰 수 있습니다.

 

 

5) 라플라스 변환이있다면 마찬가지로 라플라스 역변환이라는 것도 있나?

네 당연히 있습니다.

그러나 라플라스 변환자체가 복소평면(s-plane)이 연관되어있다보니 엄청나게 어렵고 복잡한 식이 나타납니다.

 

$f(t) = \mathcal{L}^{-1}\{F(s)\} = \frac{1}{2\pi i} \int_{\gamma-i\infty}^{\gamma+i\infty} F(s)e^{st} ds$

 

이 식은 브롬위치 적분(Bromwich integral)이라고 불리며, 복소수 평면에서 특정 경로를 따라 적분해야 하므로, 복소해석학에 대한 깊은 이해가 없으면 직접 계산하기가 거의 불가능합니다. 실제로 공학 문제를 풀 때 이 정의를 직접 이용하는 경우는 거의 없습니다

(여기서 $\gamma$의 역할: ​$\gamma$는 적분 경로를 결정하는 실수 값입니다. ​적분은 복소 평면에서 실수부가 $\gamma$인 수직선($Re(s) = \gamma$)을 따라 $\gamma - i\infty$ 에서 $\gamma + i\infty$ 까지 수행됩니다.
이때 $\gamma$는 매우 중요한 조건이 있는데, 바로 $F(s)$의 모든 특이점(singularities)보다 오른쪽에 위치해야 한다는 것입니다.
즉, 적분 경로가 $F(s)$가 불안정해지는 모든 점들을 피해서 그 오른쪽에 그어져야 올바른 역변환 값을 얻을 수 있습니다.)

 

그럼 역변환은 쓰임새가 없을까요?

 

아니죠! 위에서 ‘계산의 제왕'이라는 말이 나왔던걸 기억하실 겁니다.

 

라플라스 변환을 하면 원래 식이 매우 간단해지고 이 변환식을 간단히 정리해서 역변환을 하면 정말 쉽게 답을 구할 수 있답니다.

 

그런데 역변환은 매우 어렵다면서요

 

그래서 수학자들이 미리 간단한 함수들에 대한 변환/역변환 표, 이른바 '라플라스 변환 쌍(Laplace Transform Pairs)'을 미리 만들어놨죠!

 

그때그때마다 연산을 매번 하는 것이 아니라 미리 연산된 결과를 그때그때 적용하는 거랍니다!




 

6) 마무리

이로써 기나긴 '푸리에 오디세이'를 모두 마칩니다.

 

이 모든 과정을 아주 단순히 한 문장으로 써보면 다음과 같습니다.

주기 함수를 분석하려다 보니 푸리에 급수가 나왔고, 비주기 함수를 다루려고 주기를 무한대로 보냈더니 푸리에 변환이 되었으며, 심지어 발산하는 불안정한 함수까지 다루기 위해 감쇠 인자를 추가했더니 라플라스 변환이 탄생했습니다.

 

이 거대한 서사에 몸을 맡겨주신 여러분 감사합니다.

 

대성하십시오!

반응형
반응형

푸리에 오디세이(Fourier Odyssey): 푸리에 변환 for 컴퓨터(Fourier Transform for computer)

 

📘 푸리에 오디세이(Fourier odyssey) 시리즈

 

 

0) 서론

저번 포스팅까지 해서 우리는 '푸리에 ~~~'의 모든 개념과 도구 그리고 표현들에 대해서 알아보았습니다.

사실상 저번 포스팅까지가 이 푸리에 오디세이의 클라이맥스, 즉 가장 높은 산을 등정하여 그 정상까지 올라온 것이라고 할 수 있겠죠!

 

이제는 이 정상이 어떻게 생겼는지도 한번 살펴보고, 이 정상에서만 볼 수 있는 경치를 음미하며 살살 하산하면 이제 이 대장정은 끝을 맞이합니다.

 

오늘은 이 정상 즉 '푸리에 변환'이 컴퓨터에서 어떻게 활용되는지 한 번 살펴보도록 하겠습니다.

 

 

1) 컴퓨터에서의 푸리에 변환

사실상 개념적으로만 봐도, 이 푸리에 변환이라는건 정말 현대사회에서 없으면 안될 이론 같아 보이죠?

모든 신호 처리의 근간이 되니까요.

 

그러나 우리가 지금까지 경험해 왔듯이 이 수식은 계산이 극악으로 복잡하다는 최악의 단점이 있습니다.

특히나 비주기 함수까지 '완벽하게' 분석을 하려면,  '적분', '연속', '무한'의 개념이 필수적으로 필요하죠.

 

그러나 이 신호처리에서 컴퓨터라는 엄청난 계산장치를 사용하지 않고 사람이 매번 계산을 한다던가 하는건 정말 매우 비효율적이죠.

더군다나 실시간 처리는 완전히 요원할 것입니다.

 

근데 컴퓨터는 '적분', '연속', '무한'이 세 가지를 정말 제일 못합니다.

따라서 컴퓨터에게 이 푸리에 변환을 맡기지 못하느냐... 하면, '네 푸리에 변환의 원래 식 자체는 절대 못맡깁니다'가 답입니다.

 

그러나 하늘이 무너져도 솟아날 구멍은 있다고, 컴퓨터는 대신에 '단순', '반복' 작업을 세상에서 제일 잘합니다.

그리고 이런 컴퓨터를 위해 등장한 것이 바로 이산 푸리에 변환(Discrete Fourier Transform, DFT)와 고속 푸리에 변환(Fast Fourier Transform, FFT)이며, 이것이 오늘날 모든 디지털 신호 처리의 심장 역할을 하게 됩니다.


각 개념을 간단하게 말하자면 컴퓨터는 '연속'이 아니라 연속처럼 보이는 '이산'값(샘플링&양자화라고도 하죠)만을 취급할 수 있기 때문에 나온 것이 이산 푸리에 변환(Discrete Fourier Transform), 그리고 계산이 너무 복잡하기 때문에 알고리즘상 속도를 개선시켜 나온게 고속 푸리에 변환(Fast Fourier Transform) 입니다.

 

그리고 여기서 재밌게도 똑같은 '푸리에 변환'이라는 타이틀을 달고 있지만, 컴퓨터에게 시키는 작업은 엄밀히는 '푸리에 급수'로 근사하는 작업입니다.

왜냐면 컴퓨터는 '연속'을 처리하지 못하고 '이산'적이기 때문이죠.

 

다시 한 번 정리하죠.

 

  • 우리는 컴퓨터라는 엄청난 계산 장치를 활용하면 푸리에 변환을 훨씬 빠르고 정확하게 사용하여 실생활에 많은 도움을 줄 수 있다는걸 알고있습니다.

  • 그러나 컴퓨터는 '적분', '무한', '연속'이라는 개념이 들어간, 수학적으로 완벽한 '참 값'을 주는 푸리에 변환(적분)을 그 자체로는 절대로 처리하지 못합니다.

  • 그래서 어떻게 하면 컴퓨터에게 이 푸리에 변환을 시킬 수 있을까 고민했습니다.

  • 일단 연속이 불가능 하기때문에(실제로 컴퓨터는 연속 데이터를 처리하지 못합니다) 샘플링으로 이 값을 이산화 된 값으로 바꿉니다.(여기서 나이퀴스트-샤넌 샘플링 정리(Nyquist–Shannon Sampling Theorem)이란 것이 있는데, 간단히 말해 최대 주파수의 두 배 속도로 샘플링을 하면 원래 신호를 완벽하게 샘플링(추출)할 수 있다는 정리입니다.)

  • 그리고 샘플링을 하려면, '구간'이 필요하기 때문에 신호를 특정한 구간(window)으로 자릅니다.

  • 이 구간 안에서 이산화된 값을 푸리에 급수로 계산하여 '근사값'을 얻습니다.(연속은 푸리에 적분, 이산은 푸리에 급수였죠?)


그래서 실제적으로 컴퓨터는 '푸리에 급수'만 쓰는 격입니다.

 

 

2) 컴퓨터에서의 푸리에 변환의 문제점 - 구간(Window) 설정의 문제점

위에서 이산푸리에 변환과 고속푸리에변환 모두 우리가 잘라낸 유한한 구간(Window)의 데이터가 영원히 주기적으로 반복된다고 '강제로 가정'하고 계산합니다.

그리고 여기서 이 구간이 짧으면 ‘언제’ 시작되었는진 정확하게 알아도 ‘어떤 주파수'가 들어있는지는 불명확해지고, 반대로 이 구간이 길면 ‘시간'이 불명확해져도 ‘어떤 주파수'가 들어있는지가 명확해지죠.

푸리에 변환판 불확정성 원리(Gabor-Heisenberg 불확정성 원리)라고 볼 수 있겠네요.(시간 분해능 vs 주파수분해능)
(시간 영역에서의 정밀도($\Delta t$)와 주파수 영역에서의 정밀도($\Delta f$)의 곱은 특정 상수($\frac{1}{4\pi}$)보다 항상 크거나 같다는 것이 수학적으로 증명되어 있습니다. $\Delta t \cdot \Delta f \geq \frac{1}{4\pi}$)

 

참고로 이 구간(window)는 전적으로 분석 목적에 따라 달라집니다.

  • 리듬/타악기 분석: '언제' 쳤는지가 중요하므로 짧은 구간을 씁니다.
  • 화성/선율 분석: '무슨 음'인지가 중요하므로 긴 구간을 씁니다.
  • 음성 분석: 말은 '시간'에 따라 빠르게 변하지만 '음높이'도 구별해야 하므로, 그 중간의 적절한 값 (보통 20~30ms)을 경험적으로 사용합니다.

 

 

3) 컴퓨터에서의 푸리에 변환의 문제점 - 급수에서 적분으로 확장시에 발생했던 문제점들

과거 '푸리에 적분' 포스팅에서 왜 급수에서 적분으로 개념을 확장해야 하는지 세가지 문제점을 말씀드렸는데 기억나시나요?

 

  • 1) 내가 정한 L값에 따라 주파수 성분이 멋대로 바뀌고(기본주파수는 L과 관련이있죠?)
  • 2) 억지로 자른 경계면(대표적으로 x=0)의 불연속 문제(Gibbs phenomenon:불연속점이 있는 함수를 푸리에 급수로 근사할 때, 불연속점 주변에서 오버슈팅(overshooting)이 발생하는 현상) 때문에 있지도 않던 '유령' 주파수들이 잔뜩 튀어나옵니다
  • 3) 더불어 단 한번만 있는 신호였는데도 2L주기를 가지고 무한히 반복하는 신호처럼 호도하기까지하죠.

 

이렇게 세 가지 큰 문제점 때문에 푸리에 급수에서 푸리에 적분으로 개념 확장이 필수적이었죠.

 

근데, 지금은 또 반대로 푸리에 적분(변환)에서 푸리에 급수와 유사한 이산적인 도구로 근사를 하고 있습니다.

따라서 저 세가지 문제가 따라올 수밖에 없겠죠?

 

그러면 이 문제들은 어떻게 해결할 수 있을까요?

 

물론, '근원적인 해결'은 불가능합니다. 애초에 저 문제들을 해결하려고 적분으로 확장한건데, 그걸 다시 급수와 유사한 이산적인 도구를 사용하는 상황에서 무조건 이 문제들은 발생할 수밖에 없죠.

 

그래서 공학적으로 여러가지 트릭을 써서 이 문제들을 '완벽히 제거'한 것은 아니지만, '충분히 무시할 수 있을 만큼 잘 관리하고 완화하는' 방식으로 해결하고 있습니다.

 

1] 내가 정한 L값에 따라 주파수 성분이 멋대로 바뀐다

원인: '유한한 길이($L$)'로 신호를 잘라내는 행위, 즉 '창(Windowing)'을 씌우는 행위 때문에 발생합니다.

 

해결: 영 채우기(Zero padding)

아까 위에서 구간(window)를 짧게 정의하면 시간 해상도가 올라가고, 길게 정의하면 주파수 해상도가 올라간다고 말씀드렸죠?

그리고 주파수 해상도가 높을수록 이 합성 신호에 들어있는 주파수들을 잘 분해할 수 있겠죠?

그래서 일정 길이 이상의 구간을 설정해주면 주파수 성분이 멋대로 바뀌는 것을 방지할 수 있습니다.

 

그런데 이 신호가 매우 짧은 신호라 구간을 길게 설정할 수 없으면 어떻게 될까요? 혹은 짧은 구간을 보고 싶은데 주파수 해상도는 높았으면 하는 경우에는요?

바로 이때 사용하는 방법이 영 채우기(Zero padding)입니다.

 

1초 짜리 신호를 분석하고 싶은데 이렇게 구간을 설정할 경우 주파수 해상도가 낮아지면, 이 1초짜리 신호 뒤에 9초 분량의 0 데이터를 덧붙여 총 10초짜리 신호를 만듭니다. 

DFT/FFT의 주파수 해상도( $\Delta f$ )는 총 샘플링 시간 ( $T = N \cdot \Delta t$ )에 반비례합니다. ( $\Delta f = 1/T$ )

신호 뒤에 0을 덧붙여 $T$를 10배로 늘리면, 주파수 해상도가 10배 더 조밀해집니다.

이것이 새로운 주파수 정보를 '창조'하는 것은 아니지만, 기존에 듬성듬성 보였던 주파수 스펙트럼을 훨씬 더 촘촘하게 보간(interpolation)하여 진짜 피크(peak) 주파수가 어디인지 더 정확하게 찾아낼 수 있게 해줍니다.

 

따라서 1번 문제도 어느정도 해결이 되었습니다.

 

 

2] 경계면 불연속과 '유령' 주파수 (Gibbs/Spectral Leakage)

원인:

억지로 자른 경계면의 불연속 문제 (Gibbs) 때문에 있지도 않던 '유령' 주파수들이 잔뜩 튀어나온다.

이것이 가장 심각한 문제일 수 있으며, 전문 용어로 '스펙트럼 누설(Spectral Leakage)'이라고 부릅니다.

신호를 단순히 네모난 칼(Rectangular Window)로 뚝 잘라내는 순간, 신호의 시작과 끝에 매우 급격한 '점프'(불연속점)가 생깁니다. 푸리에 해석의 관점에서 "급격한 변화 = 수많은 고주파 성분의 합"입니다.

따라서 DFT는 "아! 이 신호를 만들려면 원래 신호의 주파수뿐만 아니라, 이 '급격한 점프'를 만들기 위한 온갖 종류의 (있지도 않던) 고주파 성분들이 필요하구나!"라고 판단하여 '유령' 주파수를 스펙트럼 전체에 뿌려버립니다.

 

해결: 테이퍼링 윈도우 (Tapering Window)

네모난 '직사각형 창(Rectangular Window)'이 문제의 원흉입니다.

작동 원리: 신호를 네모로 뚝 자르는 대신, 양 끝을 0으로 수렴하도록 부드럽게 눌러주는 다른 모양의 창(Window Function)을 원본 신호에 곱해줍니다.

 

종류: 해닝(Hanning), 해밍(Hamming), 블랙맨(Blackman) 창 등이 유명합니다.

 

효과: 신호의 양 끝이 부드럽게 0이 되므로, 강제로 잘라낸 경계면에서의 '불연속 점프'가 사라집니다.

 

결과: "급격한 변화"가 사라졌으므로, DFT가 만들어내던 "급격한 변화를 만들기 위한 가짜 고주파 성분들", 즉 '유령' 주파수(Spectral Leakage)가 획기적으로 줄어듭니다.

 

한계: 물론 윈도우 함수를 사용하면 스펙트럼의 '주 피크'가 약간 뭉툭해지는(해상도 저하) 단점이 있지만, 스펙트럼 전체가 '유령' 주파수로 오염되는 것보다 훨씬 나은 절충안입니다.

 

 

3] 강제 주기성

원인: 이 또한 '유한한 길이($L$)'로 신호를 잘라내는 행위, 즉 '창(Windowing)'을 씌우는 행위 때문에 발생합니다.

컴퓨터는 $N$개의 샘플 데이터(총 시간 $T$)만 볼 수 있으며, DFT는 이 $N$개의 샘플이 영원히 반복된다고 가정합니다.

 

해결: 영 채우기(Zero padding)

이 또한 영 채우기(Zero padding)으로 해결이 가능합니다.

 

작동 원리: 우리가 분석하려는 실제 신호(예: 1초짜리 "딱!" 소리)가 있다면, 그 뒤에 9초 분량의 '0' (완전한 침묵) 데이터를 덧붙여 총 10초짜리 신호로 만듭니다.

강제 주기성 완화 예시:

Before: "[딱!][딱!][딱!][딱!][딱!]" → 실제와 전혀 다른 신호

After: "[딱! ....(침묵 9초).... ][딱! ....(침묵 9초).... ]"

이렇게 하면 "딱!" 소리가 10초에 한 번씩 울리는 신호가 됩니다. 여전히 주기적이긴 하지만, 원래 신호인 '단발성 소리'와 훨씬 더 유사해졌습니다. 주기($L$)를 충분히 길게 늘려서 주기성으로 인한 왜곡(Aliasing)을 최소화하는 것입니다.

 

이 기법들은 완벽한 수학적 '해결'이라기보다는, 공학적인 '절충(Trade-off)'과 '최적화'에 가깝습니다.

 

 

 

4) 마무리

그 동안 등반하시느라 고생하셨을 여러분을 위해 오늘은 이 푸리에 변환이 컴퓨터에서 실제로 어떻게 작동되는지에 대해 개념적으로 간단하게 알아보는 시간을 가졌습니다.

 

의외로 재밌지 않나요?

 

푸리에 급수의 한계를 돌파하기 위해 수학적으로 푸리에 적분이라는 개념으로 확장시키고 이것이 결국 푸리에 변환이라는 개념을 창출하였는데,

이 엄청난 개념을 활용하기 위해서는 컴퓨터라는 계산기계의 활용이 필수적이 되었으나,

이 계산기계의 태생적 한계로 확장된 수학적 개념을 사용하지 못하고 다시 푸리에 급수와 같은 형태로 회귀하면서,

이 두 문제(정확성 vs 컴퓨터 이용 가능성)를 해결하기 위해 또 다른 방법론들이 도입되었다는 사실이요!

 

그리고 재밌게도 이 두 지점이 '수학'과 '공학'을 가르는 요소이지 않나 싶어요.

수학은 "어떻게 해서든 가장 '엄밀하고 정확한' 정보를 얻을 수 있느냐" 라면

공학은 "이 개념을 어떻게 현실과 잘 타협할 것이냐" 니까요!

 

약간의 쉬어가는 코너였습니다.

 

이제 이 기나긴 푸리에 오디세이도 슬슬 마지막 포스팅만 남았습니다.

 

푸리에라는 산 꼭대기 위에서만 볼 수 있는 절경이 남았다구요!

 

조금만 더 힘내보죠!

반응형

+ Recent posts