Linear classification.

어제 모임이 있어서 갔다가 요즘 블로깅 뜸하다는 이야기를 친구에게 들었다.
사실 요즘에 정말 바쁘다.
회의도 많고 일도 만만치 않고…
회의가 많다는건 참여하고 있는 프로젝트가 많다는 걸 의미하니.. 회의를 줄여야만이 일이 줄일수 있을거 같다는 생각이 좀 든다.
그래서 회의를 가급적이면 피해볼라고 노력중이다. ㅋㅋ

머리속에 들어있는 생각중에 가장 큰 것은 랭킹이다.
랭킹 디자인을 하고 함수를 만드는 일을 하고 있는데 의외로 이 작업이 재미있다.
일단 프로그래밍의 재미를 생각하자면, 고차원 벡터 데이터를 사용해서 프로그래밍을 해야 하기 때문에 이 작업 자체가 일반 프로그래밍 작업에서 자주 하지 못하는 신나는 작업이다.
작업을 하면서 functional programming 언어가 이런 작업에 적당하다는 것도 새삼 알게 되었다.

예를 들어 dot product나 vector의 norm을  만드는 작업을 아래와 같은 Erlang함수로 만들 수 있다.

[CODE js]
dot_product([H1|T1], [H2|T2]) ->
    H1 * H2 + dot_product(T1,T2);
dot_product([], []) ->
    0.

vec_norm(Vec) ->
    vec_norm(Vec, 0).
vec_norm([H|T], Accu) ->
    vec_norm(T, Accu + math:pow(H, 2));
vec_norm([], Accu) ->
    math:sqrt(Accu).
[/CODE]

물론 vector sum이라든지 여러 vector작업에서 쓰이는 function들을 위와같은 형태로 간단하게 구현이 가능하다. 물론 코드도 더 이해하기 쉽다. (for문 여러개 중첩하는것보다.)

한가지 Erlang으로 하면서 문제가 생길 부분은 learning 자체가 state를 계속 유지해야 하는 문제가 있는데 이것이 Erlang에서 자체적으로 static변수나 global 변수를 유지하지 않고 게다가 Class같은개념도 없기 때문에 문제가 있다. 이것은 애초에 언어가 concurrent programming을 위해 태어났기 때문인데.

이 부분은 살짝 process를 이용한 인자 넘기기를 이용하면 해결이 가능하다.
아래 코드처럼 얼개를 만들어 두어 프로세스로 띄운 다음에 누적 학습 정보들을 인자로 다시 넘기면 가능하다.

[CODE js]
linear_training_two(AccuData, ScaleSrc, EachCenter, MidVec) ->
    receive
       {train, Data} ->
          %something todo
          linear_training_two(AccuData, ScaleSrc, EachCenter, MidVec);
       {endtrain} ->
          %something todo
          linear_training_two(AccuData, ScaleSrc, EachCenter, MidVec);
       {evaluation, RawData} ->
          %something todo
          linear_training_two(AccuData, ScaleSrc, EachCenter, MidVec);
       {debugging} ->
          %something todo
          linear_training_two(AccuData, ScaleSrc, EachCenter, MidVec)
    end.
[/CODE]

위 방법말고 ets나 dets 등의 내부 라이브러리를 이용한 데이터 저장 방법이 있는데 위의 방법이 가장 Erlang 스럽고 concurrency 프로그래밍에 적합하며, 나중에 확장하기도 적합한 방법이지 않을까 한다.

이렇게 해보면서 살짝 드는 생각이 Erlang process가 Class의 개념하고 약간 비슷하다는 생각이다. 물론 자바 Class처럼 우아하지는 않지만 나름 Class틱하다.

Erlang으로 힘들게 디자인 했는데, 물론 고생한 보람이 있다.
추후 위 process를 각 노드마다 수개씩 만들어 대용량 학습시 활용하면 꽤 괜찮을 듯 하다.
물론 각 학습 Process를 어떻게 merge할지를 고민해야 겠지만 인자값만 가지고 merge 하는거니 그리 어렵지는 않을거다.

CC BY-NC 4.0 Linear classification. by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.