【问题标题】:Theano partial derivative over element in symbolic vectorTheano 对符号向量中元素的偏导数
【发布时间】:2016-07-27 09:46:54
【问题描述】:

我最近在 Sympy 中使用符号矩阵导数遇到了一些性能瓶颈(具体来说,通过使用 lambdas 替换评估符号矩阵的单行代码占用了程序运行时间的约 90%),所以我决定试一试 Theano。

它之前的应用是评估高斯过程的超参数的偏导数,其中使用 Sympy 符号 (MatrixSymbol) 的 (1, k) 维矩阵在迭代此列表并区分每个矩阵上的矩阵时效果很好项目。

但是,这并没有延续到 Theano 中,并且文档似乎没有详细说明如何执行此操作。在 Theano 中索引符号向量返回 Subtensor 类型,对计算梯度无效。

下面是我正在尝试做的一个简单(但在算法上完全不正确 - 精简到我想要获得的功能)版本。

编辑:我已经修改了代码示例,将数据作为张量包含在下面建议的函数中,并包括替代尝试使用单独的标量张量列表,因为我无法索引 a象征性的 Theano 向量,虽然也无济于事。

import theano
import numpy as np

# Sample data
data = np.array(10*np.random.rand(5, 3), dtype='int64')

# Not including data as tensor, incorrect/invalid indexing of symbolic vector
l_scales_sym = theano.tensor.dvector('l_scales')
x = theano.tensor.dmatrix('x')
f = x/l_scales_sym
f_eval = theano.function([x, l_scales_sym], f)

df_dl = theano.gradient.jacobian(f.flatten(), l_scales_sym[0])
df_dl_eval = theano.function([x, l_scales_sym], df_dl)

代码 sn-p 的倒数第二行是我试图对“长度比例”变量列表中的一个元素进行偏导的地方,但这种索引不适用于符号向量。

任何帮助将不胜感激!

【问题讨论】:

    标签: python theano derivative


    【解决方案1】:

    使用theano时,所有变量都应该定义为theano张量(或共享变量);否则,该变量不会成为计算图的一部分。在f = data/l_scales_sym 中,变量data 是一个numpy 数组。尝试也将其定义为张量,它应该可以工作。

    【讨论】:

    • 谢谢@Mehdi。我可能仍然缺少关于 Theano 工作原理的大量知识(正在研究),但这是否意味着每次进行计算时,我都需要将我的数据集替换回去?我不了解 Theano 如何存储和处理其数据,因此与使用 Sympy 矩阵相比,整体性能提升可能远远超过需要这样做的开销。
    • 一般过程通常如下:定义变量(所有你想使用的符号变量都应该是theano张量,即使你使用标量。)接下来,你定义你的函数就像你确实使用了所有数学运算和 theano 函数,例如grad。接下来,使用 `theano.function([input list], output)' 来编译你定义的函数。然后它就变成了一个 python 标准函数,你可以用 numpy 数组输入来调用它。也可以看看:tutorial
    • 两个问题:1. l_symbols = [theano.tensor.dvector('l' + str(i)) for i in range(data.shape[1])] 行是一个 python 列表,而不是一个矩阵(即一个 theano 张量)。 2. 在theano.function([x] + l_symbols, df_dl0) 中,您应该传递一个输入列表。声明[x] + l_symbols 不应该是正确的。但是,我认为对于您的问题,您最好使用shared 变量来让生活更轻松。看看这个 (deeplearning.net/software/theano/tutorial/…)
    • 好的.. 我现在明白了。问题是由于l_scales_sym[0]。子张量算子不可微,导致误差。例如,假设x 被定义为向量。然后T.grad(x[0], x) 可以,T.grad(x[0], x[0]) 不行。
    • 是的 - 我意识到,通过对整个向量进行微分,得到的评估表达式包含每个变量的偏导数,但组合起来,需要程序员解包它们以获得各自的偏导数。一旦我解决了一些问题,我会在稍后将其添加为响应。
    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2016-10-26
    • 2015-10-21
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多