機械学習に本気で取り組むためにやった数学周り 後半戦結果

ai_study_kikaigakusyu_2

 前回の「機械学習に本気で取り組むためにやった数学周り 前半戦結果」の記事から早くも半年近くが経過しました(覚えてくれている人いるだろうか…)。本当に時間が過ぎるのは早い。とりあえず2017年前半の締め括りの季節として良い時期になってきたので少々早いですが後半戦結果を書きました。後半戦では 色々な軌道修正・計画の調整を行ったため 前半戦に記載している流れになっていない部分がありますがご了承下さい。

● 2017年1月 – 6月 後半戦結果

2017年1月後半 – 線形代数復習

昨年8月にやっていたのだけれど、幾何的な理解はできていたが理論的な理解が浅いままで割と苦労したので改めて時間を設けて固めることにした。

 【勉強時間: 35時間】

2月 – 最適化数学

 → これなら分かる最適化数学―基礎原理から計算手法まで
 ラグランジュの未定乗数法とか最適化問題の考え方の基本はこの本で習得した。未定乗数法は機械学習理論の本で割とあらゆる所に「え?知ってるよね?」くらいのライトさでサラッと出てくるのでここで習得しておいて良かったと思う。勾配法とかニュートン法とかそのあたりの考え方もこの本で抑えられた。

 【勉強時間: 55時間】

3月 – 基礎的な多変量解析 + 統計学

 → 心理統計学の基礎
 多変量解析も載ってるけど、どちらかというと統計本って感じも。
 本当は 多変量解析法入門 (ライブラリ新数学大系) に入る予定だったが、当時の自分に若干敷居が高かったため、背伸びして現状の自分の身の丈に合わない本をやるよりも 現状の自分より少しハードルの高いくらいのレベル感で着実に実務に活かせる実力をつけた方が良いだろうという判断でこちらの本にした(「心理」という名前がついているけれど、良質な統計書としても評判らしい )。結果的に線形と統計に関しては想定していたより結構な時間がかかってしまった感があるけれど、その分時間をかけたおかげで 機械学習に取り組む上での最低限の地盤が固まったかなという感覚を得るがひとまずできた。

 この頃になると深夜帯(0:00~2:00)メインで勉強していたが、この辺りから 机に座ると眠気が襲ってくるようになったので、深夜帯の勉強 → 朝早く起きて会社の最寄駅のカフェで1~2時間勉強してから出社する習慣に切り換えた。

 【勉強時間: 52時間】

4月 ~ 5月前半 – 機械学習理論

 → パターン認識と機械学習(PRML) 上巻
 仮に進捗がどのような状況であっても 4月~6月の間の3ヶ月は1年の総仕上げとして機械学習理論に入ろうと決めていたため、ラスボスとして位置づけていたPRMLに突入。
 結果として上巻は5月の前半で決着がついたし 機械学習・生成モデルの基礎的な概念周りに関して大分良い理解が得られたと思う。同時にこの時期に機械学習理論の事を「数学」と呼ぶことについて、厳密に学生時代数学を学んで来た人たちが「うーむ」と思う部分があるということを知った( 機械学習周辺の論文の数学はざっくばらんすぎてイラつくことがあるらしい )のでタイトルでは「機械学習に本気で取り組むためにやった数学周り」となっているが、今後機械学習理論の事を安易に数学と表現するのは控えようと思った。

 【勉強時間: 82時間】

5月後半 – PRML下巻 途中まで

 → パターン認識と機械学習(PRML) 下巻
 8章 グラフィカルモデル 終了
 9章 混合モデルとEMアルゴリズム 終了

 6, 7章のカーネル法に関してはひとまず概要だけの理解にとどめておいた。というのも、カーネル法自体がそこそこ大きなトピックで且つPRMLだけでは不足な点があるという評価が見られたので、必要になったタイミングで『カーネル多変量解析』等の本とともに勉強する方針にした。

 また、この時期より勉強だけに留まらず少しずつ外にも出ていく事を意識し始め、TeamAIさん主催の交流会やKaggle勉強会に参加させていただきました。渋谷付近で毎日AI関連のイベントを開催されており、個人的にとても素敵なコミュニティだと思うので こちらの記事にて併せて紹介してみました。現在機械学習・AI周りの勉強をされている方等オススメです。

 【勉強時間: 20時間】

6月 ~ 現在

 → Pythonで体験するベイズ推論 PyMCによるMCMC入門
 → トピックモデル(機械学習プロフェッショナルシリーズ)
 当初の目標としての最低限のベースの理論の習得は達成できたため計画修正。本格的な業務上での応用を優先し、これまで習得した知見をもとにトピックモデル周りの勉強をメインとして、PRMLを補助的な教材として利用する方針に推移( 特にギブスサンプリング、変分推論 などはトピックモデル周辺の勉強において不可欠なため、その進捗に応じて PRMLで補填的に学習 )。

 本当は「PRML全部終わりました!」という状態で気持ちよくプロジェクトを締め括ることができればよかったのですが、現在の自分のベース部分における習熟度や、今の自分が求められている役割等を総合的に考えた結果、今現在実務において得られる成果の最大化を優先するという形で軌道修正した感じになります。

● 勉強時間まとめ

・前半戦: 250 ~ 300時間程度
・後半戦: 250時間程度
計: 500 ~ 550時間程度

※ だらだら勉強した時間、効率の悪かった時間は計算に入れておらず、集中的に取り組んでいた時間のみを計算しています。なお、ここでかかった時間は飽くまで自分の場合なので 当然ながら500時間の勉強で得られる内容や密度は人によって全然変わってきます。

study_wakaru_boy

● この1年間で習得できた事 まとめ

人に説明できるレベル & 実際に実務で扱えるレベルを基準としています。多分もうちょっと色々あったと思うけど、思い出したら追加する感じで。思い浮かぶ限り書いたので分野や各項目の粒度はごっちゃ煮です、スミマセン…。全体として取り組んだ分野としては 数II・Bの復習、数III・C、解析学、線形代数、統計学、最適化数学、機械学習理論 って感じです。

生成モデル・識別モデル・識別関数の違い, 最小二乗法, 過学習, 正則化, 正則化最小二乗法, 尤度, 対数尤度, 最尤推定, MAP推定, 予測分布, 事前分布, 事後分布, 共役事前分布, パーセプトロン, 誤差逆伝播, ベルヌーイ分布, 二項分布, 多項分布, ガウス分布, 対数正規分布, 指数分布, ポアソン分布, ガンマ分布, ベータ分布, カテゴリ分布, ディリクレ分布, 標本平均 / 標本分散, 1-of-K符号化法, t分布, 大数の法則, 中心極限定理, 標準化, 確率密度, 条件付き確率, 確率の加法定理・乗法定理, ベイズの定理, 周辺化, 超パラメータ, 汎関数, デルタ関数, 次元の呪い, n-gram, 線形回帰, 行列式, 形態素解析, 係り受け解析, ラグランジュの未定乗数法, Ridge回帰, Lasso回帰, テイラー展開・マクローリン展開, 一次形式・二次形式, pandas / sklearn / numpy / matplotlib, jupyter notebook, KLダイバージェンス / JSダイバージェンス, コサイン類似度, 共分散, 指数・対数等の微積分, step関数, ロジスティックシグモイド関数, ソフトマックス関数, ロジスティック回帰, 多クラスロジスティック回帰, 交差エントロピー誤差関数, 勾配降下法, ニュートン法, ナイーブベイズ, 一次独立(線形独立) / 一次従属, 固有値 / 固有ベクトル, ベクトル空間, 正定値, ヤコビ行列, ユークリッド距離 / マハラノビス距離, 決定理論, 棄却域・棄却オプション, パラメトリック手法 / ノンパラメトリック手法の違い, 線形写像, 核と像, Σ計算, Π計算, 指数/対数等の微積分, 偏微分, ベイジアンと頻度論の違い, TF-IDF, グラフィカルモデル, ベイジアンネットワーク, マルコフ過程, kmeans, EMアルゴリズム, 混合モデル, イェンゼンの不等式, 人工無脳(辞書型), ニューラルネットワーク(多層パーセプトロン), ユニグラムモデル, 混合ユニグラムモデル

● 目標の振り返り

 前回(前半戦)の報告記事で書いていた目標を振り返りたいと思います。

・個人的な数学コンプレックスに決着をつけたい
 → 決着がついた。学生時代ガチで勉強してきた理系の人達に比べるとまだまだ毛程にも満たない実力だと思うし そういう人たちから見たらまだまだニワカ感が拭えないけれど、少なくとも「数学がネックで…」という数年前からずっと胸に抱いていた心のつかえを払拭することはできたし 実務に応用できるレベルまで引き上げる事ができたので目標は達成された。

・機械学習・人工知能周辺で採用されている各種法がどういう理屈で動いているのか分かるようにしたい
 → なんというか今改めて見返すと結構雑な目標だな。とりあえずこれに関しては前述の項目「この1年間で習得できた事 まとめ」を参考にしていただけましたら幸いです。

・機械学習・人工知能周辺の最新手法とか論文の数式をストレス無く追えるようになりたい
 → 論文の数式を追うための下地は整ったかなという感覚。少なくとも機械学習周りの論文に出てくる数式に理不尽にわからん殺しされることは無くなった。あとは慣れだろうか。正直これは大分助かるし、1年間頑張ってきて本当によかったと思う。

・文系で社会人でも、後天的に機械学習周辺分野の数学的な素養・下地をつくることは可能である事を証明し、そのロールモデルになりたい(意識高め)
 → 結論から言うとロールモデルになれたかというと正直微妙な所です。 

 これについては、まず自分の特性について説明する必要があり、まず僕は自分自身に対する評価として
 ・頭の回転: 特別速いわけではなく、人並み
 ・習慣化能力・継続能力・忍耐力: かなり高い

 という自己認識を持っています。ので、計画段階においては この特性にあわせて自分の強みである習慣化能力・継続能力・忍耐力をフルに活用して 焦らず一歩一歩理解を深めていくことで頭の回転の平凡さをカバーする という戦い方をしました。

 こうして自分の選んだ戦い方における土俵の特徴ですが、勉強している途中に泣きたくなるような途方もない大きな壁が数日おきにやってきますし、割と自分の至らなさに何度も心を折られ続けます。ただ時折自分の勉強してきた道を振り返った時にふと自分が以前より大分先の道を歩いていて、今まで分からなかった事がスッと理解できるようになっていることに気づいて言葉に表せない喜びを感じる…という経験ができるので、辛い状態と楽しい状態がシュレーディンガーの猫よろしく同時に存在し続けている土俵です。慣れない数学的表現で精一杯頑張って表すと:

x1 = 辛み, x2 = 楽しみ ( x1は負の実数、x2は正の実数 )
w1 = 辛みにかけられる重み, w2 = 楽しみにかけられる重み ( w1, w2 ともに正の実数 )
wTx < 0 のとき 「もう無理だ諦めよう」となると仮定すると、
自分の選んだ土俵は x1 = -0.8, x2 = 0.2 くらいの土俵で、w1 = 0.4, w2 = 0.6 くらいを想定した感覚で臨むと普通に潰される土俵です。
自分の場合ドMで w1 = 0.05, w2 = 0.95 くらいだったので続けられた感じです。

 …みたいな感じです。この観点から言うと、自分の選んだ土俵は相当特殊な土俵で、自分のような変態魔人でもないと確実に撃沈するため ロールモデルとして参考になったかというと「うーん…」といわざるを得ない という感じです。人それぞれ自分に合った勉強の仕方があり、一律に万人に当てはまる効率的な勉強の仕方というのは無いと思うので、計画段階で自分の強みを分析した上で どういう風な学び方が自分に合っているかによって計画を立てて進めつつ、効率が落ちてきた頃合いに再度計画を見直し修正して…と勉強法を軌道修正しながら進めていくのが良いのではないかと思います。

● TODO

 一先ず自分がこの後何をすべきか、チームにおいてどういう役回りで立ち回れそうか見えてきたので、今後は実務に活きてくるアウトプットを意識した形でその周りの技術的知見を中心にどんどん強化していく予定。実務では自然言語処理周りを扱う事が多いので主にそちらの方をメインで見る感じになってくるかなーという感じ。

・LDA, CNN, RNN, GAN, LSTM, seq2seq, … 周りの論文を一通りおさえる。
・TensorFlow, chainer, Keras 周りの、理論を実際のシステムに落とし込むための技術をおさえる。

juuryoku_newton

● 実際にどういう実りがあったのか

 ここまで聞いた感じただただ辛そうな経験でしかなさそうだけど、前述の通り楽しさが辛みに勝っていたのでとても楽しかった( 更に言うと 時間が許すならばもっとやっていたい所 )し、業務でも勉強したことをガンガン役立てることができているので、個人的な感想としてはやはり理論から着実にやっておいて良かったと思う。

理論的な発想の引き出しが増えた

 特に「こういう回帰モデルに落ち着かせられそうだな」とか「こういう特徴量を取って一旦アプローチをかけてみるか」とか「こういう風に前処理をかけて混合モデルとして表現して確率的に分類してみたらどうだろう」とかそういう日常の何気ない発想の引き出しが増えた気がする。あとは「精度があまりに良すぎるので過学習を疑った方が良いのでは」とか「そもそも適切なモデルじゃないな」とか基本的なミスを自然と避けられるようになったのも良かったと思う。

幾何的なイメージがツール習得の手助けに

 NumPyとかいじる時で言えば、代数周りの幾何的なイメージを事前に持っているのでエラーが出ても「ああ、確かに無理がある行列計算だな」等当たりをつけることができて、不必要な部分で変に詰まる事があまり無くなった。
 また、TensorFlowとかいじる時で言えば、 モデルフィッティングやら予測周りやらの一連の流れについて 予め理論面の勉強によってある程度腹落ちしていたので その辺りも「どうしてこういう流れなんだ?」とか悩まず円滑に理解することができた。
 というように、新しいツールをいじる時 理論的土台がある程度できているのであまり変なはまり方をして時間を消耗することが無くなりかなりストレスは軽減した。

専門分野として 学んだ事がそのままビジネス成果に繋がる喜び

 数式がうわーって並ぶ論文周りとかを読んで、それを実際の仕事に活かして何らかのビジネス成果を達成したり課題解決をしたりするまでの一連のフローをつくるのが個人的にとても憧れだったので、そういう形で段々と実務に携われるようになってきたのがとても嬉しい。

朝型になった

 完全にネタなのだけど、これに関しては全く意図したことではないし 正直機械学習の勉強で得られた実りと言うべきか疑問ではあるけど、夜の勉強が眠すぎて朝型に切り換えてからというものの調子がすごく良いし1日にメリハリがついた。

( …なんだか全体的にフワッとした感じになってしまったので、実際に実りがあった事を定量的に示せるよう今後はガンガンアウトプットしていきたいと思います )

● 感謝の言葉

 チャットボット周りで機械学習の一連の導入フローを体験させて頂いたり統計解析的な仕事の機会を頂いたり、様々なアウトプット面で数々の機会を頂いた上司やチーム、会社の方々には正直どれだけ感謝してもし切れませんし、同様に 勉強に追われる中毎日健康的な食事・お弁当を用意してくれたり激励してくれた奥さんにも本当に頭が上がりません。
 本当に周りに恵まれていると思いますし、頂いた分ちゃんと返さねばと思いつつ今後も頑張ります!

● おまけ: 学生の方々に一言

 社会人になってからこういうインプットを1からしようと思うととにかく結構大変なので、やりたい分野がハッキリしている場合は学生のうちにできる限り理論面の勉強を惜しまずやっておいた方が良いと個人的に思います。
 集中的に何かをインプットをできる時期というのは人生で本当に限られていて、社会人になって役職がついたり守るべき家族ができたりするとなおさらですし、勉強のための体力や集中力も一生続く無限のリソースでは無いです。
 学校におけるコミュニティにも大きな価値があります。同じ分野の課題で、更には(カリキュラムの性質上)比較的同じくらいの進度の部分で相談できる友人が比較的探しやすい環境だと思います。社会人になってからは まず同時期に同じ分野の課題に取り組んでいる人を見つけるハードルも学生時代より格段に上がりますし、更に見つけられたとしても課題に対する学習の進み具合も往々にしてバラバラです。加えてそれぞれが個々の仕事や家庭等様々な事情を持っているため その人達と継続的に同じ課題を取り組み続けられるとも限りません。ので学校にいる間に思う存分羽を伸ばして勉強に打ち込むと良いのではないかというのが自分の意見です。
( 何というか偉そうに先輩風吹かせる感じで締めくくってしまいスミマセン )

Written by Nisei Kimura ( 木村 仁星 )

- Sponsored Links -

Top

>>