共用方式為


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按一下這裡以瞭解 epochSize

  • keepCheckPointFiles:是否要在新的 Epoch 啟動時保留檢查點檔案。 有效值為 truefalse (預設值)。

  • disableWkInBatchNormal:是否要在 SGD 更新時啟用批次正規化的重量衰減詞彙。 有效值為 truefalse (預設值)。

  • maxEpochs:要執行的 Epoch 數目上限。

  • minibatchSize按一下這裡以瞭解 minibatchSize

  • dropoutRate:定型程式期間的卸載率。 預設為 0.0。 可以使用 0.5*10:0.2 之類的語法,這表示針對 10 個 epoch 使用 dropout rate 0.5,然後針對其餘部分使用 0.2。

  • maxTempMemSizeInSamplesForCNN:封裝和解除封裝輸入功能時,) 樣本數目中 (使用的暫存記憶體上限。 預設值為 0,這表示視需要使用任何值。 在 GPU 下執行時,適用于控制記憶體腳印 esp。

  • saveBestModelPerCriterion:將每個準則的最佳模型儲存為交叉驗證資料測量的選項。 當定型結束時,模型會命名為 <modelName>_<criterionName> 。 有效值為 truefalse (預設值)。

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 預設值 (,對漸層) 、 AdaGradRmsProp 沒有特殊處理。

    • AdaGrad等於 或 RmsPropgradUpdateType ,您可以使用下列參數來控制漸層更新的行為:
      • 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.9
  • eta:使用 minibatch-average 漸層的學習速率

以這種方式指定的參數可以使用下列公式對應至CNTK參數:

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

您將使用 learningRatePerMB 和 接近此專案,其對應方式如下 (請注意,沒有 / (1-mu)learningRatePerSamplemomentumPerMB

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
    }
}