次の方法で共有


BrainScript SGD ブロック

SGD 構成ブロックは、CNTKでの SGD (確率勾配降下) アルゴリズムの動作を制御します。 他のツールキットに精通している場合は、必ずチェックアウトしてください

SGD 構成ブロックには、次の構造と既定値があります。

SGD = {
    # Training process control
    modelPath = ...
    trainCriterionNodeName = ...
    evalCriterionNodeName = ...

    maxEpochs = ...
    epochSize = 0
    minibatchSize = 256

    truncated = false

    dropoutRate = 0
    maxTempMemSizeInSamplesForCNN = 0
    keepCheckPointFiles = false

    disableWkInBatchNormal = false

    # Learning rate and momentum control
    learningRatesPerSample = ...
    learningRatesPerMB = ...
    minLearningRatePerSample = ...

    momentumAsTimeConstant = ...
    momentumPerMB = ...

    useNAG = false

    autoAdjust = {
        autoAdjustLR = "none"  # | "searchBeforeEpoch" | "adjustAfterEpoch"
        autoAdjustMinibatch = false

        # for autoAdjustLR = "adjustAfterEpoch":
        reduceLearnRateIfImproveLessThan = 0
        learnRateDecreaseFactor = 0.618
        increaseLearnRateIfImproveMoreThan = infinity
        learnRateIncreaseFactor = 1.382
        loadBestModel = true
        learnRateAdjustInterval = 1
        useCVSetControlLRIfCVExists = true
        useEvalCriterionControlLR = false

        # for autoAdjustLR = "searchBeforeEpoch":
        numMiniBatch4LRSearch = 500
        numPrevLearnRates = 5
        numBestSearchEpoch = 1

        # for autoAdjustMinibatch = true:
        numMiniBatch4LRSearch = 500
        minibatchSizeTuningFrequency = 1
        minibatchSizeTuningMax = 1048576
        minibatchSearchCriterionErrorMargin = 1
    }

    parallelTrain = {
        parallelizationMethod =  "none"  # | "dataParallelSGD" | "blockMomentumSGD" | "modelAveragingSGD"
        parallelizationStartEpoch = 1
        distributedMBReading = false
        syncPerfStats = 0
        # for parallelizationMethod = "dataParallelSGD"
        dataParallelSGD =
        {
            gradientBits = (8*sizeof(precision))  # | 1 | 2
            useBufferedAsyncGradientAggregation= false
        }
        # for parallelizationMethod = "blockMomentumSGD"
        blockMomentumSGD = {
            blockSize = (120000 * #workers)
            blockMomentumAsTimeConstant = (-blockSize / log(1 - 1/#workers))
            resetSGDMomentum = true;
            useNesterovMomentum = true;
            blockLearningRate = 1.0
        }
        # for parallelizationMethod = "modelAveragingSGD"
        modelAveragingSGD = {
            blockSize = (40000 * #workers)
        }
    }

    # Gradient control
    gradientClippingWithTruncation = true
    clippingThresholdPerSample = (infinity)
    L2RegWeight = 0
    L1RegWeight = 0
    gaussianNoiseInjectStd = 0
    gradUpdateType = ""  # "" | "adagrad" | "rmsProp" | "fsAdaGrad"
    # for gradUpdateType = "adaGrad" or "rmsProp":
    normWithAveMultiplier = true
    # for gradUpdateType = "rmsProp":
    rms_wgt_inc = 1.2
    rms_wgt_dec = 0.75
    rms_wgt_max = 10.0
    rms_wgt_min = 0.1
    rms_gamma = 0.99

    # Information display
    traceLevel = 0
    firstMBsToShowResult = 10
    numMBsToShowResult = 10
    numMBsToCUDAProfile = 0

    # Precompute
    useAllDataForPreComputedNode = true

    # Gradient check
    gradientCheck = false
    sigFigs = 6
}

パラメーター

トレーニング プロセス制御

  • trainCriterionNodeName: トレーニング条件ノードの名前。 指定されていない場合は、ネットワーク内の既定のトレーニング条件ノードが使用されます。

  • evalCriterionNodeName: 評価基準ノードの名前。 指定されていない場合は、ネットワーク内の既定の評価基準ノードが使用されます。

  • epochSize: epochSize の詳細については、ここをクリックしてください

  • keepCheckPointFiles: 新しいエポックの開始後にチェック ポイント ファイルを保持するかどうか。 有効な値は、true および false (既定) です。

  • disableWkInBatchNormal: SGD の更新中にバッチ正規化の重み減衰期間を有効にするかどうか。 有効な値は、true および false (既定) です。

  • maxEpochs: 実行するエポックの最大数。

  • minibatchSize: minibatchSize の詳細については、ここをクリックしてください

  • dropoutRate: トレーニング手順中のドロップアウト率。 既定値は 0.0 です。 0.5*10:0.2 などの構文を使用できます。つまり、ドロップアウト レート 0.5 を 10 エポックに使用し、残りのエポックに 0.2 を使用します。

  • maxTempMemSizeInSamplesForCNN: 入力機能をパッケージ化およびアンパックするときに使用される最大一時メモリ (サンプル数)。 既定値は 0 です。これは、必要に応じて任意の値を使用します。 GPU で実行する場合に、メモリ フット プリント esp を制御するのに役立ちます。

  • saveBestModelPerCriterion: クロス検証データで測定された各条件に最適なモデルを保存するオプション。 トレーニングが終了すると、モデルに名前が付けられます <modelName>_<criterionName>。 有効な値は、true および false (既定) です。

ラーニングレートとモメンタム制御

学習率と勢いを指定するCNTKの方法は、他のツールキットとは異なります。 詳細については、こちらを参照 してください。

  • learningRatesPerSample: 各サンプルのグラデーションによってモデルが更新されるエポックごとの学習率。 エポックごとに異なる値を使用できます。たとえば、0.025*10:0.00625 は、最初の 10 エポックでは学習率 0.025、残りは 0.00625 を使用します。 これは、ミニバッチ サイズに依存しない学習率を指定するため、CNTKで指定する場合に推奨される方法です。これは、ミニバッチの自動サイズ設定を使用する場合に重要です。 他のツールキットでは、多くの場合、ミニバッチ平均化の方法で学習率を指定します。 その表記から変換するには、サンプルあたりの学習率 = MB minibatchSize / あたりの学習率を使用します (詳細については、こちらを参照 してください)。

  • learningRatesPerMB: ミニバッチ内のサンプルに対する 平均 に適用される学習率を指定する別の方法。 これは他のツールキットで学習率を指定する最も一般的な方法ですが、ミニバッチサイズを変更するデータ並列トレーニングCNTKでは問題があります。 内部的には、これは指定された learningRatesPerSample 'minibatchSize' で値を除算することによって変換されます。 と相互に排他的 learningRatesPerSampleです。

  • minLearningRatePerSample: サンプルあたりの最小学習率。 サンプルあたりの学習率がこの値より小さい場合、トレーニング プロセスは終了します。 これは、多くの場合、自動学習レート調整が有効になっている場合の早期停止を制御するために使用されます。 既定値は 1e-9 です。

  • momentumAsTimeConstant: 同様にlearningratesPerSample、CNTKでは、単位ゲイン 1 次 IIR フィルターの時間定数 (サンプル) として、ミニバッチ サイズに依存しない方法で勢いを指定します。 この値は、グラデーションが 1/e=37% の効果を持つサンプルの数を指定します。 他のツールキットでは、多くの場合、モメンタムをミニバッチごとの重み (例: 0.9) として指定します。 そこから変換するには、次を使用します momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)。 20000*10:2500 などの構文を使用できます。つまり、モメンタム時間定数 20000 を 10 エポックに使用し、残りのエポックに 2500 を使用します。

  • momentumPerMB: モメンタムを指定するこの別の方法は、一般的なツールキットの動作を模倣します。 たとえば、0.9 を指定すると、前のグラデーションは 0.9 の重みで保持されます。 ただし、他のツールキットとは異なり、CNTKはまだユニットゲインフィルタを使用しています。つまり、新しいグラデーションが乗算(1-momentumPerMB)されます。 内部的には、これは momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB).

  • autoAdjust: 自動学習速度制御に関連する情報が含まれます。 既定値は空 ("") です。これは、自動学習レート制御がないことを意味します。 ブロック内には、次の値を指定できます。

    • autoAdjustLR: 使用する自動学習率調整アルゴリズム。 有効な値は None (既定値では、学習率を自動調整しないでください) AdjustAfterEpoch 、(トレーニング セットの開発セットを使用して各エポックの後にトレーニング基準を確認し、学習速度を調整するかどうかを決定します)、( SearchBeforeEpoch 各エポックが開始される前にトレーニング セットの小さな部分に基づいて学習率を検索する) です。

    • モードで使用する AdjustAfterEpoch 場合:

      • reduceLearnRateIfImproveLessThan: 改善がこの値より小さい場合は学習率を下げる。 既定値は 0 です。
      • learnRateDecreaseFactor: 学習率の低下率。 既定値は 0.618にする必要があります。
      • increaseLearnRateIfImproveMoreThan: 改善がこの値より大きい場合は学習率を上げる。 既定値は 1#INF (無限大) です。これは決して増加しません。
      • learnRateIncreaseFactor: 学習率の増加率。 既定値は 1.382にする必要があります。
      • loadBestModel: 現在のモデルでパフォーマンスが低下した場合に最適なモデルを読み込むかどうか。 有効な値は、true (既定値) および false です。
      • learnRateAdjustInterval: 学習率調整チェックを適用する頻度を決定します。 既定値はエポックです 1 。 この値が 1 より大きい値に設定されている場合、学習率の調整は、最後 learnRateAdjustInterval のエポックから計算された平均基準に基づいて行われます。
      • useEvalCriterionControlLR: トレーニング条件の代わりに評価基準を使用して学習率を制御します。 既定では、false になっています。
    • モードで使用する SearchBeforeEpoch 場合。

      • numMiniBatch4LRSearch: 学習率の検索に使用されるミニバッチの数。 既定値は 500にする必要があります。 通常、エポック内のミニバッチ全体の 10 ~ 20% に設定されます。
      • numPrevLearnRate: 検索範囲のヒントとして使用された以前の学習率の数。 既定値は 5にする必要があります。
      • numBestSearchEpoch: 十分な学習率ではなく、最適な学習率を使用するエポックの数。 既定値は 1にする必要があります。
    • "AdaptiveMinibatchSizing" モードで使用する場合。

      • numMiniBatch4LRSearch: アダプティブ ミニバッチ サイズ モードの場合にミニバッチ サイズを検索するために使用されるミニバッチの数。 既定値は 500にする必要があります。 これは通常、エポックのミニバッチの合計の 10 ~ 20% に設定されます。これは、モードでの SearchBeforeEpoch 学習率の検索と共有されます。
      • autoAdjustMinibatch: ミニバッチ サイズが適応的に調整されているかどうかを有効または無効にします。 既定値は falseにする必要があります。 アダプティブ ミニバッチのサイズ設定は、明示的に指定されたユーザー ミニバッチ サイズが完了した後からエポックで開始されます。 たとえば、ユーザーが minibatchSize=256:1024 を指定した場合、最初の 2 つのエポックで 256 と 1024 が使用され、アダプティブ ミニバッチサイズが後で使用されます。
      • minibatchSizeTuningFrequency: ミニバッチ サイズを動的に調整する前に、定期的にスキップするエポックの数。 既定値は 1にする必要があります。
      • minibatchSizeTuningMax:アダプティブ調整されたミニバッチ サイズに許容される最大サイズ。 既定値は 1048576にする必要があります。

グラデーション コントロール

  • gradientClippingWithTruncation: 切り捨てベースのグラデーション クリッピングを使用してグラデーションの展開を制御するかどうかを指定します。 有効な値は、true (既定値) および false です。 false の場合、代わりにノルムベースのクリッピングが使用されます。これはより高価です。

  • clippingThresholdPerSample: 各サンプルのクリッピングしきい値。 既定値は 1#INF 無限大を意味します (つまり、クリッピングはオフになります)。

  • L2RegWeight (既定値は 0): サンプルあたりの L2 正則化の重み。 学習可能なパラメーターの Frobenius ノルムは、この重みを持つ目的に追加されます。 これは サンプルごとに指定されます。これは、Frobenius ノルムにミニバッチ内のサンプルの数を乗算することを意味します。

  • L1RegWeight (既定値 0): サンプルあたりの L1 正則化の重み。

  • gradUpdateType: グラデーションの更新の種類。 有効な値は None (既定では、グラデーションに対する特別な処理はありません) AdaGrad、および RmsProp.

    • 等しいか、またはRmsProp等しいAdaGrad場合gradUpdateTypeは、次のパラメーターを使用してグラデーション更新の動作を制御できます。
      • normWithAveMultiplier: AdaGrad/RmsProp アルゴリズムによってグラデーションに適用された平均乗数でグラデーションを正規化します。 既定値は true (既定値) です。
    • RmsProp等しい場合gradUpdateTypeは、次のパラメーターを使用してグラデーション更新の動作を制御できます。
      • rms_wgt_inc: 学習率スケールの乗法インクリメント。 既定値は 1.2 です。
      • rms_wgt_dec: 学習率スケールの乗法的デクリメント。 既定値は 0.75 です。
      • rms_wgt_max: 最大学習率のスケールが許可されます。 値が 1 に近いほど、学習率の調整は安定しますが、遅くなります。 既定値は 10 です。
      • rms_wgt_min: 最小学習率のスケールが許可されます。 値が 1 に近いほど、学習率の調整は安定しますが、遅くなります。 既定値は 0.1 です。
      • rms_gamma: 分散の移動平均を推定するために使用される平滑化係数。 値が小さい場合は、過去の情報を忘れる時間が短くなります。 既定値は 0.99 です。
  • gaussianNoiseInjectStd: このアプローチを使用するときに追加されたガウスノイズの AdaGrad 標準偏差。 既定値は 0 です。

情報の表示

  • traceLevel: stderr に出力する情報を決定するトレース レベル。 有効な値は、0 (既定値) および 1 です。

  • numMBsToShowResult: ミニバッチの数の後にトレーニング統計を表示します。 既定値は 10 です。

TensorBoard

  • tensorBoardNumMBsToLogResult: TensorBoard へのログ結果の間のミニバッチの数。

グラデーション チェック

  • gradientCheck: グラデーション チェッカーを使用するかどうかを決定します。 既定値は false です。 グラデーション チェッカーを使用する場合は、RNN のトレーニングに使用されるバックプロパゲーション (BPTT) アルゴリズムの切り捨てと、相違に起因する数値の問題を防ぐために学習速度が小さいため、RNN のシーケンス長よりも大きいミニバッチ サイズを使用する必要があります。 さらに、有効桁数を double に設定する必要があります。

説明

SGD アルゴリズム (確率勾配降下学習器) の動作は、オプションの SGD ブロックによって制御されます。 オプションを省略すると、既定値が想定されます。

明示的に指定されていないパラメーターは既定値のままにします。

データ サイズの指定

他のツールキットからのラーニングレートおよびモメンタム パラメーターの変換

CNTKのモデル更新式は、他のツールキットや文献とは多少異なります。CNTKでは、ミニバッチ サイズに依存しない方法でパラメーターが指定されます。 これは、CNTK自体がミニバッチ サイズを変更する可能性があるデータ並列トレーニングのコンテキストで重要です。 学習率と運動量を非依存の方法で指定すると、ミニバッチ サイズの変更時にこれらの値を調整する複雑さが回避されます。

これらは、勢いのある SGD のCNTKのモデル更新式です。

G(t) = (1-mu) sum { g(t-minibatchSize+1) ... g(t) } + mu * G(t-minibatchSize)
mu   = exp (-minibatchSize/momentumAsTimeConstant)
M(t) = M(t-minibatchSize) + learningRatePerSample G(t)

代入

  • G(t): サンプル後 t のモメンタム平滑化グラデーション
  • g(t'): 時間のサンプルの生のグラデーション t'
  • M(t): サンプルを見た t 後に使用されるモデル。
  • t のステップでインクリメントする minibatchSize

(注: 可変長シーケンスを使用する場合、 minibathSize ミニバッチ内のシーケンス長は通常、要求された minibathSizeシーケンスと正確に合計されないため、若干変動します)。)

次のことがわかります。

  • モメンタムフィルタ G(t) はユニットゲインです。 すべてのサンプルのグラデーションは、合計が 1 になるように時間の経過と同時に分散されます。
  • 学習率は、サンプルに対する平均ではなく、サンプルごとに指定されます。

他のツールキットやニューラル ネットワークの文献で使用される仕様は、多くの場合、次のとおりです。

G'(t) = average { g(t-minibatchSize+1) ... g(t) } + mu * G'(t-minibatchSize)
M(t) = M(t-minibatchSize) + eta G'(t)

代入

  • G': 代わりの方法でミニバッチ ごとの平均 として定義され、ないグラデーション (1-mu)
  • mu:ミニバッチごとに適用される非ユニットゲインIIRフィルタのモメンタムパラメータ(例:0.9)
  • eta:ミニバッチ平均 勾配による学習率

この方法で指定したパラメーターは、次の数式を使用してCNTKパラメーターにマップできます。

learningRatePerSample = eta / minibatchSize / (1-mu)
momentumAsTimeConstant = -minibatchSize / ln (mu)

この問題に近づくには、次のようにマップされている and momentumPerMBを使用learningRatePerMBします (以下が存在しないこと/ (1-mu)learningRatePerSampleに注意してください)。

learningRatePerSample = learningRatePerMB / minibatchSize
momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)

ImageHandsOn チュートリアルでデータ並列処理と自動ミニバッチ スケーリングで使用される構成:

SGD = {
    epochSize = 50000

    maxEpochs = 160 ; minibatchSize = 128
    learningRatesPerSample = 0.0078125*80:0.00078125*40:0.000078125
    momentumAsTimeConstant = 1200
    L2RegWeight = 0.0001

    firstMBsToShowResult = 10 ; numMBsToShowResult = 500

    parallelTrain = {
        parallelizationMethod = "dataParallelSGD"
        parallelizationStartEpoch = 1
        distributedMBReading = true
        dataParallelSGD = { gradientBits = 2 }
    }
    autoAdjust = {
        autoAdjustMinibatch = true        # enable automatic growing of minibatch size
        minibatchSizeTuningFrequency = 10 # try to enlarge after this many epochs
        numMiniBatch4LRSearch = 200
        minibatchSizeTuningMax = 15000    # out of memory above this
    }
}