본문 바로가기

Enginius/Projects

MFC - Hierarchical Temporal Memory 1st Prototype Test



 On Intelligence를 보고 Jeff Hawkins의 Inference(적절한 단어가 생각이 안남..)를 바라보는 관점에 완전히 매료된 이후로 대략 3개월 동안 Numenta에서 올린 자료를 바탕으로 HTM을 실제로 구현했다. 정말이지 혼자서 개발한다는 것은.. 인고의 시간이었다. 


Numentahttp://numenta.com/

HTM_CorticalLearningAlgorithms.pdf


이 과정에서 HTM에 관한 여러 포스팅도 하였고, (아무도 관심은 없었지만)


 1. Overview:    http://enginius.tistory.com/256

 2. Algorithms:  http://enginius.tistory.com/265

 3. 하다만 번역http://enginius.tistory.com/236


 GUI를 위한 MFC 관련 포스팅도 하였다. 


 1. BITMAP사용하기http://enginius.tistory.com/275


 모 여튼 길고도 재밌는 시간이었다. 물론 아직 프로그래밍 실력이 많이 미천하기 때문에 약간의(사실 매우 많은) 메모리 누수가 일어난다.   최대한 잡는다고 했는데 모두 다 잡는데는 실패했다. 일단 기본적으로 Learning을 위한 객체를 계속 생성하기 때문에 이에 의한 영향도 있는 것 같다. 


 HTM의 Overview를 대충 읽어보면 알겠지만 이 Machine Learning Technique의 핵심은 예측에 있다. 즉 주기적인 신호가 들어올 경우 그 신호를 예측하고, 이를 바탕으로 clustering 해주는 알고리즘이다. 


 실험은 최대한 직관적으로 하기 위해서 20 by 20의 이차원 입력 신호가 있고, 이 평명의 중앙에 입력이 왼쪽에서 오른쪽으로 이동하게 하였다. 이러한 입력에서 HTM이 어떻게 동작을 하나 알아보는 것이 이 실험의 목적이었다. 실험을 하는 와중에 구현이 잘못 되었거나 이상한 부분들을 수정하였다. 


 결론부터 말하자면 HTM이라는 알고리즘은 여러 상황에 적용하기는 쉽지 않아보인다. 첫번째 이유는 엄청난 메모리와 Computational Resource를 사용한다. 두 번째 이유가 사실 critical한데, parameter들이 너무 많다. 이 알고리즘을 처음 접했을 때는 multilayer perceptron 구조와 매우 비슷하다고 생각했다. 


 1. 참고 사이트:       http://www.aistudy.com/neural/multilayer_perceptron.htm

 2. MLP 구현:       http://www.codeproject.com/Articles/9447/Neural-Network-Classifier

 3. 글자 인식 구현:  http://enginius.tistory.com/219

 

 하지만 실상은 multilayer perceptron에 비해 매우, 매우매우, 매우매우매우 복잡한 구조였다. 


Multilayer perceptron



Hierarchical Temporal Memory



//////////////////////////////////

// Thresholds //

//////////////////////////////////

connectedPerm = 0.7;

activationThreshold = 6;

minThreshold = 2;

double minOverlapPercent = 0.3;

minOverlap = 2;

///////////////////////////////////////////

// System parameters //

//////////////////////////////////////////

permanenceInc = 0.08;

permanenceDec = 0.05;

double input_connect_rate = 0.2;

synapsesPerSegment = 80;

newSynapsesCount = 20;

double inhibitionRate = 0.4;

desiredLocalActivity = 20;


 위의 parameter들이 기본적으로 설정해줘야 하는 값들이었고, 이 값들을 조금만 변경해도 동작이 많이 바뀌었다. 


 대망의 실험 결과는 다음과 같다. 사실 조금 .. 아니 많이 실망스럽다... 그래도 HTM이라는 것이 생각한데로 동작한다는 것을 확인할 수 있다는 것에 의의를 두겠다. 물론 HTM의 H즉 Hierarchical이지만 개발 막바지의 귀차니즘으로 인해서 계층이 1층에 불과한 것도 문제의 원인일 수 있겠다. 


 


 먼저 이 동영상의 맨 왼쪽은 Input Layer이고, 가운데 영역은 Region 1이다. 그 오른쪽은 계층구조를 위해 Region 2로 하려고 했으나 귀차니즘..으로 인해 구현하지 않았다. 아마 2nd Prototype에는 넣지 않을까 싶다. 


 동영상 에서 검은색은 아무것도 들어오지 않는 것을 의미하고, 흰색은 입력이 들어온 것을 의미한다. 초록색은 입력에 의해 activate된 것이고, 파란색은 예측을 의미한다. 


 동영상의 처음에는 학습된 것이 없기 때문에 많은 영역에 파란색이 보인다. 즉 수많가지를 예측하는 것이다. 이러다가 어느정도 학습을 하고 나면 파란색, 즉 예측 되는 것이 초록색이 지나가는 길에만 한정되는 것을 볼 수 있다.


 즉 이 간단한 HTM이 어느정도 예측을 하고 있는 것을 알 수 있다. 

 

프로젝트 소스 파일


 

'Enginius > Projects' 카테고리의 다른 글

FW, MFC - miniJoyStick ver2.0  (0) 2012.05.15
FW, MFC - miniJoyStick  (0) 2012.05.11
MFC - Docking Station IR Simulation  (0) 2012.01.20
MFC - Cleaning Robot Simulator  (1) 2012.01.10
MFC - Two-wheel Robot Simulator version 2.1  (0) 2011.12.31