Theano を使用して、ベクトルといくつかのスカラーに関して関数のヘッセ行列を計算しようとしています (編集: つまり、基本的に、ヘッセ行列を計算しているベクトルにスカラーを追加する必要があります) . 最小限の例を次に示します。
import theano
import theano.tensor as T
A = T.vector('A')
b,c = T.scalars('b','c')
y = T.sum(A)*b*c
私の最初の試みは:
hy = T.hessian(y,[A,b,c])
失敗するものAssertionError: tensor.hessian expects a (list of) 1 dimensional variable as 'wrt'
私の2番目の試みは、A、b、およびcを次のものと組み合わせることでした:
wrt = T.concatenate([A,T.stack(b,c)])
hy = T.hessian(y,[wrt])
失敗するものDisconnectedInputError: grad method was asked to compute the gradient with respect to a variable that is not part of the computational graph of the cost, or is used only by a non-differentiable operator: Join.0
この場合、ヘッセ行列を計算する正しい方法は何ですか?
更新:私が探しているものを明確にするために、A が 2 要素ベクトルであるとします。次に、ヘシアンは次のようになります。
[[d2y/d2A1, d2y/dA1dA2, d2y/dA1dB, d2y/dA1dC],
[d2y/dA2dA1, d2y/d2A2, d2y/dA2dB, d2y/dA2dC],
[d2y/dBdA1, d2y/dBdA2, d2y/d2B, d2y/dABdC],
[d2y/dCdA1, d2y/dCdA2, d2y/dCdB, d2y/d2C]]
サンプル関数の場合は次のy
ようになります。
[[0, 0, C, B],
[0, 0, C, B],
[C, C, 0, A1+A2],
[B, B, A1+A2, 0]]
したがって、関数を定義する場合:
f = theano.function([A,b,c], hy)
次に、正常に計算できると仮定するhy
と、次の出力が期待されます。
f([1,1], 4, 5) =
[[0, 0, 5, 4],
[0, 0, 5, 4],
[5, 5, 0, 2],
[4, 4, 2, 0]]
私の実際のアプリケーションでは、A には 25 個の要素があり、y
より複雑ですが、考え方は同じです。