我正在阅读this tutorial
上提供的home page of Theano documentation我不确定梯度下降部分给出的代码。
我对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)))
为什么我们需要它?
我想我在这里弄错了。 你们能帮助我吗?
答案 0 :(得分:15)
使用param_update
初始化theano.shared(.)
只会告诉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的渐变。 param
根据动量规则将param_update
更新为新的更新方向。然后,param
将按照param_update
中保存的更新方向与适当的learning_rate
进行更新。