답글로 달기에는 글이 길어질 듯해서... (극히 개인적인 의견이니 그냥 참고만...)
딥러닝 기술을 바이오 데이터에 적용하는 걸로 석사를 졸업했다. 나는 취업해서 그냥 데이터 사이언티스트가 되고 싶다.
실무자가 되기 위해서 굳이 알고리즘의 수식을 유도하고 코드를 구현하는 걸 공부해야 하나?
머신러닝 이론이 실무에 그대로 활용되는가? 그냥 데이터 다루는 법이 더 중요하지 않나?
소프트웨어 엔지니어 수준의 개발 지식과 기술이 필요한가?
첫 줄 요약.
당장은 필요 없다. (일단 취업된다는 가정 하에) 하지만 레벨업을 위해선 미리미리 준비해야 한다. (언젠가 해야 한다면 어릴 때… == 취업 후에라도)
데이터 과학자도 여러 종류가 있다. 가장 하드코어 하게는 인공지능 연구실로 진학해서 더 나은 새로운 알고리즘을 발명하겠다는 부류도 있을 테고, 반대편에는 그냥 내가 가진 문제/데이터를 기존에 구축된 잘 알려진 알고리즘을 적용해서 해결하겠다는 부류도 있을 거다. 대부분은 그 중간 어디쯤에... 회사 실무에서 데이터 과학을 적용하겠다는 — 특히 수학 베이스가 약한 — 이들에게 알고리즘의 수학적 증명이나 low 레벨에서의 알고리즘 코드 분석이나 코딩 기술을 요하는 것은 과한 면이 있다. 그럼에도 — 아무리 공부해도 모르겠고 자기 적성에 맞지 않는 경우가 아니라면 — 저는 가급적 수학적 증명이나 유도과정을 익히고 로-레벨 코딩도 해보라고 권한다. 취직을 하는데도 아주 약간 도움도 되겠지만 향후에 더 나은 데이터 과학자로 성장하는데 분명 도움이 된다. 적성에 맞지 않거나 과도하게 리소스를 요구한다면 굳이 권하지는 않는다. 일단은 취업해서 2~3년 정도, 경우에 따라서 5~6년 정도, 운이 좋으면 평생 동안 쉬운 기술 (테크닉)으로 업무를 수행하는데 지장 없다. 그런데 레벨업이 필요한 시점이 온다. 단순히 더 많은 도메인 지식을 얻고 다양한 알고리즘을 경험함으로써 레벨업이 되기도 하겠지만, 데이터 과학자에게는 다른 측면에서의 레벨업이 필요하다. 현재 구할 수 있는 최고의 알고리즘과 라이브러리도 내가 해결해야 할 문제에 맞지 않을 때가 있다. 완전히 새로 설계해서 개발하지 않더라도 그 문제에 맞게 알고리즘을 개선하거나 자기만의 알고리즘을 만들어야 할 때도 있고, 기존 오픈 소스를 자신의 환경에 맞게 재설계, 재프로그래밍해야 할 때도 있다. 지금 당장 모든 수식을 유도하고 구현해보라는 얘기는 아니다. (가능하면 좋긴 하지만) 취업해서 주니어 시기를 보낼 때 허투루 시간을 보내지 말았으면 한다.. 2~3년 또는 5~6년 동안 당장 필요한 기술이 아니더라도 꾸준히 공부하고 연습해서 시니어로 레벨업했으면 한다
수식을 유도하고 직접 구현해보면 그 알고리즘의 특징을 더 잘 이해할 수 있다. 더 잘 이해했다는 것은 더 잘 활용할 수 있다는 의미다. 그저 남들이 '랜덤포레스가 좋다'더라 '부스팅을 사용하면 더 좋을 거야’ 또는 '그냥 딥러닝을 적용해’와 같은 식으로 기계적으로 데이터와 알고리즘을 묶을 수도 있지만 그렇게 시간을 보내면 결국 ‘딥러닝 사용해봄 그러나 이해는 못 함’ 정도의 이력서 한 줄 밖에 남는 게 없다. Linearly separable 케이스에는 그냥 선형 모델이면 충분하다. 이런 경우에도 딥러닝으로 문제를 해결하겠다고 덤비는 우는 범하면 안 된다. 다른 글에서도 적었지만 데이터 과학은 분석을 넘어서 해석이 필요하고, 해석을 넘어 소통이 필요하다. 해석을 하려면 기초 개념을 정확히 이해하고 있어야 하고 지식을 내재화했을 때 공유가 가능하다. 면접에서 종종 묻는 ‘L1과 L2의 장단점을 설명하라’고 질문하면 이것도 제대로 답변하지 못하는 지원자를 종종 본다. 아주 복잡한 알고리즘의 모든 수식을 이해하는 것은 불가능할지 몰라도 최소 이런 류의 기본적인 수식에 대한 이해는 필요하다. 최소한 업무에 필요한 논문을 읽고 이해할 수 있는 수준은 돼야 한다.
…
길어졌는데 수학의 이해와 구현이 당장 필요하지 않을 때가 대부분이다. 어떤 아고리즘을 사용하는데 굳이 그걸 손으로 유도해볼 이유가 없다. 그러니 굳이 그걸 모두 이해하려고 노력할 필요는 없다. 좀 더 시간을 갖고 천천히 익혀나가도 된다. 다만 진짜 들어가고 싶었던 회사의 면접에서 저런 류의 질문이 나오지 않기만을 바랄 뿐이다. 취업 후에 익혀도 늦지는 않다. 취업이 된다면…
복잡한 머신러닝 알고리즘을 현업에서 실제 사용하는가? 늘 그렇듯 케바케다. 어떤 분석 팀에서는 머신러닝을 전혀 사용하지 않을 수도 있고 다른 팀은 딥러닝을 하드코어하게 사용하기도 한다. 물론 질문자의 말마따나 심플한 알고리즘으로 데이터의 본질을 꿰뚫어 보는 게 더 중요하다. 이걸 잘 못하니깐 그냥 유명한 알고리즘을 가져와서 무턱대고 사용하는 경우도 종종 본다. (개인적으로 극혐함) 머신러닝 알고리즘을 어떻게 활용하느냐는 주어진 문제와 데이터에 따라서 다르므로 유연하게 알고리즘을 선택하고 적용해야 한다. 문제가 단순하면 단순한 알고리즘이 더 적합할 테고, 실시간으로 빠른 연산이 필요하면 조금 덜 정확하더라도 approximation 방식을 사용해야 할 테고, 시간도 충분하고 0.1%의 정확도라도 더 높여야 하는 분야라면 그게 맞는 복잡하고 진보된 알고리즘이 필요하다. 그렇지만 데이터의 양이 절대적으로 많아진 요즘에는 복잡한 알고리즘보다 오히려 단순 counting이 더 나은 경우도 많다. 실제 많은 서비스에서 카운팅으로 줄 세우는 경우가 잦다. CTR 예측 시에도 굳이 정확도가 크리티컬 하지 않다면 단순히 노출수와 클릭수를 카운팅 해서 비율값을 그대로 사용했다. 문제와 데이터에 유연하게 접근하는 게 필요한데, 그러려면 — 역설적이게도 — 많은 알고리즘을 잘 알고 있어야 하고, 각각의 특징을 잘 알고 있어야 한다. 그리고 공개된 발표자료에는 크게 두 부류가 있다. 하나는 이렇게 어려운 일을 하고 있다는 걸 자랑하기 위해서 복잡한 알고리즘을 소개하는 발표가 있고, 역으로 우리는 어려운 일을 하는데 너희가 이해하지 못할 테니 쉬운 방법만 맛보기로 설명하는 발표가 있다. 일반인을 대상으로 하다면 후자일 가능성이 높다. 겉으로 보이는 걸로 모든 걸 판단하면 안 된다. … 정리하자면, 현업에서 의외로 간단한 방법/테크닉/휴리스틱을 많이 사용한다. 하지만 모든 문제가 쉽게 해결되지 않기 때문에 미리 다양한 알고리즘을 일종의 무기로 갖추는 게 필요하다.
기본 프로그래밍 기술만 가졌디면 데이터 과학자가 되는데 별로 장애는 없다. 일반적으로 회사 업무는 모델링 파트와 시스템 개발 파트로 나뉘는데, 이 둘을 모두 잘하는 인재가 베스트겠지만 자신의 성향과 적성에 맞는 쪽으로 일한다. 그냥 현업 데이터 과학자가 되겠다는 사람에게 CS의 기초적인 것을 요구하는 것은 과한 면이 있다. 하지만 가끔 면접을 볼 때는 CS가 부족하더라도 모델링 지식이 충분하면 통과시키는데, 저와 다른 성향의 면접자들도 있다는 점은 알아야 한다. 그래도 일할 때 종종 필요한 데이터 구조나 DB (SQL) 정도는 익힐 필요가 있다. 요즘 나오는 라이브러리들은 워낙 잘 돼있어서 데이터 구조는 몰라도 되지만, 데이터 과학자가 하는 일의 7~80%는 데이터를 조회하는 일이니 SQL은 확실히 사용할 수 있어야 한다. 그리고 입사하는 회사가 어떤 곳이냐에 따라서 필요한 지식의 정도가 다를 거다. 잘 갖춰진 분석/머신러닝팀이라면 모델러와 시스템 개발자가 함께 있어서 역할 분담이 되겠지만, 소수 또는 한두 명이 일당백으로 모든 걸 해야 하는 스타트업이나 비 개발 회사에 취업했다면… 현실적으로 자신이 들어갈 수 있는 회사의 사정을 살필 필요는 있다. 어쨌든, 데이터 과학자가 굳이 CS의 모든 기초 지식을 미리 다 공부해서 알 필요는 없다.
…
앞에서 계속 ‘취업에 문제없다면’이라는 단서를 달았다. 그런데 취업에서 문제가 될 수 있지 않을까?. 만약 당신이 면접관인데 지금 ‘컴공을 전공하지 않고 바이오 쪽에서 딥러닝을 적용한 — 스스로 취업이나 현업에 도움이 되지 않을 것 같다고 말한 — 지원자’가 앞에 있다면 이 지원자는 뭘 보고 판단해야 할까? 이 지언자에게 어떤 질문을 할 것인가? (좀 비아냥대는 듯하다면 먼저 양해를 구한다.)
-
XX과를 졸업하셨네요? 싱크로너스와 어싱크로너스 프로그래밍의 장단점을 설명할 수 있어요?
-
컴공과 전공이 아니어서 잘 모르시구나. 그러면 딥러닝에서 BatchNorm은 왜 잘 동작할까요? 혹시 수학적으로 설명해줄 수 있나요?
-
아, 수학쪽으로도 공부한 게 없으시구나. 딥러닝은 어떤 프레임워크를 사용하셨나요?
-
PyTorch를 사용하셨구나. 우리는 YYY라는 함수를 사용해야 하는데, PyTorch에 해당 기능이 구현돼있지 않은데 어떡하죠?
-
이런 테이블들이 있는데, 다음 조건을 만족하는 데이터를 유저별로 상위 5개씩 뽑아주는 SQL 문을 작성해주시겠어요?
좀 극단적일 수도 있지만 대강 이런 식으로 질문을 하지 않을까? 만약 이 지원자는 자신의 어떤 점을 부각해서 자신이 그 회사에서 데이터 사이언티스트로 입사해야 한다는 점을 부각할 수 있을까? 저는 수학적 이해가 빠릅니다. 저는 프로그래밍을 기막히게 잘합니다. 저는 검색과 쇼핑 쪽에서 데이터 분석을 많이 해봤습니다. 저는 텐서플로우로 이런 알고리즘들을 직접 구현해봤습니다. 이런 류의 어필이 필요할 텐데…
수학적 이해가 없더라도, 다양한 구현 경험이 없더라도, 다양한 알고리즘에 대한 지식이 없더라도, 다양한 연구/업무 경험이 없더라도 취업문을 통과하는 전략이 있다면 질문자의 질문처럼 현업에서 데이터 과학자로 일하기 위해서 굳이 뵥잡한 수식을 유도해서 구현해보거나 어려운 알고리즘을 공부하거나 프로그래밍 스킬을 키울 필요는 없다. 하지만 특별한 전략이 없다면 가장 일반적인 게 가장 좋다. 미리 모두 익혀둬라. 일단 출발하면 문제가 없는데, 출발하는 게 어렵다.
고백하자면 나도 머신러닝 알고리즘들을 수학적으로 이해하고 유도하지 못한다. 간단한 몇 개를 제외하고 직접 구현해본 알고리즘도 없다. 업무의 대부분은 조건을 바꿔가면서 데이터를 쿼리하고 카운팅하는 일이다. 요즘은 데이터를 조회하는 일도 없이 그냥 그림만 그리고 글만 적는 시간이 더 많다. 분위기 휩쓸려 여러 컴공과 수업을 들었지만 프로그래밍은 내가 잘 하는 분야가 아니다. 그럼에도 나는 지금 데이터 사이언티스트로 일하고 있다. 나는 이미 출발했기 때문이다. 내가 취업할 때보다 요즘 데이터 과학자를 뽑는 게 더 까다로워졌다. 10년 전에는 똘똘한가만 봐도 됐지만 요즘은 전문 지식과 경험이 있는지를 검토해야 한다. 출발선에 서는 것부터 힘들어졌다. 스스로 면접관이 돼서 자신을 봐야 한다. 충분히 매력적이라면 굳이 어렵게 시간, 돈, 열정을 쏟으면서 공부할 필요가 없다.