Theano函数的参数更新采用对列表,其中每对在计算函数输出后指定共享符号变量及其新表达式。 我想知道是否有更新程序的订单。 如果两个符号变量的新表达式相互依赖,则该顺序将很重要,并且更新过程将使用更新的符号变量来更新依赖于它的其他符号变量。 例如,此列表可能如下所示,
[(a, b + a), (b, b+ 1)]
我写了一些函数来测试它。结果似乎表明它总是使用表达式中的旧值(对中的第二项)来更新第一项中的符号变量,即
a_new = b_old + a_old
b_new = b_old + 1
这是一种定义的行为吗?
但是我找到了动力here的实施, 以下是生成更新列表和param_update符号变量的代码
param_update = theano.shared(param.get_value()*0., broadcastable=param.broadcastable)
updates += [(param, param - learning_rate*param_update),
(param_update, momentum * param_update + (1. - momentum)*T.grad(cost, param))
然后在第一次迭代中,param将不会更新,因为param_updates都是零。根据我的理解,应首先更新param_update,然后使用它来更新param。
答案 0 :(得分:7)
对于更新,它始终使用先前的值(Theano函数调用之前的值)。所以你找到了正确的事情。
对于动力,我认为延迟是正常的。