Theano乘以零

时间:2015-05-31 14:19:30

标签: 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

这是一个错误吗?为什么我们将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

1 个答案:

答案 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本身。这些命令不会改变pp,一旦函数编译完成(第69行),它们只会告诉Theano以后应该如何更新accp它被执行的时间(第74行)。

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