備忘録的な

プログラミングや機械学習に関する備忘録

「ゼロから作るDeep Learning」を読んだ

評判に違わずとても良い本でした。
副題に「Pythonで学ぶディープラーニングの理論と実装」とあるように実装を重視しており、単純パーセプトロンから多層パーセプトロン、畳み込みニューラルネットワークまで、丁寧な解説で実装方法を理解することができます。

本書の特徴の一つは、ニューラルネットワークの学習方法である誤差逆伝搬法を、一般的な合成関数の微分の連鎖律として数式ベースで説明するのではなく、「計算グラフ」という考え方で説明している点だと思います。
計算グラフは、下図のように計算の過程をノードとエッジで表したものです。詳細は本を読んでいただきたいのですが、計算グラフを用いることで、誤差逆伝搬法の仕組みとその実装イメージを理解しやすくなっています。

f:id:canard0328:20171002213108p:plain
シグモイド関数の計算グラフ

その他にも本書では、ソフトマックス関数実装時のオーバーフロー対策、重みの初期値はどうするのが良いか、CNNのプーリングのウィンドウサイズとストライドは同じ値にするのが一般的、など理論だけでなく、実装し使う上で役に立つ情報が満載です。

ただ、後半のディープラーニングの話にいくほど、紙面上での実装の説明は少なくなっていくので、Githubにあるソースコードを追う必要があります。欲を言えば、その分コードのコメントをもう少し充実させてほしいと思うかもしれません。

少し気になったのは、4章で、従来の機械学習は、人の考えた特徴量(SIFTやHOGなど)をSVMなどの入力としていたのに対し、ディープラーニングでは人の特徴量設計が不要で、人のアイディアが介在しない、という記述があることです。
画像認識の場合、SIFTやHOGのような特徴量を用いずに、ピクセルの値をそのまま入力として、従来に比べて高い精度を達成できたというのは事実ですが、それをもって、ディープラーニングが「特徴量の生成が不要」、「人のアイディアが介在しない」と言ってしまうのは適切ではない、ということも既に色々なところで言われていることであり、本書を読んだ初学者がそのような認識をもってしまわないか心配です。

もう1点、6章で過学習について述べており、過学習対策をしなかった場合、訓練データに対する認識精度はほぼ100%なのに対し、テストデータの認識精度は隔たりがある(70%強)が、Weidht decayを用いることで、訓練データの認識精度が100%にならず、テストデータの認識精度との隔たりが小さくなったと言っています。しかし、このときのテストデータの認識精度をみると70%強で、過学習対策をしなかったときとほとんど変わりません。
これでは、なぜ過学習がいけないのか、が十分に伝わらないのではないでしょうか。
とは言っても、自分でいろいろパラメータをいじってみると分かるのですが、本書で例題として取り上げているMNISTという手書き数字認識問題は、問題が簡単すぎて「過学習してしまうことにより、テストデータに対する認識精度が悪化してしまう」状態を作り出すのが難しいという問題があります。

と細かな点を挙げましたが、本書はディープラーニングの基礎を実装できるレベルで理解したい方に最適だと思います。


おまけ

4章で数値微分について説明し、数値微分は実装が簡単だが遅いので、という流れで5章の誤差逆伝搬法に入るのですが、どの程度遅いのかに関する言及がなかったので試してみました。
f:id:canard0328:20171002222537p:plain
横軸はログスケールの計算時間で、縦軸が認識精度です。計算に使用したPCはこちらのLG gramで、決して早いPCではありません。
精度がサチったあたりを拡大したのが次の図です。
f:id:canard0328:20171002222852p:plain
だいたい、認識精度97.5%のあたりでサチるのですが、そこまで到達するのにかかる時間が、数値微分では341秒かかったのに対し、誤差逆伝搬法では71秒でした。