在Theano中用循环定义函数

3 投票
1 回答
563 浏览
提问于 2025-04-18 15:29

我想在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

撰写回答