我非常困惑cntk中的动量是如何运作的 从文档中我看到有两种方式 1.动量为时间常数
#对所有样品使用1100的固定动量 m = momentum_as_time_constant_schedule(1100)
我在哪里设定动量值? 这种固定动量的价值是什么?
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)
另一种传递动量的方法,但只有一个列表
有人可以帮我理解这个吗?
答案 0 :(得分:4)
一般情况下,请参阅how to use learners上的手册以获取详细说明。复制了与您的问题相关的部分:
momentum_as_time_constant_schedule
是遗留API,时间常数与动量衰减因子之间的关系是
momentum = exp(-minibatch_size / time_constant)
time_constant = minibatch_size / log (1 / momentum)
有关详细说明及其来源,请参阅手册。另请参阅维基页面的时间常数:wikipedia link。
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)
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)
使用费率列表而不是单个数字的含义是它是学习率(动量)时间表而不是单个学习率(或动量):将应用不同的学习率(动量,变量动量)不同的样品:
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。