"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

CNNにBatchNormalizationを適用して認識精度向上効果を試す/ニューラルネットワーク

f:id:arakan_no_boku:20190326212937j:plain

目次

BatchNormalization

BatchNormalization(バッチノーマライゼーション)は、2015年に発表され、大半のDeepLearningモデルで組み込むだけで、精度が向上するという人もいます。

実際、ImageNetの画像分類ではBatchNormalizationを入れただけで5%の精度向上が報告されたりもしているようです。

まるで、魔法みたいな技術ですが、Neural Network Consoleのレイヤーリファレンスをみると以下のように書いてあります。 

入力値を平均0分散1に正規化します。

ConvolutionやAffineの後に挿入することで精度向上、および収束を早める効果があります。

ディープラーニングはデータ全体から取り出した小さな単位で学習を行います。

それをミニバッチ法といいますが、その単位(バッチ)ごとに次の層の入力値(つまり、前の層の出力)を平均0分散1にNormalize(正規化)して、ノイズを減らすことで、学習効率をあげられるんだなと、いったん理解しておくことにします。

でも、本当にそんな効果があるのだろうか?

試してみることにします。

Neural Network Consoleで確認する

ベースはシンプルなCNNにします。

f:id:arakan_no_boku:20220404002542p:plain

これは、MINIST(手書き数字)データに対して、チューニングして、以下の結果をすでにだしているものです。

f:id:arakan_no_boku:20220404002717p:plain

Accuracyが99.2%なので、かなり優秀な結果ですが、これに「BatchNormalization」を組み込むことで、さらに改善できるかどうか?を試してみます。

BatchNormalizationを、convolutionの直後におく

リファレンスに従い、正規の位置・・つまり、convolutionの直後におきます。

f:id:arakan_no_boku:20170909111321j:plain

 

他の設定はまったく変えずに、学習と評価をやって、どう変わるか見てみます。 

学習した結果はこちら。

f:id:arakan_no_boku:20170909111505j:plain

かなりきれいな学習曲線になりました。 

でもって、評価した結果がこちら。

f:id:arakan_no_boku:20170909111644j:plain

おお!・・99.31%になった。 

リファレンスの

ConvolutionやAffineの後に挿入することで精度向上、および収束を早める効果があります。 

は、本当なんだなあ・・と実感できます。

本日の結論

過学習抑制で利用した「BatchNormalization」が、精度を向上させる効果もあるというのが本当だ・・ということが確認できました。 

本を読んで理論的にはそうだと理解していても、実際にためして結果をみるまで信用できないというのはありましたが、すっきりしました。

いつでも試せる環境(Neural Network Console)はありがたいです。

ではでは。