如果在扫描内部或外部进行计算,则theano.scan输出梯度是不同的

时间:2016-06-12 10:15:39

标签: python theano

所以我有以下代码

def step(i, rng, prev, A, B):
    a = A*prev
    b = B*a
    return b, a, a+rng

rng = RandomStreams(lasagne.random.get_rng().randint(1,2147462579))

A = T.scalar("A")
B = T.scalar("B")

outputs, _ = theano.scan(step, 
                         sequences=[T.arange(1,5),rng.normal([4])], 
                         outputs_info=[T.ones_like(A),None, None], 
                         non_sequences=[A,B])
res, re, samp = outputs
grad = T.grad(cost=re.sum(), wrt=A)
func = theano.function([A,B],[grad])

print func(3.0,2.0)

上面的代码给出了[array(985.0)]的输出,这是正确的。 但是,如果我执行以下渐变

grad = T.grad(cost=(re-samp).sum(), wrt=A, consider_constant=[samp])

渐变出来0。 更有趣的是,如果我在扫描之后执行a+rng步骤,即使用re值生成samp,则渐变出来[array(985.0)]再次正确(当使用consider_constant=[samp],这是我感兴趣的内容。

为什么会出现这种情况?我绝对需要在扫描中执行随机计算, 所以很高兴知道在这种情况下是否有办法让梯度正常工作。

由于

1 个答案:

答案 0 :(得分:0)

如何使用theano.gradient.disconnected_grad

from theano import gradient

def step(i, rng, prev, A, B):
    a = A*prev
    b = B*a
    return b, a, a+rng

rng = RandomStreams(lasagne.random.get_rng().randint(1,2147462579))

A = T.scalar("A")
B = T.scalar("B")

outputs, _ = theano.scan(step,
                         sequences=[T.arange(1,5),rng.normal([4])],
                         outputs_info=[T.ones_like(A),None, None],
                         non_sequences=[A,B])
res, re, samp = outputs
grad = T.grad(cost=(re-gradient.disconnected_grad(samp)).sum(), wrt=A)
func = theano.function([A,B],[grad])

print func(3.0,2.0)

输出

[array(985.0, dtype=float32)]