有人可以向我解释这两行代码背后的含义是什么:https://github.com/Newmu/Theano-Tutorials/blob/master/4_modern_net.py
acc = theano.shared(p.get_value() * 0.)
acc_new = rho * acc + (1 - rho) * g ** 2
这是一个错误吗?为什么我们将acc实例化为零,然后在下一行中将它乘以rho?看起来它不会以这种方式实现任何目标并且保持为零。如果我们更换" rho * acc"会有什么不同吗?只是" acc"?
完整功能如下:
def RMSprop(cost, params, lr=0.001, rho=0.9, epsilon=1e-6):
grads = T.grad(cost=cost, wrt=params)
updates = []
for p, g in zip(params, grads):
acc = theano.shared(p.get_value() * 0.)
acc_new = rho * acc + (1 - rho) * g ** 2
gradient_scaling = T.sqrt(acc_new + epsilon)
g = g / gradient_scaling
updates.append((acc, acc_new))
updates.append((p, p - lr * g))
return updates
答案 0 :(得分:5)
这只是一种告诉Theano"创建共享变量并将其值初始化为零的方式与p 相同的形状。"
此RMSprop
方法是符号方法。它实际上并不计算RmsProp参数更新,它只告诉Theano如何在执行最终的Theano函数时计算参数更新。
如果你向下看the tutorial code you linked to,你会看到参数更新的符号执行图由RMSprop
通过第67行的调用构建。然后将这些更新编译成Theano在第69行的Python中调用了train
函数,并且在第72行和第73行的for循环中第74行执行了train函数.Python函数RMSprop
只会被调用一次,无论如何很多时候,在第72和73行的for循环中调用train
函数。
在RMSprop
内,我们告诉Theano,对于每个参数p
,我们需要一个新的Theano变量,其初始值与{{1}具有相同的形状并且始终为0.然后我们继续告诉Theano如何更新这个新变量(就Theano而言尚未命名但在Python中命名为p
)以及如何更新参数acc
本身。这些命令不会改变p
或p
,一旦函数编译完成(第69行),它们只会告诉Theano以后应该如何更新acc
和p
它被执行的时间(第74行)。
第74行的函数执行将不调用acc
Python函数,它们执行RMSprop
的编译版本。编译版本内部不会进行初始化,因为这已经发生在RMSprop的Python版本中。行RMSprop
的每次train
执行都将使用acc_new = rho * acc + (1 - rho) * g ** 2
的当前值而不是其初始值。