【问题标题】:Clarification in the Theano tutorialTheano 教程中的说明
【发布时间】:2014-10-11 13:50:09
【问题描述】:

我正在阅读home page of Theano documentation上提供的this tutorial

我不确定梯度下降部分给出的代码。

我对 for 循环有疑问

如果您将 'param_update' 变量初始化为零。

param_update = theano.shared(param.get_value()*0., broadcastable=param.broadcastable)

然后在剩下的两行中更新它的值。

updates.append((param, param - learning_rate*param_update))
updates.append((param_update, momentum*param_update + (1. - momentum)*T.grad(cost, param)))

我们为什么需要它?

我想我在这里弄错了。 你们能帮帮我吗!

【问题讨论】:

  • 'and you dun 在剩下的两行中更新它的值是什么?什么意思?
  • 能否请您添加代码而不是屏幕截图?
  • 这里的梯度下降部分:nbviewer.ipython.org/github/craffel/theano-tutorial/blob/master/… 我的意思是你在我提供的第一个代码行中初始化 param_update,而你不需要在上面给出的剩余两个代码行中更新。下次我会尝试添加代码!

标签: python numpy theano gradient-descent deep-learning


【解决方案1】:

使用theano.shared(.) 初始化param_update 只告诉Theano 保留一个将由Theano 函数使用的变量。此初始化代码只调用一次,以后将不会使用将param_update的值重置为0。

param_update的实际值会根据最后一行更新

updates.append((param_update, momentum*param_update + (1. - momentum)*T.grad(cost, param)))

train 函数通过将此更新字典作为参数构造时(本教程中的 [23]):

train = theano.function([mlp_input, mlp_target], cost,
                        updates=gradient_updates_momentum(cost, mlp.params, learning_rate, momentum))

每次调用train,Theano 都会计算cost w.r.t 的梯度。 paramparam_update 根据动量规则更新到新的更新方向。然后,param 将按照保存在param_update 中的更新方向进行更新,并带有适当的learning_rate

【讨论】: