まぃふぇいばりっと

機械学習やってます.Julia大好きです.勉強したことの殴り書きです.

物理学徒が機械学習に入門した軌跡

修士課程までディラック電子系の理論物理をやってました.そのまま博士課程に進学することも考えましたが,色々考えて民間に就職して,深層学習を使ったコンピュタービジョンの研究をしました.2年後,会社を辞めて情報系の博士課程に編入しました.先日,友人に,今まで機械学習をどう勉強したか細かく教えてほしいと聞かれたので,機械学習何も分からん状態から機械学習をどう勉強したかを振り返りました.他の人にも役に立つかもしれないと思って,ちょっと肉付けして,公開することにしました.

「物理学徒が機械学習に入門するなら,こうするべきだ」と言うつもりは全くなくて,あくまで自分がどういう順番で勉強をしてきたのか,というメモのようなものです.凄まじいスピードで進歩する深層学習に関しては,以下に紹介した文献の一部が既に時代遅れになっているかもしれません.前提として,機械学習界隈に飛び込んだ時のスペックは,

  • プログラミングは,ごく小規模な実験のためにCとFortranでやったことがある程度.

  • Pythonは触ったこともない.

  • GPUが何かも説明できない.

  • 微積分,線形代数をゴリゴリ使って物理の論文を数本書いたけど,関数解析とか確率解析とか幾何とかは全然分からない.ベイズ統計も知らない.

でした.

就職前

どうやら理論物理をやっている人は機械学習領域に需要があるらしいということを知り,そもそも機械学習とは何ぞやと思い,手に取ったのが「機械学習と深層学習」でした.当時はCとFortranしか書いたことがなかったのでサンプルコードがCで書かれているこの本には助かりました.簡単な数学が分かって、C言語が読めれば前半は誰でも分かるようになっています。「Q学習」「帰納学習」「遺伝的アルゴリズム」あたりを俯瞰するにはとてもよい本だったと思います。サンプルコードが汚い,という批判があるみたいですが,私にはどう汚いのかは分からなかったです.最近はサンプルコードがPython版も出版されたようです.

1年目春

どうやらディープラーニングというのものが産業応用されまくっているという噂を聞いて,ディープを勉強しようと思いました.初めに読んだ本が瀧の深層学習でした.Amazonの辛口のレビューが目立ちますが,私は良い本だと思います.自己符号化器の活性化関数を恒等関数にすると主成分分析になるみたいな基本的だけれども大事な話がちゃんと丁寧にかいてあるのはとても良いと思います.確かに未定義で記号を使ったり,表記ゆれがあったり,おびただしい量の誤植があったりしますが,数式をちゃんとフォローして理解したい人にとっては最適な本だと思います.一部,テクニカルな内容があったりするので,全部を完璧に理解する必要はないと思います.最近,ボルツマンマシンに関する研究をしてますが,この本の10章をよく参照します.著者が素粒子物理出身ということもあり,物理畑から来た人とは親和性がある本と思います.

イルカ本も評価が高かったので読んでみました.こちらも役に立ちました.イルカ本と瀧本の違いですが,瀧本の方が丁寧で概念的な説明も多く数式で説明されています.イルカ本は前半が丁寧ですがRNN以降の説明が良く分からないです.

どうやら仕事をするためには,Pythonを勉強しないといけないらしい,ということに気が付いたので,「詳細! Python 3 入門ノート」を勤務時間中に写経しました.3日もかからなかった気がします.Pythonがかける(嘘)ようになった私は「ゼロから作るDeep Learning」を読み始めます.初オライリー本でした.行列の微分の定義に戸惑った記憶があります.ライブラリは自分で作ったものを使おう!と謎の野心がありましたが,CNNあたりの章まで読んで気が変わった私は Chainerの環境構築を始めたのでした.最近は,自然言語処理編フレームワーク編もあるみたいですね.

この頃,生成モデルがあちこちで大活躍しており,感動した私はVAEとかβ-VAEの論文を読み始めます.つけ焼き刃の知識で最新の論文が読めることにちょっと感動しました.あと,disentanglementという言葉が出てきたのはちょっと物理勢として嬉しかった記憶があります.

以上が,入社3か月くらいかけて読んだ本だったと思います.7時半に会社にいって勉強して,終業後と土日は近くの図書館でカリカリ勉強してました.ぜんぜん畑違いの物理学からこの分野に来たので,周りの強い人に追いつこうとすごく焦っていた記憶があります.それと,linuxが全然分からなくて,周りの情報系出身の人たちに対してすごい劣等感を感じていました.みんながbashの話をしているのに,私だけbashが何か分からなくてとてもつらかったです.Chainerのドキュメントを読んで分からないことを先輩に質問したら,「なんでコード読まないの?バカなの?」と言われてすごく落ち込んだりしました(そもそも,ドキュメントを読んで分からない時にコードを見に行く発想がなかった.どうせ当時は読めなかったし...).

1年目夏

会社ではGoodfellowを輪読しました.個人的にはあまり好きな本ではないのですが,周りの人は絶賛してたので人によっては役に立つんだと思います.Goodfellow本には地味に役に立つpracticalな話題が多いようで,深層学習を実際に活用している人が読むと学びが多いのかもしれません.初めに読む本ではなかったかなと思います.英語版は無料で公開されてます.

いざ開発をはじめるとディープに突っ込んでばかりで,もう少し古典的な手法を身に着けたいと思った私は,須山ベイズを読み始めます.行間を全部埋めて楽しんでました.5章にある線形次元削減とかはPythonで実装したりして遊んでました.

あとは,いまさらながら機械学習の評価の方法をちゃんと知っておこうということで,中川機械学習の1章を精読したら面白くてそのまま完読しました.基本が詰まっててすごくよかったです.時代に流されずに基本的なことをちゃんと抑えるには中川機械学習か,はじパタのどちらかをちゃんと読めばいいと思います.私は,はじパタは部分的にしか読んでいませんが,どちらもすぐれた入門書と思います.

1年目秋・冬

この頃は業務が忙しくて,スラスラ読める本ばかりに手を出すようになります.

先輩にコードが汚すぎると言われ,リーダブルコードを読んだ気がします.会社で「音楽の趣味でもあるの?」と言われた思い出.大事なことがたくさん書いてあるけど,実践できるようになったかは微妙です.コードを書くなら読んで損はないと思います.続けて,前処理が大事だと言われたので,「機械学習のための特徴量エンジニアリング」を読んだ気がします.スラスラ読めて楽しかった.

ディープについては大量の論文積読を横に,「イラストで学ぶディープラーニング 第二版」を読み始めました.タイトルからは信じられないくらい立派な本と思います.GANとかYOLOとかResNetとか当時知りたかったいろんなトピックが俯瞰できて良かったです.

2年目春・夏

もっといろいろ使える技を増やそうと,「ガウス過程と機械学習」に手を出してしまいます.これがめちゃくちゃ面白いかったのです.GPLVMとか自分で実装して,社内勉強会で発表したりしたんですけど,「計算量多いし,ディープで良くね?何に使えるん?」みたいな微妙な反応で悲しかった思い出.この本の第三章のコラムに興味を惹かれて,NNとGPの関係に関する論文とかを読み始めます(仕事には全く役に立たなかった).NNとGPの関係に感動した私は社内勉強会で発表するんですが,「高尚な発表ありがとうございました」と言われてで質疑が盛り上がならなったのが悲しかったです.この頃,機械学習のアプリケーションより,もうちょっと数理に根差した研究の方が面白いなと気が付いてしまう.

ノンパラ手法に興味がわき,「続 わかりやすいパターン認識 教師なし学習入門」の9,11,12章をガチ読みしました.この本のタイトルからは考えられないくらい重たかったです.ガンマ関数とかなり深い友情が結ばれたと思います.この辺を興味もって,自分で実装しようとしたんですけど,階乗がすぐにオーバーフローしちゃってうまくいかなかった思い出があります.この本は,難しいことをかなり分かりやすく説明してくれている良書ですが、後半の混合ディリクレ過程が相当ヘビーだから、覚悟して読み進めないと余裕で挫折すると思います.大変でした.ところどころ佐藤先生のノンパラメトリックベイズも参照しました.そういえば,1年目に他社の特許調査で出てきた「中華レストラン過程」という確率過程がなんだったのかをこの頃理解できてうれしかったです.「インド料理過程」があるのかとか興奮してました.(面白いネーミングですよね)

このころ,体調を崩して入院してて,彼女が見舞い品に「ディープラーニングと物理学」を持ってきました(本当に私の彼女はセンスが良い).あんまりちゃんと読めてないけど,物理と機械学習もいいなぁとか思う.

2年目秋以降

コンピュータビジョンの諸々の理解のためには,MLP赤本の画像認識を辞書的に使っていました.

確か,須山ベイズ深層学習とか読んでた気がします.途中まで読んだのですが,いつのまにか積読になってしまいました.

この頃は,業務の方はなかなか順調だったのですが,「ディープラーニングに突っ込んだらうまくできちゃった」っていうのが退屈に感じていました(所望のタスクをDLのタスクとして定式化したら解けてしまった).そんな感じで諸々を勉強しても全然会社での業務に活かせない(活かす能力が私にはなかった)ことへのフラストレーションがたまり,退職D進の覚悟を決め,情報幾何を勉強したり,博士でやる研究の準備をしてました.会社帰りに,博士課程でお世話になる先生とディスカッションしたり,有休をとってボスの論文を精読してたりしました.EMアルゴリズムの情報幾何的な解釈(emアルゴリズム)とかすごいなと思った記憶があります.

最後に

PRMLはどうなの?ってよく聞かれます.つまみ食いしかしてないですが,私にとってはあれは良い本です.よく参照しています(英語版は深刻な誤植があるらしいので,日本語版がよいらしい?)

あと,物理学徒は体系的に学問を勉強する訓練をしているので,「本で勉強する」ということに拘りがちな気がします.ポイントを押さえたら,そんなに真剣に本を読まずに,論文を読みまくるほうがよかったんじゃないかなと思ってます.それと,業務でMLをやるなら,言わずもがな多くの場合,理論よりもまず実装ができないとお話にならないので,その点に留意した方が良いと思います.DLフレームワークを使えるようにすることの優先順位は極めて高いと思います.

基本的には式の導出等は全部,手でフォローしていましたが,それが正しい勉強の方法だったかもよくわからないです.理論研究をするわけでなく,MLの社会実装のためにMLを勉強するなら,どの程度の粒度で理解する必要があるのか(或いは理解したいのか)に応じて,柔軟に理解の閾値を変えることも大事かなと思います.