相对于矩阵行的 theano 梯度

theano gradient with respect to matrix row

如问题所示,我想计算矩阵行的梯度。在代码中:

import numpy.random as rng
import theano.tensor as T
from theano import function

t_x = T.matrix('X')
t_w = T.matrix('W')
t_y = T.dot(t_x, t_w.T)

t_g = T.grad(t_y[0,0], t_x[0])   # my wish, but DisconnectedInputError
t_g = T.grad(t_y[0,0], t_x)      # no problems, but a lot of unnecessary zeros

f = function([t_x, t_w], [t_y, t_g])
y,g = f(rng.randn(2,5), rng.randn(7,5))

如评论所示,当我计算整个矩阵的梯度时,代码可以正常工作。在这种情况下,梯度计算正确,但问题是结果在第 0 行中只有非零项(因为 x 的其他行显然没有出现在 y 的第一行的方程中)。

我发现 this question,建议将矩阵的所有行存储在单独的变量中并从这些变量构建图形。不过在我的设置中,我不知道 X.

中可能有多少行

有人知道如何获得矩阵单行的梯度,或者我如何在输出中省略多余的零吗?如果有人对如何堆叠任意数量的向量提出建议,我想那也应该有效。

我意识到在计算关于行 i:

中的条目的导数时可以去掉零
t_g = T.grad(t_y[i,0], t_x)[i]

为了计算雅可比行列式,我发现

t_g = T.jacobian(t_y[i], t_x)[:,i]

成功了。不过好像对计算速度影响比较大。


也可以从数学上解决这个问题。矩阵乘法的雅可比t_yw.r.t。 t_x 只是 t_w.T 的转置,在这种情况下是 t_w (转置的转置是原始矩阵)。因此,计算将像

一样简单
t_g = t_w