私は theano 勾配とヘシアンのベクトル化されたバージョンを取得しようとしています。つまり、以下に示すように、行列で指定されたいくつかの点で勾配とヘシアンを計算したいと考えています。
私は機能を持っています:
f(x_1,x_2,..,x_n)=exp(x_1^2+x_2^2+...+x_n^2)
1 つのコマンドで複数のポイントでその勾配を計算したいと考えています。私はこれを次のように行うことができます:
x = T.matrix('x')
y = T.diag(T.exp(T.dot(x,x.T)))
J = theano.grad(cost = y.sum(), wrt = x)
f = theano.function(inputs = [x], outputs = J)
f([[1,2],[3,4]])
行が点 (1,2) と (3,4) で計算された勾配である行列を返します。私はヘッセ行列に対して同じ結果を得たいと思っています(この場合、行列とは対照的に3次元テンソルになりますが、同じ考えです)。次のコード:
H = theano.gradient.hessian(cost = y.sum(), wrt = x)
エラーを返します:
AssertionError: tensor.hessian expects a (list of) 1 dimensional variable as `wrt`
次のコードで適切な結果を得ることができました
J = theano.grad(cost = y.sum(), wrt = x)
H = theano.gradient.jacobian(expression = J.flatten(), wrt = x)
g = theano.function(inputs = [x], outputs = H)
g([[1,2],[3,4]])
しかし、それは多くの不要なゼロを生成し、目的の結果を得るための非効率的で「醜い」方法のように思えます。誰かが同様の問題を抱えていましたか、何か提案できますか?