나는 어떻게 취업을 (못) 하게 되었나
페이스북에서 학부생인데 기계학습 관련 직종으로 취업하고 싶지만 어떻게 해야 좋을까, 혹은 나는 어떤 공부를 해야 좋을까 하는 고민을 올린 글을 많이 봤어요. 저도 비슷한 고민을 하고 있었고, 나름대로 취업에 대한 고민의 결론을 내렸고, 이를 위해 노력한 성과가 어느 정도 나와서, 이를 공유하고 싶어졌습니다. 사실 결과적으로는 대학원에 진학하게 되었습니다.

(1) 카카오 추천팀과, (2)당근마켓의 면접을 다 합격하게 된 게 성과…‘ㅅ’…
결국 석사를 진학하게 되었지만 ^0^…
(1) 제가 어떤 사람이고, (2) 어떻게 공부를 해왔는지 공유하면, 기계학습 관련 취업을 준비하는 사람들에게 분명히 도움이 될 거라 생각해서 이런 글을 쓰게 되었습니다.
그리고, 사실 대학교를 마치기까지의 제 자신에 대한 회고 같은 느낌도 있어요.
이 글의 대상은 학부를 졸업하고, 기계 학습 엔지니어로 취직하고자 하는 사람을 위한 글입니다.
경력있고 실력있는 엔지니어, 리서쳐 분께서 보면 겨우 이런 일을 가지고 자랑하는 듯한 글을 쓴다는 생각이 들 수도 있을 것 같습니다. 하지만, 음… 제 경험이 도움이 될 사람도 분명히 있을 것이라 생각해 제 경험을 공유하고자 합니다.
나는 어떤 사람인가
저는 한양공업고등학교를 나왔습니다. 어느 정도 공부를 한 결과 운이 좋아 성균관대학교에 입학하게 되었습니다.
공고 출신이 대학 입시를 준비하고, 성공하는 과정에서, 지레짐작하며 포기하는 것이 나쁘다는 사실을 배웠어요. 좋지 않은 학교를 나왔다는 사실이 날 도전하지 못하게 막을 수는 없다는 사실을 알게 되었습니다. 날 막는건, 단지 도전할 용기를 내지 못하는 자신 뿐이라는 사실을 배웠어요. 혹시 좋지 않은 대학교를 나왔다거나, 전공이 다르다거나, 혹은 대학교를 나오지 않았다고 해서 포기하지 않았으면 좋겠어요. 내 학벌이나, 학점이 아닌 실력으로 평가받을 수 있다고 믿으려 노력하고 있습니다.
어떻게 기계학습을 공부하게 되었는가
기계학습에 처음 관심을 갖게 된 건, 2017년 연초에 여자친구랑 헤어지고 하루종일 유투브만 들여다보던 시절이었던 것 같아요. (다른 사람들은 알파고때 많이 관심을 갖게 되었다고 들었어요.) 사용자가 좋아할 만한 동영상을 추천해주는 것을 연구하는 분야를 “추천 시스템”이라고 부르는 것도 모르는 채, “유투브 신기하네” 정도로만 생각하고 있었습니다.
한 두어달쯤 그렇게 생활했을까, 이렇게 살면 안된다는 생각을 했었습니다. 선배들이 취준하는 모습을 보고, 나도 뭐라도 해야겠다 하는 생각을 했었어요. 그래서, 아무 생각도 없이 요즘 핫하다는 데이터마이닝을 연구하는 교수님을 찾아가서 학부연구생을 시켜달라고 했어요. 물론 데이터마이닝이 뭐 하는건진 하나도 몰랐어요…
운이 좋아서(교수님이 부임된지 얼마 되지 않아 연구실에 사람이 전혀 없었기 때문에) 연구실에 자리를 하나 얻을 수 있게 되었고, 추천 시스템, 조금 넓게는 머신 러닝과의 만남은 이 때 시작되었습니다.
어떤 방법으로 공부했는가
개인적으로, 대학원에 진학하거나 학부연구생을 할 수 있는 환경이라면, 무조건 하시는 걸 추천드려요. 연구실 생활의 가장 큰 장점으로는, 내가 뭘 공부하면 좋을지 잘 모를때 가이드라인이 존재한다는 점인 것 같아요. 어떤 논문을 읽어야 좋을 지, 어떤 것을 공부해야 좋을 지 등등… 좋은 지도교수님과, 좋은 선배와, 개인의 노력까지 합쳐지면 혼자 공부할 때에 비해서 성장의 폭이 달라지는 것 같아요. 그렇게 할 수 없는 경우에도, 혼자 공부하는 것보다는 되도록 다른 사람과 함께 공부하는 것을 추천해요. 성장은 협력에서 나오는 것이 아닐까 하는 생각을 많이 하곤 해요.
이 글은, 그렇지 못한 사람들을 위해, 제가 어떻게 공부했는지를 알려주고자 하는 글입니다!
수학을 피할 수는 없습니다
저도 수학을 잘 하진 못했던 것 같아요. 생소하기도 하고, 처음에 MLP를 이해하지 못해서 몇주간 헤멨던 기억이 납니다. 수학보단 insight가 중요한게 아닐까, 수식은 이해하지 못해도, 코드를 이해하면 되지 않을까 하는 유혹에 혹하기도 했어요. 근데 이런 생각이 들더라구요. 내가 잘 할 수 없으니까, 수학을 신 포도라고 생각하게 되었던 건 아닐까? 수학 공부하는걸 포기하지 않으면 더 많은 걸, 더 자세히 알 수 있다고 생각해요.
생각나는게 몇 개 없지만 예를 들자면,
- Bias-Variance Tradeoff가 왜 생기는지
- Regularlization은 왜 overfit을 줄이게 되는지
- 왜 minibatch training이 전체 샘플을 사용하는 것에 비해 충분히 괜찮은 estimate를 제공하며, overfit도 일부 줄이는 효과를 얻는지
이런 것들은 글로, 혹은 코드로 이해하기 쉽지 않지만, 수식으로 설명하면 쉽게 이해가 된다고 생각합니다. 이 뿐만 아니라, 기계 학습을 공부하며 마주치는 많은 내용들은 그리 복잡하지 않은 확률론, 미적분학 지식이 있으면 더 쉽고, 더 자세히 이해할 수 있습니다. 처음부터 수학을 너무 깊게 공부할 필요는 없다고 생각합니다. 목표는 수학을 잘 하는게 아니니까요. 하지만, 수학을 너무 무서워하지 않게, 꾸준히 연습할 필요는 있다고 생각합니다.
저는 기계 학습을 공부하며 모르는 수학이 나오면, 어디 적어뒀다가 주말에 찾아서 공부를 했어요. 이제는 너무 유명한 PRML이나, 수리통계학 두 책을 가장 많이 본 것 같습니다.
분명, 수학을 꾸준히 공부하다 보면, 공부하길 잘했다 싶은 순간이 올 것이라 믿어요. 제가 그런 경험을 했고, 같이 수학을 공부하던 친구도 그런 경험을 했습니다. 포기하지 않았음 좋겠어요!
무슨 모델을 공부했는지보다는, 어떤 문제를 해결하는가에 집중하기.
학부 연구생을 경험하며 처음으로 어떤 문제를 해결하는 방법에 대해 배우게 되었습니다. 특히, 이는 지금까지 내가 공부했던 방식과 전혀 다른 방식이었어요. 지금까지의 공부는, 알고리즘으로 예를 들자면, 알고리즘을 배우고 그 다음 이를 이용해 해결할 수 있는 문제를 푸는 방식이었어요.
새로 배운 방식은, 예를 들자면 이런 것 같아요. 유저의 시청 이력(유저가 아이템을 클릭한 목록)이 충분해야 추천을 잘 만들 수 있는데, 유저가 시청 이력을 충분히 남기지 않았다. 이를 어떻게 해결할까?
즉, 두 방법을 요약하자면 다음과 같습니다.
- 해결책 X를 먼저 배운 뒤, 이 X로 해결할 수 있는 문제 Y에 적용해본다.
- 문제 Y를 먼저 정의한 뒤, 이 문제를 해결할 만한 방법 Z를 열심히 생각한다.
기계학습 분야에서는 (제 생각에는) Z는 특히 책으로 배우기 어려운 것 같아요. 기계학습 문제가 적용되기 시작한지 그리 오래 되지 않아, 방법론이 정리되지도 않았고, 상당히 많은 분야에 적용할 수 있기 때문이라고 생각하는데 정확히는 잘 모르겠습니다.
기계학습 모델로 어떤 문제를 해결하고자 하면 생기는 문제는 대부분 Z에 있고, 이 과정에서 상당히 많은 문제가 발생합니다. (대부분은 책에 없는 문제였어요.) 이 과정에서 생기는 문제를 잘 해결하는 것이 좋은 엔지니어의 필수적인 자질이라고 생각합니다. 이는 기계학습 엔지니어 뿐만 아니라, 모든 엔지니어에게 필수적인 자질이겠죠. 저는 운좋게도 이 과정을 학부 연구생을 하며 자연스럽게 배울 수 있었습니다.
예를 들면, 만든 기계학습 모델을 200ms 내에 Serving하는 API를 만들어야 한다고 가정해봅시다. 단순히 생각했을 때, 다음과 같은 현실적인 문제를 추가적으로 해결해야 합니다.
- 모델을 Web API로 돌릴 수 있을 정도로 경량화 되어있어야 한다. (돈을 충분히 쓴다면 필요 없는 경우도 많겠지만)
- 일단, 개별 Query에 대해 200ms 이내로 서빙해야 한다.
- 요청이 (예상 범위 내에서) 많아지는 경우에도, 200ms 이내로 서빙해야 한다.
이 부분은 일부는 기계학습의 영역이고, 일부는 컴퓨터 공학의 영역인 것 같아요. 사람마다 잘 하는 일이 다르므로, 잘 하는 부분이 생길 거고, 못 하는 일이 생길 거라고 생각합니다. 자신이 잘 하는 일, 좋아하는 일을 강조하면 서류/면접에서 좋은 결과 있을 것이라 생각해요.
리서치를 목적으로 하신다면, 다른 방법으로 접근하는게 좋을 것이라 생각해요. 하지만, 리서치의 본질도 문제를 제기하고, 해결 방법을 제안하는 것이므로 크게 다르지는 않을 것이라 생각해요.
블로그/오픈소스 활동
자신이 배운걸 습관적으로 남들한테 보여주는게 중요합니다! 이러면 (기본적으로는 쪽팔릴까봐) 더 열심히 하게 되고, 이력서처럼 활용도 가능합니다. (어딘가 지원할때 제 깃허브와 블로그 이외에 다른 것을 제출해보지는 않았어요. 대부분의 경우 긍정적인 답변이 오는 것으로 보아, 블로그와 깃헙 활동만으로 포트폴리오는 충분하지 않나 싶어요.)
특히, 블로그는 꼭 하는게 좋은 것 같아요. 내가 얼마나 성장했는지 확인하기 가장 좋은 방법이기 때문입니다. (과거에 쓴 글이 너무 쪽팔려지면 성장한 겁니다…)
오픈소스 활동도 꼭 해보시길 권해요. 처음에 코드를 커밋할 때에는, 반신반의했어요.이런 멋진 코드를 쓰는 사람들이 활동하는 곳에 내가 코드를 올린다는게 방해가 되지는 않을까 생각했어요.
그러다, 그러다 정말 우연히 올린 오타 수정 Commit이 grpc에 반영되게 되었고,

So what?쯤의 대답이 돌아올 줄 알았는데, “Thanks!”라는 친절한 대답을 들었던 것 같아요. 다른 사람들에게는 별 일 아닐 수도 있겠지만, 조금 자신이 생겨서 이번에는 새로운 기능을 만들어보거나, 코드를 조금 수정해보거나 해봤어요.
이러는 동안 정말 많은 것들을 배울 수 있었습니다. flake를 사용해 pep8에 맞는 Python code를 작성하는 방법, Travis를 이용하는 방법, Remote에 있는 사람과 협업하는 방법 등… 가장 중요한 것은, 정말 훌륭한 코드를 읽어볼 수 있다는 점이었어요.
단지 방에서 혼자 프로그래밍을 했다면 배울 수 없는, High standard를 가진 사람들과 (돈을 받지는 않지만) 많은 사람들이 사용하는 프로덕트를 만들 수 있는 기회라니…(게다가 원하는 시간에만 일할 수 있음) 놓치면 안됩니다.
이게 다, 처음 제 commit에 Thanks라고 말해준, grpc를 maintain하는 어떤 아저씨로부터 시작되었다고 생각하면 신기하기도 해요ㅋㅋㅋ… 현재는 큰 레포지토리는 아니지만, Implicit이라는 라이브러리를 maintain하고 있습니다.
참고로, open source 활동의 가장 좋은 점은 이거에요.

이걸 보고 Job offer가 들어오기도 합니다 >_<
결론
가장 중요한 것은, 면접이나 취업을 잘 하는 것이 아니라, 자기 자신이 성장하는 것인 것 같아요. 요즘은 어딜 가던 면접 프로세스가 정말 잘 되어있어서… 결국 자신의 진짜 모습을 보여주게 되어 있고, 이로 평가받게 되니까요. 엔지니어로서 자신의 모습을 솔직하게 보여줬을 때, 서류나 면접에 합격할 정도의 수준은 (저도 가능했으니) 누구나 노력한다면 가능할 것이라 생각합니다. 그러니, 음… 개인적으로는, 자신을 어떻게 보여줄 지에 대해 너무 신경쓰기보다, 자기 자신이 더 좋은 사람이 되기 위해 노력하는게 맞다고 생각해요.
저는 결국 대학원에 진학하는 것을 선택했어요. 더 많이 성장할 수 있다고 생각해서…라고 생각할래요. (사실은 납치당함) 하지만 처음 언급했듯이, 제가 어떻게 기계 학습을 공부하게 되었고, 공부했는지가 다른 분들에게 도움이 될 것이라 생각합니다.
읽어 주셔서 감사합니다.
私はどのように就職できなかったのか
Facebookで、学部生だけれど機械学習関連の職に就きたい、どうすればいいだろう、あるいは何を勉強すればいいだろう、と悩みを書いた投稿をたくさん見ました。私も似たような悩みを抱えていて、自分なりに就職について考えた末の結論を出し、そのために努力した成果もある程度出たので、それを共有したくなりました。実際、結果的には大学院に進学することになりました。

(1) Kakaoの推薦チームと、(2)タングンマーケットの面接に全部合格したのが成果…‘ㅅ’…
結局、修士に進学することになりましたが ^0^…
(1) 私がどんな人間で、(2) どのように勉強してきたのかを共有すれば、機械学習関連の就職を準備している人たちの役にきっと立つと思い、この文章を書くことにしました。
そして実は、大学を卒業するまでの自分を振り返るような気持ちもあります。
この記事は、学部を卒業し、機械学習エンジニアとして就職したい人のための記事です。
経験も実力もあるエンジニアやリサーチャーの方が読めば、たかがこんなことで自慢げな文章を書くのかと思うかもしれません。でも、うーん…私の経験が役に立つ人もきっといると思い、共有したいと思います。
私はどんな人間なのか
私は漢陽工業高校を卒業しました。ある程度勉強した結果、運よく成均館大学に入学できました。
工業高校出身者が大学受験を準備し、成功する過程で、早合点して諦めるのはよくないということを学びました。 よくない学校を出たという事実が、私の挑戦を阻むことはできないと知りました。 私を阻むのは、ただ挑戦する勇気を出せない自分自身だけだと学びました。 もし、よくない大学を出たとか、専攻が違うとか、あるいは大学を出ていないからといって諦めないでほしいです。 学歴や成績ではなく、実力で評価してもらえると信じようとしています。
どのように機械学習を勉強することになったのか
初めて機械学習に興味を持ったのは、2017年の年初に彼女と別れ、一日中YouTubeばかり見ていた頃だったと思います。(ほかの人はAlphaGoのときに興味を持つことが多かったと聞きました。)ユーザーが好きそうな動画を推薦する研究分野を「推薦システム」と呼ぶことすら知らず、「YouTubeって不思議だな」くらいにしか考えていませんでした。
一、二か月ほどそんな生活をした頃、こんなふうに生きていてはいけないと思いました。先輩たちが就活する姿を見て、私も何かしなければと思ったんです。それで何も考えず、最近ホットだというデータマイニングを研究している教授を訪ね、学部研究生にしてほしいと言いました。もちろん、データマイニングが何をするものなのかは何ひとつ知りませんでした…
運がよく(教授が赴任して間もなく、研究室に人がまったくいなかったので)研究室に一席を得ることができ、推薦システム、少し広く言えば機械学習との出会いはこのとき始まりました。
どんな方法で勉強したのか
個人的には、大学院に進学したり学部研究生をしたりできる環境なら、絶対にやることをお勧めします。研究室生活の最大の長所は、自分が何を勉強すればいいのかよく分からないときにガイドラインがあることだと思います。 どの論文を読めばよいか、何を勉強すればよいかなど…よい指導教授、よい先輩、そして個人の努力まで合わされば、独学に比べて成長の幅が違ってくると思います。 そうできない場合でも、一人で勉強するより、なるべくほかの人と一緒に勉強することをお勧めします。成長は協力から生まれるのではないかと、よく考えます。
この記事は、そうできない人たちのために、私がどのように勉強したかを伝えようとするものです!
数学は避けられません
私も数学が得意ではなかったと思います。馴染みもなく、最初はMLPを理解できずに何週間もさまよった記憶があります。 数学よりinsightが重要なのでは、数式を理解できなくてもコードが分かればいいのでは、という誘惑に心を動かされたこともありました。 でも、こんな考えが浮かびました。自分にはうまくできないから、数学を酸っぱい葡萄だと思うようになったのではないか? 数学の勉強を諦めなければ、より多くのことを、より詳しく知ることができると思います。
思い浮かぶものは少ないですが、例を挙げると、
- Bias-Variance Tradeoffはなぜ生じるのか
- Regularlizationはなぜoverfitを減らすのか
- なぜminibatch trainingは全サンプルを使う場合に比べて十分よいestimateを提供し、overfitも一部減らす効果があるのか
こうしたことは文章やコードでは理解しにくいですが、数式で説明すれば簡単に理解できると思います。 それだけでなく、機械学習を学ぶなかで出会う多くの内容は、それほど複雑でない確率論や微積分の知識があれば、より簡単に、より詳しく理解できます。最初から数学を深く学びすぎる必要はないと思います。目標は数学が得意になることではありませんから。でも、数学を怖がりすぎないよう、地道に練習する必要はあると思います。
私は機械学習を勉強していて知らない数学が出てきたら、どこかに書き留めておき、週末に調べて勉強しました。今ではあまりにも有名なPRMLと、数理統計学の二冊をいちばん多く読んだと思います。
きっと、数学を地道に勉強していれば、勉強してよかったと思う瞬間が来ると信じています。私にもその経験があり、一緒に数学を勉強していた友人にもありました。諦めないでほしいです!
どんなモデルを勉強したかより、どんな問題を解決するのかに集中する。
学部研究生を経験し、初めて問題を解決する方法を学びました。特に、それはそれまで私が勉強してきた方法とはまったく違うものでした。 それまでの勉強は、アルゴリズムを例にすれば、アルゴリズムを学び、その次にそれを使って解ける問題を解くという方法でした。
新しく学んだ方法は、たとえばこんなものです。 よい推薦を作るにはユーザーの視聴履歴(ユーザーがアイテムをクリックした一覧)が十分に必要なのに、ユーザーが十分な視聴履歴を残していない。これをどう解決するか?
つまり、二つの方法をまとめると次のとおりです。
- まず解決策Xを学び、そのXで解決できる問題Yに適用してみる。
- まず問題Yを定義し、この問題を解決できそうな方法Zを懸命に考える。
機械学習分野では(私の考えでは)特にZは本で学ぶのが難しいように思います。機械学習の問題が応用され始めてからそれほど長くなく、方法論も整理されておらず、非常に多くの分野に応用できるからだと思いますが、正確にはよく分かりません。
機械学習モデルで何かの問題を解決しようとするときに生じる問題の大半はZにあり、この過程で非常に多くの問題が発生します。(ほとんどは本にない問題でした。)この過程で生じる問題をうまく解決することが、よいエンジニアに不可欠な資質だと思います。これは機械学習エンジニアだけでなく、すべてのエンジニアに必要な資質でしょう。私は運よく、学部研究生をしながらこの過程を自然に学ぶことができました。
たとえば、作った機械学習モデルを200ms以内にServingするAPIを作らなければならないとしましょう。単純に考えても、次のような現実的な問題を追加で解決する必要があります。
- モデルはWeb APIとして動かせるほど軽量化されていなければならない。(十分にお金を使えば必要ない場合も多いでしょうが)
- まず、個別のQueryに対して200ms以内にサービングしなければならない。
- リクエストが(想定範囲内で)増えた場合にも、200ms以内にサービングしなければならない。
この部分は一部が機械学習の領域で、一部がコンピュータ工学の領域だと思います。人によって得意なことは違うので、得意な部分もあれば苦手なこともあると思います。自分が得意なこと、好きなことを強調すれば、書類/面接でよい結果が出ると思います。
リサーチが目的なら、別の方法でアプローチしたほうがよいと思います。ただ、リサーチの本質も問題を提起し、解決方法を提案することなので、大きくは違わないと思います。
ブログ/オープンソース活動
自分が学んだことを習慣的に人に見せるのが重要です!そうすれば(基本的には恥をかきたくないので)もっと頑張るようになり、履歴書のようにも活用できます。 (どこかに応募するとき、GitHubとブログ以外のものを提出したことはありません。たいていの場合、好意的な返事が来るところを見ると、ブログとGitHubでの活動だけでもポートフォリオとして十分なのではと思います。)
特に、ブログは必ずやったほうがよいと思います。自分がどれほど成長したかを確かめるのに最適な方法だからです。 (昔書いた文章がものすごく恥ずかしくなったら、成長したということです…)
オープンソース活動もぜひやってみることをお勧めします。 最初にコードをコミットしたときは、半信半疑でした。こんな素晴らしいコードを書く人たちが活動する場所に自分がコードを上げるのは、邪魔にならないだろうかと思いました。
そうしているうちに、そうしているうちに本当に偶然上げた誤字修正のCommitがgrpcに反映され、

So what?くらいの返事が来ると思っていたのに、「Thanks!」という親切な返事をもらったと思います。 ほかの人には大したことではないかもしれませんが、少し自信がつき、今度は新しい機能を作ったり、コードを少し修正したりしてみました。
そうする間に、本当に多くのことを学べました。flakeを使ってpep8に合ったPython codeを書く方法、Travisを使う方法、Remoteにいる人と協働する方法など…いちばん重要なのは、本当に素晴らしいコードを読めることでした。
ただ部屋で一人プログラミングしていたら学べない、High standardを持つ人たちと、(お金はもらえないけれど)多くの人が使うプロダクトを作れる機会だなんて…(しかも好きな時間だけ働ける)逃してはいけません。
これがすべて、最初のcommitにThanksと言ってくれた、grpcをmaintainしているどこかのおじさんから始まったと思うと不思議でもありますㅋㅋㅋ… 現在は大きなリポジトリではありませんが、Implicitというライブラリをmaintainしています。
ちなみに、open source活動のいちばんよいところはこれです。

これを見てJob offerが来ることもあります >_<
結論
いちばん重要なのは、面接や就職をうまくやることではなく、自分自身が成長することだと思います。最近はどこへ行っても面接プロセスが本当によくできていて…結局、本当の自分を見せることになり、それによって評価されるからです。エンジニアとしての自分を正直に見せたとき、書類や面接に合格できるほどの水準には(私にもできたので)誰でも努力すれば到達できると思います。だから、うーん…個人的には、自分をどう見せるかを気にしすぎるより、自分自身がもっとよい人になるために努力するのが正しいと思います。
私は結局、大学院への進学を選びました。もっと成長できると思ったから…ということにしておきます。(実は拉致された)でも最初に触れたように、私がどのように機械学習を勉強するようになり、勉強したのかが、ほかの方々の役に立つと思います。
読んでくださってありがとうございます。
我是如何(没能)找到工作的
我在Facebook上看过很多本科生发帖烦恼:想从事机器学习相关工作,该怎么做,或者该学些什么。我也有过类似的烦恼,并且对就业有了自己的结论,为此付出的努力也取得了一些成果,所以想把它分享出来。事实上,最终我去读研究生了。

成果就是通过了(1) Kakao推荐团队和(2)胡萝卜市场的全部面试…‘ㅅ’…
不过最后还是去读硕士了 ^0^…
我觉得,如果分享(1)我是怎样的人,以及(2)我一直怎样学习,肯定会对准备从事机器学习相关工作的人有所帮助,所以写了这篇文章。
而且其实,也有一点像是在回顾直到大学毕业为止的自己。
这篇文章写给那些本科毕业后,想作为机器学习工程师就业的人。
有经验、有实力的工程师或研究员看到后,也许会觉得,才做了这么点事就写得像在炫耀一样。但,嗯……我想我的经历肯定也能帮到一些人,所以想分享出来。
我是怎样的人
我毕业于汉阳工业高中。经过一定程度的学习,运气不错,考进了成均馆大学。
在一个工高毕业生准备大学入学考试并成功的过程中,我明白了凭臆测就放弃并不好。 我明白了,毕业于不好的学校这个事实,不能阻止我挑战。 我明白了,阻挡我的只有那个拿不出勇气挑战的自己。 希望你不要因为毕业于不好的大学、专业不同,或者没有上过大学就放弃。 我正努力相信,别人能不看学历和成绩,而凭实力评价我。
我是如何开始学习机器学习的
第一次对机器学习感兴趣,似乎是在2017年年初和女朋友分手后,整天只盯着YouTube看的那段时间。(听说很多人是在AlphaGo时期开始感兴趣的。)当时我甚至不知道,研究向用户推荐其可能喜欢的视频的领域叫“推荐系统”,只觉得“YouTube真神奇”。
这样过了一两个月左右,我觉得不能再这么活下去了。看到学长们准备就业,我也觉得自己总得做点什么。于是我什么都没想,就去找一位研究当时很火的数据挖掘的教授,请他让我当本科研究生。当然,我完全不知道数据挖掘是干什么的……
运气很好(教授刚上任不久,实验室里完全没人),我在实验室得到了一个位置,也从那时开始遇见了推荐系统,以及更广义的机器学习。
我用什么方法学习
我个人认为,如果环境允许你读研究生或做本科研究生,我无条件推荐去做。实验室生活最大的优点,似乎是当你不知道该学什么时,会有一套指引。 该读什么论文、该学什么等等……好的导师、好的前辈,再加上个人努力,成长幅度似乎会和独自学习时不同。 即便做不到,我也建议尽可能与别人一起学,而不是独自学习。我常常想,成长也许来自协作。
这篇文章就是为了告诉做不到这些的人,我是怎样学习的!
数学无法回避
我数学似乎也不好。它很陌生,我还记得起初无法理解MLP,迷茫了好几个星期。 我也曾被这种诱惑打动:是不是insight比数学重要,即使看不懂公式,只要看懂代码就行? 但后来我想到:会不会是因为自己做不好,才把数学当成酸葡萄? 只要不放弃数学,就能了解更多,也能了解得更细。
能想到的不多,但比如:
- 为什么会产生Bias-Variance Tradeoff
- Regularlization为什么会减少overfit
- 为什么minibatch training相比使用全部样本,能提供足够好的estimate,同时也有一定减少overfit的效果
这些内容用文字或代码不容易理解,但用公式说明就很容易理解。 不仅如此,学习机器学习时遇到的很多内容,只要掌握并不复杂的概率论和微积分,就能更轻松、更详细地理解。我不认为一开始就需要把数学学得太深。毕竟目标不是擅长数学。但为了不过分害怕数学,确实需要持续练习。
学机器学习时遇到不懂的数学,我会先记在某处,周末再查找学习。我看得最多的似乎是如今已经非常有名的PRML和数理统计学这两本书。
我相信,只要一直学数学,总有一刻会觉得学得真好。我经历过,一起学数学的朋友也经历过。希望你不要放弃!
与其关注学了什么模型,不如关注解决什么问题。
经历本科研究生后,我第一次学会了如何解决问题。尤其是,这和我此前的学习方式完全不同。 此前的学习,以算法为例,是先学习算法,再解决能够用它解决的问题。
新学到的方法,例如是这样的。 要做好推荐,需要足够的用户观看记录(用户点击过的条目列表),但用户没有留下足够的观看记录。该怎么解决?
也就是说,两种方法可以总结如下。
- 先学习解决方案X,再把X应用于它能解决的问题Y。
- 先定义问题Y,再努力思考能够解决这个问题的方法Z。
在机器学习领域(依我看),Z尤其难以从书本中学到。我想这是因为机器学习问题开始得到应用的时间还不长,方法论尚未整理好,而且能应用于相当多的领域,不过确切原因我也不清楚。
想用机器学习模型解决问题时,出现的问题大多都在Z上,而这一过程中会发生相当多的问题。(大多数都是书上没有的问题。)妥善解决这个过程中出现的问题,是优秀工程师必备的素质。这不仅是机器学习工程师,也是所有工程师必备的素质吧。我很幸运,在做本科研究生时自然学会了这个过程。
例如,假设我们必须制作一个API,在200ms内Serving做好的机器学习模型。简单想想,也必须额外解决以下现实问题。
- 模型必须足够轻量,能够作为Web API运行。(如果花足够多的钱,很多情况下也不需要)
- 首先,对单个Query必须在200ms内完成服务。
- 即使请求(在预期范围内)增多,也必须在200ms内完成服务。
这部分似乎一部分属于机器学习,一部分属于计算机工程。每个人擅长的事情不同,所以会有擅长和不擅长的部分。只要强调自己擅长、喜欢的事情,我想简历/面试会有好结果。
如果目的是研究,我想最好采用其他方式。不过研究的本质也是提出问题和解决方法,所以应该没有太大不同。
博客/开源活动
把自己学到的东西习惯性地展示给别人很重要!这样会(主要因为怕丢脸)更加努力,也能像简历一样使用。 (申请时,除了我的GitHub和博客,我从未提交过其他东西。大多数时候都能得到积极回复,看来只有博客和GitHub活动作为作品集也足够了。)
尤其是博客,我觉得一定要做。因为这是确认自己成长了多少的最好方法。 (如果以前写的文章让你羞耻得不得了,那就是成长了……)
也强烈建议尝试开源活动。 第一次提交代码时,我半信半疑。我担心,把代码传到这些写出精彩代码的人活动的地方,会不会反而妨碍他们。
后来,后来我真的偶然提交的一次错字修正Commit被合并进了grpc,

我本以为会得到类似So what?的回答,却似乎收到了一句友善的“Thanks!”。 对别人来说也许没什么,但我多了一点自信,这次又试着做新功能,或稍微修改代码。
这期间我真的学到了很多。如何用flake编写符合pep8的Python code,如何使用Travis,如何和Remote的人协作等等……最重要的是,我能读到真正优秀的代码。
这是一个如果只在房间里独自编程就学不到的机会:和具有High standard的人一起,制作(虽然没有报酬)很多人使用的产品……(而且只需在想工作的时候工作)绝不能错过。
想到这一切都始于那个维护grpc、在我第一次commit时对我说Thanks的某位大叔,也觉得很神奇ㅋㅋㅋ…… 现在虽然不是大型仓库,但我在maintain一个叫Implicit的库。
顺便说,open source活动最大的好处是这个。

也会有人看到这个后发来Job offer >_<
结论
最重要的似乎不是擅长面试或求职,而是让自己成长。如今无论去哪,面试流程都做得非常好……最终你必然会展示真实的自己,并因此得到评价。作为工程师坦率地展示自己时,任何人只要努力,都能达到足以通过简历和面试的水平(连我都做到了)。所以,嗯……我个人觉得,与其过分操心如何展示自己,不如努力让自己成为更好的人。
我最终选择了读研究生。就当作是因为我觉得自己能成长得更多吧……(其实是被绑架了)不过正如开头提到的,我想,我如何开始学习机器学习以及如何学习的经历,会对其他人有所帮助。
感谢阅读。
How I Came to (Not) Get a Job
I’ve seen many Facebook posts by undergraduates wondering what they should do, or what they should study, because they want a machine-learning-related job. I had similar concerns, reached my own conclusion about getting a job, and got some results from the work I put into it, so I wanted to share them. In fact, I ended up going to graduate school.

The result was passing all the interviews for (1) Kakao’s recommendation team and (2) Danggeun Market…‘ㅅ’…
Though I ended up starting a master’s degree ^0^…
I wrote this because I thought sharing (1) what kind of person I am and (2) how I studied would definitely help people preparing for machine-learning-related jobs.
And honestly, it also feels a little like a retrospective on myself up through the end of university.
This post is for people who want to graduate from college and get a job as a machine learning engineer.
Experienced and skilled engineers or researchers may read this and think I’m bragging over something this minor. But, um…I believe there are definitely people my experience can help, so I want to share it.
What Kind of Person Am I?
I graduated from Hanyang Technical High School. After studying a fair amount, I was lucky enough to enter Sungkyunkwan University.
As a technical-high-school student preparing for and succeeding in university admissions, I learned that it is bad to assume the outcome and give up. I learned that graduating from a poor school could not stop me from taking on challenges. I learned that the only thing stopping me was myself, unable to summon the courage to try. If you attended a poor university, have a different major, or did not attend university, I hope you won’t give up because of it. I’m trying to believe I can be judged by my ability, not my academic pedigree or grades.
How I Came to Study Machine Learning
I think I first became interested in machine learning in early 2017, when I had broken up with my girlfriend and spent all day staring at YouTube. (I heard many others became interested around the time of AlphaGo.) Without even knowing that the field studying how to recommend videos a user might like was called a “recommendation system,” I only thought, “YouTube is fascinating.”
After living like that for a month or two, I thought I couldn’t keep living this way. Seeing older students prepare for jobs made me feel I had to do something too. So, without thinking, I went to a professor researching the then-hot field of data mining and asked to become an undergraduate researcher. Of course, I had no idea what data mining did…
I was lucky enough to get a seat in the lab (the professor had arrived recently, so there was nobody in it), and that was when I encountered recommendation systems and, more broadly, machine learning.
How I Studied
Personally, if you are in a position to attend graduate school or work as an undergraduate researcher, I absolutely recommend it. The biggest advantage of lab life is having guidelines when you don’t know what to study. Which papers to read, what to study, and so on…When a good advisor, good senior colleagues, and individual effort come together, the amount of growth seems different from studying alone. Even if that is impossible, I recommend studying with other people whenever possible rather than alone. I often think growth may come from collaboration.
This post is meant to tell those who cannot do that how I studied!
You Cannot Avoid Math
I don’t think I was good at math either. It was unfamiliar, and I remember wandering for weeks because I couldn’t understand MLP at first. I was also tempted by thoughts like: isn’t insight more important than math; even if I can’t understand the equations, couldn’t I just understand the code? But then this occurred to me: did I start treating math as sour grapes because I couldn’t do it well? I think that if you don’t give up on studying math, you can know more things in greater detail.
Only a few examples come to mind:
- Why the Bias-Variance Tradeoff occurs
- Why Regularlization reduces overfit
- Why minibatch training provides a sufficiently good estimate compared with using the entire sample, while also having some effect in reducing overfit
These aren’t easy to understand through prose or code, but I think they become easy when explained with equations. Beyond these, much of what you encounter while studying machine learning is easier to understand, and in greater detail, with some not-too-complex knowledge of probability and calculus. I don’t think you need to study math too deeply from the start. Being good at math isn’t the goal. But I do think you need consistent practice so you don’t fear math too much.
When I encountered math I didn’t know while studying machine learning, I wrote it down somewhere and looked it up on the weekend. I think the two books I used most were the now extremely famous PRML and Mathematical Statistics.
I’m certain that if you keep studying math, a moment will come when you are glad you did. I experienced it, and so did the friend who studied math with me. I hope you don’t give up!
Focus on What Problem You Solve, Rather Than Which Model You Studied.
While working as an undergraduate researcher, I learned for the first time how to solve a problem. In particular, it was completely different from how I had studied until then. Using algorithms as an example, my previous approach was to learn an algorithm and then solve problems that could be addressed with it.
The new approach I learned was something like this. You need enough user viewing history (a list of items the user clicked) to make good recommendations, but the user has not left enough viewing history. How do you solve that?
In short, the two approaches are as follows.
- First learn solution X, then apply it to problem Y that X can solve.
- First define problem Y, then think hard about a method Z that could solve it.
In machine learning (in my opinion), Z is particularly hard to learn from a book. I think this is because machine learning problems have only recently begun to be applied, the methodology has not been organized, and it can be applied to a great many fields, though I don’t know for certain.
Most problems that arise when trying to solve something with a machine learning model lie in Z, and a great many problems emerge during this process. (Most were not in any book.) I think solving these problems well is an essential quality of a good engineer. That applies not only to machine learning engineers, but to every engineer. Luckily, I learned this process naturally as an undergraduate researcher.
For example, suppose you must build an API that Serves a machine learning model within 200ms. Even at a basic level, you must additionally solve these practical problems.
- The model must be lightweight enough to run as a Web API. (Though this is often unnecessary if you spend enough money.)
- First, it must serve each individual Query within 200ms.
- It must still serve within 200ms when requests increase (within the expected range).
Part of this seems to belong to machine learning and part to computer engineering. People excel at different things, so everyone will have strengths and weaknesses. I think emphasizing what you do well and what you enjoy will produce good results in applications/interviews.
If your goal is research, I think a different approach would be better. But the essence of research is also to raise a problem and propose a solution, so I don’t think it is very different.
Blogging/Open-Source Activity
It is important to habitually show other people what you have learned! This makes you work harder (basically because you don’t want to embarrass yourself), and it can also serve as a résumé. (When applying somewhere, I’ve never submitted anything besides my GitHub and blog. Since I received positive responses in most cases, I suspect blog and GitHub activity alone make a sufficient portfolio.)
I especially think you should definitely blog. It is the best way to see how much you have grown. (If your old posts become unbearably embarrassing, you’ve grown…)
I also strongly recommend trying open-source work. When I first committed code, I had my doubts. I wondered whether posting my code where people writing such excellent code worked would only get in their way.
Then, then a typo-fixing Commit I uploaded completely by chance was actually incorporated into grpc,

I expected an answer like So what?, but I think I got a kind “Thanks!” instead. It may have been nothing to others, but it gave me a little confidence, so next I tried creating a new feature or modifying some code.
I learned so much during this time: how to use flake to write Python code that follows pep8, how to use Travis, how to collaborate with people on a Remote, and more…Most importantly, I could read truly excellent code.
The opportunity to build a product used by many people (though unpaid), alongside people with High standards—something I could never learn programming alone in my room…(and I can work only when I want)—must not be missed.
It is also amazing to think this all began with some guy who maintains grpc saying Thanks on my first commitㅋㅋㅋ… It isn’t a large repository, but I currently maintain a library called Implicit.
For reference, this is the best thing about open source activity.

Sometimes people see this and send you a Job offer >_<
Conclusion
I think the most important thing is not being good at interviews or job hunting, but growing yourself. These days, interview processes are really well designed wherever you go…Ultimately, you end up showing your true self and being evaluated on it. I think anyone who works at it can reach a level where honestly showing themselves as an engineer is enough to pass applications and interviews (since even I could). So, um…personally, rather than worrying too much about how to present yourself, I think it is right to work on becoming a better person.
In the end, I chose graduate school. I’ll tell myself it was because I thought I could grow more…(Actually, I was kidnapped.) But as I mentioned at the start, I believe how I came to study machine learning and how I studied it will help other people.
Thank you for reading.