kalman filter는 대부분 잘 알고 있고, 대단히 많은 내용들이 알려져 있기 때문에 핵심이 되는 내용 몇 가지 내용만 기록해두려 한다.  wiki 나 다른 자료들을 보면, kalman filter가 prediction과 update라는 두 개의 흐름 구조를 갖고 있는 것을 쉽게 알 수 있다. 대체 prediction 과 update 는 어떤 원리를 기본으로 두고 하게 되는 것인가? 


1. gaussian

  kalman filter 의 update 는 bayes rule 을 기본으로 product 의 성질을 갖고 있다. 또한, prediction 은 convolution 연산에 해당(사실상 덧셈)하며, total probability 을 계산한다. 사실 이렇게 말로 써놓으면 뭔 말인가 싶은데, 그림으로 가볍게 살펴보면 그렇게 어렵지 않다. (물론, 개념적인 부분만 한정해서 그렇다.)


  여기 그렇게 많이 보던 gaussian 이다.  평균 μ 와 편차 σ 를 따르는 gaussian 함수는 상기의 수식과 같이 정의된다. 다들 알고 있는 바와 같이 대부분의 자연 현상을 모델링 하는데 있어서 가장 많이 사용하는 함수로 알려져 있다. kalman filter 는 gaussian 을 다루는 filter 라고 할 수 있는데, 대체 prediction 과 update 는 gaussian 과 무슨 상관이란 말인가?


  prediction 과 update 중 우선 update 를 살펴보면, 엄밀히 말하면, measurement update 인데, 위의 그림과 같이 구성되어 있다. 풀어서 설명을 하자면 prior p(x) 는 이전에 알고 있는 사전 지식에 해당한다고 생각하면 되고, measurement p(z|x) 는 센서로부터 취득된 데이터라고 생각하면 된다. 그리고 updated results 는 이러한 취득된 데이터로부터 갱신해 나가게 되는 새로운 확률분포 x 에 해당하는데, p(x|z) 를 계산하는데 bayes rule이 적용된다. 아래의 μ' 과 σ' 은 수식적으로 계산하는 부분을 정리했을 뿐이다. 즉, update 부분은 어떤 센서로부터 측정된 데이터를 알고자 하는 사전지식에 업데이트하기 위해 확률 분포를 정의하는 부분에 해당한다.


  prediction 은 그럼 무엇일까? prediction 은 더 단순하고 간단한데, 이미 알고 있던 확률 분포에 다른 확률분포를 합산하여 새로운 값으로 갱신하는 역할을 한다. 즉, total probability 의 개념이 적용되며, convolution(addition) 연산이 내부적으로 사용된다. 

  정리하자면, 결국 kalman filter의 풀이 방식을 보면 bayes rule을 기본으로 활용하고, 측정된 값을 토대로 예측하기 위한 확률 분포를 정의하고, 기존에 있던 값을 의미하는 확률 분포에 더하여 새로운 확률 분포 값으로 갱신해준다고 할 수 있다.

  그리고 위의 지식을 바탕으로 다시 해석해보자면, kalman filter 는 system 의 model 을 정의 했을 때, 그 모델의 노이즈나 에러에 해당하는 term 이  gaussian distribution 을 가진다고 가정하고, 위에 기반한 방식으로 system 에 발생하는 노이즈나 에러를 최소화 하는 형태로 시스템을 update 할 수 있다는 것이다. 그로 인해서 우리가 센서자체가 갖고 있는 노이즈들을 핸들링 하고, 더 정교한 tracking/estimation 등이 가능하다는 것인데... 얼마나 놀라운 일인가? 여기까지 공감이 간다면 kalman filter 는 대강 감이 올 것 같다.

  그리고 extended kalman filter 나 unscented kalman filter 나 결국 다 kalman filter 이기 때문에 같은 구조를 가지고 있다. 그런데 대체 왜 다른 형태로 정의된 3가지 kalman filter 가 있는 것일까?


2. modelling

  결국 kalman filter 에서 extended kalman filter, 그리고 unscented kalman filter 에 이르기까지 새로운 형태의 kalman filter 가 만들어지게 된 이유는 이 모델링 때문이다. 우리가 state transition equation 과 measurement equation 을 정의할 때, 부득이하게 non-linear term 이 발생하고, 여기서 이것을 handling 하기 위해 미분하여 jacobian 을 핸들링하게 되면, extended kalman filter 가 정의된다.

  조금 더 자세히 말하자면, system 의 특성을 볼 때, 특정 구간에서 linearization 을 통해 문제를 해결할 수 있다면, non-linear function 을 taylor expansion 으로 풀어내고, 그 구간 내에서 jacobian 을 계산하여 핸들링 하면 extended kalman filter 가 된다. 즉, kalman filter 자체가 linear system 을 가정하고 만들어졌기 때문에, 이에 대한 non-linear extension 이 extended kalman filter 가 된다. 그러므로 extended 하는 방식에 있어서 수많은 modification 이 있는데, 대부분 system modelling 에 따라서 linearization 을 하는 방법들에 포커스가 맞춰져 있다.

  또한, 여기서 한발 더 나아가서 이도저도 다 귀찮으니, state transition model 에 이러한 term 을 모조리 때려박고, gaussian process 로 모든걸 처리하게 되면 unscented kalman filter 가 정의된다. unscented kalman filter 는 일부 값을 sampling 하여, 임의로 약간의 변동성을 추가하여 그 값들을 가지고 gaussian distribution 을 계산하게 되는데, 엄밀히 말해 완벽하게 시스템을 모사하는 것을 목표로 하지 않는다. 다만, jacobian 을 계산하는 과정이 필요 없고, 그로 인하여 시스템의 모델링이 단순해지는 장점이 있지만, 통상적으로는 연산량은 unscented kalman filter 가 조금 더 많은 것으로 알려져 있다. (sigma rule 이나 계산 하는 방식에 대해서는 wiki 를 참고 하는게 좋다.)


3. 정리

  사실 말로 주절주절 적어두어서 이걸 보고 다른 사람들도 kalman filter 를 완전히 이해할 수 있을지 애매하다. 개인적으로는 가장 중요한 직관적인 요소가 gaussian distribution 과 bayes rule 이 결합되었을 때, 어떻게 변화하는가에 대한 부분이라 그 부분에 포커스를 맞추어 정리해두었다. 물론, modelling 부분에 적어두었지만, 사실 kalman filter 류의 가장 key 는 model 이다. system 을 modelling 한 결과에 따라서 다른 종류의 filter 를 사용하게 되고, 대부분의 실세계 문제에는 extended kalman filter 가 제일 좋은 성능을 보여준다. 그러나 system modelling, 그리고 이것에 대한 미분식의 도출이 그렇게 쉽지 않기 때문에 다들 머리 싸매고 고생한다.

  직관적으로 우리가 kalman filter 를 볼 땐, 상기 그림과 같이 확률분포가 계속 업데이트 되어 점점 좁고 뾰족한 형태로 변해가야 정상이다. 그렇지 않다면 설계를 잘못한 탓일 확률이 높다. 그 바탕에는 저런 직관적인 요소가 있고, 그 background 에 있는 수학적 요소와 기타 보다 자세한 내용들은 다른 reference 를 참고하면 좋을 것 같다. 여기서 이야기 하고 싶은 것은 kalman filter 는 남들 이야기하는 바와 같이 system 의 error/noise 를 핸들링 하는데, 대체 어떤 식으로 변하는 지에 대한 직관적 이해 정도이다.

Posted by SHHyun

쉬운건데, 이상하게 매번 걸리적거리고 피곤하게 처리하는 내용이라 정리해놓는다.


1. 아래 홈페이지에서 Preconditions에 Windows/Unix 링크 다운

https://support.hdfgroup.org/HDF5/release/cmakebuild.html


2. 어딘가에 압축 풀어놓기.. or 설치


3. HDF5-1.10.1-Linux.sh 실행 


여기까진 뭐 그냥 쉽게 잘 간다.


마무리로  .bashrc 든 윈도우 환경이든

HDF5_DIR=뭔가설치된 폴더/cmake 지정

example) export HDF5_DIR=/usr/local/HDF_Group/HDF5/1.10.1/share/cmake


위에 HDF5_DIR 지정해주면, cmake 에서 hdf5 에 대한 내용들을 인식하여 처리할 수 있다.

Posted by SHHyun

최근에 Multi- 혹은 Many-objective 에 대한 연구를 진행하고 있다. 회사에서 필요한 부분도 있지만, 오랫동안 개인적으로 연구해오던 테마이기도 하기 때문에, 꽤 많은 자료를 다시 살펴보고 연구를 진행하고 있다.


만약, 목적함수의 개수가 하나라고 가정하자. 이 경우에는 최소 혹은 최대라는 하나의 값으로 수렴해나갈 수 있다. 그러나 Trade-off 관계에 있는 2개의 목적함수를 사용할 경우에 한쪽이 상승할 경우, 필연적으로 다른 한쪽은 낮아질 수 밖에 없다. 만약 3개 이상의 목적함수가 각각이 상보적인 관계일 경우, 값의 방향성을 어떻게 잡아가야 하는 지는 더욱 모호해질 수 밖에 없다.


이러한 문제들에 대한 보편적 접근 방식은 Weight 를 적용하여 목적함수에 대한 가중을 두어 수렴시키는 방식이다. 예를 들면 보행 로봇의 직진성과 좌/우 흔들림에 대해서 직진성에 0.8, 좌/우 흔들림에 0.2 와 같은 식으로 가중치를 두어 더 빠르게 움직이는 것을 더 중요하다고 보는 식이다.


우리가 정확하게 어떤 Spec 을 주고, 그 Spec에 맞도록 학습/최적화를 진행한다고 할 때에는 관계가 없을 수도 있다. 그러나 때로는 이 가중치를 정의하기 어려운 경우가 있을 수 있다. 그리고 정 반대로 수 많은 선택지를 만들어내고, 그 속에서 무엇인가를 고르고 싶은 경우도 있다.


Multi- 혹은 Many-objective 에 대한 연구는 이러한 방향성을 가지고 있다. 즉, 기존에 Weight 를 주어 하나의 값으로 수렴시키는 것을 목적으로 했다면, 이 연구는 어떻게 더 넓게 해를 표현할 수 있는지에 관심을 갖는다. 그리고 Trade-off 관계에 있는 다양한 해를 효율적으로 찾아가는데에 목적을 갖는다. 이렇기에 현실 문제에 적용하기가 좋은 특징이 있어서, 많은 관심을 갖고 연구를 진행하고 있다.


다음에는 관련해서 진행되어온 연구들을 정리할 예정이다.  --> 과연 이걸 언제쯤 하나씩 하게될까...

Posted by SHHyun

진화 연산은 여러면에서 매력적입니다. 공간에 대한 분포를 잘 모르고, 문제정의만 하면 왠만큼 해를 구할 수 있다는 것이야 말로 엄청난 매력이라 할 수 있죠. 복잡한 수학이 들어가 있지도 않고, 알고리즘만 이해할 수 있으면 누구나 쉽게 구현하고 접근할 수 있습니다. 이런 장점으로 많은 사랑을 받아왔죠.


그러나 이 부분이 진화 연산의 장점이면서 동시에 한계입니다. Evolutionary Strategies 나 기타 Covariance Matrix Adaptation 기법 등이 나왔지만, 여긴 수학의 영역에 약간의 진화연산의 Mutation 의 기법이 들어갔다고 보는게 맞을 것 같습니다. 또는 Mutation 이라는 것이 확률적이라 표현하는 확률의 기법이 들어갔다고도 볼 수 있겠네요. 거의 Random 에 가까운 속성으로 인하여, 해를 찾아도 왜 찾았을 까에 대해서 물음표가 생기고, 다시 한번 수행하더라도 꼭 그렇게 찾을 수 있다는 보장을 하기도 어렵습니다.


흡사, 문제 풀이를 로또와 같이 한다고 느끼는 사람도 있을 것 입니다. 아직은 주어진 해 공간에 대해 모두 시험해볼 수 없으니 이것을 대체하여 로또의 확률을 느끼는 것과 같이 대량의 시험을 해보는 그런 상황으로 비추어지기도 할 것이고, 언젠가 양자컴퓨터나 기타 더 강력한 컴퓨팅 환경이 주어졌을 때, 모든 경우의 수에 대해 시뮬레이션을 해보고 그 결과를 얻어내는 것과 진화 연산의 차이가 없어지는 날이 오겠죠.


이런 한계는 Genetic Programming 에서 더 심하게 나타납니다. 우리는 주어진 수식에 대해 파라미터를 계산하거나 신경망이나 기타 접근 방식을 통해 수식 자체를 근사화하여 모사하는 행위를 하지만, 이것은 값을 따라가도록 하는 어떤 방향성을 Loss-function 으로 정의하여 그 근거를 가지고 있습니다. 물론, Back-propagation 이 편미분이 연속적으로 연결되어 있는 chain-rule 이라는 것도 확인할 수 있습니다.


그러나 수식 자체를 Tree 형태로 표현한 것에 대해서 수식 자체가 갖는 공간적 표현을 수학적으로 모사하지 못합니다. (지금은 하고 있는데, 제가 모르고 있는 것일 수도... ) Tree 의 특정 위치를 교환하거나, 전혀 다른 Sub-tree 로 교체하여 수식을 풀어나간다고 하지만, 그 자체에 대해 어떤 수학적 근거를 갖는지에 대해서는 설명하기가 어렵습니다. 특히나 Fitness function 의 정의가 어떤 방향으로 유도한다고는 하지만, 이것이 항상 그 방향으로 유도되어 나아가는 것도 아니라는 것을 확인할 수 있습니다.


예전에 Tree 의 Distance Metric 을 정의한 여러가지 사례가 있었는데, 이 Distance Metric 은 비교적 Tree 의 차이에 대해 정의할 수 있었고, 이 Metric 을 통해서 특정 Tree 형태로 수렴할 수 있도록 Guidance 로 사용할 수 있었습니다. 문제는 Tree 의 구조적 형태가 좋은 해와 그렇지 않은 해를 구분하기에는 적절치 않았다는 것에 있었죠. 즉, 우리가 어떤 형태의 Tree 로 해를 유도한다고 해도, 사실 그 구조를 가진 해가 좋은 해인지를 판별할 방법이 없었습니다.


Genetic Programming 이나 Grammatical Evolution 은 진화 연산 중에서 Tree 구조를 사용하여 새로운 구조를 만들어나 갈 수 있다는 장점이 있지만, 반면 연속적인 시간 변화에 대한 값으로 주어진 결과물을 모사하기 위한 어떤 구조를 만들어낸다는 측면에서 2차원으로 주어진 데이터를 전혀 다른 공간의 형태로 Mapping 하는 일종의 Black-box Optimization 으로 생각하기에 아직은 수학적으로 접근할 수 있는 부분에 한계가 있는 것 같습니다.


언젠가는 연속적인 시계열 데이터나 기타 일련의 알고리즘을 Tree 나 다른 형태로 Mapping 하는 수학적 방법에 대한 제안이 있을지 모르겠습니다만, 이러한 부분이 극복되지 않는다면 결국 진화연산은 항상 랜덤에 의존하는 그런 최적화 방식으로 치부되지 않을까 싶습니다. Schema 이론이나 기타 몇가지 이론이 있지만, 그렇다 해도 말이죠.

Posted by SHHyun

예전에 tensorflow 를 처음 사용할 때, 리눅스 설치때문에 엄청나게 고생했었던 기억이 있다.


특히나 CUDA를 사용하는 부분에서, 노트북(GT 650M 사용)이 개발환경이다보니 일반적인 설치파일을 그냥 다운받는 것으로는 문제가 있어 많은 시간이 소모되었었는데,


얼마 전에 Ubuntu 16.04 버전으로 버전업하고, 그때의 과정을 되풀이 했는데, 너무나 쉽게 되었다.


1. Ubuntu 16.04 버전 설치


2. 그래픽카드 드라이버 설치

    sudo add-apt-repository ppa:graphics-drivers/ppa

    sudo apt-get install nvidia-370   

    설치 이후 재부팅하여, nvidia-settings 로 정상 설치 확인


3. CUDA 설치

    sudo apt-get install nvidia-cuda-toolkit

    example 이 필요하면, nvidia 사이트에서 다운


4. cuDNN 설치

    /usr/include, /usr/lib 에 설치함(기존에는 /usr/local/cuda ... 에 설치)

    CUDA v7.5 기준 v5 설치


5. anaconda2 설치

    https://www.continuum.io/downloads

 

6. tensorflow 설치 (설치시점에는 v0.11 사용함)

    http://tensorflow.org 참조


세상에... nouveau blacklist 따위도 필요 없고, 그냥 잘 된다.

진작 16.04 로 옮겨갈걸 그랬네...;;

Posted by SHHyun

예전에 처음 신경회로망을 배우고, 알고리즘으로 학습을 모사할 수 있다는 것에 대해서 상당한 매력을 느꼈었는데, 잘 정제되어 있는 학습데이터가 없이는 결과가 좋지 않았기에 그 이후로 크게 관심을 두고 있지는 않았었다. 한동안 그러다가 비전과 관련한 분야에 대해 공부하면서, 특징점을 추출하기 위한 부분을 신경망을 활용하여 드라마틱한 성능의 향상을 보여주는 것을 보고 다시 관심을 가지게 되었었다.

 

신경망에 대해 다시 관심을 갖기 시작했던 때에는 호기심에 한창 CUDA로 GA에서 실수최적화 기법을 사용하는 알고리즘들을 병렬화시키는 부분에 대한 개발하고 있었다. 그래서 처음에는 당연히 가중치 계산에 대해서 예전보다 더 큰 규모의 신경망을 보다 빠르게 학습시키는 것에 대해서만 생각하고 있었다. 

 

CUDA 를 처음 활용하면서, 그때 오류역전파 알고리즘을 구현하고, 10계층에 5천개 정도의 뉴런을 학습시키는 프로그램을 만들어 돌리면서, 진짜 빠르다는 생각은 하고 있었지만, 사실 제대로 최적화가 안되었었다. 아주 단순한 문제에 대해서 5천개의 뉴런을 학습한다는 게 가당키나 한 말인가? Learning Set이 5천개의 뉴런을 학습시킬 만큼 다양한 데이터 셋을 갖출리가 만무했고, 당연히 결과는 수렴 속도는 진짜 빠르네 였을 뿐이다. 물론, 그 당시에는 왜 안될까에 대해서 계속 의문이 있었을 뿐이었지만...

 

시간이 좀 지나고 나서, CNN 과 RNN 에 대해서 알게 되었다. 처음 CNN 이나 RNN 을 접했을 때에는 그 부분에 대해 정확히 이해하지 못하고, 단순히 더 계층화 되고, 다른 형태의 전달함수를 사용하지 했을것 같다는 정도로 생각했던게 문제 였다. 결론적으로 다시 하나씩 곱씹어보고 당연히 비전쪽에 잘 맞춰져 동작할 수 있겠구나 라는 생각이 들게 되었지만... 이 시점에 나는 학습데이터를 충분히 확보하지 못하는 시점에도 어느정도의 목표를 향해 결과를 보여줄 수 있는 특성이 있는 진화 신경망 쪽에 더 관심이 많았다.

 

회사에 오고나서는 신경망이나 진화연산과 같은 머신러닝 기법을 사용하기가 참 힘들었다. 가장 큰 장벽은 확률적. 그리고 언제나 동일한 해를 보장하지는 않는다는 점. 그런 부분을 이해시키는 것이 너무 말도 안되는 일이었다. 내가 일하는 곳이 산업용 로봇을 만드는 곳이니 당연한 것이기도 했다. 비교적 최근에 다시 고장예지나 다른 분야에 이러한 기법들을 사용할 수 있다는 것에 대해서 사람들이 인지하기 시작한건 참 다행이라 생각한다.

 

어쨌든, 신경망은 CNN과 RNN 이후로 눈부신 발전을 거듭하고 있고, 더 많은 연구자들과 함께 획기적인 결과물들이 쏟아져 나오고 있다. 놀랍고, 경이롭다. 언젠가는 내가 연구하는 여러가지 기법들 중, 나로 인하여 이러한 폭발적인 연구 성과를 보여줄 수 있기를 희망한다.

 

 

Posted by SHHyun

이책의 저자인 페드로 도밍고스는 기호주의자(Inverse Deduction), 연결주의자(Back-propgation), 진화주의자(Genetic Programming), 베이즈주의자(Bayesian Inference), 유추주의자(Support Vector Machine)로 머신러닝의 다섯 종족을 구분해두었다.

 

머신러닝의 기본서 같은 책이라 추천받아 봤는데, 세상에나... 난 진화연산을 머신러닝의 한 분파로 분류해줄 줄은 몰랐다.

 

진화연산을 공부하면서 항상 고민되던 부분이 어떻게하면, 진화의 부분을 학습과 같이 수행할 수 있도록 하는가에 대한 것이었다. 예를 들면 역전파 알고리즘은 항상 결과의 피드백으로 가중치의 값을 변경해나아가는데, 이 과정을 하나의 목표를 향한 학습이라 볼 수 있다.

 

그런데, 진화 연산에서의 선택은 많은 부분에 있어서 랜덤이다. 물론 진화연산을 이용한 수치최적화 부분에서의 일부 연산 방식의 경우, 결과값을 기반으로하여 점점 본래의 값을 변화시켜 나아가기 때문에 일종의 학습처럼 보일 수 있다. 그러나 유전프로그래밍의 연산자는 트리의 어떤 한 노드를 선택하여 하위 전체 노드를 변경하거나, 랜덤으로 특정 노드를 특정 트리나, 노드로 변경하는 방식이 대부분이다. 그렇기에 이를 학습이라보기는 항상 어렵다고 생각하고 있었는데, 이를 머신러닝의 한 분류로 넣어줄 줄은 몰랐다.

 

이 책에서도 물론 의문을 제기하고 있긴 하다. 여전히 유전프로그래밍이 문제를 해결하는 방식이 수많은 탐색공간을 뒤지는 탐색의 결과인지, 진화를 모델링한 것의 효과인지는 불분명 하지만... 이라는 단서를 달아서. 그리고 나 역시도, 이 부분에 대해서 공감은 하지만, 순수한 랜덤 탐색으로만 찾아낼 수 있는 결과에 비해 항상 더 우수한 결과를 보여줄 수 있는 것은 진화의 모델링에 의한 결과라고 생각한다.

 

아무튼 흥미로운 관점이고, 머신러닝의 다른 부분에 대해서도 다시 간단하게 살펴볼 수 있는 좋은 기회였다.

Posted by SHHyun