これは、「バッチ正規化:内部共変量シフトを減らすことによるディープネットワークトレーニングの高速化」という論文からバッチ正規化をPyTorchで実装したものです。
この論文では、内部共変量シフトを、トレーニング中のネットワークパラメーターの変化によるネットワークアクティベーションの分布の変化として定義しています。たとえば、との 2 つのレイヤーがあるとします。トレーニングの開始時に、アウトプット(へのインプット)が配布される可能性があります。その後、いくつかのトレーニング手順を実行すると、に移動する可能性があります。これは内部共変量シフトです
。内部共変量シフトは、後の層(上の例)がこのシフトした分布に適応しなければならないため、トレーニング速度に悪影響を及ぼします。
分布を安定させることにより、バッチ正規化は内部共変量シフトを最小限に抑えます。
ホワイトニングはトレーニングのスピードとコンバージェンスを向上させることが知られています。ホワイトニングとは、入力を平均がゼロ、単位分散、無相関になるように線形に変換することです
。事前に計算された(分離された)平均と分散を使用して勾配計算の外で正規化することはできません。例えば。(分散は無視)、ここで、 and はトレーニング済みのバイアスで、外部勾配計算 (事前に計算された定数) です
。には影響しないことに注意してください。したがって、トレーニングを更新するたびに増加または減少し、無期限に成長し続けます。この論文は、同様の爆発にはばらつきがあると述べています
。ホワイトニングは、相関をなくす必要があり、勾配がホワイトニングの計算全体を通る必要があるため、計算量が多くなります。
この論文では、バッチ正規化と呼ばれる簡略版を紹介しています。1 つ目の簡略化は、各特徴量を独立して平均が 0、単位分散になるように正規化することです。ここで、は -次元の入力です
。2 つ目の簡略化は、データセット全体の平均と分散を計算するのではなく、ミニバッチからの平均と分散の推定値を正規化に使用することです。
各特徴量を平均ゼロと単位分散に正規化すると、レイヤーが表現できる内容に影響する可能性があります。例示しているように、シグモイドへの入力が正規化されると、そのほとんどはシグモイドが線形である範囲内になります。これを解決するために、各機能のスケーリングとシフトを学習済みの 2 つのパラメーターとで調整します。ここで、はバッチ正規化層の出力です
。線形変換のような線形変換の後にバッチ正規化を適用すると、正規化によりバイアスパラメータがキャンセルされることに注意してください。そのため、バッチ正規化の直前に線形変換のバイアスパラメータを省略することができ、また省略すべきです
。また、バッチ正規化では逆伝播が重みのスケールに対して不変になり、経験的にジェネラライズが改善されるため、正則化効果もあります。
正規化を実行するには、とを知る必要があります。そのため、推論時には、データセットの全体 (または一部) を調べて平均と分散を求めるか、トレーニング中に計算された推定値を使用する必要があります。通常は、トレーニング段階で平均と分散の指数移動平均を計算し、それを推論に使用します
。以下は、MNIST データセットのバッチ正規化を使用する CNN 分類器をトレーニングするためのトレーニングコードとノートブックです。