当我使用adadelta时,我发现我的模型出错了,这个实现如下:
def adadelta(cost, params, learning_rate = 0.012, rho = 0.95):
grads = T.grad(cost, params)
accumulators = [theano.shared(np.array(np.zeros(p.get_value().shape), dtype=theano.config.floatX)) for p in params] # @UndefinedVariable
delta_accumulators = [theano.shared(np.array(np.zeros(p.get_value().shape), dtype=theano.config.floatX)) for p in params] # @UndefinedVariable
updates = []
for p, g, a, d in zip(params, grads, accumulators, delta_accumulators):
a_new = rho*a +(1-rho)* g ** 2
updates.append((a, a_new)) # @UndefinedVariable
delta = - learning_rate*g *T.sqrt(d+0.000001)/ T.sqrt(a_new + 0.000001)
p_new = p + delta
updates.append((p, p_new)) # @UndefinedVariable
updates.append((d,rho*d +(1-rho)* delta ** 2 ))
return updates
经过几个更新的时代,这些参数变成了纳米。但是,如果我只使用这样的简单梯度下降:
def simple_gd(cost, params, learning_rate = 0.012):
grads = T.grad(cost, params)
updates = [(param, param - learning_rate * grad) for param, grad in zip(params, grads)]
return updates
它没有出错。
最奇怪的是,如果我将thegrads添加到theano.function的输出中,就像这样:
grads = T.grad(cost, params)
outputs.extend(grads)
adadelta也不会出错。
当我设置优化器为None时,问题也不存在
有什么问题?垃圾收集者是否收集了adadelta的毕业生?
答案 0 :(得分:0)
我认为“更新”可能存在错误。输入theano.function。
只要计算theano变量x的更新值的函数独立于x定义,似乎就会出现问题。在theano函数的第二次迭代中,即使给共享变量赋予相同的值,它也会搞砸。叹气:(