いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

書籍『ゼロから作るDeep Learning』紹介

まだこのブログで紹介していなかった素晴らしい本です。『ゼロから作るDeep Learning』です。

何回か話題にしている数字認識の実験のセットMNISTを用い、Pythonでコードを書いていろいろ試しながらディープラーニングの勉強をできる本です。ライブラリを使わず、理屈を理解しながら実験する、という方針で書かれています。ぼくは初めてMNISTを使ったときは以下の2冊を主に参考にした……と思い込んでいたのですが、同じ時期にこの『ゼロから作るDeep Learningも購入し、読んでいたのでした。今回この本の必要なところをあらためて読んでみて、「これは凄い本だったんだ……」と認識を新たにしました。最初は価値が分からないこと、あるんですね。

前回、画像を配列に読み取り、学習させるときのトラブルについて書きました。重みの初期値をうまく調節しないと、どういうわけか特定のいくつかばかりが最後の答え(「これは『1』」とか「これは『7』」とか)になってしまうのです。また、途中の層でも特定のいくつかのユニットだけが値が大きくなったりします。ぼくは何冊かディープラーニングの理論を解説している本(日本語)を持っていますが、その中でこのことについて詳しく説明しているのは今回紹介しているこの本だけです。ページもたくさん割き、分かりやすく解説されています。

ぼくの出会った、特定の(いくつかの)ユニットばかりの値が大きくなる現象は、この本では「アクティベーションの分布が偏っている」のように表現されています。こうなると正しく学習できません(重みの正しい調整ができない)。要するに、実験していると多分みんな同じような目に遭うんですね。ぼくは何となく「特定のいくつかのユニットばかりでなく、他も無理矢理でも少し大きな値にできないんだろうか」などと考えていたんですが、それに対する答えがこれでした。バッチ正規化と言います。簡単に説明すると、「データを何個かずつグループにしてユニットの平均値と分散を求め、その平均と分散を用いて正規化して次の層に渡す」という方法です。まだ実際に試していないので、ぼくの環境でどの程度まで改善されるのか分かりませんが、少なくとも本の実験では偏り切った分布がかなり一様になっています。しかも、大きなメリットとして、「重みの初期値についてあまり神経質にならないで済むようになる」というのがあるそうです。実験してみると分かるのですが、重みの初期値は絶妙の値をセットしないと「アクティベーションの分布」が偏るのです。だから、うまくいくなら大変ありがたい方法です。
ただ、この本では逆伝播については数式でなく「計算グラフ」というものを使って説明しています。ぼくはこの部分を読んでおらず、自分の実験では他の本に載っていた数式や自分で導いたものを使ってコーディングしています。また、今回話題にしているバッチ正規化も、逆伝播については「導出はやや複雑なので説明は省略するが計算グラフ(載せてある)を使えば比較的簡単に導出できる」といった説明がされています。持っている他の本にも数式は載っておらず、自分で逆伝播の式を導きました。これから試してみます。なお言語はC#でやっています。

初期値は状況に応じて「こうするとうまくいく」という選び方がいくつかあります。何が悪いのか、試しましたがダメでした。どうしようか考えていたところ、前に読んだ本を思い出して今回見直しました。「これはいい本だ!」と思って紹介した次第です。