iizukak の雑記

忘れる前に書いとこう

機械学習スタートアップに転職して、1年間で学んだこと

この記事は LeapMind Advent Calendar 2019 3 日目の記事です。

概要

2018 年末に LeapMind という機械学習スタートアップに転職しました。そして 1 年が経ち、ソフトウェアエンジニア兼マネージャとしてなんとかやっていっています。前職では機械学習とは全く関連の無いソフトウェア開発業務を担当していたので、転職後にほぼゼロベースで学んでいます。本記事では、LeapMind に転職してからどんなソースを使って学んでいるのかを紹介します。昨今、私のようにゼロから機械学習をやっていこうという人も多いでしょう。同じような境遇の方の参考になればと思います。

また、LeapMind は機械学習の中でも深層学習に注力していることもあり、本記事の内容も深層学習メインの話になります。

Coursera

入社して即座に深層学習関連のプロジェクトに配属されたので、なにはともあれこの深層学習という未知の技術を使えるようになる必要がありました。そこで、Coursera というオンライン教育サービスの "Deep Learning Specialization" を受講しました。このコースは深層学習についてそれぞれ 1 ヶ月くらいのコースが 5 つからなるボリューム感のある内容になっており、コースは連続した内容になっています。講師は Andrew Ng で、講義の質が非常に高いです。後半は日本語字幕が無いことに途中で気づくも、気合で乗り切りました。この講座では、Jupyter Notebook を使った演習が必修で、深層学習のコーディングについても手を動かして学べます。

一連のコースを修了し、以下のことを学習しました。

  • ニューラルネットワークモデルの学習の仕組み。特に様々な種類の層に対する逆誤差伝播法の適用
  • 過学習、学習の不安定性など深層学習で頻発する問題に対処する手法
  • TensorFlow, Keras を使った実験の方法
  • 畳み込みニューラルネットワークに関する基本的な知識
  • 再帰的ニューラルネットワークに関する基本的な知識
  • ハイパーパラメータについて

このコースを終えた時点で、Github で公開されている深層学習のコードのうち、TensorFlow や Keras を使ったものはある程度読めるようになったと感じました。また、実験を回してうまくいかなかった場合に、どのハイパーパラメータをどの程度変更すべきなのか、そもそもネットワーク構造を変更すべきなのかというところも考えられるようになってきました。

Deep Learning Specialization は、4 ヶ月くらいかけてゆっくり取り組みました。修了すると Andrew Ng のサイン付き修了証がもらえるおまけつきです。以下が修了証。

f:id:iizukak:20191202162058p:plain

コードリーディングと実験

TensorFlow を使ったソースコードが読めるようになったので、興味のあるプロジェクトのソースコードを読んで実験してみることにしました。個人的に、音楽とゲームに深層学習を適用することに興味があったので、以下のようなプロジェクトのコードを読みました。

Magenta

Magenta プロジェクトは、Google が主導する、音楽に深層学習を適用するプロジェクトの集合です。自動作曲や、音色のシンセサイズなどわくわくするプロジェクトが多く含まれます。このコードを読んで、 ファミコン音源のデータセット を使い作曲の実験をしたりしました。しかし音楽はできたものの結果は芳しくなかった…。

ml-agents

ml-agents は、Unity ゲームエンジン上で深層強化学習エージェントを学習させるためのライブラリです。物理演算を組み込んだエージェントを強化学習で動かすことは面白く、実際に強化学習で学習したモデルを組み込んだゲームを作成し itch.io で公開しました。それがこちらの sumo simulator です。へんてこな動きのキャラクターが相撲を取る!? このゲームは社内でそこそこ遊ばれ、最高記録を出そうと頑張る人が出たりしました。

深層強化学習については Coursera の講義でカバーできないものも多いので、 Python で学ぶ強化学習 を読みました。深層強化学習は、コンピュータビジョンのタスクに比べ実装も学習も難しい印象です。特に学習が不安定なのが厳しい…。

OSS へのコントリビュート

さて、Coursera の講義を受け、コードもいろいろ読んで実験して、なんとなく深層学習プロジェクトに貢献できるようになった気がしてきました。突然ですが、LeapMind では Blueoil というオープンソースプロジェクトを公開しています。このプロジェクトに業務でコントリビューションをしました。 Blueoil はコンピュータビジョンのタスクを扱います。今回はコンピュータビジョンの中でも Semantic Segmentation という画像のピクセルごとにラベル付けするタスクのサポートの追加をお手伝いしました。変更点は、 Github issue にまとまっています。ネットワーク構造などは以前からコードベースに含まれていたので、深層学習部分をがっつり実装したというわけではなかったですが。

あまりコントリビューション量は多くないのですが、最近もぼちぼちと やっていっています 。Blueoil については別の記事でまたちゃんと書きます。

放送大学に入学した

深層学習について、いくらか生産性を発揮できるようになってきました。たぶん。ただ、ここである疑念が私の頭にもたげてきました。それは

お主、深層学習を雰囲気でやってはおらぬか?

ということです。思い返せば、技術書をや論文を読んでいても、式変形や理論をすっと飛ばして擬似コードを TensorFlow に落とし込むことしかやっていなかったりします。さて、どうしたものか。そこで、学部の教養レベルの数学からから学び直しを行うことにしました。Coursera や Python で強化学習の本、論文数本を読んでみて、まず必要そうなのが

  • 線形代数
  • 微分積分・解析学
  • 確率統計
  • 計算理論

あたりの知識です。参考書だけで学ぶのは自分には難しそうと思い、放送大学に入学して講義ベースで学習することにしました。放送大学では単位の認定試験もあるので、知識が身についているか客観的に判定できるだろうという目論見です。2019 年 10 月に入学し、まず 2019 年度下期に、入門線型代数入門微分積分 の講義を受講しています。いま期の半分まで来ていて、中間課題を提出したところです。課題はインターネットで提出でき便利。1 月には単位認定試験があるので、久しぶりのテスト勉強もして、単位の取得を目指します。数学は、やはり面白いですね。数検とか受けたくなった。

近くにいる人に質問

LeapMind では、同じチームに機械学習で博士号をとった人がいたり、あたりを見渡すと IT秀才 がいたりとなかなかエキサイティングな職場でして、ぱっと質問しちゃうのが良いパターンもあり、よくお世話になっています。教科書や論文の数式を追っていて、式変形や行間を埋められないことが多発します。そこですごい人材に教えを請うと「ここは二項定理を使うんじゃ」「両辺の log をとるんじゃよ」と優しく教えてくれます。また、Deep Learning Office Hour という大学のオフィスアワー的なものが毎週開催されていて、そこで割と何でも質問できます。

Educational Support

Coursera にしても放送大学にしても無料ではないのですが、LeapMind には Educational Support という制度があり、四半期ごとに自己教育への投資を一定金額サポートしてくれます。この一年は Educational Support をフル活用しました。ありがとう会社。

まとめと宣伝

LeapMind という機械学習スタートアップに転職して一年で、上記のような学びを行いました。今後はニューラルネットワークモデルの理論的な解析ができるようになっていきたい所存です。

ところで、会社で放送大学の課題をやっていると、いろいろな人が足を止めて「合成関数の微分懐かしい!」「俺の数学力は大学受験のときがマックスだった」などと話しかけてくれて楽しいです。上記に書いたような学びは、ほぼ業務時間中にしています。

LeapMind ではソフトウェアエンジニアを通年採用しています! 興味を持たれた方はぜひ 募集職種のリスト を御覧ください。