반응형

오라클 클라우드 인프라스트럭쳐(Oracle Cloud Infrastructure) 세팅하기

 

0. 서론

정말 간만의 포스팅이긴 한데... 요 근래 AWS가 정책이 매우 괴랄하게 변했다..

25년 7월 15일에 엄청난 개악(?)을 단행했는데...

  1. 기간 반토막: 12개월 월 750시간 프리티어를 주던 정책을 6개월로 줄임
  2. 대신 용돈 줌: 새로 가입하면 $200 크레딧(현금 포인트)을 주고 "이걸로 6개월 동안 마음껏 써봐!"라는 식으로 바뀜
  3. 거기다가 요새는 가장 기본 프리티어인 t2.micro 조차도 용량을 수정하기 매우 어렵게 완전히 꽁꽁 숨겨놨다.

덕분에 나름 꼼꼼히 보면서 다시 만들었어도, 기본 8gb 용량이라 제대로 아나콘다 하나 설치를 못한다...

그래서 인스턴스 뿌시고, 다시 만들어봤더니... 이야 한달만에 크레딧 다 쓰고 유료 전환하라고 메일이 와서... 이번에 그냥 다른 대안을 찾아보다가 오라클 클라우드(OCI)를 선택했다.

OCI는 하드 총량도 200Gb나 주고, 기본 성능도 t2.micro보다는 좋다고하고, 무엇보다 "평생 무료"이다.

거기에 더불어서 꽤나 좋은 '암페어' 모델도 평생 무료다(그래서 이건 진짜 매번 생성불가에다가, 이미 다른 '매크로'들이 호시탐탐 노리고 있다)

일년마다 프리티어를 새로 만드는 짓거리를 하지 않아도 되는 셈...

그러나 사람이란게 한번 익숙해지면, 새로운 것을 받아들이는덴 참 시간이 걸리고 어려운지라, 오늘 복습도 할겸 한번 끄적거려본다.

 

1. 회원가입하기

일단 회원가입은 기본적인 거니까 쭉쭉 진행을 하면 되는데... 여기서 제일 중요한게 회원가입단계에서 바로 '리전'을 선택하게 되어있다.

그리고 aws랑 다르게 oci는 한번 리전을 설정하면 유료로 돌리기 전에는 바꿀 수 없다.

그래서 '서울'이나 '춘천'을 노리게 되는데... 서울은 진짜 너무 빡세서 리스트에조차 없다. '춘천'도 빡빡하긴 마찬가지...

만약 서울/춘천 둘 다 안되면 적어도 Japan East (Tokyo)Japan West (Osaka)라도 노리자..

이렇게 회원가입을 하고 나면, 의외로 회원가입에 시간이 꽤나 걸린다. 최장 24시간까지 걸린다는 흉흉한 소문도 들어봤고...

내 경우엔 한 10분? 로딩 화면에 있다가 15분 정도 시간 더 걸릴거라는 페이지로 넘어가며 '메일'을 보냈다고 알람이 왔다.

실제로 메일을 받았으면 내 계정은 잘 만들어 진 셈.

그리고 여기는 따로 mfa를 설정하는게 아니라 아예 가입하면서 mfa를 설정할 수 밖에 없게 만들어 놓는다.

그리고.. 여기 프리티어지만, 진짜 무서운게 aws보다 더 빡빡하게 신용카드 결제 가능 여부를 관리한다는 점이다.. 매달 확인한다는 '썰'이 있는데...

일단 프리티어니까 적당히 잘 했으면 이제 인스턴스를 만들러 가보자.

 

2. 인스턴스 만들기

아... 여기서부터 꽤나 힘들다. aws처럼 이 친구들도 엄청나게 복잡하게 화면을 구성해 놨기 때문...

게다가 여전히 aws 처럼 수시로 ui를 바꿔 댈 테니 여기서는 스크린샷은 최대한 자제하고 '느낌'으로 전달하려고한다.

인스턴스 만들때 의외로 단계가 꽤나 된다?는 느낌을 받았다

 

1] Basic Information
 1. 이름 및 위치 (Name & Placement)
 Name: 원하는 대로 (예: main-server)
 Placement: 기본값 유지 (AD-1 하나밖에 없을 겁니다)

 2. 이미지 및 셰입 (Image and Shape)
 이 부분을 반드시 수정(Edit)해야 합니다.

 - Image (운영체제):
 기본값: Oracle Linux
 추천: Canonical Ubuntu 24.04.

 - Shape (하드웨어):
 기본값: VM.M.Standard.E2.1.Micro (aws에서의 t2.micro 모델)
 일단 기본값 자체도 그다지 나쁘지는 않다고 한다.(심지어 내가 돌리려는게 꽤나 큰 모델이나 프로젝트도 아니고...)
 그러나 ARM 프로세서로 OCPU: 4, Memory: 24GB까지 쓸 수 있는 하드웨어도 "평생 무료"라고 한다. 그래서 지금 이 인스턴스는 엄청난 인기! 그래서 한번에 생성은 거의 불가능하다. 보통 이 인스턴스를 쓰고 싶어도 일단 기본값으로 만들어 놓고(얘는 쉽게 생성됨) 거기서 매크로를 돌리는게 일반적이라고 하니...

일단 변경 방법은 다음과 같다.

  • Change Shape 클릭
  • Ampere 시리즈 선택 (ARM 프로세서)
  • VM.M.Standard.A1.Flex 체크
    -(여기서부턴 리스트에서 선택인지, 슬라이드 바가 나오는지는 '신비의 전설' 수준이라 명확하진 않지만 어찌되었든)
  • OCPU: 4 / Memory: 24 GB로 선택
  • Select Shape 클릭

당연히 나는 안만들어져서, 기본 마이크로로 만들었다.

2] 시큐리티
아무것도 건드리지 말것

3] 네트워킹 (Networking)
- vnic 이름 만들어주고(이건 나중에 바꿀 수도 있고.. 뭐 대충 아무렇게나..)

- Create new virtual cloud network 선택
아래쪽에 Automatically assing Public IPV4 address 가 체크되면 땡큐인데.. 오라클 홈페이지가 진짜 엄청나게 예민해서 비활성화 되는 경우도 있다. 안되면 나중에 수동으로 붙일 수 있으니 일단 넘어가기

아 그리고 aws랑 다르게 포트(80, 443 등) 여는 건 따로 설정해야 함..

- SSH 키 추가 (Add SSH keys)
당연히 너무나도 잘들 아실테지만.. 이거 잃어버리면 서버 못 들어갑니다.

Generate a key pair for me 선택 (기본값)
Save private key 버튼을 눌러서 .key 파일 다운로드.
public key도 받아도 상관은 없음..

4] 부트 볼륨 (Boot volume)
프리티어는 총 200GB까지 공짜!
근데 여기도 기본 50Gb?로 설정되어 있으니까
Specify a custom boot volume size 눌러서 100GB 정도로 넉넉하게 잡으면 될듯요. (200GB 다 쓰면 나중에 서버 하나 더 만들 때 용량 부족합니다. 뭐 만일을 위해서 좀 남겨두는거고.. 실상 100Gb도 충분하기도 하고...)

 

이렇게 다 세팅을 하고 나면, 리뷰?로 한번 모든 정보를 싹 보여주고 'Create'가 나오는데.. 그냥 마이크로 했으면 바로

Case A: "Provisioning" (주황색) 상태가 된다.

일 것이고, 욕심을 내서 암페어를 골랐다면, 인터넷 창 아래에 빨간 색으로 오류메시지 즉,

Case B: "Out of host capacity" 에러가 뜬다.

가 될 확률이 높죠.

Case B면, 그냥 속편하게 마이크로로 셰입 바꾸고 만드는게 속 편합니다.

 

이렇게 해서 인스턴스를 만들었습니다!

 

 

2. 퍼블릭 아이피 붙이기

자, 느낌적인 느낌으로 설명드릴께요.

방금 인스턴스를 만들었죠? 그러면 바로 인스턴스 창이 브라우저에 뜰 겁니다.

바로 이 인스턴스 창에서 파란색 링크된 인스턴스 클릭(이 부분은 생략될 수도 있습니다. 만들어지고 바로 '디테일'창으로 들어와졌다면요)

인스턴스 명 아래 여러 탭이 보이는데, 그중에 네트워킹 탭 클릭

스크롤 내려서 Attached VNICs 에서 name 아래 파란 링크 클릭

상단 탭에서 'IP administration'클릭

하단 표에서 오른쪽 끝 점 세개 클릭 Edit

Ephemeral Public IP 선택하고 Update 누르면 끝!

수 분 내로(거의 즉시?) 퍼블릭 아이피가 붙습니다.

 

자, 이제 퍼블릭 아이피도 얻었겠다, 일단 ssh로 접속해볼까요?

ssh -i "C:\Users\사용자명\Downloads\ssh-key-2026-01-30.key" ubuntu@"퍼블릭 IP 주소"

위 명령어를 복사해서 붙여넣되, [키파일경로] 부분만 실제 파일 경로로 바꿔주세요.
(팁: ssh -i 치고 한 칸 띄운 뒤, 다운로드 폴더에 있는 .key 파일을 터미널 창으로 드래그 앤 드롭하면 경로가 자동으로 입력됩니다.)

오라클 우분투의 기본 아이디는 ubuntu입니다. (opc 아닙니다.)

성공 신호
처음 접속하면 "Are you sure you want to continue connecting?" 이라고 물어봅니다.

yes 라고 타이핑하고 엔터 치세요.

ubuntu@"vnic 이름":~$ 라는 초록색 글씨가 뜨면 접속 성공입니다!

 

3. 포트개방

aws랑은 다르게 오라클은 조금 보안이 빡세서, 단계가 두개가 필요합니다.

1단계: 오라클 웹 콘솔 설정 (문 열기)

AWS의 Security Group 설정과 똑같습니다.

  • Networking 탭: 아까 그 인스턴스 상세 화면에서 중앙의 Networking 탭 클릭.
  • 표에서 Subnet이라 써있고, 그 오른쪽에 파란색으로 링크 된 부분 클릭
  • 상단 탭에서 시큐리티 클릭
  • 시큐리티 리스트가 나오는데, 여기서 디폴트 시큐리티 리스트(파란색 링크) 클릭
  • 상단 탭에서 Security rules클릭
  • Ingress rules가 나오는데, 여기서 Add ingress rules 눌러서
  • Source CIDR: 0.0.0.0/0 (전 세계 허용)
  • Destination Port Range: 80,443,8080,8888,8501,5000
  • 두 개만 써주고 나머지는 그냥 디폴트 값으로 둔 상태에서
  • Add Ingress Rules 클릭


2단계: 서버 내부 설정

이게 제일 중요합니다.

오라클 우분투 이미지는 기본적으로 iptables라는 빡센 방화벽이 켜져 있어서, 위에서 열어도 접속이 안 됩니다.

그러면 어떻게 해야하나... 하면 그냥 터미널에서 쿨하게 방화벽 규칙을 싹 밀어버리고(허용하고) 저장합시다. (어차피 앞단의 오라클 콘솔이 막아주니까요.)

아래 명령어 3줄을 한 줄씩 복사해서 붙여넣으세요.

# 1. 현재 걸려있는 모든 차단 규칙 삭제 (프리패스)
sudo iptables -F

# 2. 앞으로의 모든 접속 허용으로 변경
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

# 3. 재부팅해도 초기화 안 되게 저장 (이거 안 하면 껐다 켜면 다시 막힘)
sudo netfilter-persistent save
끝났습니다.

이렇게 포트도 다 열었구요~

 

4. 이제 aws처럼 웹서버로 씁시다~

이젠, 이 블로그의 다른 포스팅에서처럼 아나콘다를 깔고, 주피터 서버를 만들면 이제 나만의 작은 주피터 서버가 생성되는 것이죠.

그 사이에 좀 많은 변화가 있어서 이참에 조금 정리해 두려고 합니다.

FTP 포트

일단 과거랑 가장 큰 차이는 FTP 포트(21)가 딱히 안전성이 좋지 않아서 굳이 사용하지 않을거라는 점? 그래서 위에서 포트개방때도 딱히 안열었었죠.

아나콘다 설치

그리고 아나콘다 설치는 https://omnil.tistory.com/72이 링크에서 자세히 설명하고 있습니다.

요 근래 아나콘다 설치 후 source ~/.bashrc해도 기본 패스가 잘 안잡히는 경우가 있는데, 이때는

  • export PATH=~/anaconda3/bin:$PATH
  • conda init
  • source ~/.bashrc

한번 더 강제로 돌려주면 잘 돌아갑니다.

주피터 서버

이게 사실상 제일 크게 변한 부분입니다.

과거에는 주피터 서버로 모든걸 관리했는데, 이제 이 부분이 주피터 랩으로 넘어가면서 명령어에 약간의 변화가 생겼습니다.

  • jupyter lab --generate-config
    로 config 파일 만들어주고요
  • cd .jupyter
    로 이동해서
  • vi jupyter_lab_config.py
    config 파일 열고
  • i 눌러서 insert모드 들어가서 enter 두번 치고
    c.ServerApp.ip = '0.0.0.0'
    c.ServerApp.port = 8888
    c.ServerApp.open_browser = False
    c.ServerApp.notebook_dir = '/home/ubuntu/'
    c.ServerApp.allow_remote_access = True
    이렇게 써주고, esc 눌러준 다음 :wq 눌러서 저장하고 나와주시면 됩니다.
  • jupyter lab password
    이걸로 패스워드 진짜 쉽게 설정할 수 있구요
  • screen -S jupyter
    jupyter notebook
    ctrl+a+d
    로 스크린 켜고, 웹 브라우저에서 '퍼블릭 IP:8888'로 접속하면 바로 주피터 노트북이 열릴겁니다.

 

5. 마무리

네, 이렇게 나름 쉽다면 쉽게? OCI를 설정해봤습니다.

평생 무료란게 정말 마음에 드네요.

반응형
반응형

리만 가설(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) 마무리

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

 

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

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

 

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

 

대성하십시오!

반응형

+ Recent posts