Theano教程中的澄清

7 投票
1 回答
3517 浏览
提问于 2025-04-18 17:40

我正在阅读这个教程,这个教程是在Theano文档的主页上提供的。

我对梯度下降部分的代码有些不太明白。

enter image description here

我对这个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 来进行更新。

撰写回答