【发布时间】:2016-06-01 01:35:26
【问题描述】:
我尝试通过扫描操作手动计算标量成本对权重向量的梯度。然而,这不起作用,并且总是返回 SubTensor 不可微分的错误
为了确保可以计算梯度:
T.grad(cost, p2)
完美运行。这意味着 p2 没有与成本脱节。但是,当我尝试以下操作时:
def differentiate_element(i,p2,c):
p2element=p2[i]
return T.grad(c,p2element)
h2, h2_updates = theano.scan(differentiate_element,
sequences=T.arange(p2.shape[0]), non_sequences=[p2, cost])
我收到错误'theano.gradient.DisconnectedInputError: grad 方法被要求计算一个变量的梯度,该变量不是成本计算图的一部分,或者仅由不可微的运算符使用:子张量{int64}.0'
之前已经有人问过这个问题:Defining a gradient with respect to a subtensor in Theano,但没有得到满意的回答。也就是说,如图所示将 p2[i] 分配给它自己的变量并不能解决问题。
将选项 disconnected_inputs='ignore' 添加到内部循环实际上会消除错误,但不再产生正确的输出,如下面的简短示例所示:
import numpy
import theano
import theano.tensor as T
p2=theano.shared(name="P2",value=numpy.zeros(100,dtype=theano.config.floatX),borrow=True)
x=T.scalar('x')
cost=T.sum(x*p2)
gradient=T.grad(cost,p2)
def differentiate_element(i, p2, c):
p2element = p2[i]
return T.grad(c, p2element, disconnected_inputs='ignore')
gradient2, grad2_updates = theano.scan(differentiate_element,
sequences=T.arange(p2.shape[0]),
non_sequences=[p2, cost])
f=theano.function([x],gradient)
g=theano.function([x],gradient2,updates=grad2_updates)
print(f(20))
print(g(20))
第一个,打印一个包含 20 的数组。第二个打印一个包含 0 的数组。
【问题讨论】:
-
为什么你需要像这样计算梯度而不是在扫描函数之外?如果您有特定的理由这样做,请提供更广泛的代码示例
-
这是一个例子。如果我能够计算粗麻布对角线,这是基本步骤之一。
-
啊,好吧,我明白了,因为它有巨大的计算成本,你只想计算你需要的梯度而不是整个巨大的东西。
标签: theano