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: 새 Epoch가 시작된 후 확인 지점 파일을 유지할지 여부입니다. 유효한 값은 truefalse(기본값)입니다.

  • disableWkInBatchNormal: SGD가 업데이트되는 동안 일괄 처리 정규화의 가중치 감쇠 기간을 사용하도록 설정할지 여부입니다. 유효한 값은 truefalse(기본값)입니다.

  • maxEpochs: 실행할 최대 epoch 수입니다.

  • minibatchSize: minibatchSize에 대해 알아보려면 여기를 클릭하세요.

  • dropoutRate: 학습 절차 중 중 중퇴율입니다. 기본값은 0.0입니다. 0.5*10:0.2와 같은 구문을 사용할 수 있습니다. 즉, 10 epoch에 대해 드롭아웃 속도 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 미니배치 크기의 제약 없이 운동량을 단위 게인 1차 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: 학습 속도 조정 검사를 적용하는 빈도를 결정합니다. 기본값은 epoch입니다 1 . 이 값이 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 Epoch에서 256 및 1024가 사용되고 적응형 미니배치 크기 조정이 나중에 사용됩니다.
      • minibatchSizeTuningFrequency: 미니배치 크기를 동적으로 조정하기 전에 정기적으로 건너뛸 epoch의 수입니다. 기본값은 1여야 합니다.
      • minibatchSizeTuningMax: 적응형으로 조정된 미니배치 크기에 허용되는 최대 크기입니다. 기본값은 1048576여야 합니다.

그라데이션 컨트롤

  • gradientClippingWithTruncation: 잘림 기반 그라데이션 클리핑을 사용하여 그라데이션 폭발을 제어할지 여부입니다. 유효한 값은 true(기본값)와 false입니다. false이면 표준 기반 클리핑이 대신 사용되므로 비용이 더 많이 듭니다.

  • clippingThresholdPerSample: 각 샘플에 대한 클리핑 임계값입니다. 기본값은 1#INF 무한대(즉, 클리핑이 꺼져 있음)를 의미합니다.

  • L2RegWeight (기본값 0): 샘플당 L2 정규화 가중치입니다. 학습 가능한 매개 변수의 Frobenius 표준이 이 가중치를 사용하여 목표에 추가됩니다. 이는 샘플별로 지정됩니다. 즉, Frobenius 표준에 미니배치의 샘플 수를 곱합니다.

  • L1RegWeight (기본값 0): 샘플당 L1 정규화 가중치입니다.

  • gradUpdateType: 그라데이션 업데이트 유형입니다. 유효한 값은 None (기본값, 그라데이션에 대한 특별한 처리 없음) AdaGradRmsProp.

    • 같거나 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로 설정해야 합니다.

Description

SGD 알고리즘(확률적 그라데이션 하강 학습자)의 동작은 옵션의 SGD 블록에 의해 제어됩니다. 옵션을 생략하면 기본값이 가정됩니다.

명시적으로 지정되지 않은 매개 변수는 기본값으로 남아 있습니다.

데이터 크기 지정

다른 도구 키트에서 Learning 비율 및 모멘텀 매개 변수 변환

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)

다음과 같이 매핑되는 사용 및 momentumPerMB을 사용하여 learningRatePerMB 이에 근접하게 됩니다(다음에 대한 learningRatePerSample항목이 / (1-mu) 없음을 확인합니다.)

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