現在の仕事と役割
▼ 仕事
私の所属する組織(ML室)は、LINEの多様なサービスに対して機械学習の技術(例えば推薦エンジンなど)を適用したり、機械学習に関する、社内の共通基盤を開発・運用したりすることをミッションとしています。
具体的な事例は、LINEアプリ上でのスタンプのレコメンド機能や、マンガなどユーザーへのおすすめコンテンツを表示させるエンジンの開発です。
これらの機能に必要な、ユーザーに最適なものを推薦するエンジンの元になるモデルを作るには、昔はナイーブベイズを使っていましたが、最近だとディープラーニングを適用することが多くなっています。
ただしディープラーニングを使った推薦エンジンもロジックが、色々あります。基本的にはABテストを行い、新規のロジックを一部のユーザーに露出させ、既存のものと比較してどちらがパフォーマンスが良いのか検証し、日々アップデートしています。
もう少し具体的に、皆さんに馴染みのあるLINEスタンプを例にあげます。
おすすめのスタンプを推薦するエンジンを作るためには、過去にユーザーがどのスタンプを購入したか、しなかったかを基本的な正解データとして用いるわけですが、エンジンは、このユーザーがまだ購入したことがない、購入してくれると思われるスタンプを予測しなければなりません。
そのためには、オーソドックスではありますが、他のユーザのデータもさらに活用し、購買傾向などの特徴が類似するユーザの購買傾向も参考にするなどの仕組みをとっています。
さらに、予測精度を高めるために、もっと色々な情報を付加して学習させていて、スタンプはどの作者が作ったかという情報もさらに加え、このスタンプの購入者はどういう年代、性別が多いかなどの情報も付加します。
こうした情報をグラフ構造で表現し、グラフデータに対するディープラーニングの手法を適用する、といったモデルを、最近は多く開発しています。
▼ 役割(プロマネから見た若手のキャリアプラン)
ML室には、MLのモデルを構築するMLエンジニア、機械学習基盤の開発運用を行うサーバサイドエンジニアなどが多く在籍していますが、私個人は、組織運営や、開発プロダクトの企画や開発管理などをしています。
参考 https://linecorp.com/ja/career/lp/media/machine-learning
せっかくなので、学生の皆さんに近い、若手 ML エンジニアの仕事や、キャリアについて説明していきます。
ちなみにML室では2年前から新卒エンジニアの採用をスタートしました。
新卒採用の人も、採用プロセスのなかでプログラミングのテストを受けて入ってくるので、基本的にコードが書けるメンバーが揃っています。MLエンジニアに限らないですが、各々に求められる基礎的な知識やスキルをもとに様々な経験を積み、将来自分たちでサービスが作れるようになりたいという高い志をもったメンバーが多くいる印象です。
MLエンジニアの仕事内容は主に以下のようなものがあります。
まず、サービスで必要とされる各種エンジンのためのモデルの構築があります。
これは、新しいサービスや機能を実現するためにイチから新たなモデルを作ることもあれば、既存のシステムで使われているモデルをチューニングしたり、別のものに作り直したりすることもあります。
経験も浅いのにいきなり「新たなモデルを作れ」と言われることはないのでご安心ください。先輩たちによる様々なモデル開発事例がソースコードを含めて残っていますので、初めはそういうものを参考にしたり、アドバイスを受けたりしながら業務にあたることになるでしょう。
また、ただモデル単体を作るだけが仕事ではありません。最終的にサービスを提供できるシステムを作るためには、モデルはあくまでイチ構成要素であり、モデルを連携する機能へ繋ぎこむための開発も、MLエンジニアの仕事です。
さらに、習熟度の高いエンジニアになってくると、機械学習に用いる自社独自のライブラリを作るという仕事もあります。Scikit-learnなど、広く一般的に利用されているライブラリをご存知だと思いますが、こういう一般的なものでは性能などの面で足りないことがあり、そういうときはライブラリ自体を自社開発することもあります。例えば、非常に大量のデータを扱うエンジンが多いので、もっと高速な処理を実現させるために独自開発したライブラリを使用するなどしています。
ML室の若手エンジニアが描く将来のキャリアプランは、
・機械学習スキルをさらに高めたい人
・機械学習以外のシステム開発のスキルを磨き、エンジニアとしての幅を広げたい人
・技術者の素養を磨いた上で、サービスの企画にもチャレンジしたい人
など、人によって様々です。
エンジニアリングという切り口で見た場合、機械学習だけでなく、分散処理、データベース、ネットワーク、身につけるべき知識やスキルは山ほどあります。
また、技術者としての素養をベースにするからこそ、新しいサービスを企画することもできるかもしれません。
人によって将来へのステップは様々ですが、みんな、世に出るサービスに自分が関われることにやりがいを感じています。
そこが大学でのものづくりと大きな違いであり、魅力的な点だと思います。
▼ 仕事に必要な知識・スキル
機械学習に携わるエンジニアは、機械学習のアルゴリズムや手法を理解し、論文等に記載されたロジックを実装したり、自社のデータ上で性能を検証したりする技術が求められます。
アルゴリズムによっては、データの量の増加に対し計算量が加速度的に増加する場合もあるため、数理的なバックグラウンドが必要になります
さらに、扱うデータの規模が大きくなると、複数マシン間で協調して動作させる必要も出てきます。こうした領域では、コンピュータサイエンス全般の知識や応用力が必要になります。
システムの構築には、外部のオープンソース実装を利用するケースも多いです。使い倒そうとすると、意図しない挙動やバグに遭遇することは多く、内部実装を読み解いて修正したり、適当なものが見つからない場合は、独自に実装を行ったりするケースもあります。
こうした開発は個人で実現できるものではないため、他のエンジニアとチームを組んで、協業しながら開発することになります。
チーム開発には様々な方法論(たとえばスクラム開発など)が存在していますが、技術的な専門性やバックグラウンドの異なる関係者同士でコミュニケーションを取る必要があるため、専門分野の人同士、および、異なる専門性を持つ人とのコミュニケーションが適切に取れることが重要です。
LINEには外国籍の方も多く、日本語が堪能な方もたくさんいますが、文化的なバックグラウンドが異なるので、わかりやすく、率直に伝える、といったことも必要になります。
▼ 仕事に対する考え(想いやこだわり)
仕事を進めていると、特に分業化が進んだ領域では「これ誰がやる仕事だっけ?」ということが必ず出てきます。
こうした業務を拾うことで、プロジェクトが前に進むことは多いため、できる範囲で受け止めるようにしています。
ちなみに一言でマネージャーと言っても、色々な種類があります。
いわゆる管理職的なものはピープルマネージメント、製品やサービスの価値を高め維持するためのビジネスの戦略を練ったりするプロダクトマネージメント、いつまでに開発するか期日を決め進めていくプロジェクトマネージメントなど、色々な役割のマネージメントがあるのです。
また、技術的に高い専門性を持つエンジニアに囲まれて仕事をしているので、「ちんぷんかんぷんな技術や分野」ができないよう、さほど深くなくても良いので、広い範囲の知識を、必要になったタイミングで収集するよう心がけています。
私個人は裏方になることが多いですが、大きな仕事が形になって出ていく過程に関与できることは、大きなやりがいになります。実際に開発しているエンジニアの人たちは、知り合いに「これ、俺 / 私が作ったんだよ」みたいに言えることが嬉しいみたいですね。