theano T.grad() error: not part of computational graph

theano T.grad() error: not part of computational graph

代码:

a = T.vector()
b = T.vector()

loss = T.sum(a-b)

dy = T.grad(loss, a)
d2y = T.grad(loss, dy)

f = theano.function([a,b], y)
print f([.5,.5,.5], [1,0,1])

输出:

theano.gradient.DisconnectedInputError: grad method was asked to compute
the gradientwith respect to a variable that is not part of the
computational graph of the cost, or is used only by a non-differentiable
operator: Elemwise{second}.0

图的导数怎么不是图的一部分?这就是扫描用于计算粗麻布的原因吗?

这里:

d2y = T.grad(loss, dy)

您正在尝试计算关于 dy 的损失梯度。但是,损失仅取决于 ab 的值,而不取决于 dy,因此会出现错误。只有计算损失的偏导数与实际影响其值的参数有关才有意义。

在 Theano 中计算 Hessian 的最简单方法是使用 theano.gradient.hessian 便捷函数:

d2y = theano.gradient.hessian(loss, a)

有关使用 theano.gradtheano.scan 组合的替代手动方法,请参阅文档 here

在您的示例中,Hessian 矩阵将是一个 3x3 的零矩阵,因为损失的偏导数 w.r.t。 a 独立于 a(它只是一个向量)。