2014년 12월 27일 토요일

상관계수→인공신경망, 푸리에변환 → DFT → FFT

상관계수에서 FFT까지 내용을 고등학교 말년에서 대학교 신병까지 수준에서 설명을 할 것이다. 나는 학문적인 어려운 표현을 써서 수학적 증명을 하는 것보다는 직관적, 실용적으로 이해하는 것을 더 좋아한다. 이렇게 하는 것이 이해가 더 빠르다. 인터넷 찾아보면 다 나오는 내용인데 아마도 내 설명이 더 쉬울 것이다.



1. 상관계수





통계학의 상관계수는 인공신경망이나 푸리에 변환을 이해하는 열쇠이다. 상관계수란 비유적으로 말하면 성관계 수이다. 키 큰 놈과 키 큰 년은 엉덩이 높이가 맞으니 잘 어울려서 성관계 수가 많을 것이다. 이렇게 큰 수와 작은 수가 서로 짝을 이루게 되면 상관계수가 높게 나타난다. 공식을 보면서 직관적으로 이해하자. 첫 번째 공식은 상관계수 개념을 잘 이해하게 해 준다. 평균을 빼서 비교 기준선을 정한다. 중심을 맞추는 것이다. 중심을 일치시켰다고 가정하고 모든 x, y값을 중심 대비 차이로 변환해 보자. 그럼 이제 x와 y평균은 0이 되는 것이다. 수식은 더 간단해져서 다음과 같은 형태가 된다. 

∑xy/√(∑x²∑y²)

이제 크기를 맞추어 보자. 이것을 정규화라고 한다. 표준편차인 √∑x²과 √∑y²를 나누면 폭/키가 같아진다. 만약 x와 y가 100% 같다면 계산 결과는 1이 될 것이다. 그렇지 않은 경우는 무조건 –1 ~ +1 사이의 값이 나온다. 이 간단한 형태가 인공신경망에서 사용하는 패턴 비교 공식이다.



2. 인공신경망


인공신경망 공식을 보면 그 형태가 상관계수 공식과 매우 흡사하다. 모든 수가 –1, 0, +1의 3개의 숫자로만 표현 되고 평균을 무조건 0으로 보는 특수한 경우라고 이해하면 된다. 시그마(합) 기호가 들어가면 눈이 어지러우니 쉽게 3개 데이터로 풀어 보자. A 쪽은 (a, b, c)가 되고 B 쪽은 (x, y, z)가 된다고 하자. 그럼 상관계수 공식은 이렇게 단순하게 바뀐다.


f=(ax + by + cz)/√(a²+b²+c²)(x²+y²+z²)
√(a²+b²+c²) = k
√(x²+y²+z²) = h
f=(ax + by + cz)/kh = (a/k*x + b/k*y + c/k*z)/h = (A*x + B*y + C*z)/h
f=(A*x + B*y + C*z)/h = (A*x/h + B*y/h + C*z/h) = (A*X + B*Y + C*Z)
A, B, C, X, Y, Z는 모두 -1 ~ +1가 된다.

A(a, b, c)는 신경 세포로 들어가는 3개의 입력이고, 결과 f는 출력이다. B(x, y, z)는 세포 내부의 비교 패턴이다. 여기서 분모 부분은 결론의 크기를 조절하기 위한 부분이다. 그래서 이 부분을 그냥 1로 대체하고 생략해도 된다. A 패턴이 (1, 1, 0)이고 B 패턴이 (1, 0, 1)이면 결과는 0.5로 나오게 된다. 50%만 비슷하다는 의미다. B 패턴이 (-1, -1, 0)이면 –1로 나오게 된다. 100% 일치하는데 거꾸로 뒤집혔다는 의미다. 인공신경망이 상관계수 공식과 다른 점은 이렇게 나온 상관계수 값을 어떤 기준과 비교해서 다시 –1, 0, +1의 3개의 숫자로 바꾼다는 것이다. 즉 디지털로 결론을 낸다는 말이다. 예를 들어 80% 이상은 +1로 그렇다. -80%이하는 -1로 아니다. 그 중간은 0으로 판단 불가이다. 

※ 때론 어려운 공식을 이해할 때는 구체적인 숫자로 바꿔 보는 것이 좋다. 특히 0, ±1을 넣게 되면 더욱 단순해진다.

이런 공식을 사용하는 이유는 자가 학습 기능 구현 때문이다. 예를 들어 A 패턴을 알려 주고 그 답이 1이라고 알려 주면 비교 패턴인 B를 스스로 만드는 것을 말한다. A를 B로 기억한다고 생각해도 되고, A와 비슷한 것들의 특징을 파악해서 중요한 부분을 B로 기억한다고 봐도 된다. A 패턴에서 1에 해당하는 값과 곱해지는 B 패턴의 계수는 증가시키고, -1에 곱해지는 B 패턴의 계수는 감소시킨다. 0인 경우는 뭘 곱해도 상관없으니 그대로 둔다. 이 증감 폭이 학습 속도를 결정한다. 이 보정 폭이 너무 크면 빨리 배우지만 최적 경계를 넘어가서 결국 계속 진동하는 미친 현상을 보인다. 이 폭이 너무 작으면 느리게 배우지만 최적 경계 근처에 도달하게 된다. 결국 B 패턴은 A 패턴과 비슷해질 것이다.

이건 하나의 신경 세포에서 벌어지는 일을 표현한 것인데 이런 신경 세포를 다단계로 연결할 수 있다. 이 경우 자가 학습 방법이 복잡해진다. 역전파 알고리즘이란 최종 말단의 계수 보정이 제일 앞의 계수 보정까지 영향을 주는 방식이다. 예를 들어 중간의 어떤 계수가 살짝 변하면 최종 결론에 어느 정도의 영향을 미칠 것이다. 그 민감도를 편미분으로 표현할 수 있다. 민감도가 큰 계수를 변경하면 결과 값도 크게 변할 것이다. 이론적으론 그럴 듯한데 별로 쓸 데는 없을 것 같다. 다단계 회로의 의미는 분할 점령 방식으로 문제 해결을 하겠다는 것인데 자동으로 다단계 회로를 스스로 구성하는 방법이 없다. (지금 인공 지능이 한창 유행인데...)


재미 삼아서 공부해 볼만 하겠지만 별로 쓸 데는 없겠다. 다음은 몇 개 용어 정리이다.

  • 자율 학습 : 학생(기계)이 입력 데이터를 자동으로 분류하는 것
  • 지도 학습 : 선생(사람)이 정답과 계산법을 가르쳐 주는 것, 주입식 교육
  • 강화 학습 : 결과(쾌감/점수)를 좋게 하는 행동(출력)을 찾는 것

서양에선 자율 학습을 통해 다양한 자극을 받는데, 한국에선 지도 학습을 통해 정답만 배우게 되니 시야가 좁아진다. 그건 기계에서도 마찬가지다. 지도 학습만 받은 기계는 멍청이다.

  • 퍼셉트론 : 신경 세포 하나에 해당, ∑ 입력 x 가중치, 결과는 판단 기준에 따라 ±1, 0
  • 오차역전파법 : 답이 틀리면 오차 부호에 따라 가중치를 일정 비율 증감시키는 것
  • 딥 러닝 : 그냥 인공 신경망, 다단계 신경망 조립을 이용한 다단계 중간 판단 이용
  • 서포트 벡터 머신 : 자율 학습 기계, 데이터 분류 기준을 결정한다.

위의 방법과 기계들이 엄청 많이 다른 것 같지만 사실 같은 짓을 반복하는 비슷한 것들이다. 뭔가 대상의 특징을 보고 통계적인 분류를 하는 것이다. 통계적 분류를 하려면 어차피 기계적으로 외우는 과정이 필요하다. 또한 예외는 기준에서 벗어나기 때문에 어차피 외워야 한다. 예외적 판단/행동에는 어차피 수학 공식은 안 통하고 조건문과 암기가 통한다. 규칙적인 것은 수학 공식으로 압축이 되고 불규칙적인 것은 조건문과 기억으로 대응한다.

  • 튜링 기계 : 컴퓨터 CPU의 동작 원리, 상태 변화도(표)
  • 상태 변화표(도) : 조건(외부 자극 x 현재 상태)에 따른 다음 상태(행동/판단) 변화
  • 전문가 시스템 : 조건(많은 규칙)에 따른 논리 계산 후 뭔가 도출
  • 마르코프 연쇄 : 상태 변화도(표) + 상태 변화 확률, 외부 자극 없는 시변적 변화 표현
  • 은닉 마르코프 모델 : 입력(외부 자극) → 상태 변화도(표) x 확률(은닉) → 출력(행동)

역시 위의 방법들이 엄청 많이 다른 것 같지만 사실 같은 짓을 반복하는 비슷한 것들이다. 시간 변화나 순서가 있는 처리(판단)이나 다단계 처리(판단)에 사용하는 방법들이다. 아마 이 방법이 인공 지능보다 먼저 개발 되었다고 봐야 할 것 같다. 컴퓨터 CPU도 이런 방식으로 움직이기 때문이다.



3. 삼각함수 & 복소수 & 지수함수



푸리에 변환은 본질적으로 삼각함수를 사용하여 패턴 비교하는 개념이다. 그런데 이 삼각함수 cos, sin 쌍을 복소수 형태로 표현하기 때문에 삼각함수와 복소수 사이의 변환에 대해 미리 알아야 한다. 이런 복소수 표현을 사용할 필요는 없는데 수학 공식이 깔끔하게 정리 되니까 사용하는 것이다. 수학적인 허세? 편리함이다.

공식 0과 1은 어떤 단일 주파수의 정현파는 cos, sin 성분으로 분해 가능하다는 뜻이다. 어떤 복잡한 신호는 결국 성분 분석을 하면 단일 주파수 신호의 합으로 표현 된다. 이런 단일 주파수는 다시 cos, sin으로 분해된다는 것이다. 예를 들어 Acos(y) + Bsin(y)이 합성이 된 경우 이것은 cos(x) = A/√(A²+B²), sin(x) = B/√(A²+B²) 형태가 되니 √(A²+B²){cos(x)cos(y) + sin(x)sin(y)} 형태가 되고 √(A²+B²)cos(x-y)가 되는 셈이다. 이건 피타고라스 정리다.

공식 2, 3은 복소수 합이 벡터의 합과 같다는 것을 의미하고, 공식 4, 5는 직각 좌표계에서 복소수의 곱을 나타낸다. 그런데 이 공식은 벡터의 회전 공식과 같다. 그래서 3D 게임의 벡터 회전에 복소수를 이용하는 것이다. 3차원 회전은 4원수라는 실수부 1개, 허수부 3개로 된 수를 이용한다. 복소수는 4차원적인 신비한 의미가 있는 것이 아니라 제곱을 하면 부호를 바꿔주는 편리한 연산자와 같은 용도가 있어 사용하게 된 것이다. 우리가 음수(갚아야 할 빚)를 사용하게 된 것처럼 음의 면적(빼줘야 할 면적)도 생각할 수 있다. 면적의 제곱근은 그 면적을 대변한다. 고로 허수는 음의 면적의 한 변이 되는 것이다.

공식 6, 7은 삼각함수로 표현된 복소수가 지수함수와 결합하여 극좌표계로 바뀌는 것을 의미한다. 공식 8, 9는 지수함수(극좌표) 형태로 표현된 복소수 곱셈이 벡터의 회전과 같다는 것을 보여준다. 그러니까 직각좌표는 덧셈에 유리하고, 극좌표는 곱셈에 유리하니까, 이 두 표현을 오가면서 계산하는 것이다. 직각 좌표의 덧셈이 벡터 합(이동)과 같은 꼴이고, 극 좌표의 곱셈이 벡터의 회전과 같은 꼴이다. 계산의 편리함 때문에 이런 표기를 사용한다.



4. 푸리에 변환 원리



이제 수학 기초를 다시 기억 회복했으니 푸리에 변환의 원리를 보겠다. 주파수가 같은데 크기가 3인 cos과 크기가 4인 sin을 합성하면 같은 주파수의 크기가 5인 정현파가 생긴다. 이게 앞에서 본 수식에서 어떤 정현파는 cos과 sin 성분으로 분해 가능하다는 것을 나타낸다. 여기서 4와 3과 5의 관계는 피타고라스 정리에 따른다. 이제 주파수가 서로 다른 정현파를 섞는다고 해 보자. 그럼 각 정현파는 자기 주파수의 cos, sin으로 분해 될 것이다. 이렇게 특정 주파수의 cos, sin 성분을 복소수로 나타낼 수가 있다. 즉 복소수 하나는 특정 주파수의 정현파 하나에 대응된다.

역으로 크기가 5인 정현파를 같은 주파수의 크기가 1인 cos, sin과 곱하면 어떻게 될까? 여기서 상관계수 공식을 다시 떠올린다.

∑(3cos + 4sin)*cos = ∑3cos*cos + ∑4sin*cos = ∑3cos² = 3∑cos² = 3K
∑(3cos + 4sin)*sin = ∑3cos*sin + ∑4sin*sin = ∑4sin² = 4∑sin² = 4K

간단하게 위와 같이 cos 성분과 sin 성분이 분리 된다. cos, sin의 무한 평균은 0이다. 상관계수 공식에서 평균이 0인 경우와 같다. 무한 시간에 대해서 cos² = sin²이며 이것은 상관계수에서 분모(분산)에 해당한다. 무한 시간에 대해서 cos*sin은 0이 된다. 주파수가 다른 cos, sin의 곱은 결국 주기적 파형이 되는데 무한 시간에 대해 합하면 0이 된다. 주기적 파형은 평균이 0이기 때문이다. 즉 같은 주파수의 cos*cos, sin*sin만 살아남기 때문에 cos² = sin²을 나누면 cos, sin 성분의 진폭을 알 수 있게 되는 것이다. 이게 푸리에 변환의 원리다. 오직 자신과 같은 주파수에만 반응하는 것을 공진 현상이라고 한다.



5. 푸리에 변환 공식 이해



푸리에 변환의 휘황찬란한 공식을 보자. 복소수의 지수 표현이 나온다. 이것을 너무 어렵게 생각할 필요 없이 cos, sin 형태로 다시 바꿔 이해하면 된다. 보통 f(x)는 시간 함수이고 신호이다. 그럼 x는 시간이 된다. f^(ξ) 함수는 cos, sin 성분을 표시하는 복소수 형태가 되고 ξ는 주파수가 된다. f(x)는 실수부만 있는 함수이기 때문에 그대로 cos, sin 성분에 곱해진다. 그럼 앞에서 본 바와 같이 같은 주파수의 cos, sin 성분만 분리 되어 나온다. 

f(x) = A*cos + B*sin
∑f(x)(cos - i*sin) = ∑(A*cos + B*sin)*(cos - i*sin) = A∑cos² - i*B∑sin²
K = ∑cos² = ∑sin²

위에서 cos² = sin² = K를 나누면 바로 cos, sin 성분이 나온다. 지수 표현의 음과 양의 부호는 그렇게 중요한 것은 아니다. 이렇게 주파수 별로 cos과 sin성분의 진폭이 도출되면 이것을 다시 원래 신호 f(x)로 복구하는데 이용할 수 있다. 복소수 표현에선 부호 하나만 바꾸면 역변환이 되니 공식이 깔끔해서 이렇게 표현하는데 이걸 다시 cos, sin 성분으로 풀면 의외로 간단하다. 

f^(ξ) = (A – i*B)*K
∑f^(ξ)(cos + i*sin) = ∑(A – i*B)*(cos + i*sin)*K = (∑Acos + ∑Bsin)*K + i*쓰레기

여기서 허수부는 쓰레기 정보로 버린다. 실수부를 보면 원래 f(x)와 비슷한 모양이다. 복소수를 사용했을 뿐이지 그냥 cos + sin 형태로 계산해도 무방하다. 어차피 cos, sin은 섞이지 않는다. 수학적으로 복소수로 표현할 뿐이고 컴퓨터에선 실제론 cos, sin으로 분리해서 계산한다. 수학적으로는 복소수 i² = -1이 되어 부호가 바뀌니까 형태적으로 그럴 듯하게 정리 되는 것뿐이다. 푸리에 변환은 수학적으로는 마치 다른 것처럼 표현을 했지만 상관계수의 변형에 불과하다. 실제론 복소수 계산을 하지 않고 A와 B 진폭을 가지고 직접 cos, sin 파형을 합성한다.



6. 이산 푸리에 변환(DFT)



앞의 수식은 무한 시간에 대한 신호를 무한 주파수로 분석하는 것이었다. 현실적으로 이건 불가능하기 때문에 특정 시간 구간에 대해서 특정 시간 간격으로 특정 주파수 성분만 분석한다. 예를 들어 1초 구간 안에서 n=100개의 시간 단위로 0Hz, 1Hz, 2Hz, ~, 49Hz까지 정수 주파수만 분석을 한다. 데이터가 불연속적이라고 해서 이산이라고 부른다. 공식은 적분 기호(∫)가 합산 기호(∑)로 바뀌었고 1/N을 한다는 것이 다르다. 이 1/N 대신에 cos² = sin² = K를 나누면 바로 성분이 나온다. 주파수가 정수배이기 때문에 모든 주파수의 K값이 같다. 쓸데없이 1/N을 하는 이유를 솔직히 모르겠다.

예를 들어 소리를 주파수 분석 한다고 해 보자. 그럼 20~20000Hz까지 분석을 해야 한다. 최소 1/20초 동안 소리를 들어야 20Hz를 감지할 수 있다. 그래서 1/20초 동안을 분석한다. 그럼 이 1/20초를 몇 개로 나누어 데이터를 취해야 할까? 이 구간에서 최대 주파수인 20000Hz는 1000회와 같다. 최대 주파수의 2배로 취해야 최대 주파수의 형태를 파악할 수 있다. 그래서 1/20초에 2000개의 데이터를 취한다. 그럼 주파수는 0회 ~ 999회까지 분석하게 되는 것이다. 1회 단위로 말이다. 물론 이 시간 구간에서 1회는 실제 20Hz이고 999회는 19980Hz에 해당 된다.

인간은 약 10옥타브를 감지하고, 1옥타브 안에선 12음계를 감지하며, 1음계 안에선 10% 차이도 감지한다. 그럼 가청 주파수 영역을 10 * 12 * 10 = 1200 단계로 구분한다는 뜻이다. 위에서 1/20초에 1000회를 측정하는 것과 비슷한 계산 결과다. 사람에 따라 더 낮은 저주파와 더 높은 고주파를 느끼는 자도 있을 것이니 더 긴 시간에 더 세밀한 단계로 측정한다. 저주파를 측정하려면 1/20초보다 길게 관찰, 고주파를 측정하려면 2000회보다 더 빈도 높게 관찰.

이 DFT는 문제가 있는데 일단 무한 시간, 무한 밀도로 데이터를 취할 수가 없어서 주파수 분석에 한계가 있다. 또한 주파수 분석이 1Hz 단위이기 때문에 정확하게 원본 신호를 복구할 수가 없다. 근사치란 얘기다. 허나 우리 인간도 자연에서 오는 정보 중에서 놓치는 것이 많다. 실제로는 우리 감각기의 한계로 인해서 다른 색, 다른 소리를 같은 색, 같은 소리로 오인할 수 있다.


Excel로 간단하게 푸리에 변환을 만들어 시험해 볼 수 있다. 시그마 기호가 나오니까 뭐가 뭔지 모르겠지만 Excel 계산표를 보면 (시간, 주파수) 2차원 좌표에서 f*cos, f*sin의 곱에 불과하기 때문에 별로 이해하는데 어렵지 않다. 간단하게 1초에 20개의 데이터를 취하니 0~9Hz까지 분석하게 되는 것이다. 신호는 2Hz에서 진폭 3와 4인 cos, sin을 합성했다. 분석 결과 2Hz에서 정확하게 진폭 성분이 나온다. 이것을 1/N인 1/20을 곱하는 것보다는 1/10을 하는 것이 더 낫다는 것을 알 수 있을 것이다. 이 경우 cos² = sin² = 10으로 나온다.



7. DST(이산 사인 변환), DCT(이산 코사인 변환)


DFT 중에서 cos 성분만 계산하는 경우가 DCT, sin 성분만 계산하는 경우가 DST이다. DCT는 JPEG 압축에 사용하고 있다. 정확하게 DFT를 해도 원본 이미지를 100% 복구할 수 없는데 DCT만 사용하기 때문에 우리가 보는 이미지는 원본 이미지는 아니다. DST의 경우는 단위 구간 안에서 좌우측 끝이 무조건 0이기 때문에 곤란하다.

이렇게 해도 사진의 경우 별 대단한 차이를 못 느끼기 때문에 사용한다. 문제는 문자, 도형, 만화 등 선명한 그림들의 경우 선 주변에 지저분한 흔적이 남는데 이는 무한 주파수, 무한 밀도로 분석하지 못 해서 그런 것이다. 선명한 선은 사각 펄스 파형에 해당되는데 이런 것은 무한 주파수가 합성되어야 만들어진다. 그런데 무한 주파수로 분석하지 않았으니 근사치가 될 수밖에 없다.

  • 사진 = JPEG 압축
  • 만화/문서 = PNG/GIF 압축 = 선명한 선



8. FFT(고속 푸리에 변환)


DFT를 빨리 계산하는 방법을 FFT라고 한다. 이 요령은 cos, sin값 계산을 줄이는데 있다. cos, sin 값을 매번 함수 호출을 통해 계산하면 느리다. 그래서 필요한 cos, sin값을 미리 계산해 두었다가 재활용할 수 있다. 비슷하게 f*cos, f*sin이 반복 된다면 앞에서 계산한 값을 그대로 쓰면 되잖아? 앞에서 주파수는 정수배만 분석한다고 했는데 그게 요령이다. 각 주파수의 cos, sin 값을 비교해 보면 일치하는 지점이 있다. 그 지점에선 주파수가 달라도 모든 값이 같다. 그러니 f*cos, f*sin 값도 주파수가 달라도 모두 같은 것이다. 왜 그러한지는 cos, sin 함수 그래프와 표를 그려 겹쳐 잘 관찰해 보시라. 고주파에서 곱셈은 이미 저주파해서 해 놓은 게 있다. 그러니까 앞 단계 저주파에서 이미 계산한 걸 합산만 하면 되는 거지.




이걸 수식만 달랑 보여 주니 도대체 뭔 소리인지 모르지. 
수식만 보지 말고 직접 숫자를 넣어 계산을 해 보라고.
구체적 접근이 추상적인 걸 이해하는 가장 빠른 길이여.



중요한 정치적 이슈나 경제적 이슈가 있는데 뉴스에서 사건, 사고 방송만 나온다면 정부의 개입을 의심해야 한다. 살인, 강간, 교통사고 등은 매일 발생하는 사건이다. 비행기와 배의 사고는 발생하기 힘들다. 레이더, 관제소, GPS, INS, 블랙박스, 자동항해장치 등 사고 예방 장치들과 사후 분석 장치들이 있어 사고 발생률이 낮다. 그런데 요즘 배들이 박치기도 잘 하고 침몰도 잘 하고 정말 이상하다. 술 마시고 운전했다고? 자동 항법으로 움직여도 제대로 갈 것인데? 조땅콩의 항공기 빠꾸 사건 등 너무 황당한 일들이 많이 벌어져서 뉴스를 보는 것인지 판타지 영화를 보는 것인지 모르겠다. 땅콩 하나 때문에 이렇게 세상이 시끄럽다니. 정말 위대한 땅콩이다.

댓글 없음:

댓글 쓰기