在Theano中用循环定义函数
我想在Theano中定义一个有两个变量的函数,并计算它的雅可比矩阵:
f(x1,x2) = sum((2 + 2k - exp(k*x1) - exp(k*x2))^2, k = 1..10)
我该如何为上面的表达式创建一个Theano函数,并最终利用它的雅可比矩阵来最小化这个函数呢?
1 个回答
3
因为你的函数是标量的,所以雅可比矩阵简化成了梯度。假设你的两个变量 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)
那么梯度(雅可比矩阵)就是:
grad_expr = T.grad(cost=expr, wrt=[x1, x2])
你可以在 theano.function
中以标准方式使用 updates
来进行梯度下降,把 x1, x2
设置为在 givens 中的共享变量,可以手动在 Python 层面上设置,或者使用其他人提到的 scan
。