기계학습 이제 어렵지 않다.

최근 들어서 가장 나에게 많은 영향을 끼친 다른 어느분의 이야기를 들어보면 아래와 같다.

“희원씨는 머신러닝을 너무 어렵게 생각하는거 같아요.”

최근에 가장 나에게 임펙트를 많이 준 이야기였다. 왜 충격적이였냐 하면 실제 외부에 표출되는 나의 이야기에 대한 느낌이 다분히 그럴 수 있을거라는 나 자신에 대한 반성때문이다.

수년간 ML 알고리즘 공부하고 했지만 학교에서 배운 알고리즘과 개인적으로 습득한 알고리즘을 기반으로 실제 데이터라는 걸 많이 다뤄보지는 않았다. 물론 논문이라는 좋은 연구 과정이 큰 도움이 되었던게 사실이지만…
그러다 최근에 여러 프로젝트에 직간접적으로 참여하면서 이 ML이 어떻게 동작하는지 데이터를 통해 확실한 감을  느낄 수 있었다.  이는 책에서 배울 수 없는 소중한 것들이였다.

그런 상황에서 위와 같은 피드백을 들었는데 그동안 내가 블로그에 써 놓았던 이야기들이 너무 어렵지 않았나 하는 생각이 든다. 물론 블로그라는걸 누굴 위해서 쓴다는 생각을 해본적이 별로 없으니 크게 도의적인 책임감 같은건 들지 않지만 말이다. ^^;

위와 같은 피드백 다음으로 요청을 받은건,

“엔지니어 대상으로 ML에 대해서 좀 쉽게 접근할 수 있게 Tech Talk를 하거나 툴을  만들어 주세요”

이런 말씀을 하신 분은 내가 좀더 적극적으로 기술전파에 힘썼으면 하셨다.

하지만 위 방법은 아니지만 나는 이미 기술 전파에 힘쓰고 있었다. (잡지 기고문이나, 내가 직접 내 문제에 적용하는 사례로 등등)

요즘 가장 재미있는 현상이 위 이야기들을 같이 들었던 팀원분들이 ML에 대해서 예전하고는 다른 접근을 하고 있고 실제 실무에서 쓰려 하고 있고 다들 현재 ML의 효과에 대해서 피부로 느끼는 중이라는 것이다.
물론 내가 하는건 그분들의 접근을 쉽게 하기 위해 간단한 설명이나 코멘트를 하는 것이다. 물론 이것도 그분들이 직접 물어보시지만 말이다.

이런 분들이 물어보시고 나도 같이 마이닝 해보는 과정을 거치면서 나도 많이 배우고 그분들도 상당히 흥미로워하는걸 볼 수 있었다.

그런 재미를 느끼는 와중에 술자리에서까지 ML 이야기를 하는데, 어제 술자리에서 ML을 잘 활용하기 위한 첫번째 조건에 대한 아주 좋은 이야기를 들을 수 있었다.

“Must be a domain specialist! “

그 해당 분야 데이터에 대해서 깊은 이해를 하고 있는 사람이여야 한다는게 첫번째 조건이다. 어떤 라이브러리나 알고리즘을 사용한다는게 중요한게 아니라 해당 해결해야 되는 문제에 대해 충분히 고민해보고 관련 데이터를 만져본 사람이여야 한다는 이 주옥같은 한 문장은 어제 술자리에서 몽롱한 나의 머리속에서 박하향처럼 은은하고 시원하게 맴돌았다.

만능 ML specialist는 존재하지 않는다는 것이고,  다만 도메인 전문가만 있다는것이다.

언어면 언어, 스팸이면 스팸, 로그면 로그, 쿼리면 쿼리…..등등 말이다.

팀에서 각기 다른 도메인을 다루며 함께 고민할 기회가 없었는데, 이 ML이 훌륭한 공통분모를 만들어 줬다.
그래서 요즘 신난다.
내가 도움이 될 수 있고, 나도 배우고 그리고 결과물들도 꽤 좋은 퀄리티를 보여주니 말이다.

이런 최근의 경험을 통해서 ML에 대해 배운것은 아래와 같다.

1. ML알고리즘을 고르고 구현하는데 시간을 허비하기 보다는 데이터를 세밀하게 전처리 하는데 시간을 투자하는게 훨씬 나은 성능을 보장한다.

2. 일단 잘 전처리되고 명확하게 분류가 가능한 문제일 경우 어떠한 알고리즘으로 돌리더라도 서로간의 비슷한 퍼포먼스를 보여준다.

사실 1번 문제는 Decision Tree를 돌릴때  numerical 값을 binomial이나 discretize 할 필요가 있는데, 단순히 binomial로 전처리 하니 40%정확도가 나오던것을 discretize 해서 70%이상의 정확도를 보여준 사례를 경험했기 때문이다.

게다가 이런 70% 이상의 정확도는 다른 알고리즘을 같은 데이터에 적용할때 알고리즘에 따라 그렇게 큰 정확도 차이를 보이지 않는다는 것이였다.(약 1~2% 정도 차이가 날 뿐이다.)
그리고 70%의 정확도는 분류의 문제에서 좋은 시작점이 된다.

그렇다면 이런 70%의 성능을 어떻게 향상을 시켜야 되냐의 새로운 문제가 봉착하게 된다. 이런 성능향상의 방법은 데이터에 대한 또다른 접근 방법이 필요함을 의미한다.

일단 같은 성능을 보이는 수준까지 쓸모없는 feature를 제거하고 잘못 분류한 데이터들이 어떤 특징을 가지고 있는지 또 다시 데이터를 리뷰한다.
그 특징이 명확하게 몇가지로 함축된다면 그런 특징만을 처리하는 분류기를 학습시켜서 그런 특징을 가진 데이터만을 처리하게 할 수 있다. 그러나 기존의 분류기에 이런 기능을 통합하고자 한다면 좀 복잡해 진다. 새로운 feature를 발굴하거나 새로운 학습셋으로 모델빌드를 해보는 과정을 반복해야 하기 때문이다.
이런 고급 주제는 ML관련 논문의 좋은 하나의 주제가 된다. 대부분의 논문이 위의 feature나 알고리즘을 만드는 것을 소재로 하고 있는걸로 봐서는 말이다.

내가 세상에서 가장 좋아하는 그래프는 아래와 같다.

사용자 삽입 이미지

내가 알고자 하는 거의 모든 문제 공간들의 데이터들은 대부분 위와같은 미처 알지 못하는 평균과 표준편차를 가지는 정규분포를 가지고 있다.
뭔가 규칙이 있을거 같은 그런 문제는 자연상태에서 위와 같은 분포를 보여준다. 저기에서 새로운 데이터가 들어왔을때 어느 정규분포에 속하는지 예측하는게 분류이다. 만일 위에서 한점의 x값이 들어온다면 각 정규분포 곡선에서 그 점이 나올 수 있는 확률값을 구할 수 있고 그 확률값이 큰 쪽의 정규분포에 미지의 값의 예측되는 클래스를 할당할 수 있을 것이다.

이제 이쪽에 대해서 총 정리를 해볼 시점이 온거 같다. 그 정리라는게 실무가 될지 아니면 개인적인 프로젝트(논문)로 하게 될지 모르지만 아무튼 해봐야 할건 해 나가 보자!

CC BY-NC 4.0 기계학습 이제 어렵지 않다. by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.