Theano乘以零

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)

Dan*_*haw 5

这只是告诉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不是其初始值.