Aracılığıyla paylaş


BrainScript SGD Bloğu

SGD yapılandırma bloğu, CNTK SGD (Stokastik Gradyan Azalma) algoritmasının davranışını denetler. Diğer araç setlerini biliyorsanız

SGD yapılandırma bloğu aşağıdaki yapıya ve varsayılan değerlere sahiptir:

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
}

Parametreler

Eğitim süreci denetimi

  • trainCriterionNodeName: eğitim ölçütü düğümünün adı. Sağlanmadıysa ağdaki varsayılan eğitim ölçütü düğümü kullanılır.

  • evalCriterionNodeName: değerlendirme ölçütü düğümünün adı. Sağlanmadıysa ağdaki varsayılan değerlendirme ölçütü düğümü kullanılır.

  • epochSize: epochSize hakkında bilgi edinmek için buraya tıklayın

  • keepCheckPointFiles: Yeni bir dönem başladıktan sonra denetim noktası dosyasını tutmak isteyip istemediğiniz. Geçerli değerler ve false (varsayılan) değerleridirtrue.

  • disableWkInBatchNormal: SGD güncelleştirmeleri sırasında toplu normalleştirmenin ağırlık bozulması teriminin etkinleştirilip etkinleştirilmeyileceği. Geçerli değerler ve false (varsayılan) değerleridirtrue.

  • maxEpochs: çalıştırılacak en fazla dönem sayısı.

  • minibatchSize: minibatchSize hakkında bilgi edinmek için buraya tıklayın

  • dropoutRate: eğitim yordamı sırasında bırakma oranı. 0.0 varsayılan değerdir. 0,5*10:0.2 gibi söz dizimini kullanabilir; bu, 10 dönem için bırakma oranı 0,5 ve geri kalanlar için 0,2 anlamına gelir.

  • maxTempMemSizeInSamplesForCNN: Giriş özelliklerini paketleme ve paketlemeyi açma sırasında kullanılan en fazla geçici bellek (örnek sayısı olarak). Varsayılan değer 0'dır ve gerektiğinde herhangi bir değerin kullanılması anlamına gelir. GPU altında çalıştırıldığında bellek ayak izi esp.'sini denetlemek için kullanışlıdır.

  • saveBestModelPerCriterion: çapraz doğrulama verilerinde ölçülen her ölçüt için en iyi modeli kaydetme seçeneği. Eğitim sona erdiğinde modeller olarak adlandırılır <modelName>_<criterionName>. Geçerli değerler ve false (varsayılan) değerleridirtrue.

hız ve momentum denetimi Learning

CNTK öğrenme hızlarını ve momentumu belirtme şeklinin diğer araç setlerinden farklı olduğunu unutmayın. Ayrıntılı bir açıklama için buraya bakın.

  • learningRatesPerSample: her bir örneğin gradyanlarının modeli güncelleştirdiği dönem başına öğrenme oranları. Farklı dönemler için farklı değerler kullanabilirsiniz; örneğin, 0,025*10:0,00625, ilk 10 dönem için 0,025 ve geri kalan dönemler için 0,00625 öğrenme hızını kullanmak anlamına gelir. Bu, CNTK'de belirtmenin tercih edilen yoludur, çünkü otomatik minibatch boyutlandırma kullanıldığında önemli olan minibatch boyutuna göre belirsiz öğrenme oranlarını belirtir. Diğer araç setleri genellikle öğrenme oranlarını minibatch ortalaması olan bir şekilde belirtir. Bu gösterimi dönüştürmek için örnek başına öğrenme hızı = MB / minibatchSize başına öğrenme hızı kullanın (daha fazla ayrıntı için buraya bakın ).

  • learningRatesPerMB: minibatch'teki örneklerin ortalamasına uygulanacak öğrenme oranlarını belirtmenin alternatif yolu. Bu, diğer araç setlerinde öğrenme oranlarını belirtmenin en yaygın yoludur, ancak minibatch boyutunu değiştiren veri paralel eğitiminin CNTK'lerde sorunludur. Dahili olarak, değerler belirtilen 'minibatchSize' değerine bölünerek bu değere learningRatesPerSample dönüştürülür. ile learningRatesPerSamplekarşılıklı olarak dışlama.

  • minLearningRatePerSample: örnek başına minimum öğrenme oranı. Örnek başına öğrenme oranı bu değerden küçük olduğunda eğitim işlemi sonlandırılır. Bu genellikle otomatik öğrenme hızı ayarı etkinleştirildiğinde erken durdurmayı denetlemek için kullanılır. Varsayılan değer 1e-9'dır.

  • momentumAsTimeConstant: benzer şekildelearningratesPerSample, CNTK bir birim kazanç 1. sıra IIR filtresinin zaman sabiti olarak (örneklerde) minibatch boyutunda belirsiz bir şekilde momentum belirtir. değeri, bir gradyanın %1/e=37 etkisine sahip olduğu örnek sayısını belirtir. Diğer araç setleri genellikle minibatch başına ağırlık olarak momentum belirtir (örneğin, 0,9). Bunu dönüştürmek için kullanın momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB). 20000*10:2500 gibi bir söz dizimi kullanabilirsiniz; bu, 10 dönem için momentum time sabiti 20000 ve geri kalanı için 2500 anlamına gelir.

  • momentumPerMB: momentum belirtmenin bu alternatif yolu, ortak araç setlerinin davranışını taklit eder. Örneğin 0,9 değerinin belirtilmesi, önceki gradyanın 0,9 ağırlıkla korunacağı anlamına gelir. Bununla birlikte, diğer bazı araç setlerinden farklı olarak CNTK birim kazanç filtresi kullanmaya devam ettiğini, örneğin yeni gradyanın ile (1-momentumPerMB)çarpılacağını unutmayın. Dahili olarak, bu içine dönüştürülür momentumAsTimeConstant = -minibatchSize / ln (momentumPerMB).

  • autoAdjust: otomatik öğrenme hızı denetimiyle ilgili bilgileri içerir. Varsayılan değer boş (""), otomatik öğrenme hızı denetimi olmadığı anlamına gelir. Bloğun içinde aşağıdaki değerler olabilir:

    • autoAdjustLR: kullanılacak otomatik öğrenme hızı ayarlama algoritması. Geçerli değerler şunlardır None (varsayılan, öğrenme hızını otomatik olarak ayarlama), AdjustAfterEpoch (eğitim kümesinin geliştirme kümesini kullanarak her dönem sonrasında eğitim ölçütlerini kontrol edin ve öğrenme oranını ayarlayıp ayarlamamaya karar verin) ve SearchBeforeEpoch (her dönem başlamadan önce eğitim kümesinin küçük bir bölümünü temel alarak öğrenme hızını arayın).

    • Modda AdjustAfterEpoch kullanıldığında:

      • reduceLearnRateIfImproveLessThan: İyileştirme bu değerden küçükse öğrenme oranını azaltın. 0 varsayılan değerdir.
      • learnRateDecreaseFactor: öğrenme hızı düşüş faktörü. Varsayılan değer 0.618 olarak belirlenmiştir.
      • increaseLearnRateIfImproveMoreThan: geliştirme bu değerden büyükse öğrenme oranını artırın. Varsayılan değer (sonsuz) değeridir 1#INF ve hiçbir zaman artmama anlamına gelir.
      • learnRateIncreaseFactor: öğrenme hızı artış faktörü. Varsayılan değer 1.382 olarak belirlenmiştir.
      • loadBestModel: Geçerli model performansı düşürürse en iyi modelin yüklenip yüklenmeyeceği. Geçerli değerler (varsayılan) ve falsedeğerleridir true .
      • learnRateAdjustInterval: Öğrenme hızı ayarlama denetiminin uygulanma sıklığını belirler. Varsayılan dönemdir 1 . Bu değer 1'den büyük bir değere ayarlanırsa öğrenme oranı ayarlaması, son learnRateAdjustInterval dönemlerden hesaplanan ortalama ölçüte göre hesaplanır.
      • useEvalCriterionControlLR: Öğrenme oranını denetlemek için eğitim ölçütü yerine değerlendirme ölçütlerini kullanın. Varsayılan olarak false'tur.
    • Modda SearchBeforeEpoch kullanıldığında.

      • numMiniBatch4LRSearch: öğrenme oranını aramak için kullanılan minibatches sayısı. Varsayılan değer 500 olarak belirlenmiştir. Genellikle bir dönem içindeki toplam minibatların %10-20'sine ayarlanır.
      • numPrevLearnRate: arama aralığı için ipucu olarak kullanılan önceki öğrenme oranlarının sayısı. Varsayılan değer 5 olarak belirlenmiştir.
      • numBestSearchEpoch: yeterli öğrenme oranı yerine en iyi öğrenme oranını kullandığımız dönemlerin sayısı. Varsayılan değer 1 olarak belirlenmiştir.
    • 'AdaptiveMinibatchSizing' modunda kullanıldığında.

      • numMiniBatch4LRSearch: uyarlamalı minibatch boyut modunda minibatch boyutunu aramak için kullanılan minibatches sayısı. Varsayılan değer 500 olarak belirlenmiştir. Genellikle, moddaki öğrenme oranı araması ile paylaşılan bir dönemdeki toplam küçük harflerden %10-20'sine SearchBeforeEpoch ayarlanır.
      • autoAdjustMinibatch: minibatch boyutunun uyarlamalı olarak ayarlanıp ayarlanmadığını etkinleştirin veya devre dışı bırakın. Varsayılan değer false olarak belirlenmiştir. Uyarlamalı minibatch boyutlandırması, açıkça belirtilen kullanıcı minibatch boyutları tamamlandıktan sonra başlayan dönemlerde başlar. Örneğin, kullanıcı minibatchSize=256:1024'i belirttiyse, ilk 2 Dönem'de 256 ve 1024 kullanılır ve daha sonra uyarlamalı minibatch boyutlandırması kullanılır.
      • minibatchSizeTuningFrequency: Minibatch boyutunu dinamik olarak ayarlamadan önce düzenli aralıklarla atlanması gereken dönem sayısı. Varsayılan değer 1 olarak belirlenmiştir.
      • minibatchSizeTuningMax: Uyarlamalı olarak ayarlanmış bir minibatch boyutu için izin verilen en büyük boyut. Varsayılan değer 1048576 olarak belirlenmiştir.

Gradyan denetimi

  • gradientClippingWithTruncation: Gradyan patlamasını denetlemek için kesme tabanlı gradyan kırpmasının kullanılıp kullanılmayacağını gösterir. Geçerli değerler (varsayılan) ve falsedeğerleridir true . Yanlış ise, daha pahalı olan norm tabanlı kırpma kullanılır.

  • clippingThresholdPerSample: her örnek için kırpma eşiği. Varsayılan değer, 1#INF sonsuzluk anlamına gelir (kırpma kapalıdır).

  • L2RegWeight (varsayılan 0): Örnek başına L2 düzenlileştirme ağırlığı. Öğrenilebilir parametrenin Frobenius normu bu ağırlıkla hedefe eklenir. Bu örnek başına belirtilir, yani Frobenius normu minibatch'teki örnek sayısıyla çarpılır.

  • L1RegWeight (varsayılan 0): Örnek başına L1 düzenlileştirme ağırlığı.

  • gradUpdateType: gradyan güncelleştirme türü. Geçerli değerler şunlardır None (varsayılan, gradyan için özel işlem yoktur), AdaGradve RmsProp.

    • veya RmsPropdeğerine eşit AdaGrad olduğundagradUpdateType, aşağıdaki parametreleri kullanarak gradyan güncelleştirmesinin davranışını denetleyebilirsiniz:
      • normWithAveMultiplier: AdaGrad/RmsProp algoritması tarafından gradyanlara uygulanan ortalama çarpanlarla gradyanı normalleştirin. Varsayılan değerdir true (varsayılan).
    • değerine eşit RmsPropolduğundagradUpdateType, aşağıdaki parametreleri kullanarak gradyan güncelleştirmesinin davranışını denetleyebilirsiniz:
      • rms_wgt_inc: Öğrenme hızı ölçeğinin çarpımlı artışı. 1.2 varsayılan değerdir.
      • rms_wgt_dec: Öğrenme hızı ölçeğinin çarpımlı olarak azalması. 0.75 varsayılan değerdir.
      • rms_wgt_max: maksimum öğrenme hızı ölçeğine izin verilir. 1'e yakın bir değer, öğrenme hızı ayarlamasını daha kararlı ancak daha yavaş hale getirir. 10 varsayılan değerdir.
      • rms_wgt_min: minimum öğrenme hızı ölçeğine izin verilir. 1'e yakın bir değer, öğrenme hızı ayarlamasını daha kararlı ancak daha yavaş hale getirir. 0.1 varsayılan değerdir.
      • rms_gamma: Varyansın hareketli ortalamasını tahmin etmek için kullanılan düzeltme faktörü. Değer ne kadar küçük olursa, geçmiş bilgileri o kadar hızlı unutur. 0.99 varsayılan değerdir.
  • gaussianNoiseInjectStd: Yaklaşım kullanılırken eklenen Gauss kirliliğinin AdaGrad standart sapması. 0 varsayılan değerdir.

Bilgi ekranı

  • traceLevel: stderr'de hangi bilgilerin yazdırılacağını belirlemek için izleme düzeyi. Geçerli değerler şunlardır 0 : (varsayılan) ve 1.

  • numMBsToShowResult: Kaç küçük harften sonra eğitim istatistiklerini görüntüleyin. 10 varsayılan değerdir.

TensorBoard

  • tensorBoardNumMBsToLogResult: Sonuçları TensorBoard'a kaydetme arasındaki minibatches sayısı.

Gradyan Denetimi

  • gradientCheck: gradyan denetleyicisinin kullanılıp kullanılmayacağını belirler. false varsayılan değerdir. Gradyan denetleyicisini kullanırken, RNN'leri eğitmek için kullanılan zaman (BPTT) algoritmasından dolayı RNN'ler için sıra uzunluğundan daha büyük bir minibatch boyutu ve ayrıklıklardan kaynaklanan sayısal sorunları önlemek için daha küçük bir öğrenme hızı kullanmanız gerekir. Buna ek olarak, duyarlık iki katına ayarlanmalıdır.

Description

SGD algoritmasının davranışı (Stokastik Gradyan Azalma Öğrenicisi) seçeneklerin SGD bloğu tarafından denetlenmektedir. Bir seçenek atlandığında varsayılan değer varsayılır.

Açıkça belirtilmeyen parametreler varsayılan değerlere bırakılır.

Veri boyutlarını belirtme

Learning Hızı ve Momentum Parametrelerini Diğer Araç Setlerinden Dönüştürme

CNTK'in model güncelleştirme formülleri, bazı diğer araç setlerinden ve literatürden biraz farklıdır, bu CNTK parametreler minibatch boyutundan bağımsız bir şekilde belirtilir. Bu, CNTK minibatch boyutunu değiştirebileceği veri paralel eğitimi bağlamında önemlidir. Öğrenme hızını ve ivmesini belirsiz bir şekilde belirtmek, minibatch boyutundaki değişikliklerden sonra bu değerleri ayarlamanın karmaşıklıklarını önler.

Bunlar CNTK SGD için momentum ile model güncelleştirme formülleridir:

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)

örneklerini şununla değiştirin:

  • G(t): örneklerden sonra t momentum yumuşatılmış gradyan
  • g(t'): zamandaki örneğin ham gradyanı t'
  • M(t): örnekleri gördükten t sonra kullanılan model.
  • t adımlarını artırma minibatchSize

(Not: Değişken uzunlukta diziler kullanılırken, minibathSize minibatch'teki sıra uzunlukları genellikle istenene minibathSizetam olarak toplamadığından biraz dalgalanır.)

Şunu fark edeceksiniz:

  • Momentum filtresi G(t) birim kazancıdır. Her örneğin gradyanı zaman içinde dağıtılır ve toplamları 1 olur.
  • Öğrenme oranı, örnek başına ortalama olarak w.r.t. yerine belirtilir.

Diğer araç setlerinde ve sinir ağı literatüründe kullanılan belirtim genellikle şu şekildedir:

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

örneklerini şununla değiştirin:

  • G': Gradyan, minibatch başına ortalama olarak ve olmadan alternatif bir şekilde tanımlanır (1-mu)
  • mu: momentum parametresi, örneğin birim kazançsız IIR filtresinin 0,9 değeri, minibatch başına uygulanır
  • eta: minibatch-average gradyan ile öğrenme hızı

Bu şekilde belirtilen parametreler şu formüller kullanılarak CNTK parametrelerle eşlenebilir:

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

aşağıdaki gibi eşlenen ve momentumPerMBkullanarak learningRatePerMB buna yaklaşacaksınız (için learningRatePerSampleyokluğuna / (1-mu) dikkat edin:

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

Örnek

ImageHandsOn öğreticisi tarafından veri paralelliği ve otomatik minibatch ölçeklendirme ile kullanılan yapılandırma:

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