BrainScript SGD 區塊
SGD 組態區塊會控制CNTK中 (隨機梯度下降) 演算法的行為。 如果您熟悉其他工具組,請務必簽出
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
: 按一下這裡以瞭解 epochSizekeepCheckPointFiles
:是否要在新的 Epoch 啟動時保留檢查點檔案。 有效值為true
和false
(預設值)。disableWkInBatchNormal
:是否要在 SGD 更新時啟用批次正規化的重量衰減詞彙。 有效值為true
和false
(預設值)。maxEpochs
:要執行的 Epoch 數目上限。minibatchSize
: 按一下這裡以瞭解 minibatchSizedropoutRate
:定型程式期間的卸載率。 預設為0.0
。 可以使用 0.5*10:0.2 之類的語法,這表示針對 10 個 epoch 使用 dropout rate 0.5,然後針對其餘部分使用 0.2。maxTempMemSizeInSamplesForCNN
:封裝和解除封裝輸入功能時,) 樣本數目中 (使用的暫存記憶體上限。 預設值為 0,這表示視需要使用任何值。 在 GPU 下執行時,適用于控制記憶體腳印 esp。saveBestModelPerCriterion
:將每個準則的最佳模型儲存為交叉驗證資料測量的選項。 當定型結束時,模型會命名為<modelName>_<criterionName>
。 有效值為true
和false
(預設值)。
Learning速率和動量控制
注意 CNTK指定學習率和動向的方式與其他工具組不同。 如需詳細描述,請參閱這裡。
learningRatesPerSample
:每個 Epoch 的學習速率,每個樣本的漸層都會更新模型。 您可以將不同的值用於不同的 Epoch,例如 0.025*10:0.00625 表示使用前 10 個 Epoch 的學習速率 0.025,然後針對其餘部分使用 0.00625。 這是在 CNTK 中指定慣用的方式,因為它會指定與迷你批次大小無關的學習速率,這在使用自動迷你批次調整大小時很重要。 其他工具組通常會以迷你平均方式指定學習率。 若要從該標記法轉換,請使用每個樣本的學習率 = 每 MB /minibatchSize
(的學習率, 請參閱這裡 以取得詳細資料) 。learningRatesPerMB
:指定要套用至迷你批次中樣本 平均 學習速率的替代方式。 這是在其他工具組中指定學習速率的最常見方式,但在CNTK資料平行定型的位置有問題,這會修改迷你批次大小。 在內部,這會藉由將值除以指定的 'minibatchSize' 來轉換成learningRatesPerSample
。 與learningRatesPerSample
互斥。minLearningRatePerSample
:每個樣本的最小學習率。 當每個樣本的學習速率小於此值時,定型程式將會終止。 這通常用來控制啟用自動學習速率調整時的早期停止。 預設值為 1e-9。momentumAsTimeConstant
:類似于learningratesPerSample
,CNTK會以迷你批次大小無從驗證的方式指定時數,如同單位增益 1st-order IIR 篩選準則) 範例中的時間常數 (。 值會指定樣本數目,之後漸層的效果為 1/e=37%。 其他工具組通常會將動量指定為每個迷你批次權數, (例如 0.9) 。 若要從該轉換,請使用momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)
。 您可以使用 20000*10:2500 之類的語法,這表示使用 10 個 Epoch 的時程時間常數 20000,然後針對其餘部分使用 2500。momentumPerMB
:這個替代方式可指定動態模擬常見工具組的行為。 例如,指定 0.9 表示將保留先前的漸層權數為 0.9。 不過請注意,與某些其他工具組不同,CNTK仍然使用單位增益篩選,也就是新的漸層會乘以(1-momentumPerMB)
。 在內部,這會轉換成momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB)
。autoAdjust
:包含與自動學習速率控制項相關的資訊。 預設值是空的 (「」) ,這表示沒有自動學習速率控制。 在 區塊內,可以有下列值:autoAdjustLR
:要使用的自動學習速率調整演算法。 有效值為None
(預設值,請勿自動調整學習率) ,AdjustAfterEpoch
(使用訓練集的開發集檢查每個 Epoch 之後的訓練準則,並決定是否要調整學習速率) ,然後SearchBeforeEpoch
(根據每個 Epoch 開始) 之前,根據訓練集的一小部分來搜尋學習速率。在 模式中使用
AdjustAfterEpoch
時:reduceLearnRateIfImproveLessThan
:如果改善小於此值,請減少學習率。 預設為0
。learnRateDecreaseFactor
:學習速率降低因數。 預設值為0.618
。increaseLearnRateIfImproveMoreThan
:如果改進大於此值,請增加學習率。 預設值 (1#INF
無限大) 表示永遠不會增加。learnRateIncreaseFactor
:學習速率增加因數。 預設值為1.382
。loadBestModel
:如果目前的模型降低效能,是否要載入最佳模型。 有效值為true
(預設值) 和false
。learnRateAdjustInterval
:判斷套用學習速率調整檢查的頻率。 預設值為1
Epoch。 如果此值設定為大於 1 的值,則學習速率調整會以從最後一learnRateAdjustInterval
個 Epoch 計算的平均準則為基礎。useEvalCriterionControlLR
:使用評估準則而非定型準則來控制學習率。 根據預設,它是 false。
用於 模式時
SearchBeforeEpoch
。numMiniBatch4LRSearch
:用來搜尋學習速率的迷你標籤數目。 預設值為500
。 它通常會設定為 Epoch 中總計的 10-20%。numPrevLearnRate
:作為搜尋範圍提示的先前學習速率數目。 預設值為5
。numBestSearchEpoch
:我們使用最佳學習速率而不是足夠的學習速率的 Epoch 數目。 預設值為1
。
在 'AdaptiveMinibatchSizing' 模式中使用時。
numMiniBatch4LRSearch
:在調適型迷你批次大小模式中,用來搜尋迷你批次大小的迷你標籤數目。 預設值為500
。 它通常會在 Epoch 中設定為 10-20% 的總迷你標籤,這會與搜尋模式中的SearchBeforeEpoch
學習速率共用。autoAdjustMinibatch
:啟用或停用是否調整迷你批次大小。 預設值為false
。 自適性迷你批次調整大小會在 Epoch 開始,從明確指定使用者迷你批次大小完成之後開始。 例如,如果使用者指定的 minibatchSize=256:1024,則會在前 2 個 Epochs 中使用 256 和 1024,之後會使用自適性迷你批次調整大小。minibatchSizeTuningFrequency
:在動態調整迷你批次大小之前,要定期略過的 Epoch 數目。 預設值為1
。minibatchSizeTuningMax
:彈性調整迷你批次大小所允許的大小上限。 預設值為1048576
。
漸層控制項
gradientClippingWithTruncation
:是否要使用截斷型漸層裁剪來控制漸層暴增。 有效值為true
(預設值) 和false
。 如果為 false,則會改用以標準為基礎的裁剪,這比較昂貴。clippingThresholdPerSample
:每個範例的裁剪臨界值。 預設值表示1#INF
無限大 (亦即裁剪關閉) 。L2RegWeight
(預設為 0) :每個樣本的 L2 正規化權數。 可學習參數的 Frobenius 標準會新增至具有此權數的目標。 這會 依樣本指定,這表示 Frobenius norm 會乘以 minibatch 中的樣本數目。L1RegWeight
(預設為 0) :每個樣本的 L1 正規化權數。gradUpdateType
:漸層更新類型。 有效值為None
預設值 (,對漸層) 、AdaGrad
和RmsProp
沒有特殊處理。AdaGrad
等於 或RmsProp
時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
方法時新增的 Gaussian 雜訊標準差。 預設為0
。
資訊顯示
traceLevel
:追蹤層級,決定要在 stderr 中列印出哪些資訊。 有效值為0
(預設值) 和1
。numMBsToShowResult
:在多少迷你batches 之後顯示定型統計資料。 預設為10
。
TensorBoard
tensorBoardNumMBsToLogResult
:將結果記錄到 TensorBoard 之間的迷你解析數目。
漸層檢查
gradientCheck
:判斷是否要使用漸層檢查程式。 預設值是false
。 使用漸層檢查程式時,您需要使用大於 RNN 序列長度的迷你Batch 大小,因為經過時間截斷的反向傳播 (BPTT) 演算法,用來定型 RNN,以及較小的學習速率,以避免因發散所造成的數值問題。 此外,精確度應該設定為 double。
描述
(隨機漸層下降學習模組) 的 SGD 演算法行為是由選項的 SGD 區塊所控制。 省略選項時,會假設預設值。
未明確指定的參數會保留至預設值。
指定資料大小
從其他工具組轉換Learning速率和 Momentum 參數
CNTK的模型更新公式與某些其他工具組有些不同,而且與CNTK中,參數會以與迷你批次大小無關的方式指定。 這在資料平行定型的內容中很重要,CNTK本身可能會修改迷你批次大小。 以無關的方式指定學習速率和動態,可避免在迷你批次大小變更時調整這些值的複雜性。
以下是CNTK以動態顯示之 SGD 的模型更新公式:
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
因為 minibatch 中的序列長度通常不會精確加總到所要求的 minibathSize
.)
您注意到:
- 刻度篩選
G(t)
條件為單位增益。 每個樣本的漸層都會隨著時間分佈,使其總和為 1。 - 每個樣本會指定學習速率,而不是 w.r.t。樣本的平均。
其他工具組和類神經網路文中所使用的規格通常如下:
G'(t) = average { g(t-minibatchSize+1) ... g(t) } + mu * G'(t-minibatchSize)
M(t) = M(t-minibatchSize) + eta G'(t)
取代為
G'
:以替代方式定義的漸層,以每個迷你Batch 平均值 和不含(1-mu)
mu
:針對每個 minibatch套用的非單位增益IIR 篩選準則的 momentum 參數,例如 0.9eta
:使用 minibatch-average 漸層的學習速率
以這種方式指定的參數可以使用下列公式對應至CNTK參數:
learningRatePerSample = eta / minibatchSize / (1-mu)
momentumAsTimeConstant = -minibatchSize / ln (mu)
您將使用 learningRatePerMB
和 接近此專案,其對應方式如下 (請注意,沒有 / (1-mu)
learningRatePerSample
: momentumPerMB
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
}
}