안녕하세요. 정말 오랜만에 글을 올립니다.
요즘 바빠서 글을 올리지 못했지만, 재미난 글을 towards에서 읽고 공유하고자 하는 마음에 글을 올리게 되었습니다.
두가지의 글을 해석하고, 개인적인 의견을 작성한뒤에 글을 마치겠습니다. 게시글은 다음과 같습니다.
Don't learn machine learning - 머신러닝 공부하지 마세요!
이 글의 시작은 머신러닝은 개발자들에게 매력적이고 최소한의 관심이 있을것이라는 가정에서 시작합니다.
만약 머신러닝을 공부하기로 하였고, 일반적인 공부 방법을 따른다면 선형대수학 및 다변수 미적분을 공부하는데만 2주를 소비할 수 있다고 합니다. (아니.. 제 생각으로는 완전히 이해하려면 그 이상입니다.)
그 이유로는 대부분의 머신러닝 입문자료는 개발자(Developer)를 위한것이 아니라 연구자(Researcher)를 위한 자료들이기 때문에 머신러닝을 이용한 상품(Product)를 개발하는데에는 Issue가 된다고 합니다.
그럼 본격적으로 읽어 볼까요?
Do you want to build products, or research?
2000년대 후반 이전에는 머신러닝은 연구적 성향이 강했습니다. 그렇기에 머신러닝을 이용한 의미있는 상품(Product)을 만드는 회사는 많지 않았습니다.
따라서, 머신러닝에 입문하기 위한 자료들은 연구관점에서 접근합니다. 수학적 관점에서 신경망을 설명하며, 역전파(back propagation), 적대적 네트워크(adversarial networks) 같은 머신러닝의 이론들을 설명하는 것으로 시작합니다.
이 것은 대학과 무관한 곳에서도 일어나는 패턴입니다. TensorFlow의 'Quickstart for Beginners' 에는 이렇게 적혀 있습니다.
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
This loss is equal to the negative log probability of the the true class : it is zero if the model is sure of the correct class. This untrained model gives probabilities close to random (1/10 for each class), so the initial loss should be close to -tf.log(1/10) ~= 2.3
이 손실 함수는 실제 class의 음의 log확률과 동일합니다. 모델이 correct class를 맞추는 경우 0이 됩니다.
훈련되지 않은 모델은 확률이 무작위 이므로 (각 class별 1/10) 초기손실은 -tf.log(1/10) ~= 2.3 에 가까워야 합니다.
이미 머신러닝 수학을 잘알고 있고, 수학적인 부분을 공부하고자 한다면 이러한 글을 읽고 접근하는 것이 맞을 수 있습니다. 그러나처음 머신러닝을 배우고, 개발해보려고 하는 개발자에겐 이러한 문구는 찾던 것이 아닐 수 있습니다.
프로그래밍을 처음 배울때를 예로 들면, 어셈블리어를 통해 코드 작성을 배우는 것과 같습니다. 하지만 실제로 개발자들은 어셈블리 어를 배우지는 않습니다. 코딩을 처음 배울때는 고수준 언어(python 같은)를 통해 "hello world" 를 작성해보는 것을 시작했을 것입니다. 그 이후에 프로젝트에 약간의 복잡한 코드들과 좀 더 low-level까지 코딩할 수 있도록 공부해왔을 것입니다.
이러한 학습 방법은 SW개발자 사이에서 성공적으로 작용했고, 성공의 이유는 구축(Build)를 우선적으로 진행했기 때문입니다. 머신러닝의 경우도 마찬가지입니다. 추천엔진을 구축(Build)하는 것을 논문을 작성하고 게시하는 것보다 우선적으로 머신러닝에 접근해야합니다.
How to learn ML by building software
이러한 하향식 접근 방법으로는 fastai의 강의가 잘 설명되어 있습니다. (강의에 대한 내용이 약간 나오는데 생략하겠습니다.)
만약, 당신이 당신의 것을 구축(Build)하는 것을 잘 배우는 사람이라면, 머신러닝을 시작하는 것도 다른 프로그래밍을 시작하는 것과 다르지 않게 시작할 수 있습니다.
다음은 재밌어 보이는 NLP 프로젝트를 구축하는 순서를 나열합니다. 이러한 방식을 보고 머신러닝을 이용하여 구축(Build)하는 것에 친숙하게 느끼길 바랍니다.
- 텍스트 자동완성, 번호판 식별 등 만들고자 하는 목표를 정합니다.
- 프로젝트에 사용할만한 모델(GPT-2 나 YOLOv3 같은)을 찾고, 제공하는 pre-train모델을 내려받습니다.
- 실행 방법을 확인하고, 실행해본 뒤에 멋지다고 생각이 든다면, gpt-2-simple, darknet 과 같은 라이브러리를 사용하여 모델을 자신의 데이터에 맞게 Fine tuning 하여 당신만의 모델을 만들 수도 있습니다.
- 마지막으로, 모델을 마이크로 서비스로 배포하세요!
해당 동영상은 한명의 엔지니어가 재미삼아 만든 번호판을 인식하는 실제 응용프로그램 입니다.
이 접근 방식을 통해 공부한다면, 다양한 인기 모델의 구조(Architecture)를 알고, 적합한 어플리케이션에 대해 알아볼 수 있습니다. 보다 중요한것은 머신러닝 모델을 통해 실제 제품(Product)를 구축하는데 필수적인 ML 인프라를 배운다는 것 입니다.
Once you can build with machine learning, then learn the theory
만약 당신이 엔지니어라면, password를 해싱해본적이 있을 것이라고 생각합니다. 당신이 password를 해싱하는 데에 암호화에 대한 연구를 몇 주 동안 했습니까? 아니면 bcrypt 같은 라이브러리를 사용했습니까?
마찬가지로, 웹 app 을 처음 구축할때, 데이터베이스에 데이터를 생성할 때, 데이터 베이스의 기본지식에 대해 몇 주 동안 연구했습니까? 아니면 프레임워크와 함께 제공된 ORM을 사용했습니까?
머신러닝도 마찬가지 입니다. 머신러닝을 이용한 SW를 개발하고자 한다면, 먼저 머신러닝을 이용해서 소프트웨어를 구축하고, Pre-train된 모델과, 제공되는 tool을 이용해서 일단 만드세요. 그런 다음 프로젝트의 성능을 끌어올리려하거나, 머신러닝이 동작하는 것을 좀 더 깊게 알아가기 위해 머신 러닝 이론들을 공부하며 머신러닝의 작동 방식을 공부하세요.
개인적 의견
저는 이 포스팅을 읽고나서, 저의 생각과 정말 딱 맞는 포스팅이라고 생각했습니다. 한국에서 실제로 채용공고들을 보면 작년과 많이 달라졌습니다. 작년만 해도 '논문을 읽고, 구현하는 데 거부감이 없으신 분', '수학, 통계 전문가' , '석사학위 이상', '딥러닝 관련 논문 게시 경험' 등 엔지니어를 구하는 공고임에도 불구하고 연구적 성향의 자격요건들, 면접 때도 개발의 영역보다는 딥러닝 관련 지식을 질문하는 등 머신러닝 이론을 통해 사람을 채용하려고하는 경우가 많았습니다. 하지만 요 근래의 채용공고를 보면 ' 개발경험', '머신러닝 파이프라인 구현', ' SW 개발경험' 등 개발자의 역량을 좀 더 중시하는 경향이 늘어난 것 같습니다. (물론 아직도 연구자와 완벽히 분리되거나 하진 않았습니다.)
실제로 회사라는 것은 결국 이익을 추구하는 집단이기 때문에, 아무리 머신러닝에 뛰어난 지식이 있더라도, 개발 능력이 부족해서 SW를 만들어서 배포할수 없다면 즉, 상품화(Product)하지 못하는 머신러닝 지식은 회사에서 필요 없을거라고 생각합니다. (특히나 스타트업은 빠르게 성장하는것이 중요하기 때문에 더더욱 그럴 것이라고 생각합니다.)
즉, 머신러닝을 공부하고 또 그를 통해 취업하고 싶은 학생이라면 더더욱 개발을 먼저 해보는 것을 저 또한 좋다고 생각합니다. (물론 머신러닝/딥러닝 연구자(Researcher)가 되고 싶은 분이라면 깊게 이해하는 것이 좋지만, 대부분은 엔지니어의 영역에서 취업될 것이라고 생각하기 때문에.. 만약 연구자라고 하더라도, 자신만의 app을 만들어 보는 것은 좋다고 생각합니다.)
포스팅이 많이 길어졌네요! 5 Reasons You Don't Need to Learn Machine Learning 에 대한 글은 다음 포스팅으로 넘어가서 마저 진행해보겠습니다. 간단하게 말씀드리면 현업 AI개발자가 느낀 머신러닝 엔지니어에 대한 오해 같은 느낌의 포스팅입니다. 해당 포스팅에 작성된 글과는 성격이 조금 다른 글이 되겠네요.
여기까지 읽어주셔서 감사합니다!
다음 포스팅 링크를 달고 마무리 하겠습니다.
2021/03/05 - [지식 저장소] - 머신러닝을 공부할 필요가 없는 5가지 이유 - towards 해석