相对于矩阵行的 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_y
w.r.t。 t_x
只是 t_w.T
的转置,在这种情况下是 t_w
(转置的转置是原始矩阵)。因此,计算将像
一样简单
t_g = t_w
如问题所示,我想计算矩阵行的梯度。在代码中:
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_y
w.r.t。 t_x
只是 t_w.T
的转置,在这种情况下是 t_w
(转置的转置是原始矩阵)。因此,计算将像
t_g = t_w