BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ アーティクル マシンラーニングエンジニアとして採用されるには

マシンラーニングエンジニアとして採用されるには

キーポイント

  • You can gain the relevant machine learning skills by reading books, following courses, going to conferences, and working on projects.
  • Make sure your CV lists the technologies you mastered and hands-on projects you worked on.
  • During an interview, expect that you might be asked technical questions, insight questions, and programming questions to be solved.
  • When given a technical task, focus on demonstrating your skills as if you were already working at the job. This means that your code quality and description of what you did are as important as the approach you took.

原文(投稿日:2020/07/28)へのリンク

この2年間、私は自分の務める会社のマシンラーニング関連技術を向上するために、一生懸命働いてきました。数百の履歴書を読み、100件以上の電話面接(phone interview)を行い、多数のコードタスクを評価し、数十人のエンジニアとオンサイトで面接しました。このような面接に備えるには何をすればよいのか、と聞かれることがよくあるので、今回、私の知っている秘訣やヒントを記事にすることにしました。

ステップ1: 関連するスキルを伸ばす

求人に応募する前に、自身が採用されるためのスキルを磨くことが大切です。マシンラーニングエンジニアに対して採用担当者が求めるスキルは多岐にわたっているので、それらを可能な限り多く身に付けておいた方がよいでしょう。一般的に、優れたマシンラーニングエンジニアは、コンピュータ科学(一般的なプログラミングスキル)、数学、統計学(マシンラーニングアルゴリズムの動作に関する知識)、特定のテーマに関する知識を併せ持っています。今回の記事では、コンピュータ科学、数学、統計学の部分について掘り下げたいと思います。

最後にマスタすべきスキルはコミュニケーションです -- 自分が行っていることを第3者に説明する能力が不可欠です。実験を繰り返してもよい結果が得られず、数週間が過ぎてしまうこともあります。そのような時にこそ、自分が取り組んでいる問題と、その解決方法について説明するスキルを持っていることが重要なのです。

どのテクノロジを学ぶべきか?

マシンラーニングの仕事を得るためにマスタできるプログラミング言語、フレームワーク、その他のテクノロジはたくさんあります。どれを選択するかによって、どのような仕事に採用されるのか、すなわち、どのような仕事をするのかが決まってきます。賢い選択をしましょう。ここでは私からの提案と、それらをマスタすべき理由について述べておきます。

  • Python -- このプログラミング言語は、マシンラーニングアルゴリズムをトレーニングする言語になっています。言語で使用可能な機能について知っておく必要があります。Python以外にも、他の言語を学んでおいた方がよいでしょう。組み込みプラットフォームでの開発を希望するならば、C++が必要です。エンタープライズ環境でマシンラーニングモデルを使用したいのであれば、Javaを選択しましょう。データ分析を行いたいのならば、Rを学んでください。最後に重要なこととして、古典的なAIアルゴリズムや自然言語処理に関心があるのならば、Lispを学ぶ必要があります。
  • TensorFlow/Pyrorch -- ディープラーニングがブームです。市場を独占しているラーニングフレームワークは2つありますが、それぞれを使用するユーザの間には明確な違いがあります。最初に知っておくべきなのは、これまでの経緯から、TensorFlowは運用環境での使用に、PyTorchは実験的な使用に、それぞれ適していたということです。最近はTensorFlowで実験を容易にできるような試みが行われる一方で、PyTorchでは運用対応(組み込みハードウェアを含む)に向けた開発作業が進められています。研究職を希望するのであればPyTorchをお勧めします。主として運用環境でのモデル更新を希望する企業で働きたいのであれば、TensorFlowがよいでしょう。一般論として、特にフレームワークの変化する速度を考慮した場合、異なる2つのフレームワークを中途半端に学ぶよりも、どちらかひとつを徹底的に学んだ方が得策です。
  • Scikit-learn -- Scikit-learnには、最も古典的なマシンラーニングアルゴリズムが含まれています。これをマスタすれば、小規模データの問題の多くを短時間で解決することが可能になります。このライブラリのアルゴリズムの動作方法を知っていれば、技術面接で有利なスタートを切ることができるでしょう。
  • NumPyとPandas -- Pythonでデータを処理する場合、対象とするデータを正確に、かつ効率的に選択することが重要です。マシンラーニングエンジニアの多くが、基本的な機能としてNumPyを日常的に使用しています。もっと高度な選択基準があるのならば、その時はPandasの出番です!わずか数行のコードで(面倒で遅いforループを使わずに)特定のデータサンプルを選択して見せれば、将来の同僚たちに対して強い印象を与えることができるでしょう。
  • Apache Spark -- マシンラーニングを活用しようという企業は、大量のデータを保持しています。ビッグデータの処理が非常に重要です。ここではSparkが開発を進める大きな力になるでしょう。ビッグデータに関する開発を行う場合には、Hadoopを学んでおくのも面白いかも知れません。最初にひとつのテクノロジを選択して、完全にマスタするのがよいでしょう。
  • OpenCV -- コンピュータビジョンに関する仕事を希望するのならば、OpenCVが非常に重要です。たくさんのイメージ処理機能が含まれているので、プロトタイプを短期間で開発する場合や、前処理をより適切な方法で行うために利用できます。物体や特徴を認識するためのアプローチも多数用意されているので、オブジェクトの検出や特定にも使用できます。

何を読むべきか?

マシンラーニングの有用なスキルを教えてくれる書籍はいくつもあります。学習方法はひとそれぞれですから、読むべき本も人によって違うでしょう。自分にやる気を起こしてくれるような教え方の本を買うことが大切です。

数学と統計学に関しては、次の書籍をお勧めします。

  • Pattern Recognition and Machine Learning, Christopher Bishop著マシンラーニングの基礎から始まる、極めて数学的な本です。私が大学時代に取り組んだ、最も難しい本のひとつでもあります。数学が好きで、ボトムアップのアプローチで学習に取り組みたい人に限って、この本をお勧めしたいと思います。
  • Deep Learning, Ian Goodfellow, Yoshua Bengio, Aaron Courville著これも数学の本ですが、こちらはニューラルネットワークを対象としたものです。ニューラルネットワークをある程度経験した人が、その仕組みについての理解を深めるために読むべき本だと言えます。この種の書籍を読むことによって、"ネットワークで何か適当なことをやってみて、何が起こるのかを確認する"レベルから、"どのパラメータがネットワークのどの側面をコントロールするのか、十分に理解する"レベルへの橋を渡ることができるでしょう。
  • Python Machine Learning, Sebastian Raschka著この本は実用書の範疇に入るものです。書籍の中で著者は、scikit learn(Pythonのオープンソースマシンラーニングライブラリ)で利用可能なツールの概要を幅広く紹介しています。最新版にはTensorFlowのコードが含まれています。
  • Artificial Intelligence: A Modern Approach, Stuart J. Russell, Peter Norvig著この本から私が得たものは、おもにゲーム理論と検索アルゴリズムだったのですが、その他にも多くの確率論や、さらにはロボット工学まで取り上げています!とても刺激的な内容の本で、いくつかの章については面接でも役に立ちます。

ソフトウェアエンジニアリングの分野では、プログラミング言語やアルゴリズム、データ構造に関するスキルを向上させる必要があります。ほとんどの仕事でPythonの知識が必要になりますから、この言語のすべてと、新機能について知っておく必要があります。面接では、ホワイトボード上でプログラミングタスクの解決を求められる場合もあるので、アルゴリズムやデータ構造に関する知識が重要になります。ここでは2冊の本を推奨したいと思います。

  • Introduction to Algorithms by Cormen, Leiserson, Rivest, Stein共著この書籍は、さまざまなアルゴリズムとデータ構造の概要を余すところなく網羅しています。マスタしたいと考えている言語を使って、これらのアルゴリズムやデータ構造を自分自身で実装してみるとよいでしょう。
  • Cracking the Coding Interview, Gayle Laakmann McDowell著すべてのアルゴリズムを試すには、多くの時間が必要です。この本は、最も頻繁に現れるアルゴリズムやデータ構造について教えてくれます。

どの教育コースを試すべきか?

オンラインコースに関しては、最近では多くの選択肢があります。私自身が最近受講したコースはありませんが、以下のものについて、よい評判を耳にします。

どのカンファレンスに行くべきか?

私はカンファレンスやミートアップに参加するのが好きです。その時の問題をマシンラーニングで解決するためのアイデアや、最先端のテクニックが何であるか、業界で何が使われているのか、といったことを教えてくれるからです。学術的なカンファレンスは最先端技術に関するもの、商業的なカンファレンスは応用的なテクニックを探求するもの、と言っていいでしょう。私が注目しているのは、次のカンファレンスです。

  • QConでは、ソフトウェアの最先端について学びます。
  • NVIDIAのGPU Technology Conferenceは、GPUを使用した最先端のマシンラーニング(ニューラルネットワーク)について教えてくれます。
  • CVPRは、コンピュータビジョンに関するカンファレンスです。
  • NeurIPSは、ニューラルネットワークのカンファレンスです。
  • ICRAは、ロボティクスのカンファレンスです。
  • IROSも、ロボティクスのカンファレンスです。

どうやって面接の練習をするべきか?

面接の秘訣のひとつは、準備が簡単である、ということです。応募者がその仕事に適しているかどうかを評価するために、企業は、簡単な課題を応募者に与えます。この課題をうまく解決できるように練習しておけばよいのです!そのために可能なことを、いくつか挙げましょう。

  • 多くの企業では、会話よりも前に、まずHackerRankの課題を解くように、あなたに求めてくるでしょう。ですから、事前にHackerRankを自分で見て、課題を数多く解いておけば、採用担当者が解答を求める課題の練習になります。
  • 競技プログラミング(competitive programming)に強くなりたければ、既存の競技会をいくつかチェックしておくとよいでしょう。私が好きなのはGoogle Code JamAdvent of Codeです。Google Code Jamでは毎回、さまざまな難易度のプログラミング課題がいくつも出題される他、ソリューションの書評も提供されます。この方法ならば、どのアルゴリズムが重要なのか、短期間で学ぶことができます!Advent of Codeでは毎年12月、25のプログラミングタスクを提供しています。これらは月の終わりに向けて、だんだんと難しくなっていきます。AoCのよいところは、問題を解決する方法が複数あることが多い点です。他の人たちとソリューションを交換し合うことで、教えられることがたくさんあります!

大規模なマシンラーニングプロジェクトを考えておく

応募者を見ていて気付くのは、彼らがひとつの大規模なマシンラーニングプロジェクトで、すべての分野を経験している、ということです。データ収集からデータクリーニング、マシンラーニング、デプロイメントまで、すべてのステップについて考えてください。現在の仕事でこの経験をすべて獲得するようにするか、あるいは余暇時間を使って再作成するのです。この経験があれば、採用に応募する時点で、多くの競争相手から一歩抜きんでた存在になることができます。

オープンソースプロジェクトへのコントリビューションも、これを達成するひとつの手段です。既存のプロジェクトにコントリビュートすると、厳しいが有用なレビュープロセスがあることに気付くでしょう。最初のプルリクエストをマージしてもらうことができれば、他の開発者が何を気にしているのかを知っている、優れた開発者のひとりになることができるでしょう。

ステップ2:採用に応募する

採用に応募する時の応募書類と履歴書では、その仕事に求められている能力を自分が備えていることを明確に示すと同時に、履歴書が読みやすく簡潔であるように心がけてください。経験のあるフレームワークや、過去に経験したプロジェクトを列記しておくとよいでしょう。ただし、書き記したすべてのフレームワークやテクノロジに関する質問には、必ず答えられるようにしてください!レジュメに書いてあれば、質問の対象になるのは当然です。プロのリクルータやソーサ(sourcer)に履歴書をレビューしてもらうのもお勧めできる方法です。あなたがよりよい雇用機会を得るために、彼らは喜んで協力してくれるでしょう!

ここでの秘訣は、これまで経験したことではなく、自分が希望する仕事を重視して履歴書を構成することです。私は応募の毎に履歴書を調整して、過去経験したプロジェクトの中で関連性のあるものを強調するようにしています。履歴書はあなたが望むスキルやプロジェクトを定義すべきものですから、当然それを強調すべきです。興味のある分野の職を探すことも重要です — 企業は、自分たちのやっていることに情熱を持っている人を雇いたい、と思っているものなのです!

マシンラーニングは成長分野ですから、たくさんの人たちが学校でコースを選択して、マシンラーニングの仕事を探そうとしています。ですから採用担当者としては、応募者がオンラインコースを単に"受講した"だけなのか、"実際の経験"も持っているのかを知る必要があります。業務外の時間に大規模なプロジェクトを実施したのであれば、履歴書にリンクしておきましょう!

ステップ3:面接

面接者は一般に、さまざまな面からマシンラーニングについて質問します。多くのアルゴリズムについての基礎を、確実に押さえておいてください("何を読むべきか"の章を参照)。自分の知識はどこまでなのか、自分の強みは何か、といったことも明確にしておく必要があります。採用担当者としての私は、面接時に何か新しいことを教えてくれた応募者に対しては、いつも肯定的な評価をするようにしています。特定のテーマに関して深い知識を持っていることを示すことで、応募した企業がその時点で同じテーマに関する知識が不足していれば、雇用される確率が高くなります。

面接では、明確な質問をするようにしてください。お互いが違う話題を話していて、しばらく気付かないこともあります。面接担当者と同じ土俵に上がることが大切なのです。実際の例として、面接者は最大値を求める方法を聞いていただけなのに、私はリストの効率的なソートアルゴリズムを書かなければならないと思い込んでいた、ということがありました。コーディングの問題を出された時には、必ず問題のテストケースを書くことから始めましょう。先程の私の場合ならば、私が書かなくてはならない関数の出力はリストの最大値である、というアサーションをすれば十分だったのです。このプラクティスは、あなたが明確性とテストに注意を払っていることを示します。それは採用側の望むものです。面接でテストを記述する場合、ソリューションをプログラムする前に、考えられるソリューションや落とし穴についても考えて、感覚を得ておきましょう。

解答について説明する場合には、STARテクニックを使ってストーリを組み立てましょう。STARテクニックでは、置かれた状況(Situation)、課されたタスク(Task)、実行したアクション(Action)、得られた結果(Result)を説明します。

面接に行って最初の数回は、緊張するかも知れません。どのようなものか分かっていないのが普通ですから、当然です。面接は毎回違うので、この業界で長年働いた後であっても、やはり多少は緊張すると思います。残念ながら人の心は、自信を持った人を好むようにできています。ですから準備が非常に重要なのです!緊張をほぐすために、次のようなことをお勧めします。

  • 面談の最初は、いくつかの世間話から始まることがよくあります。この時間を使って、採用担当者に関する情報を収集しましょう。私はいつも、こうすることで自分自身をリラックスさせると同時に、以降の面接の中において、面接官の経験に対して共感できるようになります。
  • リモート環境をコントロールしましょう — 電話の電源を切り、ペットを別の部屋に移して、Alexa/Siriを止めておきます。何かが起きても(例えば郵便配達員が小荷物を届けに来ても)落ち着いて、事情を話し、問題に素早く対処した上で面接に戻ってください。私自身は中断を気にすることはありません。誰にでもあることだからです。
  • 事前に練習をしておくこと!友人に問題を出してもらいましょう -- 書籍"Cracking the Coding Interview"にあるものや、頻繁に出題されるものをオンラインで探せば見つかります。これらのリストのいくつかを一通り見ておいて、最も一般的な問題に対する回答を知っておくのもよいでしょう。
  • 自分用の"エレベータピッチ(elevator pitch)"を用意しておくエレベータピッチとは、自分が誰なのか、何をしたのか、何をしたいのかを、1分程度に要約したものです。採用担当者は必ず自己紹介をするように求めるので、これはあなたにとっての完璧かつ印象的な回答になるでしょう。面接の最初がうまくいけば、これ以上リラックスできるものはありません。
  • 情報を簡単に伝えられる手段を知っておく自分の考えを限られた言葉で表現するのは難しいので、私はいつもホワイトボードの前に立って、説明と一緒に考えを描くようにしています。1枚の紙に書いておいた方が、自分の考えを伝えるのに便利だと思う人もいるでしょう。どのような方法を選ぶにせよ、事前に練習して、自分の一番やりやすい方法を見つけておくことが大切です。

面接が難しいのは、何を聞かれるのか分からないからです。私が経験した問題/面接は、おもに次のようなものでした。

  • 知識問題 -- "LSTMはどのように動作するのか?"、"2次元畳み込み層にはどれだけの重みがあるか?"、"サポートベクタマシンのカーネルトリックとは何か?"などの質問が考えられます。その話題について何も知らない、あるいは自分の知識の範囲内で質問に答える場合は、そのように言いましょう。でっち上げを始める人もいますが、正直であることの方が大切です。そのような問題の答をいつもはどうやって見つけているのか、問題の解決にどのようにアプローチしているか、といったことを説明するのもよいでしょう。この種の質問の用意をするには、テキストを読んで特定のテクニックについて学び、事実や名前を憶えておくことが必要です。
    ディープラーニングの仕事に応募しているのであれば、ディープラーニングで多く使用されているコスト関数(バイナリ交差エントロピ、多クラス交差エントロピ、平均二乗誤差、コサイン類似性、Huber損失、KullbackLeibler情報量など)について知っておく必要があります。

    一般的な活性化関数やその導関数(ReLU、ELU、sigmoid、tanh、softmax、swish、SELUなど)の知識も必要です。ニューラルネットワークに見られる、最も一般的なレイヤ(Denseレイヤ、Convolutionalレイヤ、Separable Convolution、Batch Normalization、グローバルおよびローカルのプーリング[最大プーリングと平均プーリング]、LSTM、GRU、ドロップアウト)についても同様です。
    もっと古典的なマシンラーニングについて知る必要がある場合には、scikit-learnにあるアルゴリズムから始めるとよいでしょう。最小二乗線形回帰、サポートベクタマシン、最近傍法、決定木、アンサンブル法などがあります。
  • 洞察問題 -- 面接中に小さなケース問題が提示されて、アプローチ方法を問われる場合があります。過去にマシンラーニングプロジェクトをいくつか経験していれば、このような問題には簡単に答えられるかも知れません。それでも、一般的なタスクの一般的な方法については、再確認しておいて無駄ではないでしょう。問題の例は次のようなものです。
    • データの前処理を行う方法として、どのようなものを知っていますか?
    • データの強化には、どのような方法を使用しますか?
    • どのような正則化方法を知っていますか?
    • このタスクのデータをどのように取得・収集・アノテートしますか?
    • このモデルをどのように評価しますか、モデルのパフォーマンスはどの程度であるべきでしょうか?
  • コーディング面接 -- HackerRankを使う企業であれば、記述したコードを実行することも可能ですが、ホワイトボードを使う企業や、単に机上でコードを書かせる企業もあります。このテクニックは一般的なものなので、練習しておくことが大切です。コンピュータ上であれば、最善のものを選択する前に、まずは"20 lines of code"をトライすることをお勧めします。紙の上に書く場合、正しく書くチャンスは1回しかありません。これらのタイプの面接に成功するためには、素晴らしいチュートリアルがあります!秘訣のひとつは、自分の考えを表現することです。正しいソリューションを見つけるよりも、同じような難しい問題を解決しようという時に、他の人たちと協力できるような人物であることを示す方が大切である場合が少なくないのです。
  • 社会的問題 -- 社会的な質問は、例えば"他の人たちはあなたのことを何と言っていますか?"、"あなたにとって最も大きな課題は何ですか?"、"X年後のあなたはどうなっていると思いますか?"といったものです。一般的な質問に備えて、簡潔で説得力のある回答を用意しておきましょう。

ステップ4:技術的作業

多くの企業では、技術的なタスクの解決を求められるでしょう。与えられた時間で何ができるのかを見ることができるので、私はこのようなタスクを好んで用いています。これらの技術的タスクを評価した時には、素晴らしいソリューションがたくさんある一方で、不採用にせざるを得ない人たちもいました。技術的なタスクに対応するための、実践的なヒントをいくつか紹介しましょう。

  • プロセスを説明する。自分の行ったステップ、トライしたこと、時間があれば改善できた点などについて、簡単なレポートを必ず書くようにしてください。説明とコードを同時に書くことができるので、私は技術的なタスクにJupyter Notebookをよく用いています。Jupyter Notebookを使用しないのであれば、構造を十分に考慮したPDF資料にモチベーションを記載しておきましょう。
  • シンプルにする。マシンラーニングに関する技術的タスクでは特に、トライ可能なソリューションが数多く存在することが少なくありません。難しいソリューションに挑戦して低品質に留まるよりも、タスクをシンプルに解決して品質を高める方がよいでしょう。
  • コピーペーストしたコードと自分で書いたコードを明確にする。マシンラーニングのタスクでは、実装の必要な機能に対して利用可能なアルゴリズムがすでに存在することがよくあります。例えば、2次元バウンディングボックス検出器を作る必要がある場合には、既存のYOLO実装を使うことができます。ただし、重要な機能については常に自身で追加するようにしてください。コーディング方法によって評価を行う必要もあるので、どれが自分の書いたコードで、どれがコピーペーストしたコードなのかを示すことができるようにしましょう。
  • 量より質を選択する。規則やコーディングガイドラインを順守して、関数にはドキュメントを加えるようにしてください。いわゆるリンタ(linter)を使ってコードを分析し、潜在的なバグやスタイル違反を見つけることも可能です。提出したコードが将来の雇用主のマスタブランチにコミットするものであるような気持ちで、常にコーディングしてください。理解できないような非常に高度なソリューションよりも、高品質でシンプルなコードを提供する方がよいでしょう。
  • ユニットテスト! プロフェッショナルなソフトウェアエンジニアであるということのひとつは、自分の書いたコード用にテストを書くことにあります。関数の単純なassertステートメントでも十分に役立ちますが、特定のユニットテストフレームワークに関する知識があることを示せれば、技術的タスクの評価者に好印象を与えることができます。

まとめ

あなたが究極的な夢の仕事を見つける上で、この記事がお役に立てればと願っています!マシンラーニングはとても面白いテクノロジで、多くの問題を解決する可能性を秘めています。今回の記事は、カンファレンスやミートアップで私が話した経験を基にしていますが、マシンラーニングの世界を完全に描き切っていないことは自分でも理解しています。何を学ぶべきか、自分の作業フィールドでは何が重要か、といった内容の提案を読者がお持ちならば、あなたのようになりたいと願っている他の読者のために、ぜひコメントを残してください。

著者について

Roland Meertens氏は、Autonomous Intelligent Driving(AID)のマシンラーニングエンジニアとして、自動運転車の認識技術の開発に携わっています。InfoQへの執筆の他にも、pinchofintelligence.comに自身のサイドプロジェクトをリストしたブログを持っています。

 

この記事に星をつける

おすすめ度
スタイル

特集コンテンツ一覧

BT