2017-05-18 8 views
0

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

答えて

0

私は行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 
関連する問題