Theano教程中的澄清
我正在阅读这个教程,这个教程是在Theano文档的主页上提供的。
我对梯度下降部分的代码有些不太明白。
我对这个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)))
那我们为什么还需要这个变量呢?
我觉得我可能理解错了什么。你们能帮帮我吗!
1 个回答
15
使用 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
关于 param
的梯度,并根据动量规则更新 param_update
的新方向。然后,param
会根据 param_update
中保存的更新方向,以及合适的 learning_rate
来进行更新。