Theano乘以零
Theano multiplying by zero
谁能给我解释一下这两行代码背后的含义: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?看起来它不会以这种方式实现任何目标并保持为零。如果我们只用"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
这只是告诉Theano的一种方式"create a shared variable and initialize its value to be zero in the same shape as p."
这个RMSprop
方法是一个符号方法。它实际上并不计算 RmsProp 参数更新,它只是告诉 Theano 在执行最终的 Theano 函数时应该如何计算参数更新。
如果你往下看 the tutorial code you linked to 你会看到参数更新的符号执行图是由 RMSprop
通过第 67 行的调用构建的。然后这些更新被编译成 Theano在第 69 行的 Python 中调用 train
的函数,并且在第 74 行的第 72 行和第 73 行的 for 循环中多次执行 train 函数。Python 函数 RMSprop
将只被调用一次,不管 train
函数在第 72 行和第 73 行的 for 循环中被调用了多少次。
在 RMSprop
中,我们告诉 Theano,对于每个参数 p
,我们需要一个新的 Theano 变量,其 initial 值具有相同的形状作为 p
并且始终为 0。然后我们继续告诉 Theano 它应该如何更新这个新变量(就 Theano 而言未命名但在 Python 中命名为 acc
)以及如何更新参数 p
本身。这些命令不会改变 p
或 acc
,它们只是告诉 Theano 如何在函数被编译后(第 69 行)稍后更新 p
和 acc
执行时间(第 74 行)。
第 74 行的函数执行 不会 调用 RMSprop
Python 函数,它们执行 RMSprop
的编译版本。编译版本中不会进行初始化,因为 RMSprop 的 Python 版本中已经进行了初始化。 acc_new = rho * acc + (1 - rho) * g ** 2
行的每次 train
执行都将使用 acc
的 当前 值而不是其初始值。
谁能给我解释一下这两行代码背后的含义: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?看起来它不会以这种方式实现任何目标并保持为零。如果我们只用"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
这只是告诉Theano的一种方式"create a shared variable and initialize its value to be zero in the same shape as p."
这个RMSprop
方法是一个符号方法。它实际上并不计算 RmsProp 参数更新,它只是告诉 Theano 在执行最终的 Theano 函数时应该如何计算参数更新。
如果你往下看 the tutorial code you linked to 你会看到参数更新的符号执行图是由 RMSprop
通过第 67 行的调用构建的。然后这些更新被编译成 Theano在第 69 行的 Python 中调用 train
的函数,并且在第 74 行的第 72 行和第 73 行的 for 循环中多次执行 train 函数。Python 函数 RMSprop
将只被调用一次,不管 train
函数在第 72 行和第 73 行的 for 循环中被调用了多少次。
在 RMSprop
中,我们告诉 Theano,对于每个参数 p
,我们需要一个新的 Theano 变量,其 initial 值具有相同的形状作为 p
并且始终为 0。然后我们继续告诉 Theano 它应该如何更新这个新变量(就 Theano 而言未命名但在 Python 中命名为 acc
)以及如何更新参数 p
本身。这些命令不会改变 p
或 acc
,它们只是告诉 Theano 如何在函数被编译后(第 69 行)稍后更新 p
和 acc
执行时间(第 74 行)。
第 74 行的函数执行 不会 调用 RMSprop
Python 函数,它们执行 RMSprop
的编译版本。编译版本中不会进行初始化,因为 RMSprop 的 Python 版本中已经进行了初始化。 acc_new = rho * acc + (1 - rho) * g ** 2
行的每次 train
执行都将使用 acc
的 当前 值而不是其初始值。