2015-05-31 33 views
0

乘以任何人能向我解释什么是从这里开始的这两行代码背后的含义:https://github.com/Newmu/Theano-Tutorials/blob/master/4_modern_net.pyTheano零

acc = theano.shared(p.get_value() * 0.) 
    acc_new = rho * acc + (1 - rho) * g ** 2 

是不是一个错误?为什么我们实例化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 

回答

5

这仅仅是一个方式告诉Theano“创建一个共享变量和初始化它的值为零相同的形状为p”。

这个RMSprop方法是符号方法。它实际上并不计算RmsProp参数更新,它只是告诉Theano如何在最终的Theano函数执行时计算参数更新。

如果你还看不起the tutorial code you linked to你会看到的参数更新的符号执行图形由RMSprop通过调用构造线67.这些更新,然后编译成Python中叫train上线69和Theano功能在第72行和第73行的for循环内第74行执行许多次列车函数。Python函数RMSprop将只被调用一次,而不管在第72行和第73行的for循环中调用train函数多少次。

RMSprop之内,我们告诉Theano,对于每个参数p,我们需要一个新的Theano变量,它的初始值值的形状与p相同,且始终为0。然后,我们继续告诉Theano它应该如何更新这个新变量(就Theano而言,未命名但在Python中命名为acc)以及如何更新参数p本身。这些命令不会改变pacc,它们只是告诉Theano如何在以后更新pacc,一旦该函数每次执行(行74)时已编译(第69行)。

74行的函数的执行将不会电话RMSprop Python函数,它们执行的RMSprop编译版本。在编译后的版本中不会进行初始化,因为已经发生在Python版本的RMSprop中。每行train执行行acc_new = rho * acc + (1 - rho) * g ** 2将使用当前acc而不是其初始值。