はじめに

半年くらい前、まだ機械学習についてなにも知らなかったときに、書いた記事が炎上してとても恥ずかしい思いをした(記事は非公開にしました)。

この記事はただの日記です。

この半年で取り組んだこと

この半年で、機械学習の勉強はせずに、ディープラーニングと強化学習の勉強をした。

3月〜7月

上記記事を書いてモチベーションを高め、さあ機械学習のための数学をやろうと意気込んでいたのだけれども、すぐに気が変わって、機械学習の王道を進まずにディープラーニングに突っ込んでいった。なぜなら、Udacity で Deep Learning Nanodegree Foundationという4ヶ月の講座を受講し始めたからだ。

この講座に 3月から7月までの4ヶ月間取り組むことによって、

  • Deep Learningという学問分野の概要を学んだ(NN, CNN, RNN, GAN)
  • TensorFlowで実装できるようになった。

このDLND、超初心者向けな講座で、手取り足取り Deep Learningを教えてくれた。なので、数学が必要なかった(笑) あれ、おかしいな、ディープラーニングって、もしかして数学あんまり必要ない??統計とかほとんど出てこないよ。

4月〜5月

また、同時進行で Fast.aiのPractical Deep Learning for Coderという講座も受講したのだが、これがまたすごくいい講座。

この講座の理念は、Deep Learningの敷居を下げて、誰もがDeep Learningを簡単に使えるようにすること。もちろん、ここでも難しい数学は抜き!そして、ここで Keras という Deep Learningをおそろしく簡単にするライブラリを知ってしまう。これをしったら、numpyの実装はおろか、tensorflowですら面倒に感じてしまう。この講座によって、

  • Kerasでバリバリコーディングできるようになった。
  • Kaggler としてデビューし、画像系コンペなら、いい結果を出せるようになった。

というわけで、この2つの講座によって、この半年でバリバリのディープラーニングコーダーになったのだった。

6月〜7月

しかし転機はまたやってきた(コロコロ変わる)。会社にAIの勉強をしてます!といったら、「うちにはAIの仕事はまったくないよ!」といわれ、さらには「そんな役に立たない勉強よりも、Javaの資格とらないとクビにするよ」という脅しまでされたのだった。

というわけで、AIとの付き合い方について、考えを見直さざるを得なくなってしまった。今の会社は、組込みソフトの受託開発がメインだ。組込みソフトと AIがどう関係するのだ???うーん、と悩んだところ、2つの答えにたどりついだ。

  • 強化学習
  • ロボティクス

というわけで、強化学習の勉強とLEGO Mindstormsを使ったロボット制御の勉強をはじめた。

これにより、

  • OpenAI Gymデビューし、強化学習問題が解けるようになった。
  • 強化学習やロボット制御の理論を LEGO Mindstormsで試すことができた。

これから取り組むこと

数学の苦手意識を克服

この半年間で、理論よりは実践重視でバリバリコーディングしてきたのだけれども、ディープラーニングが趣味レベルで中途半端にできるだけでは、仕事には生かせないし、なにもできない!!

そもそも、である。機械学習に興味を持った理由は、数学を使って現実問題を解決するところがかっこいいと思った憧れからである。そのために、大学では数学を専攻したはずだった。

大学を卒業して10年くらい経った。大学は情報系の専攻で、卒業研究は、情報理論 を学んだのだが(学部卒)、10年も経って数学から離れていたらすっかり忘れてしまった。なので、大学の数学を一から学び直したい。

また、やっぱり数学が壁で挫折したことが、この半年間でたくさんあった。

数学で撃沈した思いでをつらつらと並べたい。

  • 誤差逆伝播法が理解できず挫折。(これはデーィプラーニングがわかる数学という本によってようやく理解できた)
  • Udacity: Artificial Intelligence for Roboticsや確率ロボティクスでベイズ統計や確率が理解できず挫折。
  • Deep Learning Nanodegreeで学んだことの先にいこうとすると、論文を読んでいかないといけない。しかし、論文を開くと数式の羅列に意味が分からずフリーズ。
  • 深層学習(イルカ本)挫折。
  • Deep Learning Javaプログラミング 深層学習の理論と実装、挫折。生成モデル??
  • Siraj Ravalの The Math of Intelligence 挫折。

というわけで、数学、やります!

プログラミングのための30代からのやり直し数学である。

勉強の方針

大学生のころは、理学系だったので、数学の勉強は定理と証明の繰り返しだった。ソフトウェア開発者になると、数学に対する姿勢は工学系よりになる。

  • 理論よりも応用を考える
  • この定理がどう役に立つかを考える
  • 抽象性よりも、具体的イメージを
  • 証明の厳密性はほどほどに(理解できることに越したことはないが)

大学1,2年生の数学の復習

機械学習で必要な数学とはなにか、それは情報系の大学生が1,2年生で習う数学で十分という意見が多い。私は、情報系の専攻だったのだけれども、そこで習った数学は以下の4つ。

  • 線形代数
  • 解析学
  • 統計学
  • 離散数学

離散数学は、TopCoderなどのアルゴリズムコンテストにとても役に立ちそうな分野だ。機械学習との関係は、よくわからなかった。集合や代数的な知識は、線形代数を勉強することで、身につけられそう。離散数学の勉強は保留で。

基礎固めのための参考書はマセマで

やり直し数学ということで、最近大学生の間で評判の高いマセマシリーズで基礎固めをすることにした。高校数学から大学数学への考え方の移行がスムーズにいける、定理の証明に手を抜いていないのでガチ、コメントが多くページを遡って読みなおす必要がなく読みやすい、などの印象を受けた。

基礎ということで、以下の3つをすすめることにした。これで、まずは、大学の初等数学を復習する。

  • 線形代数
  • 微分積分
  • 統計学

基礎の補強と応用へ

マセマは数学をとても簡単に(でも手を抜かずに)書かれているけれども、知識を厚くし、また別の角度から知識を補強したい。そこで選んだのが「プログラミングのための〜」のシリーズ。

解析系がこのシリーズにないので、代わりに最適化数学をメニューに組み込む。また、機械学習ではベイズ統計が使われるので、メニューに組み込む。

  • プログラミングのための線形代数
  • プログラミングのための確率統計
  • これなら分かる最適化数学
  • Pythonで体験するベイズ推論 PyMCによるMCMC入門

数学を復習したら機械学習へ

数学力を強化したら、もともとの目標である機械学習の勉強に着手したい。まずは、はじパタから。

理論よりも実践を重視したいので、なるべくPythonとJupyter Notebookでプログラミングできる教材を使って勉強していきたい。

ココらへんまで来たら、Kaggleにもガンガン挑戦していきたい。Deep Learningの手法のみに頼らずに、いろんな手法から最適な方法を取捨選択できるようになりたい。

その他、情報理論を勉強したい。この本は、情報理論的な立場から機械学習を捉えているらしいので、気になっている。

読みたい本

目指すは、機械学習の登竜門、パターン認識と機械学習(PRML)

また、確率ロボティクスも挫折したので、数学力をつけて再挑戦したい。

その他の勉強

Deep Learning

今後はDeep Learningの勉強は抑えて他の勉強にリソースを割り当てる。

ただし、fast.aiの Deep Learning のオンライン講座 Cutting Edge Deep Learning for Coders は進める。この講座はほんとうによい講座なので、引き続き受講する。

Deep Learning Book の 本が翻訳されたら、勉強を再開しよう。

ロボティクスと強化学習

仕事で AI を活用するためには、この2つの分野の学習が必要なので、ここに力点をいれていく。

具体的には、Udacity Robotics Nanodegreeを半年間に渡って受講します。おそらく、これはかなりの負荷になるので、他のことをやる時間がとれなくなるかもしれない。

また、強化学習は 次期 MLPシリーズで発売が予定されているので、その本が発売されたら勉強を再開したい。

まとめ: 今年やること

まとめると、今年の残りの予定は以下の3つだ。

  • 機械学習のための数学力強化
  • Udacity Robotics Nanodegree
  • fast.ai Cutting Edge Deep Learning for Coders