Sun*_*y88 0 theano deep-learning
任何人都可以向我解释这两行代码背后的含义是什么: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
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?为什么我们将acc实例化为零,然后在下一行中将它乘以rho?看起来它不会以这种方式实现任何目标并且保持为零.如果我们用"acc"替换"rho*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
Run Code Online (Sandbox Code Playgroud)
这只是告诉Theano"创建一个共享变量并将其值初始化为与p相同形状的零"的一种方法.
这种RMSprop方法是一种符号方法.它实际上并不计算RmsProp参数更新,它只告诉Theano如何在执行最终的Theano函数时计算参数更新.
如果你仔细查看你链接到的教程代码,你会看到参数更新的符号执行图是RMSprop通过第67行的调用构建的.然后这些更新被编译成train第69行的Python中调用的Theano函数.在第72行和第73行的for循环中,第74行执行train函数多次.Python函数RMSprop只调用一次,而不管train函数在第72行和第73行的for循环中调用了多少次.
在内部RMSprop,我们告诉Theano,对于每个参数p,我们需要一个新的Theano变量,其初始值具有相同的形状,p并且始终为0. 然后我们继续告诉Theano它应该如何更新这个新变量(就Theano而言尚未命名acc,但在Python中命名)以及如何更新参数p本身.这些命令不会改变它们,p或者acc它们只是在每次执行函数编译(第69行)后告诉Theano如何p以及之后acc应该更新(第74行).
第74行的函数执行不会调用RMSpropPython函数,它们执行的编译版本RMSprop.编译版本内部不会进行初始化,因为这已经发生在RMSprop的Python版本中.每次train执行该行都acc_new = rho * acc + (1 - rho) * g ** 2将使用当前值而acc不是其初始值.