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で指定する場合に推奨される方法です。これは、ミニバッチの自動サイズ設定を使用する場合に重要です。 他のツールキットでは、多くの場合、ミニバッチ平均化の方法で学習率を指定します。 その表記から変換するには、サンプルあたりの学習率 = MBminibatchSize
/ あたりの学習率を使用します (詳細については、こちらを参照 してください)。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
}
}