我想在Theano中定义两个变量的以下函数并计算其Jacobian值:
f(x1,x2) = sum((2 + 2k - exp(k*x1) - exp(k*x2))^2, k = 1..10)
如何为上述表达式创建Theano函数-最终使用其Jacobian函数将其最小化?
解决方法:
由于您的函数是标量,因此雅可比矩阵减小为梯度.假设您的两个变量x1,x2是标量的(从公式中看起来很像,可以很容易地推广到其他对象),则可以编写
import theano
import theano.tensor as T
x1 = T.fscalar('x1')
x2 = T.fscalar('x2')
k = T.arange(1, 10)
expr = ((2 + 2 * k - T.exp(x1 * k) - T.exp(x2 * k)) ** 2).sum()
func = theano.function([x1, x2], expr)
您可以在两个标量上调用func
In [1]: func(0.25,0.25)
Out[1]: array(126.5205307006836, dtype=float32)
则梯度(Jacobian)为
grad_expr = T.grad(cost=expr, wrt=[x1, x2])
而且,您可以以标准方式(请参见theano教程)在theano.function中使用更新,以进行梯度下降,在python级别手动设置x1,x2作为给定值中的共享变量,或使用其他人指定的scan.