バッチノーマライゼーションについて解説します。
バッチノーマライゼーションが導入された背景
各層の活性化関数の出力は、適度な分散をもっていると勾配消失などの問題が起こりにくいことが知られています。そこで、各層の出力を適度に分散できないか、ということでバッチノーマライゼーションが導入されました。
ミニバッチ処理とは
ディープラーニングで学習を行う場合、いくつかのデータをまとめて処理します。例えば、画像分類処理だったら、1枚目は犬の画像、2枚目は猫の画像・・・という感じに例えば64枚分をまとめて1ステップの処理で学習させます。その64枚のセットのことをミニバッチと呼び、ミニバッチを使って処理を行うことを、ミニバッチ処理と呼びます。
バッチノーマライゼーションと、その効果
バッチノーマライゼーションとは、ミニバッチの同じチャンネル毎に、平均0分散1になるよう正規化を行います。結果、出力が適度に分散され、勾配消失などの問題が起こりにくくなり、学習が適切に進みます。
バッチノーマライゼーションが導入される前は、深いネットワークの学習は難しいものでしたが、バッチノーマライゼーションが導入されてから、より深いネットワークでも学習が適切にできるようになりました。また、バッチノーマライゼーションには、過学習を抑制する効果もあるとされています。
使い所としては、深めのネットワークを作ったときに、数カ所挟むのが良いと思われます。挟む場所は、フィルタや重みの演算とバイアスの演算の後、活性化関数の前です。効果的に挟むと、学習が速く進みますし、最終的に収束するLossの値も低くなり、メリットが多いです。逆にデメリットとしては、パラメータが多くなりメモリや演算量が多くなる点くらいでしょうか。
まとめ
バッチノーマライゼーションは、近年のネットワークの深化に大きく貢献した技術です。特にCNNに用いられます。TensorFlowなどのフレームワークで利用する場合には、ちょっと注意が必要な部分もありますが、深いネットワークを設計した場合には、入れておいた方が良いものです。
ただし、バッチノーマライゼーションは、ドロップアウトと同じ層で併用するのは良くないようなので、ご注意ください。<https://arxiv.org/abs/1801.05134>
また、ミニバッチ処理のデータ数が少ないと、効果が薄くなりますのでご注意ください。
深いネットワークの学習がうまく進むようにバッチノーマライゼーションを入れるのですが、他にも同じ目的でショートカットというものを入れることもあります。また別のページで紹介したいと思います。