問題が示唆するように、行列の行に対して勾配を計算したいと思います。コード内:行列の行に関するtheanoの勾配
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
にあるのかわかりません。
行列の1行に対してどのように勾配を取得するか、または出力で余分な零点を省略することはできますか?誰かがベクトルの任意の量をどのように積み重ねるかという提案があれば、うまくいくはずです。