对CNTK动量设定的困惑

时间:2017-09-16 01:30:07

标签: python cntk

我非常困惑cntk中的动量是如何运作的 从文档中我看到有两种方式 1.动量为时间常数

  

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

我在哪里设定动量值? 这种固定动量的价值是什么?

  1. 正常方式'即:我理解的那个
  2.   

    C.adam(参数= res.parameters,lr = 0.4,动量= 0.9 ,variance_momentum = 0.9,minibatch_size = 32)

    我看到我们可以直接设置参数但不知何故还有

      

    动量= momentum_schedule(0.9)

    对我来说更加困惑我在CNTK的单元测试中看到了这种东西

      

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

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

    有人可以帮我理解这个吗?

1 个答案:

答案 0 :(得分:4)

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

  1. momentum_as_time_constant_schedule是遗留API,时间常数与动量衰减因子之间的关系是
    • momentum = exp(-minibatch_size / time_constant)
    • time_constant = minibatch_size / log (1 / momentum)
  2. 有关详细说明及其来源,请参阅手册。另请参阅维基页面的时间常数:wikipedia link

    1. C.adam(参数= res.parameters,lr = 0.4,动量= 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)
      
    3. 使用费率列表而不是单个数字的含义是它是学习率(动量)时间表而不是单个学习率(或动量):将应用不同的学习率(动量,变量动量)不同的样品:

      • 在示例中,0.4将应用于前512个样本;从第513个样本到第1024个样本将应用0.1; {10}将从第1025个样本到第1536个样本应用0.001
      • 通常,使用列表[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)个样本到(epoch_size * num_epoch_i)个样本的值(将num_epoch_0 = 0视为{{1}}一个特殊的初始化)。

      有关详细说明,请参阅learning_parameter_schedule