更新theano函数中的参数

时间:2015-07-22 08:42:39

标签: python theano

以这种方式调用时,“更新”参数有什么作用?

f_grad_shared = theano.function([x, mask, y], cost, updates=zgup + rg2up,
                                    name='adadelta_f_grad_shared')

我在theano函数中看到的关于“updates”参数的所有文档都讨论了形式对(共享变量,用于更新共享变量的表达式)。但是,这里只有一个表达式,所以如何知道哪个共享变量已更新?

我猜共享变量在某种程度上是隐含的,但zguprg2up都取决于不同的共享变量:

zipped_grads = [theano.shared(p.get_value() * numpy_floatX(0.),
                              name='%s_grad' % k)
                for k, p in tparams.iteritems()]

running_grads2 = [theano.shared(p.get_value() * numpy_floatX(0.),
                                name='%s_rgrad2' % k)
                  for k, p in tparams.iteritems()]

zgup = [(zg, g) for zg, g in zip(zipped_grads, grads)]
rg2up = [(rg2, 0.95 * rg2 + 0.05 * (g ** 2))
         for rg2, g in zip(running_grads2, grads)]

此代码来自http://deeplearning.net/tutorial/lstm.html

中的lstm.py

由于

1 个答案:

答案 0 :(得分:4)

认为updates应该是键值对的列表(或字典)是正确的,其中键是共享变量,值是描述如何更新相应共享变量的符号表达式。 / p>

这两行创建了对:

zgup = [(zg, g) for zg, g in zip(zipped_grads, grads)]
rg2up = [(rg2, 0.95 * rg2 + 0.05 * (g ** 2))
         for rg2, g in zip(running_grads2, grads)]
在前面的行中创建了

zipped_gradsrunning_grads2,每个只是一个共享变量列表。这里,这些共享变量使用Python zip函数链接到更新,该函数发出一对对列表。实际上,这些行中的第一行可以替换为

zgup = zip(zipped_grads, grads)

这段代码非常复杂,因为它正在实现AdaDelta更新机制。如果您想在更简单的设置中查看updates的工作原理,请查看Theano MLP tutorial中的基本随机梯度下降更新。

updates = [
        (param, param - learning_rate * gparam)
        for param, gparam in zip(classifier.params, gparams)
    ]