2016-02-09

2/5 (金) に開催された CROSS 2016 の「おーい、いそのー、エンジニアにとっての機械学習について考えようぜー!」というセッションにパネラーとして登壇してきました。セッションの内容はリンク先からの引用になりますが、

「機械学習は興味あるが、身に付けるためには何が必要?」
「機械学習を学ぶためにはいったい何からはじめればいい?」
「機械学習を身に付けたとして、その先のエンジニアとしてのキャリアはどうなる?」
と思ってる、そこのアナタ。
本セッションでは、機械学習や統計はもともと専門じゃないけど気がついたらバリバリ使ってた、そんなエンジニア連中が以下について語ります。
・エンジニアが機械学習を身に付けるために必要なこと
・どのように機械学習を学ぶのが効率的か
・エンジニアのキャリアパスとして考えた時、機械学習はどうなのか

というものでした。

当日は会場の音響の状況的に聞こえづらいところもあったかと思うので、僕がお話した内容(伝えたかったこと)+αをざっとまとめておきます。

エンジニアが機械学習を身に付けるには何が必要か?

まず最初は「エンジニアが機械学習を身に付けるために必要なこと」について議論しました。

そもそも、エンジニアにとって「機械学習を身に付ける」とはどういうことなのか、その点について共通認識がないままトピックが設定され議論をしていましたが、エンジニアと機械学習の関わり方には、主に以下の 2 つのタイプがあるんじゃないかと僕は考えています。

  • 機械学習を利用する人 :既存の機械学習のフレームワークやライブラリを用いる、またそれをアプリケーションに組み込んで利用する
  • 機械学習を実装する人 :既存の機械学習フレームワークなどには存在しない新しいアルゴリズムを実装する、もしくは特定のアプリケーションに最適化した形で既存のアルゴリズムを再実装する

前者のタイプであれば、機械学習の各種アルゴリズムがどのように動作するのか? というような、アルゴリズムに対するそこそこの理解が最低限必要になるかと思います。加えて、特徴エンジニアリング的な知識も必要になるかな… と、セッションを終えた後に議論を振り返っていて思ったのでした。

一方で後者のタイプであれば、機械学習アルゴリズムに対する深い理解が必要なのはもちろんのこと、アルゴリズムやデータ構造、時間・空間計算量などのある程度高水準なコンピューターサイエンスの知識、それと統計学の知識が必要になると考えています。また僕自身の経験から、微積や線形代数などの高校・大学レベルの数学の知識があると何かと助かるんじゃないかと思っています。その他には、英語力をつけておくと、最新の英語論文を読んでそれを実装したりもできていい感じです。

このトピックの僕の意見をまとめると、

  • 機械学習を利用する人:機械学習アルゴリズムに対する知識や特徴エンジニアリングの知識を身につけるべき
  • 機械学習を実装する人:上記に加えてコンピューターサイエンスや統計学、数学力、英語力を身につけるべき

となります。

機械学習を効率的に学習するにはどうしたらよいか?

次のトピックは「どのように機械学習を学ぶのが効率的か」でした。

これは僕自身の経験にもよるのですが、何よりも「仕事で機械学習を使わざるを得ない状況に身をおく」ことが一番効率的に機械学習を学べると実感しています。加えて言うと「機械学習の師匠」と呼べるような、理論面でも実活用面でも秀でた人物のそばで機械学習を利用する仕事ができるとベストだと思います(僕がいまいる会社がまさにそのような、理想的な状況にあるわけです)。

もちろん、そんな恵まれた状況に誰しもが巡り合えるわけではないことは重々承知していますが、本気で機械学習のお仕事をする覚悟があれば、転職をするのもありだと僕は考えています。ただし、転職をするにも多少なりとも機械学習の知識が必要になることもあるかと思います。そのような場合には、TokyoWebmining や TokyoR などの機械学習系の勉強会に顔を出したり、各種書籍の読書会に参加して発表するのが次善の策と言えるでしょう。

エンジニア+機械学習のキャリアパス

続いてのトピックは「エンジニアのキャリアパスとして考えた時、機械学習はどうなのか(機械学習を身につけることによって得られるリターンはいかほどか)」でした。

ここでいう「リターン」とは給与などのことを指すとして、現時点において機械学習を利用できるレベルのエンジニアの給与水準は、他の一般的なエンジニアの給与水準よりは幾分高いのではないかと推測しています。また、機械学習を実装できるレベルのエンジニアともなれば、相当な高水準の給与を得ているのではないでしょうか。

これは別に、機械学習の世界でだけ言えることではなくて、世間一般的に言えることなんじゃないかと思います。つまり、専門的かつ高度な技術・知識を持っていれば、給与水準は自ずと高くなるはずです。

ただその一方で、「機械学習を利用するエンジニア」の給与水準が今後も幾分高い水準を保てるかと言うと、僕は No だと考えています。現時点でも既に、Python 界隈は機械学習関連の機能が充実して使いやすくなってきているようですし、また Spark の MLlib が登場したことによって、一般的なエンジニアが機械学習を利用するまでのハードルが相当低くなっている = 技術コモディティ化が進んでいると思っています。この傾向は今後も継続して進んでいくものでしょうし、そうなるとただ単に「機械学習を扱える」だけのエンジニアの価値は並のエンジニアとさほど変わらなくなるでしょう。

また、機械学習が活用できるシチュエーションは、現実世界にはそう多くはない、ということにも注意が必要です。今は「人工知能」などのキーワードに引っ張られる形で機械学習も世間的に盛り上がっているようではありますが、この盛り上がりが落ち着いたときに、どれだけ「機械学習」が必要とされる仕事があるのか… というのを考えると、そう多くはないのでは? というのは想像に難くないかと思います。つまりは、機械学習を活用する仕事 = 需用が少なく、一方で供給 = 機械学習を扱えるエンジニアが多いと需給的には買い手市場となり、結果として給与水準が並のエンジニアとそう変わらない状況も生じるのではないかと思います。まあ、これはちょっと悲観的過ぎる推測でしたが…

そのため、機械学習を利用できるだけではなく、必要とあらば機械学習のアルゴリズムを実装できるぐらいのスキルがなければ中長期的にみて見合うリターンは見込めない、というのが僕の意見になります。というか、これは機械学習に限ったことじゃないですね… スペシャリスト的な働き方を目指すのであれば、それぐらいの覚悟がなければダメですよね。

機械学習を業務で扱う、その苦労

最後のトピックは「業務で大変だったこと、それをどう乗り越えたか」でした。

一般的にソフトウェア開発では、その品質を高めるために手動もしくは自動でのテストをするわけですが、機械学習においては知ってのとおり、手動や自動の議論以前に、そもそもテストを適用すること自体がそう簡単なことではありません。そのため、機械学習を組み込んだアプリケーションがあったとして、そのアプリケーションの実行結果がなんとも思わしくない結果が得られた場合、機械学習アルゴリズムにおける精度の制約なのか、それとも実装上の不具合なのかを切り分けることは困難な問題になります。

実際に僕も、この切り分けが困難な問題に何度も直面し、そのたびにつらみを感じてきました。そのため、今では機械学習の実装に対してできるかぎり自動テストを適用し、「実装上の不具合」を回避するように心がけるようにしています。

参考: 機械学習のテスト自動化コトハジメ #MLCT Machine Learning Casual Talks #1 // Speaker Deck

自分自身の振り返り

こんな感じで、当日のセッションでは識者ぶってお話をしてきました。でも今の僕は、「機械学習 黒帯」みたいなものを名乗るにはまだほど遠いところにいると思っています(「黒帯」とかただただ恥ずかしいだけだし、名乗りたいとは思っていません)。引き続き学習あるのみ、です。

そして、ふといままでの自分のキャリアを振り返ってきたときに、今となっては何の役に立たない残念な技術をいったいどれほど学習 = 貴重な時間を投資してきてしまったんだろうか… とも思いました。これまでの経験上、ソフトウェアエンジニアを続けている限りは「コンピューターサイエンス」を除いて廃れない技術はない、と僕は考えているので、機械学習もまたいつか廃れる日が来るのかもしれません。でもその日が来るまではしばらく、もうちょっと機械学習に投資してみようかな、と思っています。