バッチ正規化
BatchNormalization(input, scale, bias, runMean, runVariance, spatial,
normalizationTimeConstant = 0,
blendTimeConstant = 0, epsilon = 0.00001, useCntkEngine = true)
パラメーター
input
はバッチ正規化ノードの入力ですscale
は、学習したコンポーネントごとのスケーリング係数 (下の式の項)gamma
を保持する ParameterTensor{} です。bias
は、学習したバイアス (beta
用語) を保持する ParameterTensor{} です。scale
また、bias
出力畳み込み機能マップspatial = true
の場合spatial = false
はディメンションと等しいinput
必要がある同じディメンションを持つ必要があります。runMean
は、評価フェーズ中に使用され、トレーニング中にも使用される可能性のある実行平均です。 初期値 0 と同じディメンションscale
bias
を持つ ParameterTensor{} を渡し、設定するlearningRateMultiplier=0
必要があります。runVariance
は実行中の分散です。 と同じ方法runMean
で表されます。spatial
は、ミニバッチ内の各フィーチャの平均値/var を個別に計算するか、畳み込みレイヤーの場合はフィーチャ マップごとに計算するかを指定するフラグです。normalizationTimeConstant
(既定値 0): バッチ統計のローパス フィルターバージョンとして平均と分散の実行平均を計算するための時間定数。 注: 通常、既定値は必要なものではありません。blendTimeConstant
(既定値 0): 実行中の統計を使用してバッチ見積もりをスムーズにできますepsilon
は、逆標準偏差を計算するときに分散に加算されるコンディショナ定数です。useCntkEngine
(既定値: true): GPU 専用 cuDNN 実装を選択するように設定false
します
戻り値
バッチ正規化。input
説明
BatchNormalization
では、内部 共変量シフト (Sergey Ioffe、Christian Szegedy) を減らすことによるディープ ネットワーク トレーニングの高速化という、紙のバッチ正規化に関する記事で説明されている手法が実装されています。
要するに、各出力 (特徴) の各ミニバッチのレイヤー出力を個別に正規化し、アフィン変換を適用してレイヤーの表現を維持します。 つまり、レイヤー input
の場合:
m = mean (input)
var = variance (input)
inputNorm = (input - mean)/sqrt (epsilon + var)
output = gamma * inputNorm + beta
ここで gamma
、トレーニング beta
可能なパラメーターです。
mean
トレーニング variance
データから推定されます。 最も簡単なケースでは、トレーニング中の現在のミニバッチの平均と分散です。 推論では、代わりに長期的な見積もりが使用されます。
長期的な推定値は、ミニバッチ統計の低パス フィルター処理バージョンであり、パラメーターによって指定された normalizationTimeConstant
時間定数 (サンプル単位) です。
平均の 0
値は指数平滑化がなく、実行平均/分散は常に 最後に見られたミニバッチのものと等しくなります。
多くの場合、これは望ましくない場合があります。
代わりに、ここでは数千の値を使用することをお勧めします。
ラッパーの既定値は BatchNormalizationLayer{}
5000 です。
時間定数と指数平滑化の詳細については、以下を参照してください。 https://en.wikipedia.org/wiki/Exponential_smoothing#Time_Constant
ミニバッチ統計はノイズが発生する可能性があるため、CNTKではトレーニング中に MAP (maximum-a-posteriori) 推定値を使用することもできます。この場合、実行される長期見積もりは以前と見なされます。
前の重みはパラメーターによって blendTimeConstant
制御されます。
しかし、これは私たちの実験ではこれまでに役に立つことは見つかりませんでした。
推論中、CNTKは、既存の実行平均のみを使用し、更新されないように、両方の時間定数を自動的に設定します。 ユーザーが明示的な操作を行う必要はありません。
cuDNN の実装
既定では、この関数は GPU と CPU の両方で動作するCNTK実装を使用します。 よりパフォーマンスの高い cuDNN 実装を使用することを選択できます。 ただし、cuDNN 実装ではすべてのオプションがサポートされるわけではありません。トレーニングには GPU が必要です (ただし、cuDNN 実装を選択した場合でも、推論用の CPU エミュレーションを提供CNTK)。