次の方法で共有


バッチ正規化

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 と同じディメンションscalebiasを持つ 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)。