一連の画像で平均的な機能のアクティブ化が完了すると、ネットワークをレイヤーごとに順次正規化することは間違いありません。ただし、微妙な問題があります。以前のレイヤーとは独立してレイヤーの重みを再スケールすることはできません。
LET及びの重みおよびバイアスである層における番目の畳み込みフィルタ。カーネル寸法は(高さ、幅、channels_in)の3D形状ですが、道路の表記を簡単にするために、してみましょう。ここで、です。WlibliilWlih×w×cp×cp=h×w
Flij≡max(0, Wli∙Pl−1j+bli)は、レイヤー番目のフィルターの、番目の位置でのアクティブ化です。活性化マップ。ここで、は畳み込み演算(またはフロベニウスの内積、または積和演算、ババの答えからのシンボルを採用)を、はのウィンドウです。フィルターが検討中の位置でたたみ込むレイヤーの出力のアクティブ化。ilj∙Pl−1jh×w×c=p×cl−1
ましょうは、データセットすべての画像とフィルターの活性化マップのすべての位置におけるレイヤー番目のフィルターの平均活性化です。これは明らかに負でない数であり、VGGネットワーク内のすべてのフィルターに対して実際には正です(平均的なアクティブ化が適切なサイズのデータセットで収集される場合)。μli≡EX,jFlij=1NMl∑X∑j=1MlFlij=1NMl∑X∑j=1Mlmax(0, Wli∙Pl−1j+bli)
ilNXMl
ここで、重みとバイアスを除算することにより、アクティベーションを「正規化」するとします。これにより、着信アクティベーションが元の正規化されていないアクティベーションと同じである場合、アクティベーションの平均は1になります。つまり、、ただし前のレイヤーのアクティブ化が元の正規化されていないネットワークと同じである場合のみ-計算したネットワークμliEX,jmax(0, Wliμli∙Pl−1j+bliμli)=1Pl−1jμliこれは、正規化ネットワークの最初のconvレイヤー、つまり入力画像とたたみ込むレイヤーにのみ当てはまります。他のレイヤーの場合、これは誤ったスケールをもたらすだけでなく、実際に畳み込みの符号を反転させ、その結果、ReLUを通過した後にアクティベーションをゼロにすることができます。つまり、ネットワークの出力を変更します。
これを修正するには、着信アクティベーションを復元する必要があります。ただし、着信値自体を変更することはできません。現在のレイヤーの重みを使用して、前のレイヤーの正規化を元に戻す必要があります。フィルターの重みは、前のレイヤーの単一のチャネルとのみ相互作用することに注意してください。そのため、レイヤーの番目のチャネルと相互作用するすべての重みを、それらに乗算することによってます。これにより、前のレイヤーの正規化がキャンセルされます。Wlikl−1μl−1k
形式化するには、
Dl−1≡⎡⎣⎢⎢⎢⎢⎢⎢μl−110⋮00μl−12………⋱000μl−1c⎤⎦⎥⎥⎥⎥⎥⎥は、レイヤーからのすべての平均活性化を使用して構築された対角行列です。c×ccl−1
次に、。(そして、これが重みを2Dに再形成した理由です。これにより、明確にするために、テンソルの代わりに行列を乗算できるようになります。)EX,jmax(0, WliDl−1μli∙Pl−1j+bliμli)=1
また、最大および平均プーリングレイヤーは、スケールを変更しないため、このスキームに干渉しません。
上記はおそらく実際のコードよりも複雑に見えます。短いKeras実装でGitHubリポジトリをプッシュしました:https : //github.com/corleypc/vgg-normalize。サンプルコードを見ると、さらに詳しいことがわかります。