【问题标题】:The update order of theano function's update listtheano函数更新列表的更新顺序
【发布时间】:2016-10-16 21:18:07
【问题描述】:

Theano 函数的参数更新采用一对列表,其中每对指定一个共享符号变量及其计算函数输出后的新表达式。 我想知道更新程序是否有任何顺序。 如果两个符号变量的新表达式相互依赖,则顺序很重要,并且更新过程将使用更新的符号变量来更新依赖它的其他符号变量。 例如,此列表可能如下所示,

[(a, b + a), (b, b+ 1)]

我写了一些函数来测试这个。结果似乎表明它总是使用表达式中的旧值(对中的第二项)来更新第一项中的符号变量,即

 a_new = b_old + a_old
 b_new = b_old + 1

这是一种已定义的行为吗?

但是我找到了momentum 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。

【问题讨论】:

    标签: function updates theano


    【解决方案1】:

    对于更新,它总是使用之前的值(Theano 函数调用之前的值)。所以你找到了正确的东西。

    对于动量,我认为有延迟是正常的。

    【讨论】:

    • 我对延迟感到困惑。对于 Nestrov 动量,我认为它应该使用当前时刻速度来更新权重:v(t) = mu x v(t-1) - eta x gradient(t-1),然后 w(t) = w( t-1) + mu x vt - eta x 梯度(t-1)。所以我认为更新应该应用顺序操作?
    • 您可以假设所有操作分 3 步完成。首先从所有共享变量中读取。然后所有的计算都完成了。然后全部写入。共享变量是否保存以前的值,并且您计算共享变量 X 的当前值并且需要共享变量的当前值进行其他计算,您应该使用 not 共享变量表示当前 x。
    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 2012-05-21
    • 2021-04-23
    • 2012-11-14
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多