Deep Learning bookとは?
Deep Learning bookは2016年末にMIT Pressより発売予定の書籍(英語)で、深層学習御三家の一人Bengio先生や画像生成のGANで有名なGoodfellow先生らによって書かれており、現時点で深層学習の決定版と言える教科書です。太っ腹なことに本の内容はウェブサイトで公開されており無料で読むことができます。
Deep Learning; Ian Goodfellow, Yoshua Bengio and Aaron Courville, MIT Press, 2016.
私は以前の記事に書いた通り自然言語処理の分野で深層学習が浸透してきてから勉強を始めたため、機械学習はもちろん画像や音声が専門の人と比べて基礎的な知識が足りていないように感じたためこの本を読むことにしました。読み始めてみると機械学習の教科書として有名なPRMLと比べて数式も少なく実践的な応用を重視しているようで(理論的な背景は研究が発展途上ということもありますが)、日本語訳がないという点を差し引いても読みやすく感じました。
内容は大きく3部に分かれており、第1部は前提知識の復習、第2部は教師あり学習を中心にした実践編、第3部は教師なし学習を中心とした研究編となっています。なお強化学習はこの本ではカバーされていません。詳しくは本の方を読んでもらうとして、個人的に特に収穫の大きかった誤差逆伝搬法の部分(6.5節)について紹介したいと思います。
誤差逆伝搬法による自動微分
誤差逆伝搬法はニューラルネットワークのコスト関数の勾配を計算する方法としてよく紹介されていますが、この本ではより一般的に動的計画法を適用した自動微分法の一種として捉え直しています。どういうことかというと、勾配を求めたい関数や変数を複数のノードからなる計算グラフとして表し、その計算グラフ上の任意の変数による任意の関数の勾配の計算方法を求められるようにするということです。
これは現代的な深層学習のライブラリのほとんど全てが採用している方針で、さらにコンパイル型とインタープリタ型の2つの方式に分けられます。コンパイル型はTensorFlowやTheanoが採用していて、勾配の計算方法を別の計算グラフとして表すことで二次微分(ヘッシアン行列)を自動的に求められるといった特徴があります。一方インタープリタ型はTorchやChainerのような方式で、勾配の計算方法を計算グラフとして表さずに実行時に動的に求めるため柔軟性が高いという特徴があります。
この本を読んで自動微分の仕組みを理解しておけば、これらのライブラリを使うときに計算グラフが何のためにあるのか、一部の変数(例えば学習率)が計算グラフに含まれないのはなぜかといったことが理解できるようになり、自分で演算を定義するときに必要となる局所勾配の導出もできるようになるでしょう。ただし計算グラフを使う理由は自動微分だけではなく、GPU上で計算を完結させてCPUとのやりとりを減らすという目的もあるのでその点は区別する必要があるでしょう。
PythonによるDeep Learning
本を読んでいるだけだと自分が分かっているのか分かっていないのか分からなくなってくるため、Pythonを使ってこの本で紹介されているアルゴリズムやモデルを実装し、GitHubで公開しました。
deeplearning: Python implementation of Deep Learning book
線形代数や確率の復習は素のPython 3.5、機械学習のアルゴリズムはnumpyで、速度が必要な実験はTensorFlowで実装し、画像による可視化や試行錯誤が必要な実験はJupyter notebookを使いました。ノートブック以外のpythonスクリプトには単体テストが付いています。以前公開したdl4nlpと同じく勉強用のコードですが、深層学習を勉強したいけどやり方がわからないという人がこうやって勉強すればいいんだなという参考になってくれれば幸いです。