오랜만에 WorkingUS.com을 들어가봤다. 미국에서 일하는 한인들의 모임인데, 가끔은 Data Science 관련 분야에 대한 질문 & 답변도 올라오고, 한국 상황이 아니라 미국 상황에 맞는 답변이 많기 때문에 필요하신 분은 참고하시면 좋겠다. 링크의 어느 댓글을 보다가 필자기 2016년에 받았던 여러가지 질문들이 생각나서 한번 정리해본다.

참고로 링크를 보면 느끼게 되겠지만, 한국처럼 코딩을 얼마나 해 봤냐, C언어는 쓸 줄 아느냐, 알고리즘 한번 짜봐라 같은 개발자 면접스러운 질문을 받는 일은 절대 없다. Data Scientist라고 타이틀을 달아놓은 Data Analyst 면접이라면 Tableau 같은 Data Visualization tool을 얼마나 잘 쓰느냐고 묻겠지만, 정말 Data Scientist 면접은 수리통계학에 직간접적으로 관련 있는 질문들 밖에 없었다는 점을 다시한번 강조한다.

Q1. In a n-dimensional vector space, how do you describe dimensionality reduction? How is it related to projection matrix? How have you used it in your previous work?

박사 시절 썼던 논문 중 한 부분에 Markovian 시뮬레이션 10억개를 묶은 데이터 처리를 하느라 Dimensionality reduction을 썼던 부분을 살짝 언급했더니 나왔던 질문이었다. 머신러닝 공부가 탄탄하게 잘 된 분들은 바로 감을 잡겠지만, PCA를 Vector Space 로 설명할 수 있는지에 대한 테스트다. 결국 N개의 Linearly independent vector가 만든 공간에서 Eigen vector를 찾아내는 작업이 공간을 재구성하는 작업이라는 점, 이왕 재구성되는 공간이면 서로간 orthogonal vector를 만들어내야 가장 효율적인 차원 축소가 된다는 점을 설명하고, 추가질문에 답변하는 방식으로 인터뷰가 진행되었다.

Q2. Why is OLS the Best Linear Unbiased Estimator and when does it break down?

학부 고학년이나 석사 1학년 정도에 배우는 내용이다. 데이터 y값이 정규분포를 따를 때, MLE가 Best Unbiased Estimator이고, 이 값이 OLS와 일치한다는 점, 오차항 제곱의 최소값을 찾는 작업이 결국 Variance가 가장 작은 예측치를 찾는 작업이 된다는 걸 간단한 수식을 써가면서 증명했다. 당연히 Break down 되는 경우는 종속변수 y값이 iid 가정 (Independent, Identically Distributed)을 만족시키지 못할 때, Heteroskedasticity가 있을 때, ARIMA 형태의 시계열 시퀀스 에러가 있을 때 등등을 들고, 각각에 해당하는 예제, 실제로 데이터 모델링을 할 때 어떤 테스트들로 확인할 수 있는지 등등에 대한 질문이 이어졌다.

iid가정은 시뮬레이션 데이터로 작업할 때는 전혀 고려할 필요가 없었다. 내가 정하는 시뮬레이션 기준대로 데이터가 생성되기 때문이다. 실제데이터로 테스트해보고 싶다면, 가장 쉬운 방법으로 sub sample을 5개 정도 뽑은 다음 두 사건이 각각 일어날 확률과 동시에 일어날 확률을 비교해서 독립사건 조건을 충족시키는지, sub sample들이 분포가 (거의)일치하는지 정도 확인해보면 될 것 같다.

Heteroskedasticity나 Autocorrelation은 그런 특징이 존재하는지 여부를 귀무가설 vs. 대립가설로 놓고 2개의 Regression을 비교하면 된다. 간단하게 쓰는 F-test부터 White test나 Durbin-Watson test가 모두 그런 종류의 테스트들이다. 실제로 자주 쓰냐고?

데이터 작업을 할 때 제일 간단한 작업은 Regression 명령어 한 줄을 치는 작업이고, 제일 어려운 작업은 내 결과가 얼마나 합리적인지를 보충설명해주는 100개의 다른 가능성을 고려하는 작업이다.

Q3. In what context do you prefer MLE?

어차피 분포함수만 알고 있으면 MLE 쓰는게 제일 “짱”이지 않냐고 농담조로 답변했을 때 나온 추가 질문이다. 간단히 비교하자면 OLS는 평균 (Mean)을 찾는 작업이고, MLE는 최빈값(Mode)를 찾는 작업이라고 할 수 있다. 정규분포를 비롯해 평균 = 최빈값 조건을 만족하는 많은 분포함수들에서 OLS와 MLE가 (거의) 같다. (“거의”가 빠지려면 분산 쪽에 대한 추가적인 가정이 있어야함)

그럼 분포함수가 좌우대칭으로 생겼으면 MLE를 쓴다고 대답해야할까?

아니다. 좀 더 정확하게 이야기하면, 데이터의 분포를 모를 때는 Least Square 가 제일 단순하면서도 틀릴 확률이 낮은 방법이고, 분포를 알 때는 무조건 MLE를 쓰는게 맞다. Poisson 분포는 오른쪽 skewedness가 심할 때 평균 = 최빈값이 깨지는거 아니냐고? 계산하는 사람 입장에서 평균이 더 필요한가? 아니면 최빈값이 더 필요한가?

Q4. For what data set do you consider a Poisson distribution?

이건 Criteo 재직시절, 필자가 Impression이 아예 없었던 데이터, Click이 아예 없었던 데이터를 처리하는 작업 중에 그 분포가 Poisson인지, Truncated Poisson인지를 놓고 리서치 했던 결과물을 우리 팀 Data Scientist들에게 발표하던 중에 했던 질문이고, 그 미팅 이후에 신규 채용에도 몇 차례 비슷한 질문을 던졌다.

Poisson distribution은 이항분포에서 확률을 1/2로 놓는게 아니라 0.0001로 놓는 경우라는 것을 수학적으로 증명할 수 있다. 말을 바꾸면, 매우 드물게 일어나는 사건, 근데 숫자 1개, 2개로 헤아릴 수 있는 사건들을 Poisson으로 표현할 수 있다는 뜻이다. 박사 연구하던 시절에는 금융 시장에서 기습적인 대폭락이 일어나는 이벤트를 수학 모델에 포함시키는데 활용했고, 온라인 광고에서는 광고를 클릭하는 확률이 낮으니까 같은 맥락에서 활용할 수 있다.

Q5. How is SVM different from Logit?

Logit은 각각의 데이터 포인트들을 기준으로 Decision boundary와의 거리 or 오차를 계산하고, SVM은 0/1 그룹으로 나뉜 데이터, “그룹”을 기준으로 Decision boundary와의 거리를 계산한다. SVM이 수학적으로 더 Elegant한 부분이 많지만, Outlier들에 굉장히 취약할 수 밖에 없는 구조, Non-linear boundary를 잡아내기 위해 Kernel 함수를 써야하는 구조도 결국엔 data points vs. data groups 라는 철학적인 차이에서 비롯되었다.

Q6. In what context would you prefer Deep Neural Network to other models?

K대 산업공학과 대학원 들어간다는 친구가 자기네 학교 교수님 중 한 분이 위와 비슷한 시험 문제를 냈었단다. 선형 회귀분석 모델, Logistic regression 모델, 그리고 Deep Neural Network 모델을 비교, 설명하는 내용을 요구하는 문제가 나왔었다는데, 그 이야길 들으면서 요즘 같은 시대에 참 적합한 시험 문제라는 생각이 들었다. Logit이라는게 결국 선형 회귀분석 모델의 결과값만 Sigmoid function으로 바꾼, 일종의 Kernel 하나를 쓴 작업이고, Deep Neural Network라는 모델은 그런 Logit을 Ensemble 모델과 결합한 내용에 지나지 않으니까. (이미 이 블로그에서 여러번 이야기했던 내용이고, 기 수강자 분들은 인지하겠지만 데이터 사이언스 기본 강좌에서 자세하게 다룬다.)

일반적인 선형 회귀모델은 Regression 돌린 값을 다시 Regression 돌려봐야 선형 관계식이 바뀌지 않는다.

y = a(ax+b) + b

와 같은 방정식을 생각해보면, 처음에 ax+b 라는 선형식을 얻고, 그 위에 다시 ax’ + b라는 함수를 만드는데 여기서 x’ = ax + b 였다. 저 위의 식은 어떻게 바뀔까?

y = a^2 x + ab + b

a와 b 값은 바뀔지 모르지만, 전체 식의 모양은 전혀 변화가 없다.

Logit은? 상황이 크게 바뀌지 않는다. 단지 0/1을 구분한다는 맥락 때문에 함수 형태가 바뀐다는 것을 제외하면 맥락은 같다.

그런데 Neural Net은 1개의 Logit만 계속 덧대는게 아니라, 여러개의 Logit을 묶는 작업이 반복된다. 즉, 0/1 구간을 여러개 만드는 작업인 것이다. 언제 이런 작업이 제일 필요할까? 데이터에 0/1 구간이 여러개 필요한 데이터는 뭐가 있을까?

Random 데이터, 특히 분포함수가 정규분포인 데이터는 굳이 머신러닝의 Non-linear model들 없이 MLE나 OLS로 계산하는게 충분하다는 말이 다시 등장한다. 얼굴 이미지 인식, 자연어 처리 등의 작업은 여러 단계에 걸쳐 0/1을 구분해야할 필요가 있다 (ex. 눈, 코, 입, 얼굴형 등등) 딥러닝이 이런 종류의 데이터에서만 강한 성능을 보이는건, 이렇게 수학적으로 볼 때 너무나 당연한 결론을 내릴 수 있다.

나가며 – 면접 방식 & 준비

실리콘 밸리라고해서 무슨 프로젝트 뛰어봤다는 종류의 질문 & 대답보다 위의 이론 질문들에 더 집착하는건 아니다. 하지만, 면접 중에 무슨 프로젝트 해 봤다고하면 설명을 시켜놓고 반드시 저런 종류의 추가 질문이 나온다. 제대로 알고 그런 모델을 썼는지, 아니면 그냥 남들이 했다고 하니까 그대로 카피했는지 확인하고 싶기 때문이다. 화이트 보드에 증명을 해보라거나, 순서도를 그려보라거나는 추가 질문이 나오는 것도 같은 이유다. 이해했으면, 정확하게 알고 있으면 겁날게 없는 질문들이니까. 그렇게 알고 있어야 제대로 일을 할 수 있으니까.

이런 종류의 면접 준비는 어떻게 하냐고? 면접 질문들 구해서 답만 외우면 되냐고? 아니, 그런 사람한테 면접 시간 쓰는거 너무 싫다. 실수로 뽑았어도 수습 기간에 바로 해고한다.

당연히 수리통계학으로 깊은 내공을 쌓아야한다. 학부 졸업생이 쉽게 읽을 수 있는 책인지는 모르겠지만, Data Scientist 면접관도 면접자도 모두 기준으로 삼는 책은 The Elements of Statistical Learning (PDF 링크)다. 만약에 이거보다 더 고급 수학이 들어갈 면접을 준비해야하면 Pattern Recognition and Machine Learning (PDF링크)를 추천한다.

(A meme for fun)

 

여담 – 좋은 Data Scientist 뽑는 법

요즘 가까운 친구들이 좋은 Data Scientist 뽑고 싶은데 뭘 봐야하냐고 물어보면 이렇게 대답해준다.

“Neural Network 관련해서 모델 많이 안다고 자랑하는 애들 말고, 데이터 전처리하느라 머리 쥐어뜯어봤던 경험담을 늘어놓는 애들을 뽑아”라고.

그 전에, 본인들이 좀 똑똑해야 될 것 같다는 생각도 문득 든다. 내가 만났던 “Data 팀” 팀장급들 중엔 Correlation 공식도 제대로 이해 못하는 바보 멍청이도 있었고, 모델링 토론은 커녕 머신러닝, 딥러닝이 요술봉인 줄 아는 사람들도 많았다. 수식 볼 줄 안다고 전문가라고 착각하길래 더닝 크루거 효과*를 지적해준 적도 있었다. 어느 학교 마케팅 교수도 내가 만드는 모델이 Customer Lifetime Value (CLV) 모델인 줄 알고 있던데, 그게 기초 모델이 되긴 하겠지만, 1990년대에 통신사에서 가입자들 가치 평가용으로 쓰던 모델을 2010년대 후반에 그대로 갖다 쓰는건 아니지 않나? 보통은 잘 모르니까 이게 공대생들이 하는 작업인 줄 아는데, 아마도 전공 이름에 관계없이 Quantitative 전공으로 석박사 하면서 데이터로 모델 만들어 본 사람들이 하는 작업이라는 걸 인지할 수 있는 경험이 없었기 때문일거라고 생각한다.

*더닝 크루커 효과 (Dunning-Kruger effect): 능력이 없는 사람이 잘못된 결정을 내려 잘못된 결론에 도달하지만, 능력이 없기 때문에 자신의 오류를 알아차리지 못하는 현상을 가리킨다. 즉, 무식하면 용감하다. (박사시절, 지도 교수님이 매번 날 까면서 쓰신 표현이다 ㅠㅠ)

끝으로 개인적인 경험 하나만 덧붙인다. 밥 한번 먹자고 부르더니 자기네 회사에 오라던 스타트업 대표들 많이 만났는데, 근데말야, 니네가 회사를 나보다 먼저 만든거지, 나보다 잘난 인간은 아니지 않냐? (너무 오만방자한 표현인가?ㅋ) 나는 너 고용할 생각없고, Pabii 커져도 니네 회사 인수할 생각도 없는데?? 내가 널 고용하고 싶고, 그 회사 인수하고 싶어져야 니네 회사 들어갈 생각이 들지 않겠냐? Criteo 들어갈 때, 구글, 페북보다 더 좋은 알고리즘을 갖고 있다고 했기 때문에 오퍼에 싸인했었다.

똑똑한 인간을 뽑고 싶으면, 금전적으로나 기회 제공이라는 측면에서 비교 불가능한 보상을 해주거나, 아니면 본인이 더 똑똑한 인간이라는 걸 보여줘야한다고 들었다. 우리나라에서 좋은 Data Scientist라고 불릴만한 사람들이라면 그 정도 능력+자존심은 있는 사람일 것이다.

요즘 자주 듣는 표현 중에 필자의 귀를 매우 거스르는 표현들이 몇 가지 있다

  • 빅데이터를 배운다
  • 딥러닝을 배운다

빅데이터는 용량만 큰 데이터가 아니라 유저들의 행동을 초 단위로 추적한 데이터라고 이미 여러번 포스팅을 했다. 딥러닝도 머신러닝의 Neural net 모델 중 layer의 숫자가 좀 많은 모델들을 부르는 이름이라는 것도 같은 맥락에서 여러번 언급을 했었다. 말을 바꾸면 빅데이터와 딥러닝은 특정한 데이터나 모델인데 이걸 마치 “기술”인 것처럼, 특히 각각이 개별적인 기술인 것처럼 이해하고 있기 때문에 쓰는 표현이다. 정확한 표현이 되려면

  • (데이터 사이언스 수업에서) 빅데이터를 활용하는 방법을 배운다
  • (데이터 사이언스 수업에서) 딥러닝을 활용하는 방법을 배운다

가 맞을 것이다. 이런 표현의 차이는 “시장의 오해 vs. 필자의 철학”라는 프레임과도 맞닿아 있다. 필자가 제시하는 표현은, 빅데이터라는 것이 기존의 데이터와 다른 형태이기 때문에 기존에 쓰던 통계학과 다른 통계학 테크닉들 or 다른 철학의 통계학이 필요하다는 맥락이 들어간 표현이고, 딥러닝이라고 불리는 신경망 모델 응용법도 마찬가지 맥락에서 데이터 사이언스 모델 중 하나라는 측면에서 접근하는 철학을 담고 있다. (이래서 수업 이름이 “빅데이터 강의”, “머신러닝 강의”, “딥러닝 강의”가 아니라 “데이터 사이언스” 강의인 것이다.)

 

빅데이터를 배웠다? or 빅데이터를 활용하는 법을 배웠다?

좀 더 속 마음을 털어놓으면, “빅데이터를 배웠다”면서 기존의 통계학은 아무 쓸모짝에도 없는 테크닉인 것처럼 표현하는 사람들, “딥러닝”을 배웠다면서 “딥러닝 >> 4차원의 벽 >> 머신러닝 >> 3.5차원의 벽? >> 통계학” 이라고 생각하는 사람들에 대한 불편함이 깔려있기 때문에 글 머리의 단순한 표현들이 거북한 것 같다.

심지어 며칠전엔 명문대 통계학과 4학년이라는 분이 보낸 메일에도 “빅데이터를 배웠더니 그게 데이터 마이닝이더라”는 표현이 들어있었는데, “빅데이터”라는 명사를 “빅데이터를 활용하는 법”이라는 동사형 명사로 활용하고 있는 모습에서 유저의 행동 데이터라는 개념 이해대신 데이터 마이닝 수업에서 들을만한 테크닉을 빅데이터라고 인식한다는 느낌을 받았다. 그런 모델들은 “빅”이 아니라 “스몰”데이터에서도 쓸 수 있을텐데? (써봐야 아무 도움도 안 되겠지만ㅋ) 왜 “데이터 마이닝 = 빅데이터”라고 이해하는걸까? 당장 Non-linear 패턴이 없는 랜덤 데이터라면 데이터 마이닝 테크닉들이 아무런 도움도 안 된다는 사실을 모른채, 무작정 회귀분석은 구식이고 “빅데이터”는 진보한 모델이라는 식의 단순한 이해를 이름있는 학교의 통계학과 졸업반이 갖고 있다니…

비슷한 사건을 어느 “딥러닝 개발자”라는 분한테서도 겪었는데, “언제 딥러닝을 써야하는지 아는 것도 중요하다”면서 정작 “언제”에 대해서 애매모호한 결론 밖에 없는 경우도 있었다. 이게 Logistic regression + Ensemble = Neural net 이라는 개념 이해, Activation function이 사실은 Kernel이라는 이해가 결합된 필자의 입장에서 보면 “언제”라는 표현에 대한 답은 굉장이 명확하다. 데이터가 랜덤이 아니고, 강한 패턴이 반복되고 있고, 그 패턴을 찾아내는게 드는 계산 비용이 중요하지 않을 때에 국한된다. 이미지 인식, 자연어 처리가 대표적인 영역이고, 그 이외에 모든 High noise 데이터를 다룰 때 Neural net 기반한 모델들은 큰 장점이 없다.

이런 사건들이 모두 통계학을 수박 겉핡기 식으로만 배운채로 응용 통계학의 한 분야인 데이터 마이닝 (or 머신러닝)을 접했기 때문일 것이다.

필자는 그나마 통계학이 전공이었던 사람이 아니라, 통계학을 밥벌이로 삼고 있는 사람들이 얼마나 불쾌할지 제대로 가늠하질 못했는데, 얼마전에 필자의 “빡침”과는 비교도 안 되는 진정한 “빡침”을 담은 댓글을 하나 봤다. (링크의 첫번째 댓글 참조)

 

진퉁 통계학자의 눈에 비친 머신러닝

(Source: AmSantac.co)

Ensemble 모델은 서로 다른 (Heterogeneous) 모델들을 결합하면 결과적으로 더 나은 정확도를 얻을 수 있다는 아이디어에서 출발한다. 그런데, 모델의 결과값이 서로 다르다는 이야기는 Error에 해당하는 분산 값도 매우 크게 다르다는 것을 의미한다. 위의 코멘트는 통계학의 모든 테크닉들이 분산을 최소화하는데 초점을 맞추고 있는데, Ensemble 모델의 이면에는 서로 다른 모델들을 결합하다가 Error가 더더욱 괴상망측한 형태로 바뀌는 것을 방치하고 있지 않냐는 질문이다. 모델의 분산(or 모델의 퀄리티)은 결국 Error의 분포에 달려있는데, 그 분포가 엉망진창이라면 과연 그 모델을 쓸 수 있을까? 전통적인 통계학에서는 그런 모델을 쓰질 않는다. “틀렸”으니까.

Analytic solution을 찾는 전공들 (수학, 경제학 등)은 여러가지 시뮬레이션으로 결과값을 “예측”하는 것만으로도 이미 신성모독이라고 생각한다. 저널에 논문이 실리지도 않는다. (필자가 전공을 바꾼 이유 중 하나다.) 그런데 시뮬레이션도 받아들일만큼 열려있는 통계학자 입장에서도 데이터 마이닝에서 다루는 대부분의 테크닉들에 대해서 심한 거부감을 느끼는 것 같다. “bastardization”, “notable oversimplication”, “ill-conceived ideas” 같은 표현을 학자가 다른 사람의 연구에 쓴다는 것은 대단히 크게 잘못되었다는 판단이 깔려있다는 뜻이다. 왜냐고? 공대라서 “다른” 방법을 쓰는게 아니라, 아예 “틀렸”다고 생각한다니깐ㅋ

꼴에 수학적으로 좀 훈련받았다고 필자도 공감하는 부분이 많은데, 필드에 있는 사람도 아니고 학계에 있는 학자들마저도 “그냥 정확도 올라가면 좋은거 아냐?”라고 타협하는 말들을 가끔하는 걸 보면서 마음 속 어딘가에 무거운 감정이 항상 깔려 있었다. 저 분들이 수학 모르고 막 가져다 쓰는 공학 박사들도 아닌데…

학생들을 어떻게 가르치길래, 얼마나 확률론 기초 없이, 얼마나 “기술”적으로만 가르치길래, 이름있는 학교 통계학과 졸업반이 “데이터 마이닝을 배우고 나니 회귀분석을 왜 배웠는지 모르겠다”, “회귀분석은 그냥 기초적인 지식에 불과한거 같다”는 식으로 폄하하는 말을 하게될까… 수업하신 교수 분이 정말 그렇게 가르치셨다면, 공대 아니라 통계학과 교수님이라면, 진지하게 반성해주셨으면 좋겠다. 당신이 가르친 학생들이 다음 세대 한국의 “인공지능”, “IoT”, “빅데이터”같은 키워드로 대표되는 4차산업을 이끌어갈 핵심 인재들이다.

 

딥러닝은 언제 써야하나?

(Source: Online Stat Book)

몇 달전에 데이터 숫자가 적으면 딥러닝을 쓸 수 없다는 어느 블로거의 글에 반박하는 공대 출신임이 분명한 짝퉁 데이터 사이언티스트의 반박을 봤다. 데이터가 적어도 딥러닝의 결과물이 얼마든지 좋아질 수 있지 않냐고 Python 코드까지 붙여놨던데, 저 위에서 말한 어느 “딥러닝 개발자”와 별반 다르지 않은 수학 & 통계학 실력을 가진 사람이지 않을까 싶다.

데이터의 숫자가 적고 많고는 둘째 문제고, 데이터 안에 비선형의 강한 패턴이 반복될 때만 신경망 모델이 유의미하다는 것을 이해하고 나면 절대로 저런 블로그 글을 쓸 수도 없고, 또 “언제 딥러닝을 써야하느냐”면서 애매모호한 글을 쓰지도 않을 것이다. 제대로 통계학과 확률론을 이해했다면, 필자가 수업 시간에 반복적으로 이야기하듯이, 우선 데이터가 랜덤인지 아닌지 눈으로 확인하기 위해서 Q-Q plot 하나라도 그려놓고 “데이터 작업”을 시작할 것이다.

링크의 글을 보면, 회사에서 “딥러닝으로 풀 수 있지 않냐?”라고 묻는 사람들은 정말 아예 아무 것도 모르는 사람이고, 그 글을 쓴 사람은 최소한 뭔가 굳이 복잡한 모델링이 필요없다는 것 정도는 감을 잡으신 분이라고 보인다. 물론 통계학을 제대로 공부 안 했기 때문에 정확히 뭐가 어떻게 필요없는지는 잘 모른다. 엔지니어의 한계다. 수학적인 모델들이 어떻게 구성되었는지를 이해하기도 전에 코드 돌려서 결과값 보기 바빴던 전공 출신이니까. 괜히 Keyword in Data Science is NOT data BUT science라는 표현이 돌아다니는게 아니다.

“틀렸”다는 통계학자의 주장은 다 이유가 있다.

 

나가며

필자가 계속 수학 & 통계학 베이스 강조하는 글을 쓰다보니, 여기저기서 유사한 철학을 가지신 분들의 응원(?) 메일을 받는다. 그 분들의 분노를 담은 표현 중 강도가 좀 센(?) 문장을 몇 개 소개해보고 싶다.

“어따쓰냐는거만큼 무식한 소리가 없다. 니가 그 가치를 못 알아볼만큼 어리석은 눈을 가졌다는 뜻이니까.”

“수학적인 사고를 두려워하는 인간의 삶의 질은 중세시대 인간이랑 다를바가 없다.”

왜 이런 식의 무서운(?) 표현들을 소개하냐고? 몇 달전에 딥러닝이라는거 써 봤더니 별로 뾰족히 “인공지능”스러운거 없더라면서 필자더러 모델을 뜯어고쳐달라는 식의 뚱딴지 같은 메일을 보내는 싸가지“초짜”들이 좀 있었다. 내 밥벌이로도 바빠 죽겠는데 왜 내가 니 밥벌이를 위해서 시간을 써야하냐고 더 싸가지 없는 불편한 글을 쓰려다가, 아예 답을 하질 않았었다. 모델에 대한 기본적인 이해는 없고, 그냥 코드만 copy & paste해서 돌려봤는데 자기 입맛대로 결론이 안 나오고, 그렇다고 이걸 직접 수정해볼려는 의도는 전혀 없는, 말 그대로 “양아치”스러운 개발자라는 느낌을 받았었기 때문이다.

그 분들은 “어리석은 눈”을 가지고 사는 “중세시대 인간”인 것 같아서, 그냥 눈도 다르고 시대도 다른 분께 괜히 불편 가득한 싸가지 없는 답을 쓰길 싫었다고 변명하겠다.

필자도 학부 시절에 한심한 메일을 썼다가 교수님들께 무시당하거나 모욕(?)에 가까운 폭언을 들은 적도 몇 번 있는데, 그 시절로 돌아가면 타이핑하는 필자의 손가락을 부러뜨려서라도 말리고 싶다. 이젠 그런 메일을 받는 사람들의 기분을 알아버렸으니까. 멍청한 질문에 “미시 누구한테 들었냐?”, “학점이 뭐였냐?”고 되물으시던 전XX 교수님, 이젠 이해합니다ㅋㅋ 그리고 죄송합니다ㅠㅠ

이전 글

몇 달전의 일이다. 2016년에 구매했던 ThinkPad T460p 을 중고로 팔았다. 참고로 필자는 “빨콩 매니악”이기 때문에 “빨콩”이 달린 ThinkPad 노트북만 쓰고, 직업적인 이유로 퍼포먼스가 강조된 매우 고사양 노트북 위주로 구매한다. 필자가 쓰던 ThinkPad T460p는 말 그대로 “끝판왕” 모델이었는데, i7-6820HQ에 DDR4램 32GB, 그리고 그래픽 카드가 ThinkPad 14인치 이하 모델 중 제일 좋은 GeForce 940MX + DDR3 VRAM 2GB가 달린 모델이었다. 관심있으신 분이라면 왜 필자가 이 노트북을 매각했는지 감을 잡으실텐데, 딱 하나 필자의 입맛에 거슬렸던 부분이 그래픽 카드였다. GeForce 940MX라는 저사양/저전력 그래픽 카드 자체도 불만이었지만 그래픽 카드의 성능을 크게 좌우하는 VRAM (그래픽 카드의 램, 혹은 캐쉬)가 2GB 밖에 안 되고, 그것도 2013년부터 나오던 GDDR5가 아니라 구형 DDR3을 넣어놓은, 아주 입맛에 안 맞는 모델이었다.

“빨콩 매니악”인 필자 입장에서 다른 노트북 브랜드는 거들떠 볼 수도 없었고, 결국은 이동성을 (좀 더) 포기한 15인치 ThinkPad 모델들을 봤는데, 게임용 랩탑으로 나온 ThinkPad E560p은 최신형 Commercial 그래픽 카드에 GDDR5를 썼지만 VRAM이 2GB였고, 가격대가 두 배 이상 뛰어오른 워크 스테이션 모델인 P50은 VRAM이 4GB인 모델이 있었지만 필자의 용도 대비 오버 페이가 확실한 Quadro (쿼드로) 그래픽 카드가 달려있었다.

 

무슨 4차원 외계어를 읊고 있는 것 같나? ㅋㅋ

딥러닝에 최적화된 그래픽 카드를 가르쳐 달라는 질문을 받고 지난 2017년 가을쯤에 필자가 했던 생각들이 문뜩 떠올라서 글로 옮겨봤다. 당장은 무슨 고민을 했는지 이해가 안 되겠지만, 아래의 글을 읽어보시면 아마 왜 저런 고민을 했는지 좀 와닿고, 잘 이해하는 분들은 딥러닝에 필요한 컴퓨터를 구매하면서 어떤 그래픽 카드를 사야하는지 쉽게 결론 내릴 수 있으리라고 생각한다.

 

1. nVidia 그래픽 카드 vs. AMD 그래픽 카드

그래픽 카드 시장을 양분하는 2대 기업이 있다. 가장 유명한 브랜드는 nVidia의 GeForce 계열 그래픽 카드로, 보통 게임 유저들이 새 모델이 나오는 걸 목이 빠져라 기다리는 경우가 많다. 지금 이 글을 쓰는 시점에 가장 고사양 GeForce 카드는 GeForce GTX 1080 Ti다. 참고로 Ti는 계산 모듈이 2개가 붙은 거라고 생각하면 된다. nVidia의 아성을 위협하는 회사로 AMD가 있고, 오래전부터 가성비 만점인 ATI Radeon 시리즈로 선두 주자를 위협하면서 그래픽 카드 시장 발전을 이끌어왔다.

그래픽 카드의 성능 자체만 놓고보면 GeForce 모델과 Radeon 시리즈 최상위 모델간 격차가 많이 줄어들어서 요즘은 가성비를 놓고 게임 유저들 사이에 Radeon 시리즈 수요가 많이 증가한 상태다.

다만, TensorFlow, H2O, MXNet 등의 대표적인 멀티 코어 + GPU 활용 패키지들이 nVidia 그래픽 카드만 지원하고 있다. AMD 그래픽 카드를 쓰다가 블루 스크린이 뜬 사례가 종종 보고가 되니*, 굳이 딥러닝 패키지들을 돌리고 싶다면 nVidia 그래픽 카드를 구매하실 것을 추천한다. (오해마시라. 필자는 nVidia 주식을 단 한 주도 안 갖고 있다.)

(*참고로 nVidia 그래픽 카드는 CUDA 기반으로 계산하고, AMD 그래픽 카드는 OpenGL 기반인데, TensorFlow가 CUDA 기반이므로 당연히 AMD 그래픽 카드에서는 제 성능을 발휘 못한다. CUDA와 OpenGL 상호간 공유되는 명령어 셋도 많기 때문에 무조건 nVidia 그래픽 카드만 써야한다고 말하지는 않겠지만, 분명히 호환되지 않는 명령어 셋들 때문에 AMD 그래픽 카드에서는 충돌이 날 여지가 있다.)

 

2. Quadro 그래픽 카드 vs. Commercial 그래픽 카드

그래픽 카드는 생산하는 회사가 2종류일 뿐만 아니라, 그래픽 카드 종류도 크게 2종류로 구분된다. (정확하게는 3종류로 구분된다) 가장 흔히들 보는 그래픽 카드가 윗 섹션에 언급한 GeForce GTX 시리즈, 즉 Commercial 그래픽 카드다. 게임용으로 (or 비트코인 채굴용으로) 많이 활용된다. 그 이외에 전문가 용으로 구분되는 그래픽 카드는 서버용으로 쓰이는 파스칼 계열 (최신 모델명 Titan) , 그리고 CAD 계산용으로 쓰이는 Quadro 그래픽 카드가 있다.

당연히 파스칼 계열 그래픽 카드는 가격도 매우 비싸고 일반인이 평소에 구매할 수 있는 채널도 없다. 그나마 일반인이 볼 수 있는 양산형 노트북 모델 중에 고가 제품에 (특히 워크 스테이션, Work Station, 제품에) 들어가는 그래픽 카드가 바로 Quadro 카드들이다.

Quadro 카드들은 같은 세대 GeForce 카드에서 약간의 속도를 포기하고 CAD를 비롯한 공학 계산에 특화된 명령어를 추가해넣은 칩셋을 갖고 있다. 소프트웨어적인 개조이기 때문에 당연히 Quadro 카드를 사서 GeForce 카드처럼 사용할 수 있지만, GeForce 카드 가격의 3-4배를 상회하는 그래픽 카드를 사 놓고 그렇게 쓰는 사람은 거의 없을 것이다. (그러나 필자가 그렇게 쓰고 있다 ㅠㅠ)

예전에 TensorFlow 돌리려는데 비싼 Quadro 그래픽 카드를 쓰면 저렴(?)한 Commercial 그래픽 카드 쓰는 경우 대비 얼마나 더 장점이 있는지 질문을 받은 적이 있다. 개인적인 경험을 바탕으로 할 때 “아무런 효과가 없다”고 대답할 수 있다. Quadro 카드는 오직 그 목적성에 부합한 프로그램들(ex. CAD)을 돌릴 때만 돈 값을 한다. 그래서 머신러닝 패키지들 돌리려는 분들께는 당연하겠지만 비추한다.

 

3. VRAM의 중요성

다른 글에서 그래픽 카드의 성능은 계산 모듈과 캐쉬 메모리의 크기에 좌우된다고 했다. 그럼 계산 모듈도 같고, 메모리 크기도 같은데 메모리의 속도만 다르다면 어떻게 될까? 2013년부터 고가 그래픽 카드들에 최신형 GDDR5 메모리가 들어가기 시작했다. DDR3, DDR4보다 처리속도가 더 빨라서 당연히 가격도 더 비싸고, 생산량도 적은 고급 메모리 스틱이다. 덕분에 GDDR5 메모리가 들어간 그래픽 카드들의 가격대도 DDR3이 들어간 동일 모델에 비해 훨씬 높았다.

필자가 GeForce 940MX라는 저전력 그래픽 카드가 달린 모델을 팔았던 이유는 1년 후에 나온 ThinkPad T470p에 같은 그래픽 카드 but GDDR5짜리 VRAM이 달린 모델이 나온 것을 확인했기 때문이었다. 벤치마크를 보면 실감하겠지만, 메모리만 바꿨는데 두 그래픽 카드의 성능이 완전히 바뀐 것을 확인할 수 있다. 실제로 필자가 GeForce 940MX보다 구형인 GeForce GT 750M에 GDDR5 + VRAM 2GB 모델을 썼을 때보다 빌드 타임이 더 걸리는 것도 확인했다.

컴퓨터 덕후라 이런저런 GPU들을 많이 써 보면서 느낀 점은, VRAM이 많으면 많을 수록 당연히 성능이 더 개선되는 것이 사실이지만, VRAM 자체의 유무도 엄청나게 큰 영향을 주더라. 그래픽 카드를 이용해서 계산을 할 수 있다는 그 자체로 벌써 CPU 기반 계산과는 시스템 자원을 활용하는 방식이 달라지기 때문이다.

왜 이렇게 덕후스럽냐고? ㅋㅋ 누군가에게는 겨우 몇 초, 몇 분 차이일 수 있겠지만, 같은 작업을 다른 변수 넣어가며 여러번 반복해서 테스트하는 모델러 입장에서 빌드 타임이 10% 줄어들면 어마어마한 차이가 된다. (그래서 빨리 퇴근할 수 있다 ㅎㅎ)

 

나가며

필자는 결국 VRAM이 많이 달린 but 오버 페이하는 Quadro 그래픽 카드 모델을 구매했다. 그러나 굳이 이런 “스튜핏” 구매를 하는 것을 추천하지는 않는다. “빨콩”을 타협하면 타사 모델들 중에 Commercial 그래픽 카드임에도 VRAM이 매우 큰 노트북들이 즐비하고, 사실 게임용 랩탑으로 검색하면 발열 및 소음 처리가 매우 뛰어난 수 많은 모델들이 있다. 굳이 필자처럼 고집스럽게 입맛에 맞는 모델만 찾다가 쓸데없는 비용을 쓸 이유는 없다.

사실 저비용으로 빌드 타임을 줄이고 싶으면, 데스크탑 하나에 지갑이 허락하는 한계까지 고성능 그래픽 카드만 여러장 추가하는 편이 낫다. 굳이 무거운 작업을 비싼 노트북을 들고다니며 해야되는 경우가 얼마나 될까?

 


글 아이디어를 주신 최준영님께 감사드립니다.

강의 시작 1주일 정도를 남기고 흔히 받는 질문들이 있다.

  • 제 랩탑이 오래됐는데, 수업 듣는데 문제 없을까요?
  • 어느 정도 랩탑을 갖고가야 수업 듣는데 문제가 없을까요?
  • 머신러닝을 구현하는데 제일 좋은 랩탑은 어떤 랩탑일까요?

아래의 설명을 다 읽기 힘든 사람들을 위해서 짧게 요약한 대답을 드리면, 64비트 운영체제가 돌아가는 시스템이면 필자가 수업에 쓰는 패키지는 모두 돌릴 수 있다. 그리고 머신러닝 프로그래밍에서 가장 중요한 부분은 i5니 i7이니하는 CPU가 아니라, 비트코인 광산용 데스크탑처럼 고사양의 멀티 그래픽 카드 유무라고 봐야한다. 랩탑에 좋은 그래픽 카드가 들어가는 경우는 십중팔구 게임용 랩탑일 것이다. 그래서 제일 좋은 랩탑이 뭐냐는 질문에 “게임용 랩탑”이라고 대답하겠다.

한 줄 요약말고, 좀 구체적인 내용을 궁금해하시는 분들도 많을테니 아래에 좀 더 내공을 요하는 설명을 달아보자.

 

1. 계산 비용(Computational Cost)이란?

연구직에 있는 사람들이 제일 좋아하는 것은 간명한 수학 수식으로 결론이 나올 때다. 그 식에 맞춰서 데이터를 입력하면 최소의 자원을 들여 아주 빠른 속도로 계산할 수가 있으니까.

(Source: TQI Solutions-Modeling)

여기서 핵심 포인트는 “최소의 자원”과 “아주 빠른 속도”라는 부분이다. 이걸 계산 비용(Computational Cost)라고 부르는데, 보통은 CPU, RAM, 전력, 시간을 의미한다. 그다지 좋지 않은 CPU를 쓰고, RAM을 적게 쓰고, 전기를 적게 먹어도 되는 부분은 “최소의 자원”에 해당되고, 시간이 적게 드는 부분은 “아주 빠른 속도”에 해당된다.

수학 수식이 딱 떨어지면 (Analytic solution 이라고 한다), 어지간해서는 Computational Cost를 고민할 필요가 없다. 인간이 머리를 다 쥐어짜내서 완성된 결론을 만들어 냈고, 컴퓨터는 그냥 단순한 계산기로 쓰고 있기 때문이다. 이 때 유일하게 Computational Cost를 신경써야하는 경우는 데이터의 크기가 매우 클 때 밖에 없는 것 같다. 그렇다고 해도 RAM을 늘리거나, 아니면 순차적 계산 (Sequential calculation) 방법을 이용해서 Computational cost를 최대한 줄이는 방법이 이미 많이 나와있다. 통계 시간에 배우는 PCA도 같은 목적성을 띠고 있다.

문제는 인간이 수학 수식으로 최종 결론을 못 만들어 낼 때다. 수업 시간에 흔히 드는 예로, 공학 계산기에서 3차 이상 방정식의 근을 찾는 경우와 재무 계산기에서 IRR 찾는 계산이 있는데, 인간이 만들어낸 수학 수식이 한 번에 값을 찾아줄 수 있는 상황이 아니기 때문에, 계산기는 모든 실수 값을 다 적용해서 조건식에 대입한다. (Trial-and-error라고 부른다.) 당연하겠지만 식이 복잡해질수록 걸리는 시간이 기하급수적으로 늘어난다.

(Source: Dynamic Simulation Modeling)

필자가 시뮬레이션을 이용해서 논문을 쓰던 시절에도 같은 문제를 겪었다. 가공의 데이터를 생성해내고, 그 데이터로 가능성 있는 모든 경우의 수를 다 뒤져보려면 어지간한 슈퍼 컴퓨터로도 하루 이틀만에 계산이 안 되는 경우가 흔했다. 요즘 한창 유행인 머신러닝을 좀 쉽게 한 줄 요약하면, 딱 떨어지는 수학 수식을 찾는 대신 데이터만 우격다짐으로 많이 넣은다음, 알아서 수식을 찾아내달라는 방식의 계산이라고 할 수 있을텐데, 데이터를 잘 설명해내는 적절한 수식을 찾아내는 작업이니만큼 위와 같은 맥락에서 Computational Cost가 많이 든다.

 

2. 하드웨어 진화의 패러다임 변화 – 멀티 코어 (Multi-core)

컴퓨터 판매 광고에 듀얼 코어, 쿼드 코어, 헥사 코어 같은 표현을 본 일이 있을 것이다. 예전에는 CPU 하나에 코어(Core) 하나가 들어갔다. 그 코어가 계산을 하는데, 당연하겠지만 코어가 여러개가 되면 (이론적으로는) 여러개의 계산을 동시에 진행할 수 있으니 속도가 빨라졌다고 느낄 수 있게 된다. CPU 발달 초기에는 코어 1개의 성능을 높이는데만 주력했으나, 코어 성능을 높이는데 점점 한계에 부딪히면서 하나의 모듈 안에 2개 이상의 코어를 넣는 방식으로 CPU 개발 방식이 바뀌었다. 메모리 관련 기사에서 가끔 볼 수 있는 22nm (나노미터), 14nm, 10nm 같은 단어들이 점점 작은 공정으로 CPU 및 메모리를 만들 수 있게 되었다는 것을 의미하고, 덕분에 하나의 모듈 안에 작아진 CPU를 여러개 넣을 수 있게 되었다.

모듈 안에 작은 코어를 여러 개 넣어서 듀얼 코어, 쿼드 코어 같은 멀티 코어 제품을 만들어내면서 동시에 전력 및 발열에서도 큰 이득을 보게 되었다. 모듈이 작아지니 필요한 전력도 줄어들었고, 전력 소모가 적다보니 발열도 현격하게 줄었다. 발열이 줄면 데스크탑에 들어가는 CPU보다 노트북에 들어간 CPU의 성능을 낮춰야 할 이유가 줄어든다. 1990년대와 2018년의 데스크탑 vs. 노트북 성능 비교를 보면 노트북의 성능이 훨씬 더 빠르게 증가했음을 알 수 있다. 같은 맥락으로 데스크탑을 좀 고사양으로 맞추면 저가형 서버에 밀리지 않는 성능을 갖출 수 있게 된 것이다.

위에서 언급한 Computational Cost 기준으로 볼 때, 나노 공정의 발달로 멀티 코어를 쓰면서 계산 시간도 줄었고, 필요 CPU나 전력이 크게 감소했다는 것을 알 수 있다.

 

3. 하드웨어 진화의 패러다임 변화 – 멀티 쓰레드 (Multi-thread)

나노 공정으로 모듈 당 계산 코어의 집적 비율을 높이는 것과 더불어 계산 코어 자체의 성능을 더 “착취”하는 기술도 발전되었다. 1 코어당 2개의 가상 쓰레드를 만들어서 마치 2개의 코어가 있는 것처럼 작동하게 만들었다. Intel 기준 2011년에 나온 샌디 브릿지 (Sandy Bridge) 모델부터 지난 2016년까지 나온 카비 레이크 (Kaby Lake) 모델까지 i5, i7 같은 i 시리즈 CPU들은 기본적으로 멀티 쓰레딩 방식을 채용했다. 많은 유저들이 활용하는 저전력 CPU가 달린 노트북을 기준으로 보면, 코어가 1개 or 2개 있고, 윈도우 장치 관리자의 CPU 부분을 보면 알겠지만 코어가 마치 2개 or 4개 있는 것처럼 시스템이 인식하고 있다는 것을 알 수 있을 것이다.

2017년 모델 (인텔 기준 8세대 CPU)부터는 저전력 모델에도 코어 4개 (쓰레드 8개)를 집어넣어서 이전 세대의 표준전력 CPU에 버금가는 성능을 뽑아낼 수 있게 되었다. 

물론 더 많은 시스템 자원을 활용하기 때문에 전력 소모와 발열 이슈가 함께 따라오고 있고, 더 안타까운 사실은 멀티 코어 – 멀티 쓰레드를 쓸 수 있도록 프로그램을 짜는 일이 쉽지 않다는 것이다. 대부분의 프로그램들은 1 코어 – 1 쓰레드만 활용한다. 비싼 시스템을 들여놓고 정작 그 성능을 제대로 쓰질 못하는 것이다. 수업 시간에 옛날 노트북 갖고 가도 괜찮냐고 물으시는 분들께 2008년 이후 모델이면 어지간해서는 큰 상관없다고 말씀드리는 이유도 여기에 있다.

 

4. 계산 패러다임의 변화

컴퓨터를 이용한 계산 패러다임의 변화를 간단하게 정리하면,

인간이 만들어낸 수학 수식 -> CPU를 “학대”하는 단순 반복 계산 -> 그래픽 카드(GPU)를 이용한 3차 이상 행렬 계산

앞의 두 단계는 위에 언급한 공학용 계산기와 재무 계산기에서 흔히 볼 수 있는 사례였다면, 마지막 단계는 3D 그래픽 처리를 많이하는 게임에서 흔히 찾아볼 수 있다.

3차원 공간에서 1:1 격투기를 진행하는 게임이 있다고 해 보자. 이 때 캐릭터의 위치는 3차원 행렬로 구성된다. 머리, 몸통, 팔, 손, 다리 등의 위치를 각각 <가로, 세로, 높이>로 구성된 행렬로 구성할 수 있고, 이 캐릭터가 움직이는 방향과 속력을 추가로 더하면, 신체 부위마다 움직임을 지정하기 위해서 <가로, 세로, 높이, 방향, 속력> 이라는 5차원의 행렬이 만들어진다. 유닛에 RGB 로 색상을 입히면? 바로 8차원으로 행렬이 늘어난다. 실시간으로 움직이는 유닛이 즉각 반응하도록 하려면 당연히 3D 그래픽 처리 속도가 빨라야하고, 좀 더 실제 인간과 비슷한 3D 그래픽을 만들어내려면 사소한 디테일이 모두 포함되어야하니 유닛 하나를 구현하기 위한 데이터의 크기가 기하급수적으로 증가한다. 요즘 나오는 3D 그래픽 기반 게임들이 엄청난 고사양을 요구하는 가장 큰 이유다.

저런 계산이 게임에만 쓰이는 줄 알았는데, 지난 몇 년 동안 비트코인 광산에 들어간 컴퓨터 한 대마다 고사양 그래픽 카드가 하나도 아니고 6개씩 셋트로 들어갔다는 사실에서 알 수 있듯이, 복잡한 수학 계산에도 행렬 방식의 계산이 있었다는 것을 알 수 있다. 비트코인 하나를 얻기 위해 풀어야하는 문제를 인간이 수학 수식으로 풀어내는 대신 컴퓨터가 Trial-and-error를 하는 방식으로 접근했기 때문이고, 계산해야하는 변수가 계산기처럼 한 개가 아니라, 여러개 변수를 동시에 계산해야하기 때문에 대용량 행렬 데이터를 처리할 수 있는 그래픽 카드를 활용했던 것이다.

 

4.1. CPU vs. GPU

GPU도 계산을 하는 모듈이 들어있으면 굳이 왜 CPU와 GPU를 나누냐는 의문이 들 것이다.

보통 CPU는 페라리에, GPU는 덤프트럭에 비유한다. 페라리는 운전수를 포함해 2명의 승객이 매우 빠른 속도로 이동할 수 있도록 만든 차량이다. 반면 덤프트럭은 대용량의 물건을 상대적으로 느린 속도로 운반한다. CPU가 빠르면 일상적인 업무 (인터넷 브라우징, 메일 확인, 서류 작성 등등)에서 불편함을 겪는 일이 적을 것이고, GPU가 용량이 크고 빠르면 행렬 계산이 많이 들어간 게임, 비트코인 계산 등에서 속도로 큰 이득을 볼 것이다. 당연하겠지만 두 모듈이 쓰는 캐쉬 (뒷 트렁크라고 생각하자)도 압도적으로 차이가 난다. CPU는 1980년대 쓰던 플로피 디스크 정도 용량의 캐쉬를 갖고 있고, 요즘 나오는 GPU는 대용량 USB 스틱에 맞먹는 캐쉬(or 램)을 갖고 있다. 처리해야하는 데이터의 크기가 다르기 때문이다. (대신 두 캐쉬의 속도는 플로피 디스크 사이즈가 USB 사이즈 보다 압도적으로 빠르다.)

최신 GPU들은 멀티 코어를 구성하고, 코어들의 계산 속도도 업그레이드해서 엄청난 용량의 데이터를 순식간에 처리하는 걸 볼 수 있다. 게임 마니아들이 더 고해상도 화면에서 부드럽게 게임을 돌리기 위해 GPU가 업그레이드 될 때마다 갈아치우는 것도 같은 이유다. (필자는 일절 게임을 안 하기 때문에 더 이상의 자세한 설명은 생략한다.)

 

5. 머신러닝 – 멀티 코어와 GPU

필자가 처음 시뮬레이션을 공부하던 시절이나 머신러닝 테크닉들을 데이터 마이닝 수업에서 들을 때만해도 사실 GPU는 관심 밖에 있었다. 더 정확하게는 시장 자체에서 GPU를 써서 계산하겠다는 생각 자체를 안 했다. 그러다가 Neural network 모델 계산이 사실상 행렬 계산의 반복*이라는 사실을 깨닫게 되면서 행렬 계산에 적합한 GPU를 활용하려는 움직임이 생겼고, GPU 시장의 선두 주자인 NVidia에서 관련 프로그램 개발에 다방면의 지원을 쏟아붓기 시작했다.

요즘 딥러닝용 패키지라고 불리는 TensorFlow나 MXNet, H2O 같은 명령어 셋을 뒤져보면, CPU와 GPU의 멀티 코어를 활용할 수 있는 프로그래밍 기반에 행렬 데이터를 처리할 때 GPU를 활용할 수 있도록 시스템 자원 분배를 재설정 해 놓았다는 것을 알 수 있다.

이미지 인식, 언어 처리 등의 많은 계산들에 Neural Network를 활용하게 되면서, 행렬 계산에 대한 수요가 급격하게 증가했고, 그 때 GPU를 활용하면 CPU를 활용하는 것보다 훨씬 더 빠르게 행렬 계산을 할 수 있다 (정확하게는 역행렬을 빠르게 구하는 작업이다).

*사실상 행렬 계산의 반복이라는 부분은 Neural Network 를 직접 구성하는 코드를 확인해주기 바란다.

 

나가며

어차피 수업 시간에는 맛보기 정도로만 보여주기 때문에 CPU 만 멀쩡하게 잘 돌아가면 별로 걱정할 필요가 없다. 굳이 2008년 이전 모델만 아니면 된다고 이야기하는 것은, 그 이전 모델들은 32비트 운영체제가 깔린 경우가 많은데, 아무래도 64비트 기준으로 만들어진 패키지들과 (특히 최신 고급 패키지들과) 충돌이 일어나는 경우가 가끔 있기 때문이다.

수업 후반부에 멀티 코어와 GPU를 활용하는 패키지들을 돌릴 때도 GPU가 아주 좋은 경우가 아니면 수업 시간에 필자와 같은 속도로 코드의 결과값을 보기는 힘들다. (수업 진행을 위해서 필자는 그래픽 카드가 좋은 랩탑을 쓴다.) 그 부분 코드 복습을 하려면 비싼 노트북을 사느니 가성비 좋은 데스크탑을 사서 집에서 차근차근 실습을 해 보는 편을 추천한다.

끝으로, 꼭 랩탑으로 Neural network를 돌려보고 싶고, “머신러닝을 돌리기 위한 최적 노트북”이 필요하다면, 괜히 CPU의 업그레이드에 관심을 갖기 보다는, GPU가 속도 빠르고 캐쉬(램) 용량 많은 모델로 고르시는 걸 추천한다. (보통 전문가용 워크스테이션 랩탑이 아니면 게임용 랩탑들이 이런 조건을 충족한다.)

이어지는 글에는 GPU에 관한 정리를 해 보겠다.

 


그렇다고 게임용 랩탑을 들고 고객사 미팅을 찾아가지는 말자 ㅋㅋㅋ

사회 초년병 시절, 살고 있던 전세집에서 재계약이 임박한 무렵 전세금을 올려달라고해서 한참을 고민했던 적이 있다. 결국은 추가금을 내기로 결정하고 주인에게 연락을 했는데, 그 다음날 부동산 중개인이 전화 오더니 필자가 집주인과 대화하기 몇 분전에 자기가 신규 세입자와 계약을 했으니 필자더러 나가라고 윽박지르더라. 그리고 다음날 집에 내용증명이 도착했는데, 고민끝에 지인을 통해서 전직 판사이신 로스쿨 교수님께 조언을 구했다. 집을 사고 파는 계약이면 물권 계약이니 시간의 선후가 중요하지만, 전세같은 채권 계약은 시간의 선후가 중요한게 아니라, 다중 계약이 동시에 유효하고, 계약을 이행 못하는 경우에 물권 주인이 배상하는 의무를 지게된다는 결론을 듣고, 참 마음이 홀가분해지더라.

물론 남 말은 절대로 신뢰 안 하는 필자는 그 몇 달의 법적인 분쟁기간 동안 민법 채권편을 공부하고, 관련된 판례를 몇 십개나 읽어봤었다. 시간이 흐르면서 다급해진 부동산 중개인이 집주인에게 대리인 계약을 했던걸 소급하는 증거자료를 만들어 달라고 압박을 하고, 집주인은 아무것도 모르고 거기에 맞춰주면서 부동산 중개인에게 그저 알아서 잘 처리해달라는 이야기만 하는 것도 봤다. 나중에는 변호사를 구해서 필자에게 여러가지 말도 안 되는 이야기로 협박을 하더라. 관련 법과 판례로 무장한 필자에게 씨알도 안 먹히는 소리가 되었지만.

반년간의 지리한 분쟁 중에 필자가 집주인에게 여러번 이야기를 해 줬다. 부동산 중개인이 집주인 어르신을 속이고 있다고. 결국 이대로 흘러가면 집주인 어르신께서 신규 계약자였던 분께 계약금만큼 손해배상액을 지불하고, 부동산 중개인은 소리소문없이 도망갈꺼라고. 끝까지 자기는 아무것도 모르니까 부동산 중개인과 알아서 이야기해라고 하던 그 집주인 어르신, 시간이 한참 흐른 후에 필자에게 연락와서 그 때 모른척해서 너무 미안했다, 손해배상 소송이 들어왔는데 어떻게 하는게 좋겠냐고 묻더라.

개인적으로 별로 밝히고 싶지 않은 과거 법적 분쟁 사건 중 하나인데, 그 때 부동산 중개인과 함께 왔던 변호사의 말도 안 되는 억지 주장들이 문득 떠올라서, 그리고 요새 데이터 사이언스 강의하면서 느끼는 감정과 겹치는 부분이 너무 많아서 불편한 과거의 한 장면을 굳이 글로 옮겨봤다.

그 때 상대측 변호사는 이 건을 이기겠다는 생각보다 사건을 수임해서 돈을 벌겠다는 생각이 더 강했을 것이라고 생각한다. 변호사라는 타이틀을 이용해서 윽박지르면 법알못인 필자가 쫄아서 꼬리를 내릴 것이라고 생각했을수도 있다. 최소한 위 사건을 공유했던 주변의 법조계 지인들은 모두 필자의 생각에 공감하더라. (물론 아무것도 몰라보이는 부동산 중개인을 돕겠다는 불인인지심이었을 가능성을 배제하지는 않는다.)

요즘 외부에 돌아다니는 데이터 사이언스 강의들을 보면, 이게 결국 통계학과 수학을 깊게 알아야한다는 사실을 숨긴 채, 몇 가지 간단한 코드만으로 쉽게 적용할 수 있는 것처럼 광고를 하고 있다. 심지어는 그렇게 한 두달 수업을 듣고나면 데이터 사이언티스트로 커리어 전환을 할 수 있다는 이야기까지도 서슴없이 한다. 강의도 돈 벌이니까 좀 홍보성이 짙은 캐치프레이즈를 쓸 수 있다는건 이해할 수 있지만, 수업 내용을 보면 너무 데이터 사이언스의 실상을 외면하는 것 같아서 당황스러울 때가 많다. 마치 전세 문제로 불편할 때 화려한 미사어구와 억지스러운 법리로 필자를 괴롭히고 있던 변호사와 부동산 공인중개사를 보는 느낌이다. (수강생 분들은 그 때 집주인….)

머신러닝 전공자도 아니고, 수학과 통계학 공부 (남들보다 쪼오끔 더) 많이 한거에다 실리콘 밸리 냄새 좀 맡아봤고, 글로벌 펌에서 Senior Data Scientist 타이틀 달고 있던거, 거기에 이것저것 줏어듣고 혼자 고생하면서 배운걸로 사업하고 있는 필자가 보기에도 그런 광고는….매우 불편하다. 머신러닝으로 밥 벌어먹고 살려고 작정하시는 전공자 분들은 오죽하실까…

 

 

1. 불편함에 끌려가시는 분들

어제 저녁에 메일이 하나 왔다.

안녕하세요.

검색하다가 들어왔습니다. 1x 년차 SQL 및 Java, .Net 개발자 입니다. 많이들 묻는 질문을 다시 드리고 싶어 연락드립니다. 국내에서 Data Scientist로 경력을 쌓을 수 있 는 방법이 있나요? 학원 이런거 말고 방법은 없나요? 많은 사이트에서 학원 선전을 하고 있지만 수료 후에 현 회사 생활이나, 이직에 도움이 되는지 잘모르겠습니다. (부정적인 글들만 잔뜩 올라와 있네요.) 답변주시면 좀 더 자세하게 상담받고 싶습니다. 수고하세요~

개발 경력이 화려하신 분이 데이터 사이언티스트로 커리어 전환을 꿈꾸는 것 같아 보이는 (전형적인) 질문이다. 개발과 데이터 사이언스가 겹치는 부분은 머리속에 있는 내용을 구현하는 방식이 코딩이라는 공통의 매개체라는 점 이외에는 완전히 다른 작업이라는 걸 여러번 글에 썼지만, 뭐 필자의 글을 모든 사람이 읽는 건 아니니까. 그리고 개발자가 자기네들 수업 하나만 들으면 바로 데이터 사이언티스트로 커리어 전환을 할 수 있는 것처럼 써놓은 광고들이 엄청나게 많으니까.

아래의 메일로 답변을 드렸다. 분명히 읽기에 불편하실 것 같기는 한데, 필자는 팩트 폭격급의 솔직한 표현을 듣는게 기분은 좀 나쁠지 몰라도 시간 낭비를 안 해도 된다는 점에서 더 효율적이라고 생각한다.

안녕하세요,

일단 잘못된 강의들이 엄청나게 많이 돌아다니는 것으로 알고 있고, 그리고 데이터 사이언스를 무슨 코딩 프로젝트처럼 생각하시는 분들이 너무 많습니다. 이거 사실 (응용)통계학입니다. 여태까지 사람들이 잘 안 썼던 데이터 마이닝 기술과 최근에 빅데이터 때문에 더 응용방법이 다양해진 통계학이요. 당연히 연구자들이 작업하는 내용인데, 돈 벌이에 치중한 몇몇 학원들이 무슨 코딩 프로젝트처럼 가벼운 강의들만 만들어놓았으니 당연히 제대로 내용 전달이 안 되고, 들은 사람들은 이거 어디다가 쓰는거냐고 되물을 수 밖에 없는 것 같습니다.

개발자로 경력있으신 거랑 데이터 사이언티스트랑 (제대로 뽑는다는 가정아래) 거의 아무런 관련이 없습니다. 통계학 처음부터 새로 공부하셔야됩니다. 제가 괜히 통계학과 수학 기반으로 강의하는게 아닙니다. 제가 수업 시간에 영어 네이티브가 영어영문학 잘하는거랑 무슨 상관있냐고 이야기하는데, 코딩 잘 하면 코드 치는건 쉽겠지만, 통계학 모르면 내용을 모르는데 코드만 읽어서 어떻게 데이터 사이언스 하겠습니까?

영어 네이티브면 영문학을 읽고 미묘한 감상은 좀 더 잘할 수 있을지 모르지만, 플롯을 어떻게 구성하고, 대화 한 두줄에 숨어있는 암시를 어떻게 해석하고, 시대적 배경을 저자가 어떤 방식으로 잡아내고 있고, 당시 역사 문헌을 뒤져보면 저자의 묘사와 얼마나 일치하고, 이 문학 작품이 동시대 다른 서유럽 작품과 같은 사조를 얼마나 따라가고 있는지 등등을 다 이해하려면 영어 네이티브라고해도 세익스피어 이후의 영문학 흐름, 서유럽의 당시 역사적 흐름, 르네상스 이후 문예 사조 등등을 모조리 꿰고 있어야 합니다. 저런거 공부하는 과정이 영어영문학 공부하는 과정이죠. 저도 박사 과정 내내 수백, 수천줄의 코드가 들어가는 작업들 엄청나게 많이 했습니다. 쓰는 도구는 코딩이었지만 제 머리속에서 손으로 구현되던 모델들은 다들 수학, 통계학 모델들이었습니다. 당연히 저는 개발은 아무것도 몰랐습니다. (지금도 아는게 거의 없구요.)

한국에 제대로 돌아가는 기업들 (네이버, 카카오 등의 IT기업과 삼성전자 같은 “상대적으로” 인력 제대로 뽑는 대기업들)에 가면 통계학 백그라운드가 탄탄한 사람들한테 이런 프로젝트 맡길겁니다. 관련 기관에서 저한테 연락오시는 분들이 다들 저더러 전공이 “통계학”이었냐고 물으시구요.

박사과정 수업 커리큘럼이나 논문들을 보시면 아시겠지만, 문과에 글로 승부하는 전공들 일부를 제외하면 수학과 통계학은 모든 학문 연구자에게 공통의 스킬셋이기도 합니다. 단적인 예로, 저는 물리학 박사 친구들이 혜성의 움직임을 시뮬레이션 해 놓은 수식보면 이해하고, 같은 시뮬레이션 할 수 있구요. 기계항공 박사하는 친구가 제가 머리 싸매고 풀고 있는 Continuous Time Asset Pricing 모델 문제를 수식으로 못 풀면 그냥 시뮬레이션으로 approximation 하는 걸로 타협하는게 어떠냐고 제가 쳐 놓은 코드를 같이 리뷰해주기도 했던 경험이 있습니다.

제가 수업을 박사 학위 있으신 분들 모여있는 연구 기관에가서 하면 다들 무슨 말인지 알아먹고 어떻게 써야겠다는 이야기가 나오는데, 개발자들 모여있는 스타트업가서 설명하면 코드 따다가 k-means 적용하는 이야기, Neural net 적용하는 이야기 밖에 안 하는거보고, 더 심한 경우에는 파라미터 수정 하나도 안 하고 자기 데이터에 그대로 코드만 넣은 다음, 결과값 안 좋다고 불평하면서 이런게 머신러닝이냐고 투덜거리는 걸 보면서, 역시 통계학 제대로 가르치는게 우선이라는 생각을 또 한번하고 있는 중입니다.

개발자 경력에 자부심을 갖고 있으신 것 같은데 좀 공격적인 언사를 해서 죄송합니다만, 개발자 경력과 데이터 사이언스는 별개라는 점을 이해해주십사하고 쓴 표현이니 너그럽게 이해해주시면 좋겠습니다.

감사합니다

 

 

2. 안 끌려가셔도 되는 분들

국가 경제 정책과 관련해서 장기간 연구를 해오신 모 국책 연구 기관의 연구원 분들께 데이터 사이언스 강의를 해 봤다. 이 분들은 대부분 경제학 박사 or 경제학을 배우는 박사 과정을 거치신 분들이다. (보통 Economist by training 이라는 표현을 쓴다.) 공대 출신으로 개발을 하시던 분이 아니라.

필자의 강의 초반부를 아우르는 회귀분석 + 머신러닝 기초 부분 강의는 일반인을 대상으로 강의할 때 수업 시간에 당황한 반응, 긴장한 반응이 자주 느껴지는 부분이다. 처음 강의할 때는 머신러닝 배우러 왔는데 왜 이런거 가르치냐는 분도 있었다. 당연하겠지만 연구원 분들은 그 부분에서 통계학과 머신러닝의 용어가 다른 점 이외에는 전혀 불편을 느끼질 않는게 보였고, 후반부의 굵직굵직한 모델을 설명하면, 평소 작업하는 내용과 얼마나 연관이 있고, 어떻게 적용해야할지 갑론을박을 벌이시는 걸 여러번 봤다.

솔직히 말하면, 강의하는 내내 속이 시원했다. 머신러닝은 개발자들이 배워서 적용하는 기술이 아니라, 대학원 수준까지 통계학을 배운 사람들이 자기 작업에 응용하면서 쓰는 도구 학문이라는 필자의 평소 철학이 맞다는 사실을 웅변적으로 보여주시는 장면이었으니까.

어차피 한달 압축 강의를 듣고 그걸로 커리어 전환을 하는건 불가능하다. 커리어 전환을 할 수 있다고 생각하는 것 자체가 데이터 사이언스를 프로그래밍 프로젝트라고 착각하고 있기 때문에 생기는 현상이고, 실체를 제대로 이해하고 나면 커리어 전환을 하기 위해서는 아예 학위를 하나 더 따는 수준으로 공부를 해야겠구나는 생각을 하게 될 것이라고 본다. 실제로 필자의 강의를 두번이나 찾아오셨던 개발자 분은 데이터 사이언스 관련 석사 프로그램을 가야겠다고 지원 준비를 하시는 경우도 봤고. 컴공 출신 학부생은 자기가 왜 통계학 안 했는지 후회한다면서 학위 더 쌓으려면 어떤 path로 가야되는지도 묻더라.

 

3. 솔직한 이야기들

회사 오너가 아무것도 모르는 사람이면 일반적으로 과거 직장 경력이나 학위, 단순히 눈에 보이는 타이틀과 눈에 보이는 결과물들을 기반으로 사람을 뽑는다. 그런데 내용을 잘 아는 사업가는 차라리 똑똑한 애들을 뽑아서 내가 가르친다는 생각으로 사람을 뽑고, 아무런 도움이 안 되는게 뻔히 보이는 수업 몇 개 들었다고 그 사람을 고용할리 없다. MOOC 강의들 듣고 데이터 사이언티스트 될 수 있냐는 Quora.com의 질문 글에 달린 답변 중에 가장 인상적인 답변은, 니가 math , stat 쪽으로 관련된 전공을 했으면 수업 한 두개만 들어도 쉽게 따라갈 수 있을테니 그걸 바탕으로 잡 서칭에 나갈 수는 있겠지만, 일반적인 소프트웨어 엔지니어 출신이거나 수학과 통계학 쪽 공부를 안 한 사람이면 MOOC수업을 많이 들어도 인터뷰 콜 받기 쉽지 않을 거다는 말이었다.

필자도 좀 쉽게 강의해보려고 여러가지 노력을 해 봤지만, 결국 데이터 사이언스를 하기 위해서는 기본적인 수학과 통계학을 잘 알아야한다는 냉정한 현실에 직면하고 있는 중이다. 강의 List에서 강조하는대로, 수학과 통계학이 교육 과정에 많이 들어가 있는 전공 출신이 아니면 수업을 알아듣고 따라오기 어렵다고 본다.

성형 수술 실패로 괴로워하는 사람들의 커뮤니티에 가면 의사들 욕을 하면서 다른 의사는 다 안 된다고 하는데 그 의사만 된다고 그래서 믿고 수술을 받았다는 글을 보는 경우가 있다. 다시 한번 팩트 폭격을 날리면, 안 된다고 솔직하게 말해주는 의사들 말은 안 믿고, 된다고 과장 광고한 의사 말을 믿은 자기 탓은 왜 안 할까? 저 위의 개발자 분 이메일에 보이듯이, 데이터 사이언스 강의 듣고 이직에 도움이 전혀 안 된다고 불평하는 글 쓰시는 분들에게도 똑같은 말을 하고 싶다. 데이터 사이언스가 코딩 프로젝트가 아니라 응용 통계학이라는 사실을 제대로 몰랐던 당신의 무지와, 석사 프로그램이 생길만큼 내공 쌓는데 긴 시간이 걸리는 내용을 한 달만에 완전히 마스터해서 이직까지 가능하다는 과장 광고에 속아 넘어간 당신의 단순한 판단을 되돌아 볼 생각은 없나?

 

나가며

이런 글 쓰고나면 필자의 강의에도 수강생이 다 떨어져나갈 것 같기는 한데, 여러 시도 끝에 얻은 결론을 솔직하게 말하는 것도 가르치는 사람이 갖춰야하는 기본 예의라고 생각한다. 오늘 Reinforcement learning 슬라이드 몇 장 업데이트하며 구글링을 좀 해보니, 최적 path 찾아가는 아주 단순한 그림만 그려서 수업한 경우도 있고, Markov Decision Process를 풀어내는 가장 유명한 방법인 Bellman equation을 이용하는 슬라이드도 있더라. (물론 후자쪽은 대부분 대학원 수업 교재였다.) 어차피 대중을 향한 강의를 하면서 Bellman equation을 풀어내는 강의를 하는 건 무리라고 생각한다. 다만, Markov Process라는게 불확실성이 섞여 있는 상태를 말하고, Dynamic updating 이라는게 모델 학습 과정에서 불확실성을 포함하는 방식의 모델링이라는거, 그래서 평소에 인간이 self-learning 하는 것과 유사한 방식의 모델링이라는 직관 만큼은 제대로 설명해야하지 않을까?

단순하게 팩맨이 최적 path를 찾아서 움직이는 모습을 보여주고, 그 코드를 그대로 따라서 치도록 만드는 수업을 하고 몇 백만원씩 받아가는 수업들을 보면서 어이가 없고, 그런 수업 듣고 난 다음에 왜 나는 데이터 사이언티스트로 취업 안 되냐고 불평하는 글들을 보니 또 황당하다. 그거 구글링하면 Python으로 구현해놓은 샘플 코드 있다. 하나도 아니고 여러개.

데이터 사이언티스트를 찾는 시장 수요는 넘쳐난다. (정작 그게 뭔지 몰라서, 모르는 사람들이 강의해서 문제지.) 그렇지만 그런 수업 하나 들은 “짝퉁” 데이터 사이언티스트를 뽑으려는 회사는 없다. 기분 나쁘다면 “불편한” 수업들 찾아가지말고, 제대로 공부할 생각부터 먼저 하시라고 권유드리고 싶다.

문득, 매주 강의가 끝나면 리뷰하는데도 몇 시간이 걸리는 자료들을 첨부하면서 “아직도 어렵다, 이해한게 맞는지 모르겠다.”고 확인하는 메일 보내주시던 그 철학자 풍 수강생 분이 떠오른다. 학위 하나 더 하는게 아니라면, 최소한 그 정도 시간과 노력과 열정을 쏟아부어야 제대로 배울 수 있지 않을까?

 

후속편: 작정하고 쓰는 머신러닝 강의 비판 (2)

후속편: 작정하고 쓰는 머신러닝 강의 수강생 비판 (feat. 꼰대)