코드만 돌린다고 아냐, 모델이 어떻게 돌아가는지 알아야지

데이터 사이언스 강의 6주차 수업을 끝내고 수업 매니저분들, 학생분들과 이런저런 이야기를 나눴다. 제일 많이 들은 이야기는 역시 왜 이렇게 어렵냐, 첫 시간부터 알파고에 썼다던 Neural Network로 인공지능 적용하는거 한 두줄짜리 코드로 퐉~ 보여줄 줄 알았는데, 계속 통계학 수식만 나와서 괴롭다는 이야기였다.

공감한다 – 다른 글에 썼듯이 필자도 MIT에서 머신러닝 들을 때, 반 학기 동안 통계학 수업 잘못 들어온 줄 알았었다.

공감해서 수업 진행 방식을 바꿀꺼냐고 묻는다면, 내 답은 정해져 있다. 수업이 어렵다고 하실게 아니라, 데이터 사이언스에 대한 오해해서 벗어나시라고. 코딩 좀 들어간다고 데이터 사이언스가 개발이라고 착각하지 마시라. 데이터 사이언스는 빅데이터와 통계를 결합한 신종 통계학이다. If와 Then으로 결합된 코딩으로 Yes/No의 결과값이 나오는게 아니라, 확률적인 추정을 제시하는 모델들의 결합이다.

한 예로, 텍스트 크롤링(데이터 긁어오는 작업) 프로젝트 하나에 참여하고나면, 응용 능력에 따라 텍스트 크롤링 전문가로 성장할 수 있다. 그러나 텍스트 크롤링으로 나온 데이터에 SVM을 적용해서 데이터 그룹핑을 했다고해서 다음번에도 같은 방식을 적용할 수 있는 확률은 매우 낮다. 기존의 SVM이 Linear였다면 Non-linear 모델도 적용할 수 있고, 데이터의 특성에 따라 (특정 단어 조합이 매우 많은 경우는 데이터 분포가 다르게 나온다) Non-linear 모델에 적용하는 Kernel 함수도 달라진다. 

결국 통계학 모르면 머신러닝 할 수 없다. 머신러닝은 이름만 공대용으로 바뀐 통계학이니까.

(모 대학 화학 수업 칠판 – 저 동네도 수학 모르면 못 살아 남겠다)

 

1. 데이터 사이언스와 통계학

LSE에서 경제학 석사하던 시절에 우리나라 유명 사립대학에 교수로 임용된 선배님형님(?)을 뵌 적이 있다. 형님교수님 말씀이 경제학 학부 수업을 가르칠려니 봐야할 교재가 참 많아지더라, 가르치려니 오히려 더 배우는게 많고, 박사 공부 시절에 못 봤던게 참 많이 보인다고 하시더라. “석사 나부랭이”였던 그 시절엔, 박사 5년동안 연구하면 수업 교재는 쉽게 뚝딱 나오는건 줄 알았는데, 이번에 데이터 사이언스 강의 노트를 만들면서 “봐야할 교재가 참 많아지더라”는 말씀에 너무너무 공감을 하게 됐다. 박사는 특정 주제를 잡고 연구하는 사람이지, 가르치려고 이것저것 얇고 넓게 공부하는 사람이 아니거든. 어느 잘 짜여진 교재를 따라가기만하면 그런 부담을 안 느낄 수도 있겠지만, 마음에 드는 교재가 없어서 결국엔 새로 만들어야되니 여러 책을 참조할 수 밖에 없고, 자기 색깔로 바꾸는 것도 참 쉬운 일이 아니더라.

보스턴에 처음가서 난데없이 맡았던 Stochastic Calculus라는 석사용 수학 수업 조교할 때는, 그나마 교수님이 쓰셨던 강의노트에서 부족한 내용을 설명해주고, 여러 책에서 찾은 연습문제 풀어주면서 수업을 진행했었는데, 이번에 데이터 사이언스 강의용으로는 마음에 드는 교재도 없고, 직접 교재를 만들고 예제 코드를 다 치려니 은근히 창작의 고통이 심했다. 강의 준비하니까 평소에 가볍게 생각하고 지나갔던 부분들도 다시 보면서 공부하게 되고, 몰랐던 내용들 일부는 새로 공부하게 됐고, 일하면서 무심코 썼던 방법들이 틀렸다는 사실을 알게되어서 쪽팔림도 좀 있었다. 그런 내용을 다 강의에 집어넣으려고 욕심을 내니 강의가 어렵다고 생각할지도.

글 첫머리에도 썼듯이, 처음에 머신러닝 수업을 들어가서 한동안 통계학 수업에 잘못왔나 싶을만큼 통계학만 공부했던 기억 탓인지 처음에 강의 노트를 만들었을 때는 지금보다 훨씬 더 (수리)통계학에 기반했었다. 주변에서 조언해주는 지인들 덕분에 수학적인 부분을 많이 직관적인 내용으로 바꾸고 R 코드에 수업 절반의 가중치를 쏟는 지금도 통계학 수식이 많이 나와서 괴롭다는 이야기를 듣기는 하지만 ㅋㅋ

근데 영어권에서 데이터 사이언스 or 머신러닝 입문자에게 추천하는 교재들을 보면, 역시 예상대로 대부분은 통계학 교재다. 아마 제일 많이 알려진 교재가 “An Introduction to Statistical Learning with Applications in R” (PDF) (약칭 ISLR, 위 사진 참조)일텐데, 아예 책 제목에 보다시피 “통계학”이라는 단어가 들어가 있다. MOOC 수업 중에서 제일 많이 알려진 수업은 아마 Andrew Ng 전 스탠포드 교수님의 Coursera 강의일텐데, 이 수업도 대단히 수리통계학 기반의 내용들로 구성되어 있다. 오죽했으면 이 수업 평가하는 사람들이 머신러닝에 대해서 개발자들이 잘못알고 있다면서, 이 수업을 보면 머신러닝은 “Not an engineering project, but an applied mathematics”라고 했을까?

ISLR 수업 링크 모아놓은 R-blogger.com 페이지:
https://www.r-bloggers.com/in-depth-introduction-to-machine-learning-in-15-hours-of-expert-videos/

저 수업에 나온 내용들 중에 정말 일부의 수식만 갖다 쓰는데도 통계학 수식만 나와서 괴롭다고하니, 한편으로는 예전 내 생각이 나서 이해가 되면서도, 또 한편으로는 참 안타깝다. 참고로 저 교재랑 Andrew Ng 교수님 수업은 모두 학부 고학년용이다. (교재 머리말에 아예 그렇게 적혀있다. 학부생이나 Non-technical PhD 대상이라고) 그리고 이미 알려진대로 한국에서 적당히 수학 공부하고 간 유학생들이 미쿡에서 대학원가기 전까지 수학으로 힘들어하는 경우는 거의 없다. 딱 그정도 수학이면 된다. 필자도 강의 노트 만들면서 고교 수학 교재를 옆에 두는데, 요즘와서 느끼는거지만 우리나라 고등학교 교과서 정말 짱이다.

 

2. 데이터 사이언스와 코딩

데이터 사이언스 수업 준비하면서 또 많이 들었던 이야기가 “실제로 해 봐야 알지, 수업만 들어서 아냐”고 하는 불평이다. 이 코멘트는 한편으로는 맞는 말이고, 다른 한편으로는 틀린 말이다. 맞는 부분은 당연히 수식의 개념만 이해하는데서 끝나는게 아니라 그걸 화면에 코드로 띄워봐야 지식을 몸으로 습득할 수 있다는 이야기이고, 틀린 부분은 코드만 치는 일은 사실 피상적인 이해에 지나지 않기 때문이다.

(SVM 모델링시 최적 파라미터 찾는 코드 예시)

주변에서 가끔보는 데이터 사이언스 수업 중에, Kaggle이 데이터 전처리를 싹 해준 데이터를 이용해서 몇 가지 알고리즘을 적용해보고 그 결과값을 Kaggle에 제출하는 수업이 있더라. 그 방법이 틀렸다고 생각하지는 않지만, 1. 왜 Random Forest를 쓰고, 2. Random Forest의 파라미터는 어떤 값을 줘야하고, 3. 각각의 파라미터는 무슨 아이디어에서 출발하고, 4. 그 알고리즘 전체가 어떤 아이디어에서 나왔기 때문에 어떤 종류의 데이터와 어떤 목적에 활용할 수 있다는 근본적인 메세지는 너무 어려운지 제시를 안 하더라. 이런 수업에서는 실제로 뭔가를 돌려보기는 하는데, 주어진 Kaggle 데이터를 돌려보는데서 끝나게 된다. 

예시로 SVM (Support Vector Machine) 코드를 하나 보자.

 
library(e1071)
변수_1 <- svm(y값 ~ x값들, data = 훈련 데이터, method = "C-classification", kernel = "linear"
변수_2 <- svm(y값 ~ x값들, data = 훈련 데이터, method = "C-classification", kernel = "radial", cost = Regularization 값, gamma = 정규분포의 분산의 역수

첫번째 라인에서 SVM 명령어 패키지를 불러왔고, 두번째 라인은 Linear SVM을 적용하는 코드다. 그리고 세번째 라인은 Non-linear SVM을 적용하는 경우인데, Non-linear는 함수가 복잡하니까 여러가지 설정이 필요하다. 수업 시간에 저 설정들 중 가장 최적 값을 찾는 몇 줄짜리 알고리즘만 배우고 끝날게 아니라, cost라고 쓰인 부분이 무슨 의미인지, gamma라고 쓰인 부분이 무슨 의미인지 이해 못하면 사실 SVM은 배우나 마나한 지식이 된다.

주변에서 데이터 사이언스 수업을 들었다고 하는 지인들의 지식 수준이 딱 첫번째 라인과 두번째 라인에 머물러 있다는 사실은, 현재 시장에 돌아다니는 많은 수업들이 마지막 라인을 제대로 설명하지 않고 있다는 이야기라고 봐야하지 않을까? “실제로 해 봐야 알지, 수업만 들어서 아냐”에서 한 발자국 더 나가서, “실제로 해 본다고 아냐, 모델이 어떻게 돌아가는지 알아야지”라고 말해주고 싶다.

(참고로, 세번째 라인은, Non-linear SVM을 적용할 때, 정규분포를 Kernel로 쓰고, Kernel의 형태를 gamma로 지정하고, over-fitting이 발생하지 않도록 cost – regularization parameter의 역수 – 를 조정하는 내용들이 다 포함되어 있다. gamma 값을 어떻게 지정해야하는지, cost는 왜 다른 값의 역수를 써 놨는지 모르고 무작정 다른 변수만 집어넣으면 시간 낭비 밖에 더 되랴? 뭔가 엄청나게 복잡한게 숨어 있는 것처럼 써놓은 것 같지만, 사실 개념 이해만 하고 가기에 넘사벽 지식은 아니다.)

(필자가 실리콘밸리에서 데이터 사이언티스트 면접 중 위의 질문이 나왔던 적이 있다. 어떤 목적을 위해서 어떤 데이터를 모아야하고, 적용할 수 있는 알고리즘을 주욱 나열하고, 각각을 어떻게 적용하는지 코딩 아이디어를 나열하는데, 결국 코딩이 아니라 수학/통계학 지식이 어느 정도 깊은지, 그래서 그 지식을 데이터 셋에 맞게 잘 활용할 수 있는지를 물어보는 면접이었던 것 같다.)

필자가 그랬던 것처럼, 세번째 라인을 “이해”할 수 있는 지식을 갖고 있으면 충분히 데이터 사이언스에 도전할 수 있다. 필자가 기업들에 제공하는 코드도 결국에는 세번째 라인을 어떻게 쓰느냐에 따라 결정이 되니까. 다만 실제 업무는 저런 모델 한 줄이 나오기까지 수 많은 모델을 테스트하고, 결과값도 비교해보고, 그리고 다양한 종류의 데이터 전처리도 진행해야 한다.

많은 개발자들이 데이터 사이언스를 보니 코드가 들어가 있다고 개발이랑 비슷하게 접근한다. 그런 분께 되묻고 싶다. 저 위의 예시 코드를 이해하려면 코딩 지식이 필요할까? 통계학 지식이 필요할까? 데이터 사이언스에서 코딩은 알고 있는 지식을 표현하기 위한 외국어이지, 건축에 쓰는 자재가 아니다.

“수업만 들어서도”, “실제로 해보기만 해서도” 부족하다. 결국엔 통계학 모델을 이해해야 한다. 수업의 절반을 모델 아이디어와 설명에 쓰는 것도 이런 이유에서다.

 

3. 데이터 사이언스와 개발자 잡마켓

먼저 분명히 해두고 싶은 것은, 데이터 사이언티스트는 개발자가 아니고, 개발자도 데이터 사이언티스트가 아니라는 사실이다.

데이터 사이언스 업무의 특성상, 데이터 서버와 관리에 대한 깊은 지식이 있어야하고, 그 겹치는 영역 때문에 데이터 사이언스하려면 개발할 줄 알아야한다고 착각들을 한다. 그러나 데이터 사이언티스트는 데이터를 어떻게 활용할지 수리 통계학적인 모델을 만들고 테스트하는 사람이지, 데이터 베이스를 셋업하는 사람이 아니다. 한 예로, 데이터 크롤링해서 그래프로 정리했으면, 데이터 엔지니어링 업무와 데이터 애널리스트의 시각화 업무를 한 거지, 거기에 데이터 사이언스는 안 들어가 있다.

필자가 개발자를 뽑으려고 면접을 보면, 자기들이 머신러닝에 노출도가 있다면서 MNIST 데이터 셋을 CNN으로 돌려서 숫자 인식하는 알고리즘을 만들어봤다, 무슨 알고리즘을 어디에 넣어봤다고 그런다. 솔직히 말해서 필자는 그런 코드 몇 줄 실행해본 경험이랑 MBA에서 2년동안 파티하고 골프치고 온 경험을 (거의) 같은 클래스로 본다. 그런 이야기를 하는 1-2분 동안 정말로 미안하지만 면접을 빨리 끝내고 싶더라. 차라리 그런 말 안 하고 자신의 “개발” 실력을 자랑하셨으면 더 좋았을 듯.

(SVM 모델 Tuning 하는 작업 코드 예시)

요즘보면 오픈 소스 데이터 크롤링 좀 해와서 머신러닝 알고리즘 하나 얹어놓고는 무슨 대단히 고난이도 작업을 진행 중인 것처럼 하는 사람들이 많다. 정작 이런 분들이 해놓은 머신러닝 알고리즘 까보면 저 위의 SVM 기준으로 두번째 라인 코드더라. 당연히 왜 “Linear” 모델 적용했냐고 물어보면 횡설수설한다. Kernel을 쓴 사람들도 왜 Kernel을 썼는지 물어보면 제대로 대답하는 경우를 본 적이 없다. 왜 정규 분포가 들어가는 Kernel을 써야하는지, Parameter는 뭘로 잡아서 테스트를 해 봤는지 하나도 대답 못한다. 내가 그런 사람을 왜 뽑아야하지? 왜 VC들이 그런 회사에 투자해야하지? “개발+머신러닝 기초지식 <> 데이터 사이언티스트” 라는 말에 좀 공감하실 수 있나? (<>는 “다르다”는 코드)

필자의 수업에 와 계신 개발자 분께서 그러시더라. 그래도 저런 프로젝트(?) 경험이 있으면 회사들이 데리고가서 쓴다고. 최소한 대학교 갓 졸업하는 학생들은 저런 패키지로 포트폴리오 만들어서 취업에 쓸꺼라고.

쇼크 먹었다.

 

4. 나가며

외국계 투자은행에서 PPT 슬라이드 만들고, Excel로 Cash flow 모델 만들고, 술 접대 열심히하면서 정작 공부했던 머리는 하나도 못 쓰던 그 시절, 전 세계 방방곡곡을 쏘다니며 Risk modeling하고 있던 아는 형이 그러더라. Risk modeling을 해서 가져가면, 한국에서는 “그래서 잘 맞추나요?”라는 질문이외에 다른 질문은 안 나오는데, 다른 나라에서는 모델에 무슨 변수를 넣었고, 어떻게 계산했는지 너무너무 꼼꼼하게 물어서 대답하기 지친다고. 보험사 다니는 다른 형님 하나는 경제학 수업 때 나온 “Euler equation”을 활용한다는 보험 컨설팅 회사에 수학 알고리즘 설명 좀 해달라고 했더니, 계속 도망다니더니 몇 달 후에 프랑스 본사에 있는 모델 담당 직원을 데리고 와서 프리젠테이션을 해주더라고 그러시기도 했다.

그렇게 실력없는 사람들이 판을 치고 있는 건가 싶어서 낙담하다가도, 정작 요즘 우리나라 신용등급 계산하는 모델을 보면 감탄사가 절로 나온다. 일전에 이런저런 개인 데이터 크롤링해서 개인의 신용 등급을 새로 계산하는 모델을 한번 만들어볼까 싶었는데, 한국인의 동질성, 우리나라 신용평가 기관들이 가진 데이터의 종류, 현재 신용등급 산정 기준을 보고 맘을 접은 적이 있다. 10등급인 우리나라 신용등급 데이터를 갖고 법적인 제한만 없다면 최소한 100등급의 세부 구분도 얼마든지 할 수 있겠더라. 이래서 같은 2등급인데도 누구는 대출 심사 통과하고 누구는 리젝되는 거겠지. 한참 공부한 후에, 적어도 한국에서는 저런식으로 크롤링한 데이터 만으로 신용등급 기관이 가진 모델보다 압도적인 우위를 점할 수가 없겠다 싶어서 맘을 접었다. 실력없는 몇 몇 사람들 때문에 Risk management 여러 곳에서 욕을 먹고 있지만, 정작 뛰어난 분들이 우리나라의 금융시장 수준을 꽤나 많이 끌어올려놓았다는 증거가 아닐까?

쇼크먹은 맘을 좀 가라앉히고, 수업은 앞으로 2종류로 진행할 생각이다. 수리통계학적인 배경지식을 코드 by 코드로 화면에 띄워가며 차근차근 개념 설명해주는 강의와, 다양한 종류의 예제를 R / Python 같은 대중적인 오픈 소스 언어로 실행해보는 온라인 플랫폼을 만들어 볼까 한다. (귀차니즘을 이겨낸다면…) 두번째 수업은 지적인 도전의 비중은 낮으니 오프라인 수업을 들을 필요는 없어보이고, 손을 많이 쓰면서 몸에 숙달을 시키는 작업 위주로해서 대학교 갓 졸업하는 학생들이 지금보다 더 퀄리티 있는 포트폴리오를 만들 수 있도록 돕고 싶다. 학생들의 수준이 높아져야 시장 수준도 높아지고 업계도 발전할 것 아니겠나?

X