Share           Pin It
데이터 마이닝이나 머신러닝, 인공지능 AI 등에 관한 심도깊은 얘기는 다루지 않는다. 내가 그런 심도깊은 일을 하고 있지 않기 때문이기도 하거니와 그런 내용은 학교에서 정식으로 배우거나 많은 연구 논문을 읽으면서 터득해야할 영역이다. 개인적인 요청이 있다면 그걸 위해서 가이드해줄 수는 있지만 이 티스토리에서 그걸 해결해줄 수는 없다. 하지만 2017년에는 공부 좀 하기로 마음을 먹었으니 필요하면 특별한 주제에 맞춰서 또는 머신러닝 알고리즘의 전반적인 것에 대해서 종종 다루려 한다. 계획이 그렇다는 것이지 몇 번을 다룰지는...

최근이라 적고 작년 2016년에 가장 큰 이슈가 됐던 강화학습과 GAN (Generative Adversarial Networks)에 대한 소개 또는 개념적 이해를 돕기 위해서 글을 적는다. 남들이 이해하도록 돕는다기보다는 스스로 정리하고 넘어가고 싶었다.

알파고 AlphaGo가 이세돌 9단을 4대1로 꺾은 이후로 가장 떠오른 단어 또는 개념은 강화학습 Reinforcement learning이다. 물론 알파고가 딥러닝 Deep learning에 기반한 인공지능 AI Artificial Intelligence지만, 딥러닝이나 AI라는 단어는 그전부터 언론에도 많이 등장했었다. 단지 알파고 충격 전에는 이런 용어에 대한 소비 니즈가 없었기 때문에 일반인들은 무시했을 뿐이다. 다른 것보다 강화학습이 더욱더 부각됐다는 의미다.

그런데 강화학습이라는 게 전혀 새로운 개념이 아니다. 사실 기계학습 Machine learning이라 부르는 대부분의 알고리즘 (또는 학습법)은 강화학습에 기반을 두고 있다. 강화학습은 어떤 액션에 대한 반응에 따라서 그 액션의 정당성을 얻느냐 못 얻느냐가 판별하고, 정당성을 얻은 액션은 향후에도 계속 하도록 장려받도록 훈련받는 것이다. 애완견에서 '앉어'라고 말한 후에 개가 실제로 앉으면 '간식'을 준다. 처음에 개는 앉어 명령어와 간식 사이의 연관성을 모른다. '앉어' 명령어에 우연히 앉아서 간식을 얻었다면, 그리고 반복적으로 '앉어' 후에 간식을 계속 받아먹는다면 개는 '앉어'와 '간식' 사이의 인과성을 발견한다. '앉어' 명령어에 앉으면 간식을 얻는다를 학습한 것이다. '앉어'는 액션이고 '간식'은 리워드다. 역으로 어떤 액션을 피하게 하는 페널티도 비슷한 메커니즘이다.

기계학습에서는 이런 과정을 데이터로 한다. 특히 지도학습 Supervised learning이 그렇다. Y = f(X)에서 f() 함수 (또는 모델)을 유추할 때, 주어진 X에 대해서 정답 Y를 뱉어내면 f() 함수를 제대로 유추한 것이고 그렇지 못하면 해당 유추를 무시하면 된다. 정답 Y가 있는 많은 학습데이터 training data을 가지고 적절한 f() 함수의 형태나 파라메터를 얻어내는 과정이 보상과 벌로 애완견의 액션을 인지시키는 훈련 과정과 같고 이것이 강화학습이다. 기계학습이란 것이 학습데이터를 잘 설명하는 모델을 만드는 (또는 기계를 학습하는) 것이고, 즉 학습된 기계는 학습데이터에 따라 움직인다. 그래서 학습데이터로 기계를 학습시킨다는 모든 알고리즘이 강화학습이라고 볼 수가 있다. 특히 딥러닝의 기초가 되는 인공신경망 Artificial Neural Networks의 학습과정을 강화학습이라고 말하지만, 다른 기계학습을 강화학습이 아니라고 말하는 것은 좀 이상하다.
** 강화학습에 관해 더 자세한 것은 다음의 텍스트북을 참고하기 바란다. https://webdocs.cs.ualberta.ca/~sutton/book/bookdraft2016sep.pdf

강화학습이라는 것이 기계학습에서 일반적인 것이라면 왜 알파고 이후에 강화학습이 주목을 받은 것일까? 단순히 기계를 학습하는 방법보다는 기계를 학습시키는 정답세트를 얻는 전략적인 과정에서 비롯했다고 본다. 그래서 그냥 강화학습이라고 말하기보다는 자기강화 Self-reinforcement라는 용어를 쓰는 게 맞지 않나?라는 생각을 한다. 기계학습이 결정적으로 실패할 때는 적당히 많은 정답세트가 없을 때다. 아무리 이론적으로 뛰어난 알고리즘이더라도 그걸 학습시킬 데이터가 없다면 기계학습은 실패한다. 기계학습의 승패는 정답세트를 얻느냐의 여부에 달려있다. 알파고가 수십년동안 수집한 대국기보를 가지고 학습했다지만, 그것만으로 인간을 이길 전략을 완벽히 마스터하는 것은 사실상 불가능하다. 현재까지 학습한 것을 바탕으로 사람과 직접 대국하면서 전략을 시험해보고 전략을 수정할 수도 있겠지만, 그럴려면 시간도 많이 걸리고 탑랭크 바둑기사들이 불완전한 기계를 상대해줄 가능성도 낮다. 이 부분에서 딥마인드 DeepMind는 자기강화라는 훌륭한 전략을 사용했다.

알파고 이전에 딥마인드는 오래된 아타리 Atari라는 게임을 학습시키면서 (자기)강화전략을 선택했다. 랜덤이든 어떤 규칙에 따른 것이든 아타리게임의 커서cursor를 이리저리 수없이 많이 옮기면서 점수를 얻는 법을 터득해 나갔다. 즉, 커서를 적당히 옮겨서 떨어지는 볼을 되받아쳤더니 그 볼이 위로 올라가서 벽돌을 부수면서 점수를 얻고, 커서가 볼을 되받아치지 못했을 때는 게임이 끝나버린다. 이런 무수한 임의의 움직임을 통해서 볼을 위로 보내면 점수를 얻고 떨어뜨리면 점수를 얻지 못한다는 것을 학습하고, 커서를 유효하게 움직이는 방법을 터득한 것이다. 수많은 시행착오 끝에 사람보다 더 뛰어난 점수를 얻게 된 것이다. 게임의 최종 점수, 즉 목적 함수가 있었기에 가능한 방법이다. 같은 전략을 바둑에도 적용시켰다. 단 바둑에서는 고득점이 아니라 고승률을 얻도록 목적함수를 설정했다.

기본적으로 사람들의 기보를 통해서 합습한 알파고와 그것의 클론을 만들어서 둘 사이에 대국을 펼친다. 완벽한 계산에 따라서 움직일 수 없으니 적당히 임의의 움직임도 가지는 전략을 갖는다. 그 둘의 대국에서 승리한 쪽의 전략은 받아들이고 패한 전략은 약화시킨다. 그렇게 한번더 승리한 전략을 가진 새로운 알파고가 만들어진다. 새로운 알파고는 이전 버전과 다시 대국을 펼친다. 새 버전의 알파고도 여러 전략으로 자신과 싸워서 이기는 전략을 취하고 지는 전략은 버린다. 이런 과정을 수만번, 수십만번 반복하면서 이기는 또는 빈틈없는 전략을 찾아가는 과정이 (자기)강화학습과정이다. 사람과 직접 대국하지 않고 (정답세트 데이터가 없이) 바둑에서 이기는 전략을 찾아간 것이다. 알파고에서 자기강화의 개념을 빼버리고 단순히 강화학습이라고 설명하면 안된다는 걸 말하고 싶었다.
** 알파고의 강화학습은 알파고 논문을 보면... http://airesearch.com/wp-content/uploads/2016/01/deepmind-mastering-go.pdf

여담. (일반적인) 강화학습에서 초기값와 임의성은 전역최적화 Global optimization 때문에 매우 중요하다.

2016년도 초반에는 자기강화학습이 유명해졌다면 후반에는 GAN이라는 게 주목받았다. 2016년 12월에 열린 NIPS 학회에서 GAN이 튜토리얼로 소개됐는데, 앞서 설명한 알파고의 자기강화전략과는 또 다른 재미있는 전략으로 정답세트 없이 (또는 적은 정답세트로) 기계를 효과적으로 학습시키는 전략을 소개했다. GAN은 Generative Adversarial Networks의 약어인데, 각각이 중요한 의미를 가진다. 먼저 Network는 그냥 신경망이나 아니면 일반 모델정도로 이해해도 충분한 것 같다.

기계학습에서 Generative라는 용어가 등장하면 Discriminative라는 용어도 함께 등장한다. 이 두 용어의 개념을 여러 번 찾아보고 이해하려 했지만 논문을 읽을 때는 '아 이런 개념이었구나'라고 하다가 또 금새 '두개의 차이가 뭐지?'라고 하곤 했다. 모든 기계학습은 generative거나 discriminative다. 그냥 사전을 찾아보면 '생성적인'과 '식별하는'정도의 뜻을 가졌는데, 이것만으로 무슨 개념인지 이해하기 어렵다. 앞서 설명했듯이 기계학습은 주어진 데이터를 바탕으로 학습한다. Discriminative는 주어진 그 데이터의 현상만을 가지고 판별하는 것이라면, generative는 그 데이터 이면에 현재 이런 현상을 만든 이유 (또는 모델, 함수)가 있다고 가정하고 그 이유를 찾는 것이다. 설명이 좀 거시기하다. 예를 들어, 주어진 데이터만으로 'X > 5이면 Y = 1이고 X <= 5이면 Y = 0이다' 식으로 규칙 (바운더리)를 찾아내면 discriminative 방식이다. 하지만 generative는 X가 어떤 함수 -- 보통은 분포 distribution -- g(z)에 따라서 생성됐다고 가정하고 g(z)의 모형과 파라메터를 찾는 것이다. 클러스터링에서 가장 기본이 되는 k-means 알고리즘은 discriminative이고, 보통 gaussian 분포로 가정해서 EM expectation maximization 알고리즘으로 그 분포의 파라메터를 찾아가는 알고리즘은 generative다.
** GAN의 generative의 의미가 일반적으로 기계학습에서 사용하는 generative인지 여부는 좀 헷갈린다. (좀더 공부한 후에...)

마지막으로 adversarial이 GAN의 핵심이다. Adversarial은 반대의 또는 대립관계가 있는 등으로 해석할 수 있다. 알파고의 강화학습은 똑같은 목적을 가진 알파고와 알파고 클론 간의 경쟁을 통해서 더 나은 전략을 찾아가는 과정인데, GAN은 서로 다른 목적을 가진 기계끼리 경쟁하면서 더 나은 전략을 찾아가는 과정이다. 대표적으로 위조범G과 위작감별사D다. 예를 들어, 피카소의 그림은 매우 비싸게 팔린다. 만약 명화위조범이 피카소의 화풍으로 왁벽히 똑같은 그림을 그려서 그걸 피카소가 직접 그린 그림이라고 판매를 한다면 어떻게 될까? 반대편에서는 구입하기 전에 그 그림이 진품인지 위작이지를 알고 싶어할 것이다. 그래서 GAN은 위작을 만드는 generator G와 위작을 판별하는 discriminator D를 별도로 학습시켜서, G는 D를 속이도록 D는 G의 속임수를 찾아내도록 만드는 것이다. 자기강하학습에서는 자기 자신과 싸우면서 더 좋은 전략을 찾아가지만, GAN에서는 자신과 경쟁 관계가 있는 상대방과 경쟁하면서 전략을 향상시키는 것이다. 게임이론에서 말하는 내쉬평형을 찾는 일이라서 어렵다고 한다. 그리고 아직은 초기라서 연구하고 해결해야할 것들이 많고, 새로운 아이디어가 쏟아져나오고 있다고 한다.
** GAN에 대한 더 자세한 설명은 NIPS 2016 Tutorial 논문 참조: https://arxiv.org/abs/1701.00160

기계학습의 승패는 양질의 정답세트를 얻느냐 못 얻느냐에 달려있다. 하지만 양질의 정답세트를 얻는 것이 때로는 불가능하고 가능하더라도 리소스가 많이 들어간다. 그래서 제한된 학습데이터로 더 좋은 알고리즘을 만드는 것이 많은 연구자들의 목표였다. 아니면 비지도학습 unsupervised learning처럼 애초에 정답세트가 없이 제한된 범위 내에서 문제를 해결하려고 노력중이다. 중간에 semi-supervised learning이 존재해서 적은 양의 정답세트로 나름 괜찮게 작동하도록 학습시키는 방법도 있다. 하지만 결국 더 많은 정답세트를 이길 수는 없다. 그런 측면에서 알파고가 채택한 자기 자신과 싸우면서 더 좋은 전략을 찾아가는 방식이나 GAN이 채택한 경쟁 관계의 상반된 모델을 만들어서 전략을 수정해가는 방식이 참 흥미롭다.

강화학습이나 GAN까지는 아니더라도 부족한 정답세트를 극복하기 위한 다른 여러 방법들이 있다. Semi-supervised 중에 하나인 active learning (다른 의미로 사용되는 경우도 있음)도 일종의 앙상블 방법인데, 두개의 다른 learner가 서로 다른 결과를 예측하면 어느 예측이 맞는지 사람에게 확인받아서 모호한 케이스에 대해서 정답세트를 추가하는 방식이다. 위에서 설명한 것보다는 좀더 아날로그적인 방식이지만 액티브러닝을 소개받았을 때도 참 재미있다고 생각했었다. 일반적으로 두개의 classifier가 같은 답을 내놓으면 그게 정답이겠거니라고 생각하겠지만, 역으로 둘다 틀린 답변을 내놓았을 가능성도 있다. 그래서 둘이 다른 판정을 내린 사안에 대해서만 다시 슈퍼바이저 (인간)이 투입돼서 정답 여부를 가늠하는 겁니다. (처음 적을 때 이 문단은 없었지만, 함께 언급해도 괜찮을 것 같아서 추가함)

당장 내가 하고 있는 업무에서 자기강화방식이나 GAN방식을 사용할 수 있을지? 또는 어떻게 사용할 수 있을지는 아직 잘 모르겠다. 내가 앞으로 머신러닝 분야에서 더 깊은 연구를 하거나 새로운 알고리즘을 개발할 가능성은 낮지만, 다른 차원의 문제에서 이런 비슷한 전략으로 문제를 해결하는 실마리를 얻을 수 있지 않을까?라는 생각에서 좀 길게 글을 적었다.

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced


댓글을 달아 주세요

  1. Favicon of http://jyyang.tistory.com BlogIcon acon 2017.04.24 14:12 신고 Address Modify/Delete Reply

    흔히 기계학습에서는 Supervised Learning, Unsupervised Learning, Reinforcement Learning으로 나누는걸로 알고 있는데요, RL은 엄밀히 말하면 지도학습이나 비지도학습과는 다른 분류로 나눠야 하는 것 아닌가요?

    • Favicon of http://bahnsville.tistory.com BlogIcon Bahniesta 2017.04.24 15:20 신고 Address Modify/Delete

      일반적으로 RL을 별도의 분류로 보는 건 맞지만, 그냥 RL을 리워드(함수)도 결국 슈퍼바이즈드의 라벨과 큰 차이가 없을 수도 있습니다. 관점의 차입니다. 특히 말하고 싶었던 것은 강화 프로세스가 요즘 언급되는 RL만을 의미하는 것은 아니라는 것입니다.

Share           Pin It
다음 검색에서 '데이터마이너'라는 검색어가 갑자기 많이 들어온 날이 있었다. 강풀 작가의 '마녀'라는 작품 속에서 PC 캡쳐 화면과 함께 주인공이 데이터마이너가 됐다라는 짧은 문구가 등장했던 때다. 해당 캡쳐 화면에는 SAS라는 데이터분석툴 아이콘도 있었고 지금은 없어진 마이피플 아이콘도 등장했다 (유료화로 화면캡쳐는 생략. 9화였음.). 강풀 작가님이 웹툰을 그리기 위해서 예전 같은 팀의 팀원에게 자문을 얻었는데, 그 분의 (의도된) PC화면으로 유추된다. 당시에 내가 서울에서 근무했다면 미팅에 함께 참석했지 않을까?라는 생각도 해본다.

빅데이터, 데이터 사이언스, 인공 지능, 딥러닝, 머신러닝 (기계학습) 등의 많은 용어/개념들이 버즈buzz되고 있지만 관련 분야의 사람들이 아니라면 여전히 데이터마이닝 또는 데이터마이너라는 용어가 생소한 것 같다. 그래서 데이터마이닝/너에 대한 지극히 개인의 의견을 적으려 한다.

데이터마이너는 무엇을 하는 사람인가? 데이터를 보는 사람이다. 왜 데이터를 보는가? 데이터에 내재한 패턴 pattern을 찾거나 규칙 rule을 만들기 위해서다. 그런 패턴이나 규칙은 왜 찾고 만드는가? 문제를 해결하기 위해서다. 그렇다. 내가 생각하는 데이터마이닝은 여러 문제와 관련된 데이터를 관찰함으로써 규칙을 찾고 적용해서 문제를 해결하는 것이다. 문제를 해결하는 접근법은 다양하겠지만 데이터에 근거를 둔다는 점에서 다른 것들과 차별점이다. 물론 데이터가 데이터마이너만의 것은 아니다.

문제를 해결하기 위해서 데이터를 본다라고 표현했지만 때로는 문제를 찾아내기 위해서 데이터를 보는 경우도 종종 있다. 즉, 주어진 문제를 해결하기 위해서 근거 데이터를 수집하고 추론하는 것도 마이너의 일이지만, 이미 가진 데이터에서 시스템에 내재된 문제점을 찾아내는 것도 마이너의 역할이다. 그래서 단순히 수학적, 공학적 기술/기법 뿐만이 아니라, 다양한 경험과 (잡) 지식이 마이너에게 요구된다. 마이너가 활용할 수 있는 데이터는 단순히 시스템 구동에 필요한 데이터 (보통 DB나 텍스트 형태)나 시스템이 찍어내는 로그에만 한정된 것이 아니다. 

머신러닝 (또는 인공지능)은 데이터마이닝과 밀접한 관계가 있지만 같다라고 말하기는 어렵다. 밴다이어그램을 그린다면 상당한 공통 영역이 존재하지만 또 다른 영역이 분명 있다. 머신러닝은 특정 미션을 완수하기 위해서 근거 데이터로 학습시켜서 모사하는 것이 목적이다. 주어진 데이터 이상의 추론이 가능하다면 인공지능이라고 불러도 좋다. (Exploitation vs Exploration) 머신러닝/인공지능은 '기계를 사람처럼'이 모토이자 목적이다. 데이터마이닝은 많은 머신러닝 기술을 활용하지만 엄격함을 요구하지는 않는다. 인간 친화적이라고 표현하면 좋을 듯하다. 머신러닝에 일부러 모호함을 추가하는 연구도 진행되고 있지만...

데이터마이닝을 잘 하기 위해서 다양한 수학, 통계 지식이 필요하고, 고도의 알고리즘들도 만들어졌다. 그러나 그런 지식이나 알고리즘은 데이터를 잘 보기 위한 보조 기능을 하는 것일 뿐이다. 많은 지식과 알고리즘을 알고 있다고 뛰어난 데이터마이너가 되지는 않는다. 데이터를 잘 보는 능력과 그걸 돕는 기술을 많이 아는 것은 분명 같지 않다. 원시적이지만 -- 한계도 분명한 -- 텍스트나 엑셀의 테이블에 펼쳐진 (적은/제한된 양의) 수치나 데이터를 눈으로 확인해서 패턴/규칙을 발견할 수 있다면 HDFS에 쌓인 수 테라바이트의 데이터를 고도의 알고리즘으로 확인하는 것보다 더 낫다. 좀 극단적으로 표현했지만, 데이터마이닝은 기계가 이해하는 규칙이 아나라 사람이 이해하고 설명가능한 규칙을 찾는 것에 더 가깝다고 생각한다. (엄격함을 덜 요구한다는 의미도 이의 연장선에서 말한 것이다.)

R이나 SAS 등의 통계분석툴이나 파이썬이나 자바같은 프로그래밍 언어, 또는 Mahout이나 Spark MLlib 같은 (오픈소스) 라이브러리에 능한 것도 데이터마이너의 필수 덕목이 됐지만, 데이터를 보는 눈이 없다면 무용지물이다. 파리를 잡기 위해서 소잡는 칼을 휘두르는 모양새다. 수학이나 알고리즘 지식, 그리고 프로그래밍 스킬보다 도메인 지식 또는 비즈니스 로직을 개인적으로 더 중요하게 생각하는 이유도 데이터가 만들어지고 활용되는 곳을 잘 알아야지 데이터를 더 잘 볼 수 있기 때문이다. 물론, 때론 도메인 지식 (또는 지식 편향)이 데이터를 객관적으로 보는 것에 장애가 된다. 수학/통계/알고리즘과 프로그래밍 스킬, 그리고 도메인 지식은 데이터마이너가 되기 위한 일종의 트리니티라서 고른 역량이 필요하지만, 그렇지 않다면 각각의 능력을 가진 사람들을 모은 그런 팀을 구성하는 것이 필요하다. (그리고 모든 개발자들이 그렇듯이 영어를 읽고 이해하는 능력인 필수다. 유학 또는 취업으로 외국에 가지 않는 이상 영어를 듣고 말하고 쓸 기회는 별로 없지만 영어 문서를 읽어야할 일은 흔하다.)

수학이나 프로그래밍보다 도메인 지식이 더 중요하다고 얘기하는 가장 큰 이유는 우리가 일상에서 만나는 마이닝 문제 또는 해결책이 그렇게 복잡하지 않다는 점이다. 아주 간단한 연산으로 해결되는 경우가 많다. 물론 음성 인식이나 이미지 처리, 기계 번역과 같이 복잡한 태스크를 해결하기 위해서 사용되는 다양한 딥러닝 및 관련 기술들을 온전히 이해하고 구현하기 위해서는 수학과 프로그래밍 스킬이 필요하다. (딥러닝이 구조적으로 복잡해 보이지만 요소요소를 보면 사실 복잡한 연산은 아니다.) 하지만 일상에서 데이터를 가지고 하는 문제들은 그저 데이터를 연결하고 순위를 매기는 것에 불과한 경우가 허다하다. 대표적으로 추천 및 개인화 시스템이라는 것도 아이템과 아이템, 사용자와 아이템, 그리고 사용자와 사용자를 잘 연결시켜서 기준에 따라서 정열해서 상위 N개를 보여주는 것에 불과하다. 특히 독립적인 데이터 샘플이 많아지는 경우라면 더더욱 그렇다. 정성적인 추천의 품질을 가르는 것은 결국 도메인 지식이다. (정량적 지수는 다를 수 있다.) 흔히 말하는 클러스터링, 클래시피케이션 및 레그레션 등의 모든 개념들도 결국 데이터를 연결하고 나열하는 것, 또는 이를 잘 하도록 돕는 것 그 이상도 이하도 아니다.

야구 투수에 비유하면, 데이터마이너의 특기는 강속구가 아니라 제구력이다 (Control Artist). 데이터마이너는 데이터를 보는 사람이고 데이터에서 규칙을 찾는 사람이라는 정의의 연장선에서 생각하면 된다. 완벽한 모델을 찾고 모든 파라메터를 자동으로 최적화하려는 것도 연구의 한 축이겠지만, 여전히 대부분의 알고리즘들이 사람의 손을 타기 마련이다 (Human Intervention). 만능의 인공지능이 등장하지 않은 이상, 어떤 모델 또는 방법론을 선택하고 필요한 다양한 파라메터를 얼마나 잘 설정하느냐가 평범한 마이너와 좋은 마이너의 차이를 가른다. 도메인 지식과 경험이 중요하다는 이유도 제어 능력의 차이를 주기 때문이다. 딥러닝과 같은 강력한 한방 (강속구)를 가졌더라도 제어 능력이 없으면 의미가 반감된다.

데이터 엔지니어도 아닌 사이언티스타라는 사람의 입에서 경험 (또는 경험에 따른 감 — 고급지게 표현해서 인사이트)이 중요하다고 말하는 것이 참 이상할 법하다. 그건 내가 사이비라서 그렇기도 하지만, 실제 그렇기 때문이다. 문제 상황에서 가설을 세우고 데이터로 검증하기 때문에 데이터 사이언스라 불린다. 문제를 인식하고 적절한 가설을 세우고 실험 계획을 통해서 필요한 데이터를 모으고 분석 및 검증으로 얻은 결과를 해석해서 액션을 취하는 일련의 과정이 필요하다. 매우 간단한 과정이지만 이를 어떻게 실행하느냐에 따라서 투입되는 비용과 시간, 반복 그리고 승패가 결정된다. 이때 필요한 것이 -- 천재가 아닌 이상 -- 경험이다. 어차피 초보 마이너나 베테랑 마이너가 가지고 있는 기본 기술셋은 비슷하다.

이전 글에도 적었지만 데이터 문제가 아주 정확한 모델과 설정값을 요구하는 것 같지만 대부분의 경우 설명하기 쉬운 단조로운 모델과 설정하기 쉬운 근사값이 필요한 경우가 많다. 그리고, 경험이 쌓인다는 것 그리고 감이 생긴다는 것은 그저 오랜 시간동안 많은 데이터를 다뤘다고 해서 얻어지는 것은 아니다. 어쩌면 내가 이 글을 적으면서 그냥 데이터마이너라고 적었지만 실제 의미는 시니어 데이터마이너를 뜻했던 것 같다. 그냥 기계적으로 데이터를 분석하는 사람이 아니라 데이터로 생각하고 데이터와 함께 숨쉬는 사람을 생각했던 것이다. 오해를 막기 위해서 경험은 깊은 수학적 지식과 다양한 프로그래밍 연습 위에 쌓인다.

훌륭한 데이터마이너는 데이터를 잘 보는 사람이다. 특별한 재능과 기술을 가진 사람이 아니라 그저 데이터 위에 노는 사람이다.

P.S., 딱 4년 전인 2012년 3월 9일에도 같은 제목의 글을 적었습니다. http://bahnsville.tistory.com/546

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced


댓글을 달아 주세요

Share           Pin It
오랜만에 블로그 방명록을 통해서 들어온 질문에 대한 답변을 적어 봅니다. 

질문을 대략 요약하면 다음과 같습니다.
인천에 있는 대학에서 경영학과 4학년으로, 산업경영공학을 복수전공해서 졸업할 예정이다. 제조업 물류 쪽에서 일하고 싶지만, (이런 쪽으로 진로를 정하기 위해서 컴공과보다는) 산업공학과 대학원에 진학해서 데이터마이닝을 전공하고 싶다. 실험계획이나 통계 관련 수업은 이미 들어서 기초적인 지식은 있지만, 겨우 MS SQL만 사용할 정도로 프로그래밍 쪽은 기초가 거의 없다. 그래서, 대학원에서 다뤄야할 기본 프로그래밍 언어는 어떤 것이 있고, 빨리 배우려면 어떻게 해야 할까요?
질문을 대략 요약한 것이라서 제가 답글로 남긴 내용은 위의 요약만으로는 조금 이해하기 어려울 수도 있지만, 짧게 남긴 답글을 먼저 제시하겠습니다.
대학원에 진학하면 수업/숙제를 위해서 또는 프로젝트를 위해서 관련된 언어나 통계툴을 웬만큼 익히게 됩니다. 너무 걱정할 필요는 없을 것같습니다. 학교에서 논문 작성을 위해서는 매트랩을 많이 사용하지만, 라이센스 비용 등도 있고 현장에서 계속 사용하기 위해서는 R을 배우는 것을 추천합니다. 그리고 일반 범용 랭귀지를 배우고 싶다면 C나 자바보다는 요즘은 파이썬으로 시작하는 것도 추천합니다. 매트랩이나 R보다는 파이썬 책이나 한권 사서 먼저 익혀보세요.

최근 가천대학교 산업경영공학과의 최성철 교수가 적은 ‘산업공학과를 위한 프로그래밍 입문 파트1 링크 / 파트2 링크' 또는 ‘산업공학도가 데이터 과학하기'를 먼저 읽어보는 것이 충분히 도움이 될 것같습니다. (위의 포스팅을 페이스북에 올린 후에 최교수와는 페친이 됐는데, 학교 5년 후배였네요. 학교에 있는 동안 마주쳤을 법도 한데… 혹시 최교수가 제주에 올 일이 있어서 연락하면 한 번 만나봤으면 좋겠고, 관련 주제로 회사에서 세미나라도 해줬으면..)

이제껏 데이터마이닝 전공에 대한 몇 차례 글을 적으면서 애써 피했던 주제가 프로그래밍 관련 된 것입니다. 제가 각종 언어 (국어, 영어, 일본어 등의 자연어에서 부터 자연의 언어인 수학, 그리고 컴퓨터 언어인 프로그래밍 랭귀지들)에 자신이 없기 때문에 언어에 대한 적당한 조언자는 아닙니다. 그러나 개념적인 부분에서는 나름 잘 파악하고 있다고 생각하기 때문에 기술적이지 않은 선에서 (데이터마이닝과 관련한 언어 선택을 중심으로) 몇 자 적겠습니다.

96년도에 대학을 들어가서 처음 배운 컴퓨터 언어는 C 였습니다. 정말 못했습니다. 저희 때만 하더라도 포인터와 struct까지 다 배웠는데, 몇 년 후에는 배열정도까지만 배우도록 과정이 축소됐다는 얘기도 들었고, 어쩌면 지금은 C가 아닌 다른 언어로 시작할지도 모릅니다. 인터넷을 접하면서 자연스레 마크업을 다루고 Java도 조금 독학해서 지금은 Java (최근 자바8 등에서 차용된 최신 형태인 람다함수 등은 아직 사용하지 못하고, 여전히 아주 예전 스타일대로 자바 코딩중입니다.ㅠㅠ) 계열로 간단히 먹고 살 정도로 코드를 작성하고 있습니다. (잠시 스쳐간 소소한 언어들도 있지만) 대학원에서는 매트랩으로 수치 연산을 하고 실험 결과로 논문 작성을 주로 했고, 회사에 와서는 SAS로 데이터 가공을 주로 하고 있습니다. 그리고 최근에는 하둡+자바 환경으로 대용량 데이터 MR 작업을 주로 합니다.

진학하는 대학원 연구실이나 담당 교수에 따라서 조금씩 다르겠지만, 통계 위주의 연구실이라면 예전부터 사용하던 통계툴들이 있을 것입니다. 매트랩일 수도 있고, SAS를 사용하는 곳도 있고, 미니탭이나 매스매티카 등을 사용하는 경우도 있을 것입니다. 그리고 요즘은 R도 많이 사용할 듯합니다. 제가 대학원을 다닐 때는 그냥 매트랩으로 다 처리하고 졸업할 시점에 R에 대한 얘기를 처음 접했는데, 제대로 사용하지 못하고 그냥 졸업했습니다. (최근 R을 조금 공부했지만 그냥 코드의 흐름만 이해할 정도입니다.) 즉, 대학원 연구실의 성격이나 수강하는 수업의 교수 특성에 따라서 특정 통계툴을 사용하도록 강제(?)되기 때문에 미리 어떤 툴에 익숙해져야 겠다는 것이 조금 어리석은 생각일 수도 있습니다. 어차피 프로젝트 과제를 하거나 숙제를 하기 위해서는 그런 툴에 빨리 익숙해질 것이기 때문입니다.

그렇지만 논문 작성이 우선이라면 매트랩이나 R을 배울 것을 권합니다. 벡터나 매트릭스 연산이 많이 필요한 분야를 전공하고 싶다면 매트랩이 더 적합하고, 통계 분야로 공부하고 싶다면 R이 더 나은 선택입니다. 그리고 졸업 후에도 계속 사용하는 것이 목적이라면 R이 매트랩보다는 조금 더 매력적입니다. R만으로는 충분히 큰 데이터를 용이하게 다룰 수는 없지만, 다양한 빅데이터 기술들과 연계를 고려한다면 (프로그래밍에 취약한 분이라면) R의 대안이 거의 없다고 봐도 무관할 듯합니다.

대학원에서 과제를 진행하거나 졸업 후에 (학계가 아닌 산업계로) 취직할 때 상용 통계툴로만 해결 가능한 문제는 극소수로 제한됩니다. 그렇기에 범용 프로그래밍 언어 하나 정도는 익혀둘 필요가 있습니다. 다양한 데이터를 전처리하거나 후처리하는 과정에서 꼭 필요합니다. 그리고 웹을 통해서 도출된 결과를 보여주기 위해서는 웹 친화적인 언어를 배우는 것이 좋습니다. 그런 여러 가지를 고려한다면 적당한 대안으로 Java, 파이썬, 스칼라 Scala 정도가 있을 듯합니다. Perl이나 PHP도 일부에서는 사용하지만, 앞의 3개에는 못 미칩니다.

그런데 학교에서 연구하고 또 다양한 (특히 텍스트 형태의) 데이터를 가공하는 것이 목적이라면 파이썬이 가장 강력한 후보라고 생각합니다. Scala는 제가 아직 잘 모르는 언어라서 일단 생략합니다. 여러 종류의 문제에 맞는 오픈소스로 Java 기반의 라이브러리나 프로그램들이 많이 있지만, 과학 연구나 텍스트 마이닝을 위한 파이썬 라이브러리에는 (특히 최근에는) 못 미칠 듯합니다. 파이썬이 자바보다도 더 배우기도 쉽다고 하니 첫 언어 습득으로 파이썬은 좋은 선택입니다. (자바보다는 파이썬이 나중에 나온 언어라서 좀더 진화된 형태를 보여주는 듯함. 그에 비해서 자바는 기존의 C나 C++의 컨벤션을 많이 상속한 마지막 언어라는 느낌이 강함) 최근 구글(Go)이나 애플(Swift) 등에서도 새로운 랭귀지를 발표하는데, 이건 관련 앱을 만드는 등에 최적화됐으니 이 포스팅에서는 굳이 다룰 필요는 없을 듯합니다.

그래서 대학원에 진학하는 사람 그리고 산업계로 진출하려는 사람에게는 파이썬 + R이 가장 강력하고 적절한 조합이 아닐까?라는 생각을 해봅니다. 그런데 최근 이슈가 있는 빅데이터, 특히  Hadoop 기반의 MR 작업을 진행한다면 Java에 대한 이해가 있으면 좋을 듯합니다. 그러나 그런 것도 대부분 파이썬으로 커버가 되기 때문에 특수한 경우가 아니라면 (데이터 가공이 아닌 더 시스템에 치우친 분야로 취업한다거나..) 굳이 자바를 마스터할 필요는 없습니다. 파이썬이면 충분할 듯… 그리고 하나의 언어를 습득하고 나면 두번째, 세번째 언어는 나름 더 쉽게 습득할 수 있기 때문에 필요할 때 다시 배우면 됩니다. (먹고 살려면 배우게 됩니다.)

최근 회사 내에서도 이슈가 되기도 했지만, 빠른 빅데이터 처리 및 분석을 위한 것이라면 파이썬 + R + 하둡보다는 Scala + Spark 형태도 괜찮을 듯합니다. Scala는 Java에 더 진일보한 언어라서 자바를 배우는 것보다 바로 스칼라로 넘어가는 것도 현명한 선택일 듯합니다. (그러나 아직은 Scala는 자바나 파이썬보다는 범용성에서는 다소 떨어진다는 점을 고려해야 합니다. 범용성이란 단순 기능의 커버리지 뿐만 아니라 개발자 커뮤니티나 라이브러리 등을 두루 말하는 의미임.) Spark는 메모리 기반으로 머신러닝 ML 라이브러리를 제공해주고 스칼라에 최적화됐기 때문에 학교가 아닌 산업계에서 경력을 쌓고 유지하고 싶다면 Scala + Spark도 괜찮은 조합입니다.

대략 요약하면 학계에서 계속 경력을 쌓고 싶다면 매트랩이나 R (또는 SAS)를 선택해서 특화시키는 것이 좋을 것같고, 대학원 후에 취업이 목적이라면 R + 파이썬 조합이 괜찮을 듯하고, 그리고 회사에서 더 큰 임팩트를 주고 싶다면 Scala + Spark 조합이 좋을 듯합니다. 그러나 관련 분야에서 몇 년의 시간을 보내고 경력을 쌓다보면 매트랩도 하고 있고 R이나 SAS도 다루고 있고, 어떨 때는 파이썬으로 코딩하고 다른 경우는 또 자바로 코딩하고 있습니다. 대용량 데이터를 다루기 위해서 하둡+자바로 코딩하기도 하고, 더 빠른 분석 등을 위해서 Scala+Spark로 작업하고 있는 자신의 모습을 발견하게 될 것입니다. 당장 어떤 언어를 마스터해야겠다는 욕심보다는 상황에 맞게 빨리 습득하고 시도해보는 것이 중요합니다.

그리고 댓글에 짧게 적었듯이, 일단 프로그래밍 언어를 배워서 익숙해지는 것이 목적이라면 학원 등에 등록해서 수강하는 것도 좋겠지만, 그냥 동네 서점에 가서 파이썬 책 한권 구매해서 처음부터 읽어가면서 책에 나온 예시들을 직접 타이핑해가며 (C&P는 아니라고 생각됨) 연습해보고, 또 더 복잡한 문제를 위해서 인터넷에서 관련 오픈소스를 다운받아서 설치하거나 변경해보면서 연습하는 것만으로 충분할 듯합니다. 그리고 그루터의 정재화님이 올린 ‘프로그래머를 꿈꾸는 학부생들에게' 내용도 참조하시면 좋을 듯합니다.

저는 각종 언어에 젬병이기 때문에, 위의 글은 참조만 하시고 더 전문가들의 조언에 귀기울이시기 바랍니다.

==
페이스북 페이지: https://www.facebook.com/unexperienced


댓글을 달아 주세요

Share           Pin It
최근 Deep Learning에 대한 관심이 뜨겁습니다. 딥러닝에 대한 얘기를 처음 들은 것은 작년 이맘 때였던 것같은데, 몇몇 기사들만 읽어볼 뿐 애써 외면했습니다. 처음에 딥러닝을 소개하는 두꺼운 논문을 한편 프린트해서 조금 읽어본 후에, 내가 관여해야할 것이 아니다라는 감을 잡고 깊이 파고 들지 않았습니다. 주변에서 공부를 시작하거나 실제 문제에 적용한 케이스도 봤지만 굳이 관여는 피했습니다. 그런데 차츰 내가 직면한 문제의 나름 해결책이 딥러닝이 아닐까?라는 생각을 하게 되면서 다시 관련된 논문을 찾아서 읽거나 온라인 강좌 비디오를 보기 시작했습니다. 이제 시작 단계지만 딥러닝에 대한 첫인상을 적어볼까 합니다.

처음 딥러닝을 알게된 시점에는 단순히 기존의 뉴럴네트워크의 단순 확장판, 즉 히든 레이어나 노드의 수를 적절히 늘려서 예측력을 높이는 정도 또는 패턴을 여러 단계로 나눠서 인식하는 정도로 이해했습니다. 한참 학교에 있던 2000년대 초반에도 뉴럴 네트워크(ANN, Artificial Neural Network)에 대한 관심은 높았지만, 특정 문제에서는 잘 적용되지만 모든 문제에서 가장 적합한 해결책이 아닌 경우가 많았습니다. 특히 히든 레이어나 노드 수가 증가하면 모델을 학습시키는데 시간도 오래 걸리고 또 학습된 모델의 정확도도 낮았던 걸로 기억합니다. (그래서 ANN이 더 발전하지 않겠구나라고 생각하고 더 깊이 공부하지 않았습니다. 물론 ANN을 제대로 이해하기 위해서 필요했던 기초 지식이 부족해서 한계에 부딪혔던 점도 있습니다. 그런데 약 10년의 시간이 흘러서 다시 ANN이 딥러닝이라는 이름으로 화려하게 부활했습니다.) 당시 컴퓨팅 파워로는 레이어나 노드를 무한정 늘릴 수가 없었습니다. 그런데 지금은 컴퓨팅 파워와 대용량의 학습 데이터 때문에 더 큰 네트워크를 학습시킬 수 있게 되서, ANN이 다시 각광받는구나 정도로 이해했습니다. 그런데 딥러닝은 단순한 ANN의 확장은 아닌 것같습니다. 

실제 ANN에서 히든 레이어나 노드의 수를 증가시키면 정확도가 올라가는 것은 맞습니다. 그러나 그 정확도는 트레이닝 오류를 낮추는 것이지, 테스트 에러 즉 비학습 데이터에 대한 정확도를 높이는 것이 아닙니다. 즉 레이어와 노드 수의 증가는 ANN의 오버피팅 문제만 일으킵니다. 그렇기 때문에 ANN을 단순히 확장한다고 해서 딥러닝이 될 수가 없습니다.

아직은 많은 사례를 보지 못했지만, 딥러닝의 네트워크와 ANN이 닮은 점은 인풋 레이어, 히든 레이어, 아웃풋 레이어로 구성된다 정도만 닮았습니다. 그리고 비선형성을 위해서 sigmodal이나 tanh 함수를 사용한다정도만 닮았습니다. 그래서 딥러닝을 ANN의 차기 버전이라고 말하는 것도 조금 아닌 것같고, 일반적인 모든 방법을 단순히 딥러닝이라고 부르는 것도 이치에 맞지 않은 것같습니다. 현재까지 나온 모든 딥러닝 방법론을 딥 아키텍쳐 또는 딥 네트워크 아키텍쳐라고 부르는 것이 더 맞을 듯합니다. 편하게 딥러닝이라고 부르지만, 네트워크가 예전보다 복잡해졌다는 공통점 외에 여러 방법론들의 결과물/네트워크의 형태상으로 공통점을 찾아보기가 힘듭니다. 그래서 그런 복잡한 모든 네트워크를 딥러닝이라고 퉁쳐서 부르면 개별 네트워크의 특징을 제대로 파악하는데 어려움이 따를 듯합니다. 그래서 딥 아키텍쳐라는 우산 아래 다양한 네트워크 패밀리들이 존재한다라고 이해하는 것이 좋을 듯합니다. (더 자세한 설명은 제 능력밖이고… 아직 제대로 정립하지 못했습니다. 모양도 제각각이고…)

그리고 현재 나온 딥러닝에 관한 논문이나 글들을 이해하기는 너무 어렵습니다. 첫째는 기본적인 ANN에 내포된 여러 방법론들에 대한 설명이 없거나 너무 빈약하게 설명하고 딥러닝의 구성에 대한 설명으로 바로 넘어가 버립니다. 더욱이 ANN을 이해하기 위해서 선행해서 알아야 하는 확률 모델이나 (로지스틱) 회귀모델 등에 대한 설명도 부실합니다. 기초적인 확률통계 및 머신러닝에 대한 지식이 없이 ANN을 이해하는 것도 무리가 있는데, ANN에 대한 설명도 부실한 상태로 딥러닝을 설명하는 경우가 많습니다. 그러니 처음 논문을 접하는 분들은 바로 포기해버리고 맙니다.

두번째는 현재까지 딥러닝이 성공한 애플리케이션은 음성인식이나 이미지 판독 등입니다. 현재 인터넷으로 검색되는 많은 논문이나 강좌는 음성인식에 초점을 맞춰서 설명하는 경우가 많습니다. 즉 음성인식이나 NLP 등에 대한 경험이 없는 사람들에게 딥러닝이 멀게만 느껴집니다. 딥러닝 논문 한편을 이해하기 위해서 일반적인 음성인식 문제에 대한 배경지식도 공부해야 하고 또 전통적인 음성인식 방법론 (HMM과 같은)을 다시 들쳐봐야 합니다. 그동안 인간들이 축적한 지식의 양과 종류가 너무 방대해서 이제 초보자들이 하나의 개념을 받아들이는데 장애물이 너무 많아진 것같습니다.

혹시 딥러닝을 공부해보겠다고 마음을 먹은 사람이라면 앞서 말했듯인 ANN에 대한 공부부터 시작하시고, 음성인식이나 이미지 프로세싱 등의 애플리케이션에 대한 배경지식을 습득할 것을 권합니다. 대학원을 다니면서 (음성인식 등의 애플리케이션은 그렇다치더라도) NN에 대한 공부를 등한시했던 것이 참 후회됩니다.

딥러닝 과련 논문을 읽으면서 ‘내가 지금 딥러닝 방식으로 딥러닝을 공부하고 있구나’라는 생각을 했습니다. 앞서 말했듯이 이론적인 배경도 빈약하고 응용 분야에 대한 지식도 부족하니 논문을 읽어도 제대로 이해하지도 못합니다. 그렇다고 해서 모르는 부분을 만날 때마다 참고 자료를 모두 찾아볼 수도 없는 노릇입니다. 그래서 일단은 많은 자료를 그냥 막 읽어보자라는 결심을 했습니다. 그렇게 많은 것들을 읽다보면 머신이 학습되듯이 제 뇌도 새로운 지식을 차츰 받아들이고 학습하고 재구성할 수 있으리라는 기대를 해봅니다. 딥러닝이 그렇듯이 unsupervised로 학습한다는 것은 참 어렵습니다. 머신러닝과 관련된 문제를 만날 때마다 조언을 구하던 그 친구의 부재가 더 크게 느껴집니다.

==
페이스북 페이지: https://www.facebook.com/unexperienced

댓글을 달아 주세요

  1. Favicon of http://jitwo.tistory.com BlogIcon jitwo 2015.11.23 18:00 신고 Address Modify/Delete Reply

    글을 참 잘 쓰시는 것 같습니다. 좋은 글 잘 읽고 갑니다.

Share           Pin It

(한글 번역본 나옴. http://book.daum.net/detail/book.do?bookid=KOR9791186710050)

연초부터 옆 팀에서 Kevin P. Murphy의 "Machine Learing: A Probabilistic Perspective"라는 책으로 스터디를 한다는 얘기를 들었다. 여러 이유로 제한된 일부를 제외하고는 타팀의 청강을 허용하지 않는다고 해서, 그냥 인터넷에서 책을 구해서 읽어나갔다. (구글링하면 PDF 파일을 얻을 수 있음.) 약 1000페이지의 방대한 양에 머신러닝과 관련된 -- 최근 핫한 이슈를 포함한 -- 대부분의 주제를 다루고 있어서 이것만 마스터하면 머신러닝에 조금 더 익숙해질 수 있으리라는 기대를 가지고 막무가내로 읽어나갔다. 그런데 양도 많지만 너무 어려웠다. 처음 3챕터정도는 토시 하나 빼지 않고 다 읽었는데, 점점 한계에 부딪혀서 점점 대강 읽어나가다가 어느 순간에는 목차와 본문의 볼드체 글씨만 확인하고 넘겼다. 수학/확률 전공자가 아니면 쉽게 이해하기 어려운 너무 하드코어 텍스트북이다. 전공자가 아니라면 읽지 않는 것이 정신 건강에 좋다.

그렇게 1000페이지를 거의 넘겨가는 시점에 페이스북에서 새로운 책이 소개된 글을 보게 되었다. '그대안의 작은 호수'라는 타이틀의 사이트에 책 제목과 같은 "An Introduction to Statistical Learning with R"이라는 글을 보게 되었고, 지금 무료로 책을 다운로드 가능하다고 해서 바로 받아서 읽기 시작했다. 책 PDF는 글 속의 링크 또는 구글링을 통해서 얻을 수 있다.

이 책은 수학/통계 또는 컴퓨터 공학이 전공이 아닌데, 데이터마이닝/머신러닝에 관심이 있는 초보자들에게 유용하다. 특히 산업공학이나 화학공학, 바이오인포메틱스 등의 응용분야에서 데이터 분석을 하는 이들에게 적합하다. 학부 수준의 교육을 받았다면 (처음에는 조금 익숙치 않을 수도 있으나) 충분히 이해할 수 있다. 모든 챕터에서 개념을 설명하는 것에 더해서, 챕터 말미에는 그 챕터에서 다룬 내용을 R을 이용해서 분석하는 예제도 함께 수록되었기 때문에, 수식이나 이론을 도출하는 수학/통계학자 또는 새로운 알고리즘/애플리케이션을 구현해야하는 컴사/컴공 전공자가 아닌, 응용분야의 공학자들에게 안성맞춤이다.

물론 단점도 있다. Murphy의 책에서 다루듯이 이 분야의 거의 전체를 다루는 지는 않는다. 심화학습이 필요한 이들에게는 별로 추천하지 않는다. 그리고 책이 지나치게 Supervised, Regression, 선형성에 초점을 맞춰져있다. 즉, unsupervised나 비선형성 문제/해법은 많이 다루지 않는다. (초보자들에게는 이게 더 큰 장점일 수도 있다.) 물론 이를 베이스로해서 더 학습하면 좋은 결과를 얻을 수 있으리라 믿는다. 보통의 데이터마이닝 책이 분류 classification을 베이스 다루는데, 회귀분석 regression을 베이스로 다루는 것이 조금 특이하다. 그리고 회귀분석에서 최근에 나온 Ridge regression과 Lasso를 다뤄서 (궁금했었는데) 개인적으로 많은 도움이 되었다. 일부 알고리즘은 더 자세히 다뤄줬으면 좋겠다는 생각이 들지만, R을 이용해서 실전에서 해당 알고리즘을 사용하는데는 전혀 문제가 없다.

수학/통계 및 컴퓨터공학 비전공자들 중에서 데이터마이닝/데이터분석에 관심이 있다면 시작하기에 안성맞춤인 책이다. 더 공부학 싶으면 머피 책이나 다른 책들을 참조하면 된다.

===

업데이트.

한글 번역본이 나왔습니다.

http://book.daum.net/detail/book.do?bookid=KOR9791186710050

==

페이스북 페이지: https://www.facebook.com/unexperienced

댓글을 달아 주세요

Share           Pin It

(새벽에 문득 잠에서 깨어 이 글을 적는다.)

최근 데이터 또는 데이터 기반 접근법에 대한 관심이 뜨겁다. 어쩌면 내가 밥벌어먹고 살려고 또 내 몸값을 올리려고 이런 표현을 사용/전파하고 있는지도 모르겠다. 관련 뉴스를 보면서 과연 데이터 기반의 실행조직이라는 것이 실체가 있는 것인지? 아니면 그들도 자기들을 세일즈하기 위해서 억지로 기사를 쏟아내고 있는 것은 아닌지? 또는 구글이나 몇몇 잘 나가는 기업들이 데이터를 가지고 돈을 잘 벌고 있으니 그걸 부각시키고 과대포장하고 있는 것은 아닌지? 등에 대한 의문이 들기는 한다. 그런 의심은 일단 뒤로 하고, 데이터가 공기처럼 편재하고 있다는 것은 사실이다.

많은 기업들이 스스로 좀 더 가치있는 데이터를 생산해내거나 고객들로부터 그런 데이터를 수집하려고 노력중이다. 그러나 확실한 비전이나 전략을 가지고 실행하고 있는 것같지는 않다. 데이터는 21세기의 새로운 금맥, 보이지 않는 오일이다라는 식의 현혹된 멘트에 혹해서 우리도 지금 하지 않으면 뒤처져버리는 것이 아닐까?라는 두려움으로 새로운 골드러쉬, 아니 데이터러쉬에 합류하고 있다는 느낌이 강하다. 우리는 데이터에서 의미를 찾아내고 가치를 만들어가는 데이터 기반의 실행조직으로 다시 태어나겠노라고 선언하며 먼저 깃발을 꽂기 위해서 전진하지만 여전히 고지는 묘연하다. 과연 고지가 있기는 있는 것일까?

스스로 데이터 기반의 조직으로 변모하겠다고 내세우는 기업들의 공통된 실수 또는 인식은 ‘다양한 데이터를 많이 수집해서 데이터 사일로를 만들어놓으면 그 후에는 알아서 될 것이다 (데이터가 데이터를 만들고 궁극에는 돈이 될 것이다)’ ‘데이터 분석 인프라를 구축해서 적당한 데이터분석가들을 채용해서 자리에 앉히면 될 것이다’ 등이 아닐까?라는 생각을 해본다. 특별한 비전이나 실행 계획도 없으면서 그저 전문가들을 한 자리에 모아놓으면 그들이 알아서 뭔가를 만들어내겠지라는 안일한 생각으로 무턱대로 도전하는 것같다.

현실은 그렇게 녹록치가 않다. 단지 몇 명의 뛰어난 데이터 분석가들이 모여있다고 해서 데이터 기반의 실행조직이 만들어지지 않는다. 단지 조직 내에 전담 부서/팀이 구성되었다고 해서 만들어지는 것도 아니다. 분석가들은 언제나 실권이 없는 보조 수단에 불과했다. 변화의 동인이나 목표가 있어도 변화의 힘은 없다. 물론 그들에게 막강한 힘을 더한다고 해서 조직이 데이터 기반으로 재탄생할 수 있다는 얘기를 하는 것은 아니다. 그저 하소연일 뿐이다.

데이터 기반의 실행조직에서 가장 중요한 사람은 데이터 분석가가 아니다. 데이터에 접근할 수 있고 가공할 수 있고 해석할 수 있는 소수에 의해서 실행조직이 만들어지지 않기 때문이다. 조직 내의 모든 구성원들이 — 업무, 관점, 역량의 크기 등과 무관하게 — 데이터를 읽을 수 있고 믿고 움직일 때 가능하다. 경영자들의 의지와 지원이나 분석가들의 우수성 뿐만이 아닌, 전체의 공감대와 실행 문화가 형성되어있지 않다면 아무리 데이터를 통해서 많은 돈을 벌고 전략을 실행한다고 하더라도 그 조직을 데이터 기반이라고 부르기 어렵다.

Data is everywhere and utility. 데이터는 모두의 것이다. 특정 소수만의 특권이 아니다. 모두가 자유롭게 데이터에 접근할 수 있어야 하고, 그것을 분석하고 해석하는 능력을 가져야 한다. 먼저 빨대를 꽂으면 된다.

데이터마이닝에 대한 잘못된 오해가 있다. 마이닝이라는 말에서 오는 오해인지도 모르겠다. 땅 속에서 금맥을 찾아내고 진흙 속에서 진주를 찾아내는 것이 마이닝이 아니다. 금과 진주만 가치가 있고, 흙은 무가치한 것이다라는 인식이 바뀌어야 한다. 데이터는 진흙과 진주가 썩여있는 것이 아니다. 모든 데이터는 그저 흙이며 또 진주다. 마이닝은 단지 그 진주를 닦아서 광을 낼 뿐이며, 흙을 뭉쳐서 벽돌을 만들 뿐이다. 의미를 더하고 가치를 부여할 때만이 의미있는 데이터가 되고 데이터가 스스로 가치를 준다. 흔히 시그널과 노이즈를 말한다. 시그널은 취하는 것이고 노이즈는 버리는 것이다라는 의미다. 그러나 노이즈이도 다른 형태/의미의 시그널일 뿐이다. 물론 시그널 데이터와 노이즈 데이터를 가공하는 공임이나 최종 가격이 같다는 의미는 아니다.

Data-mining is data-meaning. 이름을 불러 줄 때 비로소 꽃이 된다.

소위 데이터 전문가라는 이들도 학점에 맞춰서 대학과 학과를 선택해야 했던 이들이다. 지금은 데이터 사이언스가 유행을 타니 데이터마이너/사이언티스트가 되겠다고 난리 — 까지는 아니지만 — 를 부리지만 지금 데이터마이닝을 하는 이들 중에 과연 몇이나 어릴 적 꿈이 데이터마이너였을까? 상황에 따라서 배우고 학습한 결과가 현재의 모습일 뿐이다. 그들은 절대 특별한 존재가 아니다. 단지 조금 먼저 시작했다는 차이는 있다. 간혹 뛰어난 두뇌의 소지자들도 있지만, 대부분은 아니다. 데이터 기반의 조직은 결국 데이터 기반의 사고에서 시작한다. 그렇다면 그들에게 데이터 기반의 사고를 전파해야 한다.

Nobody is born to be a data-miner. 누구에게나 기회의 문은 열려있다. 절대 닫히지 않는다. 차이는 들어가느냐 마느냐에 있다.

치기로 시작했지만 관련된 글들을 적고 있고 오프라인 강의도 하기로 했다. 모두가 데이터에 자유로워졌으면 좋겠다. 그럴 때 비로소 데이터 기반의 실행조직이 틀을 갖춰가리라 믿는다. 지금 치어를 손에서 놓지 않으면 대어도 없다.

어쩌면 지금 나의 전문성을 Data Analytics에서 Data Inspiration으로 바꿔야할 타이밍인 듯하다. 만약 Data Miner가 아닌 Data Evangelist로 살아간다면 밥은 먹을 수 있을까?

주사위는 던졌고 번호는 나왔다.

==

페이스북 페이지: https://www.facebook.com/unexperienced

댓글을 달아 주세요

Share           Pin It

최근 빅데이터 Big Data, 스마트 데이터 Smart Data, 데이터분석 Data Analytics, 예측분석 Predictive Analytics, 데이터 사이언티스트 Data Scientist 등과 같은 용어가 범람하는 것은 그만큼 데이터마이닝 Data Mining에 대한 수요와 인기가 높아졌다는 반증일 것입니다. 이전 글에서 데이터마이너가 되기 위해서 이런 학과에 진학하거나 수업을 들으면 된다는 류의 Q&A를 몇 차례 다뤘습니다. 일반적인 의미에서 그런 진학/진로 상담이 별로 어렵지는 않습니다. 하지만 세부적으로 들어가면 각 학과마다 조금씩 관점의 차이가 있기 때문에 단순히 이런 수업을 수강하면 된다 식의 조언으로는 충분치 못한 것같아서, 오늘은 학과/전공별로 데이터마이닝이 어떻게 다른지에 대한 글을 적으려 합니다. 데이터마이너가 되기 위한 테크트리는 일반적인 마이닝 수업을 들으면 충분하지만, 어떤 학과에 진학하느냐에 따라서 문제를 대하는 관점과 솔루션에 접근하는 방법이 조금 다를 수 있습니다.

일반적으로 데이터마이너가 되기 위해서는 컴사/컴공과나 수학/통계학과를 진학하고, 나중에 머신러닝이나 인공지능 관련 대학원에 진학하라고 조언했습니다. 대부분의 데이터마이너들이 이 두 과에서 배출된 것도 사실이기 때문입니다. 여기에 추가적으로 저와 같이 산업공학과를 진학해서 데이터마이닝을 하시는 분들도 다수 계시고, 또 다른 전자, 화학/화공, 생명과 등을 진학해서 특화된 분야에서의 데이터마이닝/분석을 전공하시는 분들도 여럿 있을 것입니다. 그러나 제 주변의 IT기업이나 금융 분야에서는 컴사/컴공, 수학/통계, 산공과 출신들이 대부분 데이터 분석 업무를 하고 있습니다. (어떤 과를 진학하더라도 수학과와 컴공과의 관련 과목들은 대학시절에 -- 복수/부전공까지는 아니더라도 -- 이수/청강해두는 것이 좋습니다.)

가장 먼저 수학/통계학과 출신들은 문제를 수학적으로 잘 정리하고, 수학적 논리로 해결하는 경향이 강한 듯합니다. ANOVA 분석에서 많이 사용하는 기무가설 H0[각주:1]를 세우고, 수집된 데이터를 통해서 이 가설의 기각 여부를 따지는 경우가 많습니다. 최근에 빅데이터에서 왜 수학/통계학자들이 두각을 못 나타내느냐라는 여러 설명에서도, 기본적으로 수학/통계학자들은 많은 데이터에서 의미있는 패턴을 찾아내는 것이 아니라, 먼저 가설을 세우고 그 가설의 유의미를 판단하도록 프로그래밍되었기 때문에 빅데이터 환경에서는 맞지 않다는 얘기를 종종 합니다. 즉, 이미 가설이라는 솔루션 (또는 의미)을 미리 산정해두고 그것이 맞느냐 틀리냐를 묻는 것이 통계학자들의 접근방법이기 때문에, 데이터 더미에서 의미 (있을 수도 있는 것)를/을 찾는 것과는 방향이 반대입니다. 수학/통계학과의 경우 다양한 알고리즘이나 (문제에 맞는) 접근법의 개발/구현보다는 정형화된 프로세스에 따라서 현상을 분석, 해석하는데 강점이 있습니다.

컴퓨터사이언스 또는 컴퓨터공학과 출신의 데이터마이너들은 좀더 소프트웨어적입니다. 데이터 분석을 위한 인프라 구축에도 조금 더 능하고, 어떤 알고리즘을 사용해서 더 최적의 솔루션을 구현해낼 것인가에 많은 관심이 있는 것같습니다. 어릴 때부터 컴퓨터 구조와 프로그래밍에 친숙해서 주어진 문제를 가장 효율적인 (메모리 사용 및 계산 시간 단축) 코드로 해결할 것인가?에 많은 관심을 가지고 있습니다. 연구실마다 관심분야가 조금씩 다르긴 하지만, 문제 중립적인 데이터마이닝/인공지능/패턴분석 알고리즘 개발이 컴공과에서 나오는 것은 당연한 결과입니다. 수학/통계학과에서 수학적 모델링에 강하다면 컴공과에서는 알고리즘의 구현과 개선에 더 강점이 있는 듯합니다.

그리고 산공과 출신은… 일반적으로 산업공학과를 생각하면 최적화, 효율과, 표준화 등이 가장 먼저 떠오르지만, 저는 산업공학과는 문제해결 problem-solving 이라는 단어가 가장 먼저 떠오릅니다. 산학연구를 하면서 흔히들 '다른 과에서 못하면 우리가 해야죠'라며  말하면서, 수학/통계과나 컴공과 또는 다른 과에 특화된 문제가 아니면 거의 모든 문제를 해결해줄 수 있다고 생각하는 과가 산공과입니다. 그래서 산공과 마이너들은 다양한 문제 상황에서 어떻게든 적당한 feasible/viable 솔루션을 찾아내는데 강점이 있습니다. 산공과 학생들도 컴공과 수업을 많이 듣지만, 그래도 알고리즘 구현 능력보다는 다양한 분석툴을 사용해서 결과를 제공해주는 응용력이 높은 편입니다. 당연히 수학적 증명은 수학과만 못하고 솔루션 구현은 컴공과만 못하지만, 문제 해결능력/응용력에 강점이 있기 때문에 다양한 산업 분야로 진출할 수 있습니다.

전자 (시그널 프로세싱), 화공 (플랜트/프로세스 컨트롤), 생명/의약 (바이오 인포메틱스) 등에서도 데이터분석 및 마이닝을 전공하는 연구실들이 많이 있지만, 이들은 워낙 애플리케이션이 명확해서 주변에 데이터마이닝을 많이 사용하는 IT/인터넷이나 금융권 (은행권, 카드회사, 보험회사 등) 쪽으로는 별로 진출해있지 않은 듯합니다. 특화된 애플리케이션에 대한 이해도가 이들의 강점이지만, 앞서 설명한 과들의 강점은 가지지 못했을 가능성이 높습니다.

그래서 요약하자면.. 단순히 데이터 마이너가 되고 싶다라는 모호한 목표가 아니라, 자신이 원하는 분야 또는 방식을 명확히 정해서 수학적 모델링이나 가설검증 등에 재능/관심이 있으면 처음부터 수학/통계학을 전공하고, 알고리즘 개발 및 구현에 탁월하다면 컴사/컴공으로, 다양한 문제들을 해결하는데 재미가 있을 것같으면 산공과를, 그리고 다른 특화된 분야의 데이터마이닝으로 진출하려면 그 과로 진학하는 것이 좋습니다. 그리고 관련 과들이 필요한 수업은 모두 이수하는 것이 이상적입니다.

언급된 모든 과를 면밀히 알고 있는 상태에서 기술한 것이 아니기 때문에, 세부적으로 다양한 이견이 있을 수 있습니다. (적어도 산업공학과는 다양한 애플리케이션에서의 문제해결능력은 맞습니다.) 자기 하기 나름이라고 생각할 수도 있겠지만, 대학에 진학해서 듣는 수업들 및 주변 분위기 (교수, 선배, 동료, 후배 등과의 관계/대화)에서 각 학과에 맞는 세계관 또는 문제/솔루션에 접근하는 방식 등을 몸으로 습득하게 됩니다. 그렇기에 각 학과의 강약점 및 접근법에 대한 차이를 알고, 나와의 조화/궁합을 생각해서 진학하는 것이 여러모로 좋습니다.

==

페이스북 페이지: https://www.facebook.com/unexperienced

  1. 기무가설 (Null Hypothesis) 은 'A와 B는 통계적으로 유의미하게 같다' 식으로 표현합니다. [본문으로]

댓글을 달아 주세요

Share           Pin It

경제학을 전공하는 1년차 대학생께서 데이터마이너가 되고 싶다는 문의를 해주셨습니다. 저와 백그라운드가 다른 쪽 (문과 계열)은 조금 조심스럽습니다. 제 경험이 아닌 상상에 맞춰서 — 그리고 어떤 면에서는 선입견에 따라서 — 불필요한 조언이 될 수도 있기 때문입니다. 지난 번에 문과 고등학생도 질문을 주셨지만, 그 분은 아직 대학/과를 정하지 않은 상태였고, 지금은 경제학과로 진학한 경우라서 조금 느낌이 다를 수 있습니다. 그리고 학교마다 개설되는 수업 이름이 다르기 때문에 정확한 수업명은 다시 확인하시기 바랍니다.

안녕하세요? 경제학과에 재학중인 학생입니다.
아직 1학년 밖에 마치지 않았지만
데이터마이너가 되고싶다는 생각이 들어 이렇게 여쭈어 보게 되었습니다.
구체적으로 어떤 과목을 공부해야하는지 알고 싶습니다.
단순히 경제학만으로는 묻지마취업밖에 길이 없다는 사실을 깨닫고 좀더 전문성이 있는 길을 가고싶어서 질문드립니다.
구체적으로 어떤 과목을 공부해야하는지 테크트리좀 알려주세요.

굳이 데이터마이너가 되지 않더라도 경제학 분야에서도 수리경제나 개량경제 등에서 수학분석 및 컴퓨터 시뮬레이션 등이 필요한 분야가 많이 있습니다. 이 말은 데이터마이닝은 데이터마이너만의 영역이 아니라는 뜻을 내포하고 있으며, 특히 최근에는 데이터 기반의 전략수립, 의사결정, 실행 등의 트렌드가 있기 때문에 누구나 기초적인 데이터마이닝 수업 등은 들어두면 좋습니다.

데이터마이닝을 하면 기본적으로 수학과 컴퓨터를 빼놓을 수 없습니다. 그래서 아래의 수업들은 대부분 수학이나 컴퓨터 관련 과목들입니다. 그리고 저도 기본적인 수학만 이수했기 때문에 수학과에서 배우는 전체 과목을 잘 모릅니다. 그리고, 컴사/컴공도 아니라서 컴퓨터 쪽도 고등 advanced 과목은 잘 모릅니다. 감안하시고 읽어주시기 바랍니다.

수학쪽 과목은 기본적으로 공대에 진학하면 1학년 때 ‘Calculus’ (타학교에서는 ‘공학수학' 정도로 개설될 듯함) 라는 과목을 듣습니다. 수학의 전반을 다루는데 고등학교 수준 또는 그 이상의 다룹니다. 수학의 기본을 배우는 과목이니 이수를 할 필요가 있습니다. 두번째로는 당연히 '확률과 통계 Probability and Statistics’는 데이터마이닝의 기본입니다. 실제 애플리케이션에서는 이 문제는 확률, 통계문제다라고 정의하지 않더라도 기본 개념들이 늘 사용되기 때문에 익숙해질 필요가 있습니다. 세번째로 응선대라고 불리는 ‘응용선형대수 Linear Algebra’가 필요합니다. 고등학교 때 배우는 행열 matrix의 심화과정입니다. 데이터의 표현방식에 따라서 조금씩 달라지겠지만, 기본적으로 모든 데이터는 matrix 형태로 표현이 가능하기 때문에 행열에 대한 기본 연산에는 익숙해질 필요가 있습니다. 그리고 고급 머신러닝이나 알고리즘을 배우게 되면 행열이나 벡터가 기본 데이터 구조로 사용되기 때문에 필수적입니다.

다음으로 컴퓨터 사이언스 또는 컴퓨터 공학 (컴사/컴공)과의 과목들입니다. 당연히 프로그래밍 언어 하나 정도는 배워둬야 합니다. 제가 학교 다닐 때는 C언어가 기본이었지만, 최근에는 Java를 CSE101로 수강하는 곳도 많을 것입니다. 프로그래밍 랭귀지마다 문법이 조금씩 다르지만, 기본 개념은 비슷비슷하기 때문에 한가지 언어를 잘 배워두면 다른 언어를 쉽게 배울 수 있습니다. 단지 웹기반의 프로그래밍만 필요하다면 최근에는 그냥 Python, PHP, Scala, Ruby 같은 언어는 좀 더 배우기 쉬울 것입니다. 그래도 제대로 배우겠지만 시작은 역시 C 언어입니다. 다음으로는 데이터 구조 Data structure나 알고리즘 Algorithm 수업을 들어두면 프로그래밍을 하는데 도움이 됩니다. 그리고 세번째는 데이터베이스 과목인데, 그런데 컴사/컴공의 데이터베이스는 너무 low level까지 다루기 때문에 (프로젝트로 데이터베이스의 기능을 실제 구현해본다와 같은 것이 나올 수 있음) 문과생들에게는 다소 어려울 수 있습니다. 그렇기 때문에 산업공학과나 다른 과에서 다루는 좀더 애플리케이션에 치중한 데이터베이스 수업을 들으면 됩니다. 기본적으로 컴퓨터를 전공한다면 이산수학 Discrete mathematics 수업도 듣습니다. 오래 되어서 정확히 기억나지 않지만, 집합에서 다루는 개념들을 컴퓨터의 원리에 맞게 맞춘 과목입니다.

당연히 컴공과에서 머신러닝 Machine Learning이나 인공지능 Artificial Intelligence 과목도 들어야겠지만, 대부분은 대학원 과목입니다. 머신러닝/AI 과목은 전기전자과에서도 개설되는 경우가 많습니다. 정확히 같지는 않겠지만 산업공학, 생명공학, 화학공학 등의 과에서도 그 과에 맞는 다양한 수학 또는 데이터마이닝 수업들이 존재합니다. (교수님/연구실의 존재에 따라서 달라지겠지만..) 단, 학과마다 그 학과에 맞는 수업을 진행하기 때문에 무턱대고 수강신청을 하면 나중에 피곤할 수도 있으니 잘 알아보고 신청하셔야 합니다.

그외의 과들에서는… 기본적으로 각 과의 개론 (101) 수업들은 들어두면 좋습니다. 산업공학과에서는 최적화 OR, 산업응용통계, 실험계획법 등의 수업이 존재합니다. 전에도 말씀드렸는데, 데이터마이닝 알고리즘들이 자연의 현상에서 영감을 받아서 구현된 것들이 많으니 물리학이나 화학의 기초도 필요할 수도 있고 (근데 굳이 수업까지는…), 자신이 원하는 응용분야에 맞게 생명이나 화공 등의 수업을 들어두면 좋습니다. 질문자는 이미 경제학을 선택했기 때문에, 굳이 이런 쪽 분야의 수업은 필요치 않을 듯합니다.

C나 Java 등의 프로그래밍 언어를 배우기가 힘들다면, 다양한 수학, 통계 관련 분석툴들에 익숙해질 필요가 있습니다. 가장 간단하게는 MS오피스에 포함된 Excel입니다. 개발자가 아닌 경우라면 회사에서 가장 많이 사용하는 프로그램 중에 하나가 엑셀이기 때문에 미리 고급 기능을 익혀두면 나중에 편하게 사용할 수 있습니다. 조금 더 전문적으로 데이터 분석을 하겠다면 SAS, R, Matlab, Mathematica, Minitab 등의 수많은 분석툴들이 있습니다. (R은 프리소프트웨어이고 학계에서도 많이 사용하기 때문에 R을 배워두면 좋습니다. 최근 빅데이터 붐과 함께 R의 사용빈도도 늘어났기 때문에 미리 공부하고 익혀두면 좋습니다.) 그외에도 특정 도메인/데이터에 맞는 또는 기능에 맞는 다양한 분석툴들이 존재하기 때문에 어떤 것들이 필요한지 미리 확인해보시기 바랍니다.

처음이라면 각 관련 과의 개론 수업, 공학수학, 프로그래밍 언어부터 시작하시고, 다음으로는 확률통계, 응선대, 이산수학, 데이터구조, 다음으로는 응용산업통계나 데이터베이스 등의 수업으로 차곡차곡 들으면 될 듯합니다. 어차피 학년 (난이도)에 맞는 1XX, 2XX 이렇게 수업이 설계되었기 때문에 아래쪽부터 차곡차곡 수업을 들으면 큰 어려움은 없을 것입니다. 이런 공학수업뿐만 아니라, 영어 (특히 독해)는 꾸준히 연습해두는 것이 좋습니다. 분석이나 개발 관련 기술문서들은 대부분 영어로 되어있기 때문에 (보통 번역서는 6개월, 1년 정도 늦게 나옴) 최근 트렌드나 기술을 익힐려면 영어는 필수입니다. (토플/토익점수는 필요치 않아요.) 무엇보다 인터넷과 게임 외의 컴퓨터와 친해지는 것이 가장 우선입니다.

충분히 답변이 되었는지 모르겠으나, 처음에는 막막해 보일 수 있지만 한 발을 일단 내딛고 나면 길이 보일 수도 있습니다.

==

페이스북 페이지: https://www.facebook.com/unexperienced

댓글을 달아 주세요

Share           Pin It

앞으로 다양한 주제의 글이 남아있지만, 이번 포스팅이 추천 시스템에서는 가장 핵심이 되는 추천 알고리즘에 대한 글입니다.

본격적으로 추천 알고리즘이 개발된 것은 20여 년 밖에 되지 않지만, 실 서비스에서 쉽게/바로 적용이 가능하고 그 효과도 즉각적으로 측정이 가능하기 때문에 다양한 방법들이 개발되었습니다. 밑에서 자세히 설명하겠지만 대부분의 알고리즘들이 매우 간단하여, 데이터마이닝에 큰 지식이 없는 이들도 쉽게 구현, 적용할 수 있어서 다양한 분야의 전문가들이 추천 알고리즘에 살을 붙여서 개념의 간단성에 비해서 매우 다양한 방법들이 존재합니다.

가장 원시적인 추천 알고리즘은 컨텐츠 기반의 필터링 (CBF)이 될 듯합니다. 아이템의 속성/메타데이터를 이용해서 연관 아이템을 묶어주기 때문에 별로 어렵지 않게 구현도 가능합니다. 예를들어, '변호인'이라는 영화를 본 사용자에게 변호인이 장르가 '드라마'이므로 드라마 장르의 다른 인기 영화를 추천해준다거나, (양우석 감독이 메가폰을 잡았기 때문에 양우석 감독의 전작인 XX를 추천해주면 된다고 적으려 했는데, 변호인이 첫번째 영화네요ㅠㅠ) 송강호씨가 주연을 맡았기 때문에 송강호씨가 출연한 다른 작품인 관상이나 설국열차 등을 추천해주는 형태입니다. 알고리즘이 매우 직관적이고 쉽기는 하지만, 추천되는 아이템이 너무 뻔하다는 단점이 있습니다. 그래도 CBF는 다른 알고리즘들과 하이브리드 형태로 여전히 사용되고 있습니다. 밑에서 설명할 CF방식의 커버리지 문제를 해결하기 위해서 CBF를 이용하면 좋습니다.

보통 추천 알고리즘이라고 말하면 대부분 협업필터링 Collaborative Filtering (CF)으로 이해합니다. 그만큼 CF가 추천시스템의 대표 알고리즘입니다. 그렇기에 지난 20여년간 다양한 방법들이 개발, 활용되고 있습니다. CF의 기본 컨셉/가정은 'likely-mind'라고 표현하듯이 나와 비슷한 성향을 가진 다른 사용자들이 좋아하는 것이면 나도 좋아할 가능성이 높다는 것입니다. 내가 영화 '변호인'을 재미있게 봤다면, '변호인'을 재미있게 본 다른 많은 사람들이 재미있게 본 '화려한 휴가'나 '26년' 등을 추천해주는 형태입니다.

CF방식도 머신러닝을 활용한 모델기반CF가 있고, 단순히 앞서 설명한 가정 (likely-mind)을 그대로 구현한 메모리기반CF가 있습니다. 죄송하지만, 모델기반의 CF는 제가 구현/적용해보지 않아서 자세한 설명을 해드릴 수 없습니다. 나이브 베이지언이나 뉴럴네트워크 등의 다양한 머신러닝/AI기법을 활용해서 추천을 해준다 정도로 이해하고 넘어가면 됩니다. 밑에서 다시 언급될 Matrix Factorization도 모델기반이라고 부르는 듯한데, 이것은 따로 설명하겠습니다.

메모리 기반 CF가 가장 흔하게 사용되는 추천 알고리즘입니다. 유저-아이템 레이팅을 모두 메모리에 올려두고 유저-유저 또는 아이템-아이템의 관계 (유사도)를 계산한다고 해서 메모리 기반이라 불립니다. 메모리 기반 CF도 사용자기반CF와 아이템기반CF로 나뉩니다. 사용자 기반의 경우 나와 유사한 사용자들이 좋아하는 상품을 추천해주는 형태입니다. (나 - 유사사용자들 - 그들이 좋아한 아이템들) 반면에 아이템 기반은 내가 좋아하는 아이템의 관련 아이템들을 추천해줍니다. (나 - 내가 좋아한 아이템들 - 그것들의 관련 아이템들) 여기서 중요한 점은 유사사용자 또는 관련아이템을 찾아내는 것입니다. 그래서 다음 글에서는 CF의 핵심은 유사도 측정 방법에 대해서 따로 설명할 예정입니다. 

일반적으로 유저수와 아이템수 중에서 적은 쪽에 맞춰서 추천시스템을 구현하는 것이 정확도나 강건성 등의 측면에서 더 낫다고 합니다. 유저기반이 조금더 일찍 소개되었지만, 아마존의 성공 이후에 아이템기반이 많은 주목을 받았고, 구글 유튜브도 최근(?)에 아이템기반으로 개인화추천을 변경했다고 합니다. CF 방식의 장점은 간단하지만 의외로 추천이 잘 된다는 점이 있고, 또 우연에 의한 추천이 가능하다는 점입니다. 그러나 적어도 한번 이상 유저들이 조회해본 상품들이 추천되기 때문에 커버리지가 낮다는 단점이 있습니다. 그리고 새로운 유저가 시스템에 등록했거나 새로운 아이템이 등장했을 때, 유저-아이템 레이팅이 존재하지 않기 때문에 이른 유저/아이템에 적당한 아이템을 추천해주지 못합니다. (Cold start 문제라고 함) 그리고 CF방식도 기본적으로 인기도에 의한 추천이기 때문에 인기 있는 상품들이 더 자주 추천될 가능성이 높습니다. 이상하게 들리겠지만, 우연에 의한 추천이 가능하지만 또 전혀 그렇지 않을 수도 있습니다.

마지막으로 CF방법에서 가장 최근에 주목을 받는 것은 Matrix Factorization (MF) 방식입니다. 여러 논문들을 읽어보면 data dimensionality를 해결하기 위해서 MF를 사용한다고 하는데, 단순히 수학적인 계산 측면에서 보면 MF방식을 적용하기 위해서 행열 matrix 연산을 하는데 필요한 메모리도 감당하기 어렵습니다. MF방식을 따로 연구/구현해보지 않았기 때문에 자세하게 설명드릴 수는 없지만, 유저-아이템 레이팅 매트릭스에서 고유값 eigen vector를 구해서 행열을 분해하는 singular value decomposition (SVD)를 이용합니다. SVD의 자세한 설명은 위키피디어를 참조하시고, 간단히 말해서 N x M 레이팅 매트릭스 (R)를 a개의 고유값으로 분해한다면 N x a의 U 행열과 a x M의 V 행열로 분해해서, 다시 이들을 조합해서 missing value에 대한 예측치를 만들어주는 형태가 됩니다. (설명이 복잡한 것같은데, 더 궁금하면 구글링을...) 앞서 MF에서 SVD를 구하는 것도 계산이 클 수 있다고 말했는데, 최근에 로컬 업데이트를 통해서 SVD를 예측하는 방식도 나와있기 때문에 서비스에서 문제가 없습니다. 실제 Netflix에서도 몇 십억 건의 레이팅을 SVD로 분해했다고 하니, 서비스 적용에는 별 문제가 없습니다.

아주 러프하게 추천 알고리즘을 설명해드렸습니다. 다음 글에서는 유사도 측정방법이나 다른 고려사항들을 다루겠습니다.

추천시스템 전체 목록

  1. 추천 시스템과의 조우 (PR시리즈.1)
  2. 추천 시스템을 위한 데이터 준비 (PR시리즈.2)
  3. 추천대상에 따른 추천 시스템의 분류 (PR시리즈.3)
  4. 알고리즘에 따른 추천 시스템의 분류 (PR시리즈.4)
  5. 추천 시스템을 위한 유사도 측정 방법 (PR시리즈.5)
  6. 추천 시스템의 성능 평가방법 및 고려사항 (PR시리즈.6)
  7. 추천 시스템에서의 랭킹과 필터링 문제 (PR시리즈.7)
  8. 추천 시스템의 쇼핑하우 적용예 (PR시리즈.8)
  9. 개인화 추천 시스템에 대하여 (PR시리즈.9)
  10. 추천 시스템의 부작용 - 필터버블 (PR시리즈.10)
  11. 추천 시스템의 레퍼런스 (PR시리즈.11)
  12. 추천 시스템에 대한 잡다한 생각들 (PR시리즈.12)
  13. 추천 시스템을 위한 하둡 마훗 사용하기 (PR시리즈.13)
  14. 추천 시스템에 대해서 여전히 남은 이야기들 (PR시리즈.14)

==

페이스북 페이지: https://www.facebook.com/unexperienced

댓글을 달아 주세요

Share           Pin It

이번 글에서 추천 알고리즘에 따른 분류는 아닙니다. CF, 유저기반, 아이템기반 등의 일반적인 알고리즘의 설명은 다음 글에서 자세히 다룰 예정입니다. 이 글에서는 -- 적당한 표현이 떠오르지 않는데 -- 추천대상 또는 형태상의 분류를 다루고 있습니다. (아래는 그냥 '하다'체로 적겠습니다. 처음에 그렇게 적어놨었었네요.)

추천 시스템을 크게 나누면 전체추천, 그룹추천, 개인추천 (개인화), 및 연관아이템추천으로 나눌 수 있을 것같다.

전체추천은 말 그대로 불특정 다수에게 추천하는 형태다. 일반적으로 다음이나 네이버에 접속했을 때 첫화면에 보여지는 무수한 글/이미지/상품들이 전체추천이다. 일반적으로 에디터 또는 운영자들이 그날의 이슈에 따라서 선별해서 보여준다 (보통 featuring한다고 표현함). 조금 발전된 형태가 조회수나 댓글수 등을 확인해서 인기가 높은 글이나 아이템을 보여주는 형태다. 검색에서 실시간이슈도 불특정 다수에게 같은 내용을 제시하기 때문에 전체추천이다. 검색창에 글을 입력하면 나타나는 suggest도 전체추천에 해당한다.

그룹추천은 사용자들을 특정 그룹 (세그먼트)로 나눠서 각 그룹에 특화된 컨텐츠를 추천해주는 형태다. 다음탑 또는 쇼핑하우에 들어가면 내또래라는 영역이 존재하는데, 이는 성연령대를 기준으로 특정 그룹에서 좋아하는 키워드나 상품을 추천해주는 형태다. 미담 내에도 개별 기사들의 조회한 성, 연령, 접속지역을 분석해서 각 세대의 인기 기사를 보여주는데, 이것도 그룹추천이다. 네이버에는 청소년, 재태크족, 주부 등으로 그룹을 나눠서 인기키워드를 보여주는 서비스가 있다. 그룹별추천에는 앞서 내또래처럼 사용자의 데모그래픽 등의 메타데이터를 기반으로 그룹열 신택틱하게 세분화할 수도 있고, 네이버 인기키워드처럼 사용자와 키워드 페어를 그룹핑/클러스터링해서 의미단위로 그룹핑할 수도 있다. (참고로 네이버 그룹별 키워드는 LDA라는 알고리즘을 사용했다. LDA는 추후에 다시 다루게 될까?)

개인추천은 말그대로 개인별로 맞춤추천, 즉 (추천)개인화다. 개인의 과거 이력을 바탕으로 그/그녀의 관심사를 특정하고, 그것에 맞는 아이템을 보여주는 형태다. 일반적으로 CF 알고리즘이 사용된다. 나중에 다시 자세히 다루겠지만, 사용자를 어떻게 모델링할 것인가? (프로파일링)이 개인화추천의 핵심이다. 검색했던 키워드, 읽었던 기사 또는 기사내의 주요 단어, 구독하거나 유사한 행동 패턴을 보인 다른 사용자/친구 등이 모두 개인 프로파일에 포함될 수 있다. (자세한 것은 추후에 따로 다룰 예정이다.)

연관아이템추천은 사용자를 그루핑하거나 개인별 맞춤추천을 해주는 것이 아니다. 개별 아이템별로 관련 아이템을 보여주는 형태다. 미디어다음에서 기사를 보면 오른쪽 날개 영역에 관련기사/이슈를 보여주기도 하고, 언론사들은 기사 하단에 관련기사를 피쳐링해서 보여주기도 한다. 다음의 쇼핑하우에서 상품을 검색해보면 아래쪽에 추천 영역이 노출되는데, 그곳에서 '최근본상품' 탭이 아이템추천이다. 아마존과 유튜브의 관련동영상이 바로 CF기반의 연관아이템추천이디. 일반적으로 메타데이터를 이용해서 (일반화시켜서) 클러스터링해서 관련아이템을 뽑아내거나 CF방식으로 관련아이템을 뽑을 수 있다. 추천시스템에서는 일반적으로 CF방식을 사용하지만, 커버리지문제 때문에 CBF와 하이브리드 형태로 조합되거나 너무 쌩뚱맞은 추천을 막기 위해서 메타데이터를 이용한 재가공/필터링이 이뤄지기도 한다. 그리고, 함께 구입한 물건을 연결하는 장바구니 분석은 아주 협소한 형태의 CF 분석방법이다. (기술적으로, Association Rule 기법이라 부름) 그리고 만약 개인의 프로파일이 최근 본 아이템들이면, 연관아이템과 결합되면 바로 개인화추천이 된다. (아마존 탑 페이지 참조)

다음 글에서는 CF를 중심으로 알고리즘 측면에서의 추천 시스템을 분류할 예정이다.

추천시스템 전체 목록

  1. 추천 시스템과의 조우 (PR시리즈.1)
  2. 추천 시스템을 위한 데이터 준비 (PR시리즈.2)
  3. 추천대상에 따른 추천 시스템의 분류 (PR시리즈.3)
  4. 알고리즘에 따른 추천 시스템의 분류 (PR시리즈.4)
  5. 추천 시스템을 위한 유사도 측정 방법 (PR시리즈.5)
  6. 추천 시스템의 성능 평가방법 및 고려사항 (PR시리즈.6)
  7. 추천 시스템에서의 랭킹과 필터링 문제 (PR시리즈.7)
  8. 추천 시스템의 쇼핑하우 적용예 (PR시리즈.8)
  9. 개인화 추천 시스템에 대하여 (PR시리즈.9)
  10. 추천 시스템의 부작용 - 필터버블 (PR시리즈.10)
  11. 추천 시스템의 레퍼런스 (PR시리즈.11)
  12. 추천 시스템에 대한 잡다한 생각들 (PR시리즈.12)
  13. 추천 시스템을 위한 하둡 마훗 사용하기 (PR시리즈.13)
  14. 추천 시스템에 대해서 여전히 남은 이야기들 (PR시리즈.14)

==

페이스북 페이지: https://www.facebook.com/unexperienced

댓글을 달아 주세요