所以我有以下代码
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]
,这是我感兴趣的内容。
为什么会出现这种情况?我绝对需要在扫描中执行随机计算, 所以很高兴知道在这种情况下是否有办法让梯度正常工作。
由于
答案 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)]