为什么在我的程序中发生了真正奇怪的theano.function更新错误?

时间:2016-01-15 13:49:36

标签: python neural-network mathematical-optimization theano gradient-descent

当我使用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的毕业生?

1 个答案:

答案 0 :(得分:0)

我认为“更新”可能存在错误。输入theano.function。

只要计算theano变量x的更新值的函数独立于x定义,似乎就会出现问题。在theano函数的第二次迭代中,即使给共享变量赋予相同的值,它也会搞砸。叹气:(