sub子的Theano渐变

时间:2016-05-31 12:06:33

标签: theano

我尝试通过扫描操作手动计算朝向重量矢量的标量成本的梯度。然而,这不起作用,并且总是返回一个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.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的数组。

1 个答案:

答案 0 :(得分:1)

不是试图为每个子传感器计算扫描函数内的渐变,而是应该事先计算渐变,然后遍历所需的渐变

p2_grad = T.grad(cost,p2)

def differentiate_element(i,p2):
            p2element=p2[i]
            return p2element

p2elements_grads, h2_updates = theano.scan(differentiate_element,
                  sequences=T.arange(p2_grad.shape[0]), non_sequences=[p2_grad])

<强> 修改

由于计算Hessian对角线的主要问题是你不想在任何情况下计算整个Hessian和浪费计算资源,你可以做些什么来避免Disconnected input错误添加{{1} }关键字争论到T.grad

disconnected_inputs='ignore'