你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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
}

parameters

训练过程控制

  • trainCriterionNodeName:训练条件节点的名称。 如果未提供网络中的默认训练条件节点,将使用该节点。

  • evalCriterionNodeName:评估条件节点的名称。 如果未提供网络中的默认评估条件节点,将使用该节点。

  • epochSize单击此处了解 epochSize

  • keepCheckPointFiles:是否要在新纪元开始后保留检查点文件。 有效值为 truefalse(默认值)。

  • disableWkInBatchNormal:是否启用批量规范化的重量衰减术语,同时对SGD进行更新。 有效值为 truefalse(默认值)。

  • maxEpochs:要运行的最大纪元数。

  • minibatchSize单击此处了解 minibatchSize

  • dropoutRate:训练过程中的退出率。 默认值为 0.0。 可以使用语法(如 0.5*10:0.2),这意味着对 10 个时期使用 0.5,其余时间使用 0.2。

  • maxTempMemSizeInSamplesForCNN:打包和解压缩输入功能时) 样本数中 (使用的最大临时内存。 默认值为 0,这意味着根据需要使用任何值。 在 GPU 下运行时,用于控制内存页脚打印 esp。

  • saveBestModelPerCriterion:用于将每个条件的最佳模型保存为交叉验证数据测量的选项。 训练结束模型命名 <modelName>_<criterionName>时。 有效值为 truefalse(默认值)。

Learning速率和动量控制

请注意,CNTK指定学习速率和势头的方式与其他工具包不同。 有关详细说明,请参阅此处

  • learningRatesPerSample:每个样本的渐变更新模型的每纪元的学习速率。 可以将不同的值用于不同的纪元,例如 0.025*10:0.00625 表示对前 10 个时期使用学习速率 0.025,其余时间使用 0.00625。 这是在CNTK中指定的首选方法,因为它指定与微型batch 大小无关的学习速率,在使用自动小块大小时,这一点很重要。 其他工具包通常以迷你Batch平均方式指定学习速率。 若要从该表示法转换,请使用每个样本的学习速率 = 每 MB/ minibatchSize (学习速率 ,请参阅此处 以获取更多详细信息) 。

  • learningRatesPerMB:指定学习速率的替代方法,以应用于小样本中的 样本的平均值 。 这是在其他工具包中指定学习速率的最常见方法,但在CNTK数据并行训练中存在问题,后者修改了迷你小块大小。 在内部,这将通过将值除以指定的“minibatchSize”来转换为 learningRatesPerSample 此值。 相互 learningRatesPerSample排斥。

  • minLearningRatePerSample:每个样本的最小学习速率。 当每个样本的学习速率小于此值时,训练过程将终止。 这通常用于控制启用自动学习速率调整时提前停止。 默认值为 1e-9。

  • momentumAsTimeConstant:与learningratesPerSampleCNTK类似,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% 的总小型巴托在 epoch 中,这是与在 SearchBeforeEpoch 模式下搜索学习速率共享的。
      • autoAdjustMinibatch:启用或禁用是否自适应调整小包大小。 默认值是 false。 在显式指定用户微分量大小后,自适应小块大小将在纪元开始。 例如,如果用户指定的 minibatchSize=256:1024,则前 2 个 Epochs 中使用 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

    • 如果 gradUpdateType 等于 AdaGrad 或等于, RmsProp可以使用以下参数控制渐变更新的行为:
      • normWithAveMultiplier:使用 AdaGrad/RmsProp 算法应用于渐变的平均乘数规范化渐变。 默认值为 true 默认) (。
    • 等于RmsPropgradUpdateType,可以使用以下参数控制渐变更新的行为:
      • 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 序列长度的小型batch 大小,因为通过时间截断的反向传播 (BPTT) 算法来训练 RNN,以及较小的学习速率,以防止因分歧导致的数值问题。 此外,精度应设置为双精度。

说明

ST 算法的行为 (随机梯度下降学习器) 由选项的 SGD 块控制。 如果省略某个选项,则假定默认值。

未显式指定的参数将保留为默认值。

指定数据大小

从其他工具包转换Learning速率和动量参数

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 因为小批中的序列长度通常不会精确汇总到请求 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:动量参数(例如,0.9)的非单位增益 IIR 筛选器,按小块应用
  • eta:使用微型batch-average 渐变的学习速率

通过此方法指定的参数可以使用以下公式映射到CNTK参数:

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

You will get close to this by using learningRatePerMB and momentumPerMB, which are mapped as follows (notice the absence of / (1-mu) for 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
    }
}