コンピュータ・ビジョンを深層学習をつかってやろうとしているので,Theano という深層学習のための環境をインストールして,そのうえで,たたみこみニューラルネット (Convolutional Neural Network, CNN) をうごかしている. たたみこみ層 1 段につき 1 個だけフィルタを用意して学習させてみると,おもしろいことがわかった.
Theano による深層学習のチュートルアルがあるが,そのなかに CNN もある. これはたたみこみ層が 2 段のネットワークであり,例題は有名な文字認識の問題 MNIST だ.
このネットワークはかなり冗長なので学習させるにも時間がかかるが,いろいろいじっているうちに,半分以下の時間でだいたいおなじくらいの結果がえられるようになった. もとのネットワークはつぎのような構成だ.
- 初段のフィルタ: 5×5 が 20 個 (入力画像は 28×28.tanh).
- プーリング (max): 2×2 (入力画像は 24×24).
- 2 段めのフィルタ: 5×5 が 50 個 (入力画像は 12×12.tanh).
- プーリング (max): 2×2 (入力画像は 8×8).
- かくれ層: 500 個.
- 出力層 (Logistic regression): 10 個.
これをつぎのようにかえる.
- 初段のフィルタ: 5×5 が 5 個 (入力画像は 28×28.tanh). (3×3 にしたかったが,そうするとあまりがでてしまうので 5×5 のままにした)
- プーリング (max): 3×3 (入力画像は 24×24).
- 2 段めのフィルタ: 3×3 が 16 個 (入力画像は 8×8.tanh).
- プーリングなし (入力画像は 6×6).
- かくれ層: 200 個.(もっとへらせる)
- 出力層 (Logistic regression): 10 個.
安定した性能をえるにはウェイトの初期値をうまくえらんでやる必要があるようだ (私は 0 にちかい一様乱数の初期値をつかっている).
これだけではおもしろくないので,フィルタを極限までへらしてみた. 初段,2 段めともに 3×3 にして,各層 1 個ずつにして学習させてみると,それでも 97% 以上ただしく識別できることがわかった (3 回ためして,テストセットのエラーが 2.69%, 2.37%, 2.38% だった). すばらしい成績だ. ついでに,たたみこみ層を 1 段だけにして,プーリングなしでうごかしてみると,エラーはやはりひくい. 2.66%, 2.46%, 2.53% になった. このほうが 2 段のときより,もちろんはやい.
さらにプログラムをかきかえて,たたみこみ層を 3 段にしてみた.
- 初段のフィルタ: 5×5 (入力画像は 28×28).
- プーリング: 2×2 (入力画像は 24×24).
- 2 段めのフィルタ: 3×3 (入力画像は 12×12.tanh).
- プーリング: 2×2 (入力画像は 10×10).
- 3 段めのフィルタ: 3×3 (入力画像は 5×5.tanh).
- プーリングなし (入力画像は 3×3).
- かくれ層: 200 個.(もっとへらせる)
- 出力層 (Logistic regression): 10 個.
それでまず気づいたのは,学習をはじめてもエラーが 90% くらいのところから,なかなかへらないことだ. 初段のフィルタをなかなか学習させることができないようだ. しかし,5 回 (epochs) くらいくりかえし学習させていると,エラーがさがってくる.
それから,フィルタを十分に用意すればしかるべき成績がえられるが,上記のようにフィルタを極限までへらしてみた. 各層 1 個ずつにすると最初は学習しにくいこと,そのうちエラーがさがってくることは上記とおなじだが,エラーは 10% くらいでとまってしまう. そして,さらにしばらく学習をつづけていると,ふたたび 90% くらいにもどってしまう. 2 段のときはそういうことはおこらない.
フィルタ数を 1, 2, 1 とすると,今度はエラーがもとにもどることはなくなった. しかし,まだ 2 段のときより成績がわるい.