머신러닝 분야에 몸담고 있는 많은 인플루언서는 1) 우리가 왜 머신러닝 학습을 시작해야하는지에 대한 이유와 2) 일단 시작해보면 머신러닝을 얼마나 쉽게 배울 수 있는지 설명하는 글들을 작성하고 있습니다. 트위터, 링크드인, Medium, Reddit 등 이를 위한 엄청난 양의 글이 있어, 이 중에서도 자신에게 도움이 되지 않는 글을 걸러내는 것도 실력이라는 말이 나올 정도입니다.
글을 읽다보면 마치 우리가 머지않아 전문가가 될 것 같고, 머신러닝을 적용해서 다양한 문제를 해결할 수 있을 것 같은 느낌을 받게 됩니다. 하지만 이번 글에서는 이를 다른 관점으로 바라보고자 합니다. 관련된 다른 글을 비난하거나 비웃자는 글이 아니며,지극히 주관적인 생각을 다룹니다.
많은 머신러닝 전문가(또는 여기서 부르는 인플루언서)가 작성한 글을 보면서, '왜 많은 사람들이 처음에 머신러닝부터 배우려고 할까?'에 대한 의문이 떠올랐습니다.
아마 주요한 이유는 많은 사람들이 머신러닝을 공부할 때 주로 접할 수 있는 환경과 실제 머신러닝 엔지니어가 머신러닝을 수행하고 있는 환경의 차이를 모르기 때문일 것입니다. 실제로 일부를 제외한 다수의 머신러닝 엔지니어는 뉴스에서 자주 접할 수 있는 알파고와 같은 인공지능이나 테슬라의 전기차와 같은 자율주행을 연구하고 있지 않습니다.
많은 인플루언서가 작성한 글을 공부한다고 해서 머신러닝 전문가가 될 수 없습니다. 또, 하나에 집중하지 않고, 많은 부분을 습득하려 한다면 절대로 이를 달성할 수 없습니다("A Jack of all trades and master of none").
Why do so many wish to learn Machine Learning?
대학을 다니면서 머신러닝 엔지니어가 되기로 결심했습니다. 어렵고, 도전적이며, 특히 매우 재밌어보였기 때문입니다. iOS 게임 개발자가 되겠다고 선택하기 전까진 말이죠.
누군가 나에게 ML 엔지니어로서의 어떠한 것을 권유하더라도, iOS 게임 개발자라는 커리어을 버리지 않을 것입니다. iOS 게임 개발로 커리어를 쌓는게 매우 행복하고, 직업 선택이 예전처럼 극단적(black and white) 결과로 나아가지 않기 때문에 이에 대한 나의 선택이 온전히 틀렸다고 말할 수 없습니다.
왜 iOS 게임 개발로 행복을 느낄 수 있을까요? 그 이유는 머신러닝을 통해 학습할 때의 재미와 iOS 게임 개발 할때의 재미가 같기 때문입니다. 또는 백엔드, 프론트엔드 애플리케이션 개발을 포함해서 말이죠. 여기서 언급한 세 가지도 충분히 도전적인 분야입니다.
대학을 다니면서 머신러닝을 바라보는 관점은 아래와 같았습니다.(아마도 머신러닝을 얕게 알고있는 많은 사람들이 이와 같은 생각을 하지 않을까 싶습니다. 아래와 같은 생각이 틀렸다는 것은 아니고 어떻게 보면 머신러닝을 학습하고자 하는 사람이 겪을 수 있는 당연한 과정인 것 같습니다.)
머신러닝은 어렵지만(Seems hard), 일자리를 쉽게 얻을 수 있다(ML Job).
재밌고(Fun), 고액 연봉을 받을 수 있으며(High wages),
모든 작업이 자동화될 것인 웹 개발자와 다르게 미래가 보장되어 있다(Future proof).
하지만 나는 이 생각이 틀렸다고 느꼈고, 그 이유를 차근차근 설명해보겠습니다.
1. Machine Learning seems hard
인플루언서들이 작성한 글을 보면 머신러닝을 굉장히 쉽게 다루고 있습니다. 타이타닉 데이터셋을 다운로드하고, 단 10줄의 파이썬 코드로 머신러닝 튜토리얼을 끝마칠 수 있습니다.
실제로 해보면 쉽게 타이타닉 사망자/생존자를 예측할 수 있습니다. 하지만 이를 할 수 있다고해서 돈을 주고 우리를 고용할 필요가 있을까요? 더욱 매력적인 머신러닝 엔지니어임을 어필하려면, 더욱 깊은 수준의 기술을 배우고 사용할 수 있어야 합니다.
모든 것을 다 이해할 수 없을뿐만 아니라 그럴 필요도 없기 때문에 머신러닝을 더 깊이 배우는 것은 더욱 어렵습니다. 더 깊이 배우는 것에 좀 더 쉽게 다가가기 위해선 자신 주변에 훌륭한 멘토가 있다는 것이 매우 중요한 요소인데 현실에서 이를 구한다는 것은 매우 힘든 일입니다. 아마도 훌륭한 멘토를 얻을 수 있는 가장 좋은 방법은 훌륭한 인턴쉽을 수행하는 것이 아닐까요?
(머신러닝 배우는게 매우 어렵고, 멘토 구하기도 힘들기 때문에) 내가 첫 커리어를 시작할 때, 누군가가 이에 대해 말해줬다면 매우 좋았을 것 같습니다. Computer Science가 아닌 다른 분야의 동료와 함께 일할 때, 그와 관련된 것(프론트엔드, 백엔드, 모바일 등)을 배우기 위해 상당한 시간이 투자되었기 때문입니다.
왜냐고요? 음.. 프론트엔드(또는 백엔드, 모바일) 개발에서 멘토를 구하기도 쉽고, 많은 사람들이 이 분야를 하고 있으니까요.
2. Easier to get a Machine Learning Job
프론트엔드(또는 백엔드, 모바일) 개발자보다 머신러닝 엔지니어로서 일자리를 구하기 매우 어렵다는 것은 확실하게 말할 수 있습니다.
자그마한 스타트업은 보통 ML Engieer를 감당할만한 자원(Resource)을 가지고 있지 않습니다. 이제 막 시작했기 때문에 데이터'도' 없기 때문이죠. 그렇다면 그들이 뭐가 필요한지 아세요? 소비자에게 비즈니스를 제공할 수 있는 프론트, 백엔드, 모바일 엔지니어입니다.
스타트업이 안되면, 대기업을 가면 되지 않을까요? 뭐 틀린 생각은 아니지만, 실제로 취업 시장에 뛰어들어보면 ML Engineer를 필요로하는 대기업이 많지 않고, 찾아보기도 힘듭니다.
3. Higher wages
Senior ML Engineer는 다른 Senior보다 더 많은 돈을 벌고 있지 않습니다.
미국에는 머신러닝 슈퍼스타가 그들의 사고방식(mindset)에 따라, 또는 돈에 구애받지 않고 자신이 원하는 곳에서 일을 하는 것도 있지만, 사실 미국에서는 이보다 더 높은 돈을 받는 소프트웨어 엔지니어가 다수 존재합니다.
4. Machine Learning is future proof
미래를 보장한다는 머신러닝과 같이 프론트엔드, 백엔드, 모바일 개발도 동일하다고 말할 수 있습니다.
프론트엔드 개발자로서 매우 만족한다면, 그대로 하세요! 머신러닝 모델로 웹사이트를 만들고 싶다면, 이에 대한 지식을 보유하고 있는 동료와 함께 일하면 됩니다. 반대로 그 동료도 프론트엔드 개발자가 필요하겠죠. 혹은 혼자 다 하거나.
5. Machine Learning is Fun
머신러닝은 항상 재밌지만은 않습니다.
많은 사람들은 머신러닝 엔지니어가 인공지능이나 자율주행차를 연구하는 멋진 일을 할거라고 생각하는데 그렇지 않습니다. 이들 대부분은 학습 데이터를 만들거나 머신러닝 인프라 구축을 위한 작업을 수행하고 있을 것입니다.
또, 머신러닝 엔지니어가 딥러닝 모델을 다양하게 바꿔본다던가, 하이퍼파라미터를 튜닝하는 일을 할 것 같지만 그렇지 않습니다. 오해하지 마세요. 일부는 이와 같은 일을 하겠지만 많지는 않을 거에요.
ML 엔지니어는 현실 세계의 문제와 닮아있는, 또 이를 해결할 수 있는 학습 데이터를 어떻게 구축할 것인지에 대한 고민에 대부분의 시간을 사용한다는 것이 진실입니다. 이 고민이 성공적으로 끝난다면, 복잡한 딥러닝 모델도 사용할 수 있겠지만 대부분의 고전적의 머신러닝 모델도 충분히 잘 작동하고, 좋은 성능을 보여줄 겁니다.
Conclusion
본문은 자칫하면 오해의 소지가 있을 수 있지만, 앞서 언급했듯이 누군가의 생각을 비하하거나 다른 생각과 싸우자는 글이 아닙니다.
머신러닝이 자신의 길이라고 생각하면, 하세요! 직접 연락해서 (저자에게) 조언을 구해도 좋습니다.
하지만 머신러닝은 모두를 위한 기술도 아니고, 모두가 알 필요도 없습니다. 만약 소프트웨어 엔지니어로서 훌륭하고, 재미를 느낀다면, 계속 소프트웨어 엔지니어 커리어를 쌓아가세요. 몇몇 머신러닝 튜토리얼은 소프트웨어 엔지니어 커리어에 도움이 되지 않을 것입니다.
이 글의 목적은 많은 인플루언서의 글과 다르게 이에 대한 비판적 견해를 말해주기 위함입니다.
대부분 공감하는 말이다. 이 글도 수용할 수 있는 한 가지 방법은 ML 전문가이면서 프론트엔드(백엔드, 모바일)도 전문가이면 되지만..... 쉽지 않다.
사용자에게 빠르게 정보를 제공하기 위해 사용하는 캐시에서 새로운 데이터가 발생했을 때, 가장 오래전에 사용된 데이터를 제거하고 새로운 데이터를 삽입하는 알고리즘입니다.
새로운 데이터가 들어온 경우
캐시에 넣어준다.
캐시가 가득차있다면, 가장 오래된 데이터를 제거하고 넣어준다.
존재하는 데이터가 들어온 경우
해당 데이터를 꺼낸 뒤,
가장 최근 데이터 위치로 보내준다.
파이썬으로 구현하면 다음과 같습니다.
cache_Size = 5
cache = [1, 2, 3, 4, 5]
user_data = [3, 7, 2]
for data in user_data:
# Miss!
if data not in cache:
if len(cache) < cacheSize:
cache.append(data)
else:
cache.pop(0)
cache.append(data)
# Hit!
else:
cache.pop(cache.index(data))
cache.append(data)
# 캐시 결과 확인
print(cache) # [4, 5, 3, 7, 2]
결과를 쫓아가보면,
3은 캐시에 존재합니다. 따라서 최근 위치로 옮겨줍니다. --> [1, 2, 4, 5, 3]
7은 새로운 데이터 입니다. 하지만 그대로 넣어주면 cacheSize를 넘어가므로 가장 오래된 데이터 1을 제거하고 넣어줍니다. --> [2, 4, 5, 3, 7]
2는 캐시에 존재합니다. 따라서 최근 위치로 옮겨줍니다. --> [4, 5, 3, 7, 2]