【问题标题】:confusion about momentum setting in CNTK关于 CNTK 中动量设置的困惑
【发布时间】:2017-09-16 01:30:07
【问题描述】:

我对动量在 cntk 中的工作原理感到非常困惑 从文档中我看到有两种方法 1. 动量作为时间常数

#对所有样本使用1100的固定动量 m = 动量_as_time_constant_schedule(1100)

我在哪里设置动量值? 这个固定动量的价值是多少?

  1. “正常方式”,即:我理解的方式

C.adam(parameters=res.parameters, lr=0.4, motion=0.9, variance_momentum=0.9, minibatch_size=32)

我知道我们可以直接设置参数,但不知何故也有

momentum = momentum_schedule(0.9)

更让我困惑的是,我在 CNTK 的单元测试中看到了这种事情

C.momentum_sgd(parameters=res.parameters, lr=[0.4, 0.1, 0.001], 动量=[0.9], minibatch_size=32, epoch_size=512)

另一种传递动力的方法,但只有一个列表

有人可以帮我理解吗?

【问题讨论】:

    标签: python cntk


    【解决方案1】:

    一般情况下,请参阅我们在how to use learners 上的手册以获取详细说明。复制以下与您的问题相关的部分:

    1. momentum_as_time_constant_schedule 是一个遗留 API,时间常数和动量衰减因子之间的关系是
      • momentum = exp(-minibatch_size / time_constant)
      • time_constant = minibatch_size / log (1 / momentum)

    请参阅手册了解详细说明及其来源。另请参阅有关时间常数的 wiki 页面:wikipedia link

    1. C.adam(parameters=res.parameters, lr=0.4,momentum=0.9, variance_momentum=0.9, minibatch_size=32) 是一种方便的说法:

      lr = C.learning_parameter_schedule(0.4, minibatch_size = 32)
      
      momentum = C.momentum_schedule(0.9, minibatch_size = 32)
      
      var_momentum = C.momentum_schedule(0.9, minibatch_size = 32)
      
      C.adam(prameters=res.parameters, lr = lr, momentum = momentum, var_momentum = var_momentum, minibatch_size = 32)
      
    2. C.momentum_sgd(parameters=res.parameters, lr=[0.4, 0.1, 0.001], momentum=[0.9], minibatch_size=32, epoch_size=512) 是一种方便的说法:

      lr = C.learning_parameter_schedule([0.4, 0.1, 0.001], minibatch_size = 32, , epoch_size=512)
      
      momentum = C.momentum_schedule([0.9], minibatch_size = 32, epoch_size=512)
      
      C.momentum_sgd(parameters=res.parameters, lr = lr, momentum = momentum, minibatch_size = 32, epoch_size=512)
      

    使用速率列表而不是单个数字的含义是它是一个学习率(动量)计划而不是单个学习率(或动量):将应用不同的学习率(动量,var 动量)到不同的样本:

    • 在示例中,0.4 将应用于前 512 个样本; 0.1 将从第 513 个样本应用到第 1024 个样本; 0.001 将从第 1025 个样本应用到第 1536 个样本。
    • 一般情况下,对于列表[p_1, p_2, .., p_n],列表中的第i个参数p_i用作从第(epoch_size * (i-1) + 1)个样本到第(epoch_size * i)个样本的值。如果列表包含对,即[(num_epoch_1, p_1), (num_epoch_n, p_2), .., (num_epoch_n, p_n)],则第i个参数用作从(epoch_size * (num_epoch_0 + ... + num_epoch_2 + ... + num_epoch_(i-1) + 1)-th样本到(epoch_size * num_epoch_i)-th样本的值(以num_epoch_0 = 0作为特殊初始化)。

    详细解释见learning_parameter_schedule

    【讨论】:

      猜你喜欢
      • 2011-07-20
      • 2019-09-13
      • 2020-05-21
      • 2012-09-28
      • 2022-11-26
      • 2018-07-24
      • 1970-01-01
      • 2014-03-21
      • 2012-04-09
      相关资源
      最近更新 更多